2016-11-26 104 views
0

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

我所做的:

  1. 制成的/linux/driver/hid/usbhid/usbkbd.clink副本,并修改usb_kbd_id_table只具有销售商ID以及与我的键盘相关的产品ID。
  2. 构建修改后的驱动程序。
  3. 插入修改后的驱动程序sudo insmod usbkbd.ko
  4. 通过将usbhid:quirks=0x03eb:0x20ff:0x4添加到/etc/default/grub,防止键盘与标准HID驱动程序相关联。

行为:

  1. 在键盘堵漏,它是正确与我的司机有关。我知道这是因为我看到printk声明,我在usb_kbd_probe中添加了/var/log/syslog。它实际上显示了两次,因为该设备有2个接口。
  2. 函数usb_kbd_irq在循环中重复调用。我在这里也添加了一个printk,我看到kbd->new在每个字节中总是有0
  3. 该循环快速继续,按下任何按键都不起作用(无论按下哪个按键,每个字节中的kbd->new总是有0)。

我已经尝试使用wireshark查看USB交通,我看到主机和设备来回。我期待着单向的交通。 wireshark screenshot

我很困惑为什么按键没有效果。如果按键被按下,我不应该在kbd->new中看到一些数据吗?

编辑:截屏与设备信息在https://i.stack.imgur.com/lNq4e.png

回答

0

的问题是与我解离与通用USBHID驱动程序的设备的方式。列在上述套4:

  • 从通过添加USBHID与标准HID驱动器被关联防止键盘:怪癖= 0x03eb:0x20ff:为0x4到/ etc /默认/蛴螬
  • 如果我改为手动取消绑定设备并将其绑定到我的驱动程序,那么IRQ不会再循环,而且实际上每次按键都会看到不同的输入。我用这里找到的说明https://lwn.net/Articles/143397/