Linux IO内存访问

注:本文资料全部来源于网络,同时加上个人理解。若有侵权,告知即删。若有错误,告知商讨。

1、IO内存访问

32位Linux系统,内核使用高端内存的vmalloc区来映射IO地址空间。具体地址可以自己定义。

例如:三星4412提供的源码使用0xF6000000 至0xF6000000+96MB的内存空间映射IO端口的寄存器。

2、内存和IO基础知识

内核访问外设IO内存之前,先要将虚拟地址映射到物理地址,有两种方式来进行映射:

  1. 动态映射:ioremap() ,和vmalloc类似,需要建立新的页表。
  2. 静态映射: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 】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值