Udev 并不总是自动将 usbhid 驱动程序绑定到我的设备

Udev 并不总是自动将 usbhid 驱动程序绑定到我的设备

我有多个运行 Ubuntu 19.10 的系统。
我有一个 USB HID 设备,每个系统都可以检测到该设备
,并且我在所有 3 个系统上使用完全相同的 udev 规则文件 (99-MyDevice.rules):

SUBSYSTEM=="usb",ATTRS{idVendor}=="XXXX",ATTRS{idProduct}=="YYYY",MODE="0660",GROUP="timothy",SYMLINK+="mydevice%n"

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="timothy"

在所有 3 个系统上,设备都正确显示为 /dev/mydevice...

现在,当我执行时,lsusb -t它将输出以下内容:

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=, 12M  

请注意,它Driver是空的,尽管有时,只是时不时地,它实际上会加载驱动程序(这就是我想要的)并输出:

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M  

这样加载驱动程序后,软件就可以检测并使用该设备了。
问题是驱动程序几乎从不自动加载。

到目前为止,我发现了两种手动加载驱动程序的方法(成功与否):

方法一:
我可以使用以下方法手动分配/绑定驱动程序:

echo -n "4-3:1.0" > /sys/bus/usb/drivers/usbhid/bind

此时lsusb -t显示驱动已加载

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M

然后我必须修改aclfor /dev/mydevice... 才能使用它。

请注意,这种方法并不总是有效......感觉充其量是随机的。

方法二:

从逻辑上断开设备与计算机的连接并重新连接。
(而不是物理上断开连接)。我通过安装
VMWare 并将设备连接到来宾系统几秒钟来完成此操作。
设备重新连接到主机后,大多数时候驱动程序会
自动绑定,并且软件可以看到/使用该设备。
(注意,使用这种方法,我不必修改任何acl

一些注意事项:

  • 如果我在带有 Raspbian 的 RaspberryPI 上使用此设备,则不会遇到此问题。
  • 我有多个相同类型的设备,并且所有设备都会出现此问题。
  • Windows 上不会出现此问题
  • Ubuntu 系统虚拟机内的 Windows 上不会出现此问题
  • MacOS 上不会出现此问题
  • 据我记得它也没有发生在旧版本的 Ubuntu 上(不完全确定)
  • 该设备本身基于STM32F4。

知道如何强制usbhid每次都绑定司机吗?

更新:

事实证明,如果在物理连接设备后运行
以下命令,usbhid驱动程序每次都会正确绑定。

sudo rmmod usbhid && sudo modprobe usbhid

请注意,我确实必须rmmod先使用,
简单地运行modprobe并不能解决问题。

所以:

  1. 物理连接:Driver=, 12MB
  2. 运行上面的命令:Driver=usbhid, 12MB

根据这个来源 驱动程序本身选择它支持的设备。

所以我猜测该命令会导致usbhid驱动程序重新评估
它是否可以处理该设备。

现在我仍然需要弄清楚如何自动化它。

答案1

/etc/modules-load.d在/00-my-usbhid.conf中创建一行文件

usbhid

在现代系统上不需要这样做,因为模块是自动加载的,但有时仍然需要强制加载模块。

如果一切都失败,请尝试添加内核启动参数

usbhid.quirks=0x0463:0xffff:0x08

重新启用 NOGET 怪癖看看是否有效。

https://www.cyberciti.biz/faq/linux-how-to-load-a-kernel-module-automatically-at-boot-time/ https://bugzilla.redhat.com/show_bug.cgi?id=1715504 https://github.com/networkupstools/nut/issues/515

相关内容