修改后的 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.clink 并修改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)的主要内容,如果未能解决你的问题,请参考以下文章

【delphi】关于窗口接收键盘按键的问题,求指导~

按键精灵--设置模拟方式

请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?

STM32 DIY USB键盘,效果杠杠滴~

linux键盘驱动

无线键盘开启按啥键