我有多个运行 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
然后我必须修改acl
for /dev/mydevice... 才能使用它。
请注意,这种方法并不总是有效......感觉充其量是随机的。
方法二:
从逻辑上断开设备与计算机的连接并重新连接。
(而不是物理上断开连接)。我通过安装
VMWare 并将设备连接到来宾系统几秒钟来完成此操作。
设备重新连接到主机后,大多数时候驱动程序会
自动绑定,并且软件可以看到/使用该设备。
(注意,使用这种方法,我不必修改任何acl
)
一些注意事项:
- 如果我在带有 Raspbian 的 RaspberryPI 上使用此设备,则不会遇到此问题。
- 我有多个相同类型的设备,并且所有设备都会出现此问题。
- Windows 上不会出现此问题
- Ubuntu 系统虚拟机内的 Windows 上不会出现此问题
- MacOS 上不会出现此问题
- 据我记得它也没有发生在旧版本的 Ubuntu 上(不完全确定)
- 该设备本身基于STM32F4。
知道如何强制usbhid
每次都绑定司机吗?
更新:
事实证明,如果在物理连接设备后运行
以下命令,usbhid
驱动程序每次都会正确绑定。
sudo rmmod usbhid && sudo modprobe usbhid
请注意,我确实必须rmmod
先使用,
简单地运行modprobe
并不能解决问题。
所以:
- 物理连接:
Driver=, 12MB
- 运行上面的命令:
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