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


26

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

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

所以,我尝试了。我能够将键盘与HID解除绑定。这行得通,而且按预期,我无法再键入它。但是,当我尝试将其绑定到驱动程序时,出现“错误:没有这样的设备”,操作失败。

所以我的问题是:如何在内核中将HID设备列入黑名单并提供自己的驱动程序时,如何使用内核绑定/解除绑定操作来复制会发生的情况?-就是说-取代始终需要修补hid-core.c的需要?

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

Answers:


27

好吧,事实证明答案正盯着我。

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

以前,我曾尝试将其与HID解除绑定,但这并不是可行的方法。HID有子驱动程序,它接管了没有专用驱动程序的设备,称为Generic-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

就像我说的那样,盯着我,因为这两个关键的信息是设备绑定时在线上的头两件事……


您是否必须在驱动程序中指定该供应商/产品与您的驱动程序兼容?还是“绑定”只是强制了问题。对于已被列入黑名单的设备,我得到“没有这样的设备”,但我想强制将其绑定,并且我想像该黑名单不仅仅是“防止自动绑定”的想法,而是“防止绑定的数量”什么”类型的事物。
dmansfield

绑定会强制使用它,因此不需要在驱动程序源中声明ID。但是,如果您希望它自动加载。
ali1234年

我遇到麻烦的两个原因:首先-该设备在内核的hid_ignore_list中列出,因此它不会“隐藏”绑定的内容。我必须在内核命令行中添加“ usbhid.quirks = 0x0b0e:0x0412:0x40000000”,然后重新启动。标记0x40000000为“请勿忽略”。其次,ID“ 0003:046D:C229.0036”的最后一部分是'0036'。这代表什么?不确定。找到它的唯一方法(看来)是已将其绑定,然后取消绑定并重新绑定它。
dmansfield,2014年

您找到自动重新绑定的方法了吗?
Vladius

添加了我自己的自动重新绑定解决方案:unix.stackexchange.com/a/475277/96686
Vladius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.