修改后的USB键盘驱动程序未接收按键(Linux)

时间:2016-11-26 23:15:55

标签: linux-kernel keyboard usb linux-device-driver irq

我正在尝试编写修改/自定义USB键盘驱动程序。我遇到了irq处理程序没有按预期接收按键的问题。

我做了什么:

  1. 制作了/linux/driver/hid/usbhid/usbkbd.c link的副本并修改了usb_kbd_id_table,以便只将供应商ID和产品ID与我的键盘相关联。
  2. 构建修改后的驱动程序。
  3. 使用sudo insmod usbkbd.ko
  4. 插入修改过的驱动程序
  5. 通过将usbhid:quirks=0x03eb:0x20ff:0x4添加到/etc/default/grub,防止键盘与标准HID驱动程序相关联。
  6. 行为:

    1. 插入键盘后,它与我的驱动程序正确关联。我知道这一点,因为我看到printk中添加的usb_kbd_probe语句显示在/var/log/syslog中。它实际上显示两次,因为该设备有2个接口。
    2. 在循环中重复调用函数usb_kbd_irq。我在这里添加了printk,我发现kbd->new在每个字节中始终都有0
    3. 此循环继续快速按下任何键无效(kbd->new在每个字节中始终有0,无论按下哪个键。)
    4. 我尝试使用wireshark来查看usb流量,我发现主机和设备来回走动。我期待单向交通。 wireshark screenshot

      我很困惑为什么按键没有效果。如果按下某个键,我是不是会在kbd->new中看到一些数据?

      编辑:使用https://i.stack.imgur.com/lNq4e.png

      处的设备信息拍摄的屏幕截图

1 个答案:

答案 0 :(得分:0)

问题在于我将设备与通用USBHID驱动程序分离的方式。列于上面的第4组:

  1. 通过将usbhid:quirks = 0x03eb:0x20ff:0x4添加到/ etc / default / grub
  2. ,防止键盘与标准HID驱动程序关联

    如果我手动取消绑定设备并将其绑定到我的驱动程序,那么IRQ不再循环,事实上我确实看到每个按键的不同输入。我使用了https://lwn.net/Articles/143397/

    中的说明