Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13600
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 16
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-25 17:37
文章分类
文章存档

2015年(5)

我的朋友

分类: LINUX

2015-07-21 15:27:17

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


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

CPU外设端口物理地址的编址方式有两种:

一种是IO映射方式,另一种是内存映射方式。
IO映射方式:
CPUi386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4GIO空间是16位可以寻址到64K
内存映射方式:arm,powerpc在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO PortMem(包括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()

  Linuxkernel/resource.c文件中定义了全局变量ioport_resourceiomem_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映射方式。
阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~