http://blog.csdn.net/hudaweikevin/article/details/18562757 writel() 往內(nèi)存映射的 I/O 空間上寫數(shù)據(jù), wirtel() I/O 上寫入 32 位數(shù)據(jù) (4字節(jié))。 原型:引用#include <asm/io.h> void writel (unsigned char data , unsigned short addr )
readl() 從內(nèi)存映射的 I/O 空間讀取數(shù)據(jù), readl 從 I/O 讀取 32 位數(shù)據(jù) ( 4 字節(jié) )。 原型:#include <asm/io.h> unsigned char readl (unsigned int addr ) 注:變量 addr 是 I/O 地址。 返回值 : 從 I/O 空間讀取的數(shù)值。
readb(), readw(), readl() 宏函數(shù) 功能:
從內(nèi)存映射的 I/O 空間讀取數(shù)據(jù)。 readb 從 I/O 讀取 8 位數(shù)據(jù) ( 1 字節(jié) ); readw 從 I/O 讀取 16 位數(shù)據(jù) ( 2 字節(jié) ); readl 從 I/O 讀取 32 位數(shù)據(jù) ( 4 字節(jié) )。 原型:#include <asm/io.h> unsigned char readb (unsigned int addr ) unsigned char readw (unsigned int addr ) unsigned char readl (unsigned int addr ) 變量: addr I/O 地址。 返回值: 從 I/O 空間讀取的數(shù)值。
__raw_readl和__raw_writel Linux對I/O的操作都定義在asm/io.h中,相應(yīng)的在arm平臺下,就在asm-arm/io.h中。
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a)) 在include\linux\compiler.h中:
#ifdef __CHECKER__ __raw_readl(a)展開是:((void)0, *(volatile unsigned int _force *)(a))。在定義了__CHECKER__的時候先調(diào)用__chk_io_ptr檢查該地址,否則__chk_io_ptr什么也不做,*(volatile unsigned int _force *)(a)就是返回地址為a處的值。(void)xx的做法有時候是有用的,例如編譯器打開了檢查未使用的參數(shù)的時候需要將沒有用到的參數(shù)這么弄一下才能編譯通過。 CPU對I/O的物理地址的編程方式有兩種:一種是I/O映射,一種是內(nèi)存映射。__raw_readl和__raw_writel等是原始的操作I/O的方法,由此派生出來的操作方法有:inb、outb、_memcpy_fromio、readb、writeb、ioread8、iowrite8等。 |
|