我正在为Linux编写一个USB设备驱动程序,它是为了操纵杆而设计的。 每次插入时,Linux都会加载一个HID驱动程序。有没有办法告诉Linux在我插入设备时加载我的驱动程序?或者至少不加载默认的驱动程序吗?
我可以在默认驱动程序的解除绑定(unbind)中将其id输出(echo),并在我的驱动程序的绑定(bind)中将其id输出(echo);但我希望有一些更自动化的方法。 谢谢。
如果您想避免绑定到usbhid
驱动程序,可以使用它的HID_QUIRK_IGNORE
(= 4)设置。按照Karl Bielefeldt所使用的示例,添加以下内容:
options usbhid quirks=0x15c2:0x0043:0x04
将某个设备加入/etc/modprobe.d/*.conf
文件中(并重新创建initramfs)。这会告诉hid-core
忽略该设备。所以usbhid
会查看该设备,但是会将其留给其他驱动程序。
然而,如果您的其他驱动程序是HID驱动程序而不是USB驱动程序,则需要usbhid
在USB层级上绑定驱动程序,并且需要您自己的HID驱动程序优先于hid-generic
驱动程序。这是我自己面临的问题,至今我还没有找到解决方案,除了稍后取消绑定和重新绑定设备之外。
/etc/udev/rules.d
文件中添加以下内容:SYSFS{idVendor}=="15c2", SYSFS{idProduct}=="0043", MODE="0666", PROGRAM="/bin/sh -c 'echo -n $id:1.0 >/sys/bus/usb/drivers/usbhid/unbind;\
echo -n $id:1.1 >/sys/bus/usb/drivers/usbhid/unbind'"
SUBSYSTEM=="usb" ATTR{idVendor}=="15c2", ATTR{idProduct}=="0043", MODE="0666", PROGRAM="/bin/sh -c 'echo -n $id:1.0 >/sys/bus/usb/drivers/usbhid/unbind; echo -n $id:1.1 >/sys/bus/usb/drivers/usbhid/unbind'"
。请注意,这也适用于其他驱动程序,例如uvcvideo
,而不仅仅是usbhid
。 - Christian Fritzhttp://lwn.net/Articles/143397/与上面的回答非常相似,可能会提供更多细节。
drivers/hid/hid-core.c
中的hid_have_special_driver
数组中。这将导致hid-generic
忽略该设备。但我非常希望有一种解决方案,可以在不修改现有模块的情况下工作,并且因此适用于通过 DKMS 或类似方式添加的额外模块。不幸的是,针对这种用例似乎没有usbhid
特例。 - MvG