Impedisci la rivendicazione di un nuovo dispositivo USB tramite usbhid in modo da poterlo controllare con libusb?


9

Ho un lanciarazzi USB con cui vorrei sperimentare libusb. Tuttavia, libusb non può rivendicare l'interfaccia; presumibilmente perché l'output degli usb-deviceselenchi 'usbhid' come driver per il dispositivo.

Da leggere su Internet, sono giunto solo alla conclusione che ho bisogno di staccare questo driver dal dispositivo in modo da poterlo usare con libusb. Tuttavia, non ho trovato un modo unico per farlo, solo diverse idee e segnalazioni di bug.

Quindi, c'è un modo per staccare il driver usbhid da un dispositivo che sarebbe rilevante con il kernel e gli strumenti forniti con Ubuntu 11.04?

MODIFICARE:

Ho provato a creare il file

/etc/udev/rules.d/10-usbhid.rules

e scrivendo quanto segue:

ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", OPTIONS=="ignore_device"

Salvataggio, quindi riavvio. Il file è ancora lì, ma non sembra funzionare affatto.

MODIFICARE:

Ok, ho provato questo:

sudo -i
echo -n "0003:0A81:0701.0006" > /sys/bus/hid/drivers/generic-usb/unbind

Dopodiché, navigando su /sys/bus/hid/devices/0003:0A81:0701.0006 e si ottiene:

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

Non elenca più un collegamento simbolico "driver" come in precedenza, quindi suppongo che non sia associato. Tuttavia, tutte le prove sembrano suggerire che il driver sia ancora usbhid. Ad esempio i rendimenti dei dispositivi 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 ritarda ancora -1 su usb_claim_interface () ....

Risposte:


5

Se esegui semplicemente il programma libusb come root,

usb_detach_kernel_driver_np()

funziona davvero come previsto.


2

Penso che dovrai aggiungere l'ID del dispositivo alla udevlista nera in modo che nessun modulo, incluso usbhid, sia collegato ad esso.


Come potrei fare esattamente questo? Perdonate la mia mancanza di esperienza, ma questo link wiki.archlinux.org/index.php/Blacklisting , a cui sono arrivato seguendo una pagina su udev, non sembra essere specificamente associato a udev e in realtà non mi dice come inserire nella blacklist un dispositivo particolare con ID prodotto fornitore.
cemulate

Quella pagina riguarda la lista nera di un modulo da caricare. Non vuoi farlo perché hai bisogno del modulo per tastiera e mouse! Quello che vuoi è impedire a quel particolare dispositivo di associarsi con esso. Mi dispiace, non conosco la regola udev fuori mano. Se ricevo una modifica per cercarla, la aggiungerò alla mia risposta, ma ho pensato di indicarti prima la direzione.
Caleb,

1

Penso che la seguente regola udev farà quello che vuoi:

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'"

Il tuo utente dovrà essere un membro del gruppo plugdev per ottenere l'accesso. Non è necessario eseguire come root con questa regola in atto.


1

Per me (Debian sid / stretch), l' $idattributo udev è vuoto quando collego il mio dispositivo USB. È $kernelquello che contiene la stringa necessaria per passare al unbind di USBHID.

Ecco le regole di udev che sto usando:

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'"

Sostituisci idVendor e idProduct con gli ID del tuo dispositivo, ovviamente.


Per scrivere questo tipo di regole, il seguente comando ti mostrerà tutti gli attributi che puoi usare (per il dispositivo USB dato):

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

Infine, $ide $kernelnon sono variabili shell; vengono sostituiti dal parser udev. Per un elenco completo di queste variabili man udeve cercare %k.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.