我有一个 USB 火箭发射器,我希望通过libusb
.然而,libusb 不能声明该接口;大概是因为输出将usb-devices
“usbhid”列为设备的驱动程序。
通过在互联网上阅读,我得出的结论是,我需要将该驱动程序与设备分离,以便我可以将其与 libusb 一起使用。然而,我还没有找到一个明确的方法来做到这一点,只有几种不同的想法和错误报告。
那么,有没有办法将 usbhid 驱动程序从与 Ubuntu 11.04 提供的内核和工具相关的设备中分离出来?
编辑:
我尝试创建文件
/etc/udev/rules.d/10-usbhid.rules
并写下以下内容:
ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", OPTIONS=="ignore_device"
保存,然后重新启动。该文件仍然存在,但它似乎根本不起作用。
编辑:
好的,我尝试了这个:
sudo -i
echo -n "0003:0A81:0701.0006" > /sys/bus/hid/drivers/generic-usb/unbind
之后,导航到 /sys/bus/hid/devices/0003:0A81:0701.0006 并 ls 产生:
drwxr-xr-x 2 root root 0 2011-05-29 15:46 power
lrwxrwxrwx 1 root root 0 2011-05-29 13:19 subsystem -> ../../../../../../../../../bus/hid
-rw-r--r-- 1 root root 4096 2011-05-29 13:19 uevent
它不再像以前那样列出“驱动程序”符号链接,所以我假设它解除了它的绑定。然而,所有证据似乎都表明驱动程序仍然是usbhid。例如 usb-devices 产量:
T: Bus=02 Lev=03 Prnt=07 Port=00 Cnt=01 Dev#= 9 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0a81 ProdID=0701 Rev=00.01
S: Manufacturer=Dream Link
S: Product=USB Missile Launcher v1.0
C: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
libusb 仍然在 usb_claim_interface() 上重新调整 -1....
答案1
如果您只是以 root 身份运行 libusb 程序,
usb_detach_kernel_driver_np()
实际上按预期工作。
答案2
我认为您需要将设备 ID 添加到udev
的黑名单中,以便没有模块(包括 usbhid)附加到它。
答案3
我认为以下 udev 规则将满足您的要求:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", MODE="0660", GROUP="plugdev", RUN="/bin/sh -c 'echo -n $id:1.0 > /sys/bus/usb/drivers/usbhid/unbind'"
您的用户需要成为 Plugdev 组的成员才能获得访问权限。有了此规则,无需以 root 身份运行。
答案4
$id
对于我(Debian sid/stretch)来说,当我插入 USB 设备时,udev属性为空。它$kernel
包含传递给 USBHID 解除绑定所需的字符串。
以下是我正在使用的 udev 规则:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", MODE="0660", GROUP="plugdev"
ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", DRIVER="usbhid", RUN="/bin/sh -c 'echo -n $kernel >/sys/bus/usb/drivers/usbhid/unbind'"
当然,请将 idVendor 和 idProduct 替换为您设备的 ID。
为了编写这些类型的规则,以下命令将显示您可以使用的所有属性(对于给定的 USB 设备):
udevadm info -a /sys/bus/usb/devices/1-3:1.0/
最后,$id
和$kernel
不是 shell 变量;它们被 udev 解析器取代。有关这些变量的完整列表,man udev
请搜索%k
.