1.引言
1.1文档目的
本文档描述IO内存的概念和访问流程。
1.2背景
1.3参考资料
名称 类型 作者 备注
Linux设备驱动开发详解:基于最新的Linux4.0内核 书籍 宋宝华 第11章
国嵌内核驱动深入班5-1-2(硬件访问) 视频 谢老师
2.几个概念
2.1 IO空间与内存空间
在X86处理器才存在IO空间,是相对于内存空间的概念。目前大多数嵌入式处理器(如ARM、PowerPC等)并不提供IO空间。所以内存空间是必须的,IO空间是可选的。嵌入式开发只关心内存空间即可。
IO空间和内存空间是彼此独立的地址空间,在32位的X86处理器中,IO空间大小为64K ,内存空间为4G。
2.2 IO端口和IO内存
设备通常会提供一组寄存器开控制设备、读写设备和获取设备状态,既控制寄存器、数据寄存器和状态寄存器。这些寄存器可能位于IO空间,也可能位于内存空间中。
当位于IO空间,称为IO端口;当位于内存空间时,对应的内存空间称为IO内存。
3. IO端口和IO内存的访问
Linux是支持嵌入式处理器,也支持X86处理器,所以Linux支持IO空间(IO端口)和内存空间(IO内存)的访问,只是API不同而已。
3.1 IO端口的访问
前面说过了,嵌入式开发不关心IO空间,所以也不关心IO端口的访问。这里不详述。
3.2 IO内存的访问
IO内存的访问,在设备驱动开发中,用的非常多的。比如在ZYNQ平台,操作FPGA的寄存器。FPGA与ARM共享的内存区域,中间的一段用做寄存器的控制。FPGA看做是ZYNQ的一个外设,挂在内存空间。知道物理地址后,对地址进行映射操作即可。具体的IO空间操作流程如下图3.2.1所示。
图3.2.1 IO内存访问步骤
3.2.1 mmap访问
在驱动中访问,可以按上面ioremap的方式。如果在应用层进行访问。就可以mmap的方式实现啦。这种方式,在实际使用中,也比较常用。