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

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

我面临的问题的简短背景。我正在致力于使用 USB 桥接器 FT260 实现同步 UART/I2C 操作。该芯片依靠 HID 报告来提供这些功能。插入后,hid 通用驱动程序会检测两个接口:0 和 1,第一个用于 I2C,第二个用于 UART。目前,我有FT260驱动程序支持I2C仅有的作为模块加载(即隐藏 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

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

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

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

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/ft260/unbind

我可以看到绑定消失了。但是,当我尝试将确切的接口(如果为 1)绑定到隐藏通用

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/hid-generic/bind

我得到:

-bash: echo: write error: No such device

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

modprobe -r hid-ft260

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

答案1

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

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

echo 1 > /sys/module/hid/parameters/ignore_special_drivers
echo -n "0003:0403:6030.0002" > /sys/bus/hid/drivers/ft260/unbind

由于热插拔,在可用的 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

绑定也可以检查为:

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

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

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

相关内容