linux - outb() 在 LDD3 示例短模块中不起作用

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

我正在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区域却无法写出数据?

感谢您的回答。

最佳答案

终于,我找到了解决方案。

确保“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

关于linux - outb() 在 LDD3 示例短模块中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768493/

相关文章:

c - C : Execvp not finishing execution when wait is added to parent 中的 Linux Shell

c++ - 如果条件不起作用怎么办?

c++ - 我应该从 C++ 转移到 Python 吗? ... 或另一种语言?

linux - 如何逐步调试没有符号或部分的程序集二进制文件?

assembly - 在 Irvine32 中使用像 foo[si] 这样的 16 位地址(在 32 位模式下)?

c - 将 __m256i 存储为整数

c++ - Linux 中的线程/套接字限制

linux - TCP 连接可以通过使用不同的 IP 但相同的端口来实现吗?

linux - Linux 驱动程序中已知的互斥方案

linux-kernel - 如何在U-Boot和Linux内核中添加自定义TAG变量?