注册(/绑定/匹配)设备与驱动程序

4
我正在Linux上编写一个USB驱动程序(用于游戏手柄),插入后会加载usbhid。如何使其加载我的驱动程序(gp_driver)? 我尝试了解绑usbhid并绑定到我的驱动程序的技巧,但我不想每次都这样做。 我应该已经加载了我的驱动程序吗? 我需要在我的驱动程序中编写一些代码吗? 我在我的驱动程序中有供应商和产品ID。 谢谢。

这对我来说已经不相关很长一段时间了。我不确定选择哪一个作为被接受的答案,但有一种方式可以表明这不再是我的选择。这样做有意义吗?感谢所有在这里回答的人! :) - pvinis
3个回答

4
你需要为设备创建一个udev规则,这可以负责创建设备文件、设置设备文件的权限和加载相关驱动程序。

资源

例子

引用自: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"

2
将(在您的情况下是HID-)设备绑定到特定驱动程序并不是一项简单的任务,这取决于您使用的内核版本:

内核版本小于4.16

在内核版本4.16之前,您需要编辑和重新编译drivers/hid/hid-core.c文件,因为该文件包含了一个设备列表,这些设备不应由hid-generichid_have_special_driver结构)处理。您可以在此处查看如何完成此操作的示例: https://github.com/atar-axis/xpadneo/blob/master/misc/kernel_patches/0002-hid_generic_claims_devices.patch

内核版本大于等于4.16

从Kernel 4.16开始,该列表已被删除,并且hid-generic会检查其他驱动程序是否想要该设备,如果是,则hid-generic会退后并不会声明该设备。相关补丁是:https://github.com/torvalds/linux/commit/e04a0442d33b8cf183bba38646447b891bb02123#diff-88d50bd989bbdf3bbd2f3c5dcd4edcb9 解决方法(始终有效):
您可以始终使用udev规则(例如/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
  • 我不记得bindunbind是什么时候添加的,但是很久以前了。

您可以在这里阅读更多关于(HID-)驱动程序的加载绑定注册的信息:

1

根据这篇Linux Journal文章,您需要拥有:

  1. 指向驱动程序所有者的指针
  2. USB驱动程序的名称
  3. 此驱动程序应提供的USB ID列表
  4. 一个探测(probe())功能
  5. 一个断开连接(disconnect())功能

现在,我怀疑,因为它正在加载标准驱动程序,您可能没有3、4,或者您根本没有将驱动程序注册到USB子系统。

我以前从未编写过USB驱动程序(仅hack过char/mem.c),但这些信息可能会派上用场。


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