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

ali*_*234 29 linux drivers kernel development usb

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

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

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

所以我的问题是:如何使用内核绑定/取消绑定操作来复制当您将 hid-core 中的 HID 设备列入黑名单并提供您自己的驱动程序时会发生什么?- 即 - 取代一直修补 hid-core.c 的需要?

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

ali*_*234 30

好吧,原来答案是盯着我的脸。

首先,无论是使用我们的自定义驱动程序,还是使用通常接管设备的通用驱动程序,它最终仍然都是由 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
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

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
Run Code Online (Sandbox Code Playgroud)

然后我在 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
Run Code Online (Sandbox Code Playgroud)

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