如何使用Linux内核驱动程序绑定/取消绑定USB-HID设备接口?

如何使用Linux内核驱动程序绑定/取消绑定USB-HID设备接口?

第一个背景。我正在为罗技游戏面板设备开发驱动程序。这是一个带有屏幕的键盘。该驱动程序运行良好,但默认情况下该设备由 HID 处理。为了防止 HID 在我的驱动程序之前接管设备,我可以在 hid-core.c 中将其列入黑名单。这可行,但不是最好的解决方案,因为我正在与几个人一起工作,我们都必须不断修补我们的 HID 模块,这正在成为一件苦差事,特别是因为它经常涉及重建 initramfs 等。

我对这个问题做了一些研究,我发现这个邮件列表帖子,最终带我去LWN 上的这篇文章。这描述了一种在运行时将设备绑定到特定驱动程序的机制。这似乎正是我所需要的。

所以,我尝试了一下。我能够解除键盘与 HID 的绑定。这很有效,正如预期的那样,我无法再在上面打字。但是当我尝试将其绑定到我们的驱动程序时,我收到“错误:没有这样的设备”并且操作失败。

所以我的问题是:如何使用内核绑定/取消绑定操作来复制将 hid-core 中的 HID 设备列入黑名单并提供自己的驱动程序时会发生的情况? - 也就是说 - 替换需要一直打补丁hid-core.c?

我们的驱动程序的来源在这里:https://github.com/ali1234/lg4l

答案1

好吧,事实证明答案就在我面前。

首先,无论是使用我们的自定义驱动程序,还是使用通常接管设备的通用驱动程序,它最终仍然由 HID 控制,而不是 USB。

之前我尝试将其与 HID 解除绑定,但这不是可行的方法。 HID 有子驱动程序,接管没有专门驱动程序的设备的驱动程序称为通用 USB。这就是我在绑定到 hid-g19 之前需要解除绑定的内容。另外,我需要使用看起来像“0003:046d:c229.0036”的 HID 地址,而不是看起来像“1-1.1:1.1”的 USB 地址。

所以在重新绑定之前我会在 dmesg 上看到这个:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

然后我这样做:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

然后我在 dmesg 上看到:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

就像我说的,盯着我的脸,因为这两个关键信息是设备绑定时上线的前两件事......

相关内容