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 一次锁定一个子驱动程序,但也可能是其他原因。如果您对绕过此问题有见解,那将非常有帮助。谢谢。
好吧,我添加对我有用的答案。所以事实证明hid-generic提供了一个回调函数(内核 5.4.70),即hid_generic_match
接受第二个 bool 参数ignore_special_driver
。如果设置了该值 (ignore_special_driver=1),则匹配函数返回true
并进行探测。此后,hid-generic允许与 ft260 的 uart 接口链接。毕竟usbhid与此无关。
对于我的设置,模块hid-generic和hid-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 驱动程序不会绑定到任一接口。