linux 操作 I/O 端口

Posted fanweisheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 操作 I/O 端口相关的知识,希望对你有一定的参考价值。

 

在驱动硬件请求了在它的活动中需要使用的 I/O 端口范围之后, 它必须读且/或写到这些 端口. 为此, 大部分硬件区别 8-位, 16-位, 和 32-位端口. 常常你无法混合它们, 象你 正常使用系统内存存取一样.[33]33

 

一个 C 程序, 因此, 必须调用不同的函数来存取不同大小的端口. 如果在前一节中建议 的, 只支持唯一内存映射 I/O 寄存器的计算机体系伪装端口 I/O , 通过重新映射端口地 址到内存地址, 并且内核向驱动隐藏了细节以便易于移植. Linux 内核头文件(特别地, 体系依赖的头文件 <asm/io.h>) 定义了下列内联函数来存取 I/O 端口:

 

有时 I/O 端口象内存一样安排, 并且你可(例如)绑定 2 个 8-位 写为一个单个 16-位 操作. 例如, 这应用于

PC 视频板. 但是通常, 你不能指望这个特色.

 

 

unsigned inb(unsigned port);

void outb(unsigned char byte, unsigned port);

 

读或写字节端口( 8 位宽 ). port 参数定义为 unsigned long 在某些平台以及 unsigned short 在其他的上. inb 的返回类型也是跨体系而不同的.

 

unsigned inw(unsigned port);

void outw(unsigned short word, unsigned port);

 

这些函数存取 16-位 端口( 一个字宽 ); 在为 S390 平台编译时它们不可用, 它 只支持字节 I/O.

 

unsigned inl(unsigned port);

void outl(unsigned longword, unsigned port);

 

这些函数存取 32-位 端口. longword 声明为或者 unsigned long 或者 unsigned int, 根据平台. 如同字 I/O, "Long" I/O 在 S390 上不可用.

 

从现在开始, 当我们使用 unsigned 没有进一步类型规定时, 我们指的是一个体系相关的 定义, 它的确切特性是不相关的. 函数几乎一直是可移植的, 因为编译器自动转换值在赋 值时 -- 它们是 unsigned 有助于阻止编译时的警告. 这样的转换不丢失信息, 只要程序 员安排明智的值来避免溢出. 我们坚持这个"未完成的类型"传统贯串本章.

 

注意, 没有定义 64-位 端口 I/O 操作. 甚至在 64-位 体系中, 端口地址空间使用一个 32-位(最大)的数据通路.

以上是关于linux 操作 I/O 端口的主要内容,如果未能解决你的问题,请参考以下文章

Linux 设备驱动IO操作

重叠 I/O:如何在完成端口事件或正常事件上唤醒线程?

用于 x86 输入/输出端口 I/O 的 C inline asm 操作数大小不匹配

CPU的端口映射I/O和内存映射I/O

linux中文件I/O操作(系统I/O)

嵌入式Linux+ARMGPIO操作