当前位置: 技术问答>linux和unix
求助:并口的I/O端口注册和读写的地址问题
来源: 互联网 发布时间:2016-10-22
本文导语: ldd3中写到: 并口的最小配置由3个8位端口组成。pc标准中第一个并口的I/O端口是从地址0x378开始,第二个端口是从地址0x278开始,第三个从0x3bc开始。第三个端口是一个只用于输出的控制寄存器。 示例代码中:short_bas...
ldd3中写到: 并口的最小配置由3个8位端口组成。pc标准中第一个并口的I/O端口是从地址0x378开始,第二个端口是从地址0x278开始,第三个从0x3bc开始。第三个端口是一个只用于输出的控制寄存器。
示例代码中:short_base = 0x378;
request_region(short_base, 8, "short“); /* 注册了8个端口 */
outb(0x10, short_base+2); /* 向第三个端口写入0x10,开启中断 */
问题是: 这里的 short_base + 2 是个什么东西? 是0x37a吗? 好像不是吧!
物理上并口的这三个端口的地址是不连续的,为什么写端口的时候可以直接用 short_base + 0 , short_base + 2 这种方式呢?
示例代码中:short_base = 0x378;
request_region(short_base, 8, "short“); /* 注册了8个端口 */
outb(0x10, short_base+2); /* 向第三个端口写入0x10,开启中断 */
问题是: 这里的 short_base + 2 是个什么东西? 是0x37a吗? 好像不是吧!
物理上并口的这三个端口的地址是不连续的,为什么写端口的时候可以直接用 short_base + 0 , short_base + 2 这种方式呢?
|
这个注释有点问题。应该不是第三个端口,而是某个端口的第三个寄存器。
short_base的类型是unsigned long,所以,
如果short_base的值是0x378,那么short_base + 2 就是0x37a
如果short_base的值是0x278,那么short_base + 2 就是0x27a
如果short_base的值是0x3bc,那么short_base + 2 就是0x3be
这是毫无疑问的。
这段代码前面有一段话:
short_base is the base I/O address of the parallel interface being used; register 2 of the interface is written to enable interrupt reporting.
这就是说:对于任何一个端口,写入该端口的寄存器2(也就是short_base+2),就可以开启中断。
short_base的类型是unsigned long,所以,
如果short_base的值是0x378,那么short_base + 2 就是0x37a
如果short_base的值是0x278,那么short_base + 2 就是0x27a
如果short_base的值是0x3bc,那么short_base + 2 就是0x3be
这是毫无疑问的。
这段代码前面有一段话:
short_base is the base I/O address of the parallel interface being used; register 2 of the interface is written to enable interrupt reporting.
这就是说:对于任何一个端口,写入该端口的寄存器2(也就是short_base+2),就可以开启中断。
|
硬件驱动里面有很多类似的代码。
通常的硬件都有很多寄存器,他们的地址都是: 一个基地址(不固定) + 一个偏移量(固定)
比如这里的 short_base+2 他就是并口里用于开关中断的寄存器。
每个端口的基地址不同,但是,只要把基地址设置对了,可以用同样的代码来操作不同的端口。
通常的硬件都有很多寄存器,他们的地址都是: 一个基地址(不固定) + 一个偏移量(固定)
比如这里的 short_base+2 他就是并口里用于开关中断的寄存器。
每个端口的基地址不同,但是,只要把基地址设置对了,可以用同样的代码来操作不同的端口。
|
我觉得这里的“端口”这个词用的有点歧义了。
准确地说,应该是有3个并口,每个并口有8个寄存器。只要弄明白这个区别,其他的就容易理解了。
0x378、0x278、0x3bc 这是3个并口
short_base = 0x378; 指定了3个并口其中之一
request_region(short_base, 8, "short“); 这是该并口的8个寄存器
outb(0x10, short_base+2); 这是一个并口里面8个寄存器里面的第三个
准确地说,应该是有3个并口,每个并口有8个寄存器。只要弄明白这个区别,其他的就容易理解了。
0x378、0x278、0x3bc 这是3个并口
short_base = 0x378; 指定了3个并口其中之一
request_region(short_base, 8, "short“); 这是该并口的8个寄存器
outb(0x10, short_base+2); 这是一个并口里面8个寄存器里面的第三个
|
是的,不过很多PC只有一个并口,在BIOS里面也可以把这个并口配置在0x378或者0x278的