如何将 hid 通用驱动程序绑定到由不同 hid 驱动程序采用的 hid 接口?

Sdi*_*dig 5 drivers usb kernel-modules bind hid

我面临的问题的简短背景。我正在致力于使用 USB 桥接器 FT260 实现同步 UART/I2C 操作。该芯片依靠 HID 报告来提供这些功能。插入后,hid 通用驱动程序会检测两个接口:0 和 1,第一个用于 I2C,第二个用于 UART。目前,我有支持 I2C的 FT260 驱动程序,仅作为模块加载(即hid-ft260),并且工作正常。然后后者接管了 hid-generic,我认为usbhid对此负责。lsusb -t返回:

|__ Port 2: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 12M
Run Code Online (Sandbox Code Playgroud)

dmesg启动时显示如下:

hid-generic 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
ft260 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input
ft260 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input
Run Code Online (Sandbox Code Playgroud)

对于 UART,我必须使用与 hid-generic 配合使用的应用程序。虽然 I2C 的驱动程序可以扩展以支持 UART,也许作为虚拟 COM 端口,但这并不是那么简单(至少我认为),而且我有一个工作代码,我想使用它并继续处理其余部分项目。

当我尝试使用以下命令取消绑定接口 UART 时:

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/ft260/unbind
Run Code Online (Sandbox Code Playgroud)

我可以看到绑定消失了。但是,当我尝试将确切的接口(如果为 1)绑定到hid-generic时

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/hid-generic/bind
Run Code Online (Sandbox Code Playgroud)

我得到:

-bash: echo: write error: No such device
Run Code Online (Sandbox Code Playgroud)

尽管当我使用以下命令卸载模块 hid-ft260 时,hid-generic 会自动加载(热插拔):

modprobe -r hid-ft260
Run Code Online (Sandbox Code Playgroud)

听起来好像 usbhid 根据 PID 和 VID 一次锁定一个子驱动程序,但也可能是其他原因。如果您对绕过此问题有见解,那将非常有帮助。谢谢。

Sdi*_*dig 2

好吧,我添加对我有用的答案。所以事实证明hid-generic提供了一个回调函数(内核 5.4.70),即hid_generic_match接受第二个 bool 参数ignore_special_driver。如果设置了该值 (ignore_special_driver=1),则匹配函数返回true并进行探测。此后,hid-generic允许与 ft260 的 uart 接口链接。毕竟usbhid与此无关。

对于我的设置,模块hid-generichid-ft260在重新启动后启动,并使用hid-ft260控制两个接口。因此,为了解决上面发布的问题,我执行以下操作:

echo 1 > /sys/module/hid/parameters/ignore_special_drivers
echo -n "0003:0403:6030.0002" > /sys/bus/hid/drivers/ft260/unbind
Run Code Online (Sandbox Code Playgroud)

由于热插拔,在可用的 HID-UART 接口上成功探测到 hid-generic:

hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input1
Run Code Online (Sandbox Code Playgroud)

绑定也可以检查为:

root@root:~# ls /sys/bus/hid/drivers/ft260/
0003:0403:6030.0001  bind  module  new_id  uevent  unbind
root@root:~# ls /sys/bus/hid/drivers/hid-generic/
0003:0403:6030.0002  bind  module  new_id  uevent  unbind
Run Code Online (Sandbox Code Playgroud)

udev可以创建规则来自动执行此操作。

备注:如果ignore_special_driver=1在探测hid-ft260之前,尽管 VID 和 PID 匹配,但 ft260 驱动程序不会绑定到任一接口。