防止usbhid要求拥有新颖的USB设备,以便我可以用libusb控制它吗?


9

我有一个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。

Answers:


5

如果您仅以root身份运行libusb程序,

usb_detach_kernel_driver_np()

实际上按预期工作。


2

我认为您需要将设备ID添加到udev的黑名单中,以便没有模块(包括usbhid)连接到该设备。


我将如何处理?请原谅我缺乏经验,但是我通过跟随udev上的页面到达的链接wiki.archlinux.org/index.php/Blacklisting似乎并没有与udev专门相关,并且实际上并没有告诉我如何将具有供应商产品ID的特定设备列入黑名单。
模拟

该页面是关于将加载模块列入黑名单。您不想这样做,因为您需要键盘和鼠标模块!您想要的是阻止该特定设备与其关联。抱歉,我不知道udev的控制权。如果可以更改查找内容,可以将其添加到我的答案中,但我想我会先指出您的方向。
卡莱布(Caleb)

1

我认为以下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'"

您的用户将需要是plugindev组的成员才能获得访问权限。无需使用此规则就可以以root用户身份运行。


1

对我来说(Debian sid / stretch),$id当我插入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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.