我正在Linux上编写一个USB驱动程序(用于游戏手柄),插入后会加载usbhid。如何使其加载我的驱动程序(gp_driver)?
我尝试了解绑usbhid并绑定到我的驱动程序的技巧,但我不想每次都这样做。
我应该已经加载了我的驱动程序吗?
我需要在我的驱动程序中编写一些代码吗?
我在我的驱动程序中有供应商和产品ID。
谢谢。
引用自:http://plugcomputer.org/plugwiki/index.php/Load_Serial_Drivers_Automatically_Using_udev
# if no driver has claimed the interface yet, load ftdi_sio
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \
ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", \
DRIVER=="", \
RUN+="/sbin/modprobe -b ftdi_sio"
drivers/hid/hid-core.c
文件,因为该文件包含了一个设备列表,这些设备不应由hid-generic
(hid_have_special_driver
结构)处理。您可以在此处查看如何完成此操作的示例:
https://github.com/atar-axis/xpadneo/blob/master/misc/kernel_patches/0002-hid_generic_claims_devices.patch
hid-generic
会检查其他驱动程序是否想要该设备,如果是,则hid-generic
会退后并不会声明该设备。相关补丁是:https://github.com/torvalds/linux/commit/e04a0442d33b8cf183bba38646447b891bb02123#diff-88d50bd989bbdf3bbd2f3c5dcd4edcb9
解决方法(始终有效):/etc/udev/rules.d/99-xpadneo.rules
),无论是在4.16之前还是在系统中有多个专用驱动程序时。# unbind the device from hid-generic on kernel < 4.16
# and bind it to the specialized driver (xpadneo in this case)
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/hid-generic/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"
# unbind the device from another specialized driver which came first
# and bind it to xpadneo
ACTION=="add", KERNEL=="0005:045E:02FD.*|0005:045E:02E0.*", SUBSYSTEM=="hid",\
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/microsoft/unbind'", \
RUN+="/bin/bash -c 'echo $kernel > /sys/bus/hid/drivers/xpadneo/bind'"
sh
而不是bash
bind
和unbind
是什么时候添加的,但是很久以前了。根据这篇Linux Journal文章,您需要拥有:
现在,我怀疑,因为它正在加载标准驱动程序,您可能没有3、4,或者您根本没有将驱动程序注册到USB子系统。
我以前从未编写过USB驱动程序(仅hack过char/mem.c),但这些信息可能会派上用场。