注:本文资料全部来源于网络,同时加上个人理解。若有侵权,告知即删。若有错误,告知商讨。
1、IO内存访问
32位Linux系统,内核使用高端内存的vmalloc区来映射IO地址空间。具体地址可以自己定义。
例如:三星4412提供的源码使用0xF6000000 至0xF6000000+96MB的内存空间映射IO端口的寄存器。
2、内存和IO基础知识
内核访问外设IO内存之前,先要将虚拟地址映射到物理地址,有两种方式来进行映射:
- 动态映射:ioremap() ,和vmalloc类似,需要建立新的页表。
- 静态映射:map_desc结构体数组中定义映射,系统初始化期间,根据结构体的映射方式建立页表。
void *ioremap(unsigned long offset, unsigned long size);
void iounmap(void * addr);
3、IO端口/内存 操作函数
IO端口请求(X86):
struct resource *request_region(unsigned long first, unsigned long n, const char *name);
inb(); outb(); //端口访问
void release_region(unsigned long start, unsigned long n);
/*IO端口也可以通过映射到内存空间来访问*/
ioport_map();
IO内存请求(ARM):
struct resource *request_mem_region(unsigned long start, unsigned long len, char *name);
ioremap(); /*IO内存映射,上面提到的两种方式*/
ioread8(); ioread16(); ioread32();/*访问*/
void release_mem_region(unsigned long start, unsigned long len);
int gpio_request(unsigned gpio, const char *label);
gpio_request:包装了request_mem_region()。
4、IO内存静态映射
map_desc结构体:定义了外设物理地址到虚拟地址的映射。
【map_desc:arch\arm\mach-exynos\cpu-exynos4.c 。补充:GPIO的端口名称和对应的虚拟地址:drivers\gpio\gpio-exynos4.c 】