Linux设备驱动程序学习--与硬件通信
平台相关性
由于自身的特性,I/O指令与处理器密切相关的,非常难以隐藏系统间
的不同。所以大部分的关于端口I/O的源码是平台依赖的。以下是x86
和ARM所使用函数的总结:
IA-32(x86)
x86_64
这个体系支持所有的以上描述的函数,端口号是unsigned short类型。
ARM
端口映射到内存,支持所有函数。串操作用C语言实现。端口是unsigned int类型。
使用I/O内存
除了x86上普遍使用的I/O端口外,和设备通讯另一种主要机制是通过
使用映射到内存的寄存器或设备内存,统称为I/O内存。因为寄存器
和内存之间的区别对软件是透明的。I/O内存仅仅是类似RAM的一个
区域,处理器通过总线访问这个区域,以实现设备的访问。
根据平台和总线的不同,I/O内存可以就是否通过页表访问分类。若通
过页表访问,内核必须首先安排物理地址使其对设备驱动程序可见,在
进行任何I/O之前必须调用ioremap。若不通过页表,I/O内存区域就
类似I/O端口,可以使用适当形式的函数访问它们。因为“side effect”
的影响,不管是否需要ioremap,都不鼓励直接使用I/O内存的指针。
而使用专用的I/O内存操作函数,不仅在所有平台上是安全,而且对
直接使用指针操作I/O内存的情况进行了优化。
I/O内存分配和映射
I/O内存区域使用前必须先分配,函数接口在定义:
struct resource*request_mem_region(unsigned long start,unsigned long len,char*name);/*从start开始,分配一个len字节的内存区域。成功返