我正在尝试从 Linux设备驱动程序一书中运行 short ,该驱动程序默认使用io地址库0x378上的pc的并行接口。我特意使用/ dev / short0设备。 从书中引用
/ dev / short0写入和读取8位端口 位于I / O地址库(0x378,除非在加载时更改)。
写操作(默认行为)基本上就是这样做
while (count--) {
outb(*(ptr++), port);
wmb( );
}
ptr变量包含指向用户请求写入设备的数据的指针。当然只有最后一个字节存在,因为先前的字节被覆盖。通过使用inb而不是outb,读取操作的工作方式类似。
也可以从书中引用
如果您选择从输出中读取 您最有可能回到写入端口的最后一个值(这适用于并行接口和常用的大多数其他数字I / O电路)
所以当我做的时候
$ echo -n "a" > /dev/short0
$ dd if=/dev/short0 bs=1 count=1 | od -t x1
正如书中所建议的那样,我希望能够找回“acii”的代码。十六进制,但我得到的是0xff:
1+0 records in
1+0 records out
1 byte (1 B) copied, 0,000155485 s, 6,4 kB/s
0000000 ff
0000001
我已经验证,添加了一些printks并使用了dmesg,驱动程序的相关代码实际上已被执行,除此之外,我还是我被卡住了。造成这种情况的可能原因是什么?或者我应该在哪里查看它为什么不起作用?
对于它的重要性,io地址范围0x378-0x37a最初是从parport模块分配的,所以i rmmod
以及其他一些在加载短模块之前使用parport的模块。最后,在我的系统上uname -a
给出了
Linux Crete 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:31:42 UTC 2014 i686 i686 i686 GNU/Linux