注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

liuyue18301的个人主页

追逐梦想 光辉岁月

 
 
 

日志

 
 

关于外设的内存映射和I/O映射  

2010-05-07 12:11:01|  分类: linux驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

IO端口和IO内存以及内存之间的关系:主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。如下图:

关于外设的内存映射和I/O映射 - xiaoyao183 - liuyue18301的个人主页

还有两个概念我决很容易混起来:

CPU对外设端口物理地址的编址方式有两种:一种是IO映射方式,另一种是内存映射方式。

IO映射方式:CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。

内存映射方式:arm,powerpc在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO Port+Mem(包括IO Mem)可以达到4G。

Linux将基于IO映射方式的和内存映射方式的IO端口统称为IO区域(IO region)。

所以至此我觉得我们应该分清楚,io端口,io内存,io映射方式,内存映射方式。

参考下面文章:

http://blog.chinaunix.net/u3/94284/showart_2030412.html

http://blog.chinaunix.net/u3/94284/showart_2030419.html

linux管理io口是通过下面一组函数来的:

1) request_region()

  把一个给定区间的IO端口分配给一个IO设备。

  2) check_region()

 检查一个给定区间的IO端口是否空闲,或者其中一些是否已经分配给某个IO设备

  3) release_region()

  释放以前分配给一个IO设备的给定区间的IO端口。

  Linux中可以通过以下辅助函数来访问IO端口:

  inb(),inw(),inl(),outb(),outw(),outl()  “b”“w”“l”分别代表8位,16位,32位。

linux管理io内存是通过下面一组函数来的

1) request_mem_region()

  请求分配指定的IO内存资源。

  2) check_mem_region()

  检查指定的IO内存资源是否已被占用。

  3) release_mem_region()

  释放指定的IO内存资源。

  其中传给函数的start address参数是内存区的物理地址(以上函数参数表已省略)。

  驱动开发人员可以将内存映射方式的IO端口和外设内存统一看作是IO内存资源。

  ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。

  Linux中可以通过以下辅助函数来访问IO内存资源:

  readb(),readw(),readl(),writeb(),writew(),writel()。

 Linux在kernel/resource.c文件中定义了全局变量ioport_resource和iomem_resource,来分别描述基于IO映射方式的整个IO端口空间和基于内存映射方式的IO内存资源空间(包括IO端口和外设内存)。

访问io映射方式的io函数组如下:

unsigned inb(unsigned port);

void outb(unsigned char byte, unsigned port);

unsigned inw(unsigned port);

void outw(unsigned short word, unsigned port);

unsigned inl(unsigned port);

void outl(unsigned longword, unsigned port);

访问内存映射方式的io函数组如下:

和访问io内存是一样的

最后可以通过ioport_map吧io映射方式变成内存映射方式,可以和内存映射一样使用,这些只是给软件设计带来方便,底层还是io映射方式

  评论这张
 
阅读(1213)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018