【问题标题】:outb() does not work in LDD3 example short moduleoutb() 在 LDD3 示例短模块中不起作用
【发布时间】:2014-05-20 19:39:35
【问题描述】:

我正在 Linux 设备驱动程序 3 的示例中尝试 short.c

我的电脑有并行端口,在 Ubuntu 启动后,我可以看到这些:

cat /proc/ioports
0378-037a : parport0
037b-037f : parport0

outp 0x378 1 
(outp is another example in LDD3 which write data to ports)
the LED on the port is ON.

然后我运行这些命令来删除模块

rmmod lp
rmmod parport_pc
cat /proc/ioports
(There is no module on 0378-037f any more.)

我再次运行,但这次 LED 没有亮起。

outp 0x378 1

然后我安装 short.ko 并且 request_region() 成功。

cat /proc/ioports
0378-037f : short

cat /proc/devices
249 short

outp 0x378 1
the LED is not ON this time either.

我也试过这些,但结果相同(LED 不亮)

mknod /dev/short0 c 249 0
echo -n "a" > /dev/short0

“a”是0x61,所以最后一位是1。

为什么我有 I/O 区域却不能写出数据?

感谢您的回答。

【问题讨论】:

  • 你做了什么来验证你已经正确连接了 LED?
  • 是的,LED 接线正确。我可以在移动模块 parport_pc 之前将其设为 ON。
  • 新发现。如果我删除 request_region() 函数调用并且不卸载 parport 模块,我可以使代码读写(也点亮 LED)。因为 parport 模块在那里,所以它使用了 irq 7。我必须将 irq 5 分配给“短”模块。虽然我成功启用了 irq 5,但中断从未进入 [通过有线引脚 9 和引脚 10,以及 outb(0xff, 0x378)]。检查 /proc/interrupts,我注意到调用 outb(0xff, 0x378) 时 irq 7 的计数器增加了,但 irq 5 始终为 0。有什么修复它的建议吗?

标签: linux linux-kernel x86 linux-device-driver hardware-port


【解决方案1】:

终于找到了解决办法。

确保“parport”模块未加载或编译到您的内核中。仅仅卸载 parport 模块是不够的,因为它会使端口处于不一致的状态。您必须首先重新启动机器并阻止 parport 和所有相关模块/代码加载。

一种方法是编辑 /etc/modprobe.d/blacklist.conf 文件并添加以下行:

blacklist ppdev
blacklist lp
blacklist parport_pc
blacklist parport

partport好像修改了并口的模式。

如果安装了cups,你应该修改/etc/modules-load.d/cups-filters.conf:

#lp
#ppdev
#parport_pc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2011-07-27
    • 2012-11-29
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多