修改后的 USB 键盘驱动程序不接收按键 (Linux)
Posted
技术标签:
【中文标题】修改后的 USB 键盘驱动程序不接收按键 (Linux)【英文标题】:Modified USB Keyboard Driver Not Receiving Key Presses (Linux) 【发布时间】:2016-11-26 23:15:54 【问题描述】:我正在尝试编写修改/自定义的 USB 键盘驱动程序。我遇到了 irq 处理程序没有按预期接收按键的问题。
我做了什么:
-
复制
/linux/driver/hid/usbhid/usbkbd.c
link 并修改usb_kbd_id_table
以仅将供应商ID 和产品ID 与我的键盘关联。
构建修改后的驱动程序。
使用sudo insmod usbkbd.ko
插入修改后的驱动程序。
通过将usbhid:quirks=0x03eb:0x20ff:0x4
添加到/etc/default/grub
来防止键盘与标准 HID 驱动程序关联。
行为:
-
插入键盘后,它与我的驱动程序正确关联。我知道这一点是因为我看到了我在
usb_kbd_probe
中添加的printk
语句出现在/var/log/syslog
中。它实际上显示了两次,因为该设备有 2 个接口。
函数usb_kbd_irq
在循环中被重复调用。我在这里也添加了一个printk
,我看到kbd->new
在每个字节中总是有0
。
此循环继续快速进行,按下任何键均无效(kbd->new
在每个字节中始终包含0
,无论是否按下了键)。
我尝试使用wireshark查看usb流量,我看到主机和设备来回移动。我期待一种方式的交通。 wireshark screenshot
我很困惑为什么按键没有效果。如果某个键被按下,我不应该在kbd->new
中看到一些数据吗?
编辑:带有设备信息的屏幕截图https://i.stack.imgur.com/lNq4e.png
【问题讨论】:
【参考方案1】:问题在于我将设备与通用 USBHID 驱动程序分离的方式。列于上述第 4 组:
-
通过将 usbhid:quirks=0x03eb:0x20ff:0x4 添加到 /etc/default/grub 来防止键盘与标准 HID 驱动程序相关联
如果我改为手动取消绑定设备并将其绑定到我的驱动程序,则 IRQ 不再循环,实际上我确实看到每次按键都有不同的输入。我使用了在这里找到的说明https://lwn.net/Articles/143397/
【讨论】:
以上是关于修改后的 USB 键盘驱动程序不接收按键 (Linux)的主要内容,如果未能解决你的问题,请参考以下文章