1. 程式人生 > >linux驅動中讀寫硬體暫存器(例如__raw_writel)

linux驅動中讀寫硬體暫存器(例如__raw_writel)

 

 __iomem原始碼位置:include/linux/compiler.h

# define __force    __attribute__((force)) //變數可以進行強制轉換
# define __nocast   __attribute__((nocast))

/*指標地址必須在裝置地址空間,__iomem是個IO map的問題,根據系統的具體情況,
把暫存器對映到虛擬地址的特定位置,這樣,訪問暫存器就可以像訪問普通記憶體一樣簡單方便
主要是用於編譯器的檢查,檢查地址空間的有效性*/
# define __iomem    __attribute__((noderef, address_space(2)))     // 
# define __acquires(x)  __attribute__((context(x,0,1)))
# define __releases(x)  __attribute__((context(x,1,0)))

 

static inline u8 __raw_readb(const volatile void __iomem *addr)
{
    return *(__force volatile u8 *)addr;
}

static inline u16 __raw_readw(const volatile void __iomem *addr)
{
    return *(__force volatile u16 *)addr;
}

static inline u32 __raw_readl(const volatile void __iomem *addr)
{
    return *(__force volatile u32 *)addr;
}


static inline void __raw_writeb(u8 b, volatile void __iomem *addr)
{
    *(__force volatile u8 *)addr = b;
}


    static inline void __raw_writew(u16 w, volatile void __iomem *addr)
{
    *(__force volatile u16 *)addr = w;
}


static inline void __raw_writel(u32 l, volatile void __iomem *addr)
{
    *(__force volatile u32 *)addr = l;
}


static inline u8 __readb(const volatile void __iomem *addr)
{
    return *(__force volatile u8 *)addr;
}


static inline u16 __readw(const volatile void __iomem *addr)
{
    return flip_word(*(__force volatile u16 *)addr);
}


static inline u32 __readl(const volatile void __iomem *addr)
{
return flip_dword(*(__force volatile u32 *)addr);
}


static inline void __writeb(u8 b, volatile void __iomem *addr)
{
    *(__force volatile u8 *)addr = b;
}


static inline void __writew(u16 w, volatile void __iomem *addr)
{
    *(__force volatile u16 *)addr = flip_word(w);
}


static inline void __writel(u32 l, volatile void __iomem *addr)
{
    *(__force volatile u32 *)addr = flip_dword(l);
}


#define readb(__addr) __readb(__addr)
#define readw(__addr) __readw(__addr)
#define readl(__addr) __readl(__addr)
#define readb_relaxed(__addr) readb(__addr)
#define readw_relaxed(__addr) readw(__addr)
#define readl_relaxed(__addr) readl(__addr)


#define writeb(__b, __addr) __writeb((__b),(__addr))
#define writew(__w, __addr) __writew((__w),(__addr))
#define writel(__l, __addr) __writel((__l),(__addr))
 

writel() 往記憶體對映的 I/O 空間上寫資料,wirtel()  I/O 上寫入 32 位資料 (4位元組)

其他的都是類似用法。