Linux中的任何设备驱动程序都可对I/O端口进行操作,这样很容易引起混乱,因此Linux提供了三个宏check_region(start,n)、request_region(start,n,name)、release_region(start,n)来对端口使用情况进行控制,它们在include/linux/ioport.h中进行了定义。
check_region(start,n)检查一片区域是否正在被使用,如果正在被使用,则返回非零值。
request_region(start,n,name)创建一片新的标记为正在被使用的区域。
release_region(start,n)释放正在使用的区域,也就是将指定I/O端口区域标记为没有使用状态。
参数start表示用到的I/O端口的基地址,n标明从start开始的I/O端口范围,name为使用这段I/O地址的设备名。
在申请了I/O端口区域之后,就可以放心地访问,Linux使用inb(p)、inw(P)、insb(p,d,l)、insw(p,d,l)、outb(v,p)、outw(v,p)、outl(v,p)、outsb(p,d,l)、outsl(p,d,l)等宏来访问I/O端口,他们在include/asm/io.h中进行定义。
宏中in表示从端口输入,out表示从输出到端口。
b表示访问字节,w表示访问字,l表示访问长整数,s表示流数据,如outw表示输出一个字。
参数p表示要访问的I/O端口号,v表示要输出的数值,d表示内存缓存起始地址,l表示输出输入的量。
eg:
intb(p)表示从端口p输入一个字节。
outsw(p,d,l)表示输出从内存地址d开始的l个字到端口p。