如何将驱动程序与USB设备绑定?

22

我正在为Linux编写一个USB设备驱动程序,它是为了操纵杆而设计的。 每次插入时,Linux都会加载一个HID驱动程序。有没有办法告诉Linux在我插入设备时加载我的驱动程序?或者至少不加载默认的驱动程序吗?

我可以在默认驱动程序的解除绑定(unbind)中将其id输出(echo),并在我的驱动程序的绑定(bind)中将其id输出(echo);但我希望有一些更自动化的方法。 谢谢。


"linux lad a hid driver" 是什么意思? - Marcelo Cantos
@Marcelo Cantos:我认为他的意思是“Linux加载了一个HID驱动程序。” HID = 人机界面设备。 - Amardeep AC9MF
如果你完全可以访问内核源代码树,你可以将驱动程序添加到 drivers/hid/hid-core.c 中的 hid_have_special_driver 数组中。这将导致 hid-generic 忽略该设备。但我非常希望有一种解决方案,可以在不修改现有模块的情况下工作,并且因此适用于通过 DKMS 或类似方式添加的额外模块。不幸的是,针对这种用例似乎没有 usbhid 特例。 - MvG
3个回答

12

自己的USB驱动程序优先于usbhid

如果您想避免绑定到usbhid驱动程序,可以使用它的HID_QUIRK_IGNORE(= 4)设置。按照Karl Bielefeldt所使用的示例,添加以下内容:

options usbhid quirks=0x15c2:0x0043:0x04

将某个设备加入/etc/modprobe.d/*.conf文件中(并重新创建initramfs)。这会告诉hid-core忽略该设备。所以usbhid会查看该设备,但是会将其留给其他驱动程序。

自己的HID驱动程序优先于hid-generic驱动程序

然而,如果您的其他驱动程序是HID驱动程序而不是USB驱动程序,则需要usbhid在USB层级上绑定驱动程序,并且需要您自己的HID驱动程序优先于hid-generic驱动程序。这是我自己面临的问题,至今我还没有找到解决方案,除了稍后取消绑定和重新绑定设备之外。


这个hid-generic重新绑定真是太麻烦了。我纳闷为什么没有人找到更好的解决方案。而且在互联网上几乎没有任何信息,我甚至怀疑是否有人首先为Linux编写驱动程序。 - Vladius

7
这里有一个关于类似问题的修复方法的帖子(链接)。简而言之,您需要在其中一个/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'"

2
udev规则的语法似乎已经发生了变化。现在应该是: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 Fritz

1

在StackOverflow上,不鼓励仅提供链接的答案。答案本身应包含基本有用的信息。链接可以作为参考。 - Craig McQueen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接