一、基础知识
1.IO空间和内存空间
在X86处器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的x86系统中,I/O空间大小为64K,内存空间大小为4G。、
IO空间X86支持,但是ARM并不支持IO空间。
2.IO端口与IO内存
当以一个寄存器或内存位于IO空间时,称为IO端口。
当一个寄存器或内存位于内存空间时,称为IO内存。
3.IO端口的操作(个人觉得不是很重要,但是老谢讲了)
①申请IO端口
函数:struct resource*request_region(unsignedlong first, unsignedlong n, const char *name)
功能:这个函数告诉内核,你要使用从 first 开始的n个端口,name参数是设备的名字。如果申请成功,返回非 NULL,申请失败,返回 NULL。
注意:系统的IO端口可能已经被占用,所以分配的时候需要查看哪些端口被占用。
②访问IO端口
unsigned inb(unsigned port) 读字节端口( 8 位宽 )
oid outb(unsignedchar byte, unsigned port) 写字节端口( 8 位宽 )
unsigned inw (unsigned port)
v void outw(unsignedshort word, unsigned port)
存取 16-位 端口。
v unsigned inl(unsigned port)
v void outl(unsigned longword, unsigned port)
存取 32-位 端口。
③释放IO端口
void release_region(unsignedlong start, unsignedlong n)
4.IO内存的操作
①申请IO内存
struct resource*request_mem_region(unsigned long start, unsignedlonglen, char *name)
功能:这个函数申请一个从start 开始,长度为len 字节的内存区。如果成功,返回非NULL;否则返回NULL,所有已经在使用的I/O内存在/proc/iomem 中列出。
②映射IO内存
原因:在访问IO内存之前必须进行物理地址到虚拟地址的映射。
函数:void*ioremap(unsigned long phys_addr, unsignedlong size)
③访问IO内存
读函数:
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
写函数:
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
④释放IO内存
1. void iounmap(void * addr)
2. void release_mem_region(unsigned long start, unsignedlonglen)