Предотвратить использование 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

Он больше не отображает символьную ссылку «драйвер», как это было раньше, поэтому я предполагаю, что она не связана с ней. Тем не менее, все свидетельства указывают на то, что водитель все еще находится в спине. Например, usb-устройства выдают:

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 все еще возвращает -1 в usb_claim_interface () ....

cemulate
источник

Ответы:

5

Если вы просто запустите программу libusb от имени пользователя root,

usb_detach_kernel_driver_np()

на самом деле работает, как ожидалось.

cemulate
источник
2

Я думаю, вам нужно добавить идентификатор устройства в udevчерный список, чтобы к нему не подключался ни один модуль, включая usbhid.

Калеб
источник
Как именно я пошел бы об этом? Извините, что у меня нет опыта, но эта ссылка wiki.archlinux.org/index.php/Blacklisting , на которую я попал, следя за страницей на udev, не связана конкретно с udev и фактически не говорит мне, как черный список конкретного устройства с идентификатором продукта поставщика.
Семьюлировать
Эта страница о внесении в черный список загрузки модуля. Вы не хотите этого делать, потому что вам нужен модуль для клавиатуры и мыши! То, что вы хотите, это чтобы это устройство не связывалось с ним. Мне жаль, что я не знаю правила udev от руки. Если мне удастся найти изменения, я добавлю их в свой ответ, но я подумал, что сначала укажу вам направление.
Калеб
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'"

Ваш пользователь должен быть членом группы plugdev, чтобы получить доступ. Нет необходимости запускать с правами root с этим правилом.

davefiddes
источник
1

Для меня (Debian sid / stretch) $idатрибут udev пуст, когда я подключаю свое USB-устройство. Это $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 на идентификаторы вашего устройства.


Для написания таких правил следующая команда покажет вам все атрибуты, которые вы можете использовать (для данного устройства USB):

udevadm info -a /sys/bus/usb/devices/1-3:1.0/

Наконец, $idи $kernelне являются переменными оболочки; их заменяет парсер udev. Для получения полного списка этих переменных man udevи поиска %k.

Jander
источник