Empêcher la revendication de périphérique USB de nouveauté par usbhid afin que je puisse le contrôler avec libusb?

9

J'ai un lance-roquettes USB que je souhaite expérimenter libusb. Cependant, libusb ne peut pas revendiquer l'interface; probablement parce que la sortie des usb-deviceslistes «usbhid» comme pilote pour le périphérique.

Après avoir lu sur Internet, je suis seulement arrivé à la conclusion que je dois détacher ce pilote de l'appareil afin de pouvoir l'utiliser avec libusb. Cependant, je n'ai trouvé aucun moyen définitif de le faire, seulement plusieurs idées et rapports de bogues différents.

Alors, existe-t-il un moyen de détacher le pilote usbhid d'un périphérique qui serait pertinent avec le noyau et les outils fournis avec Ubuntu 11.04?

ÉDITER:

J'ai essayé de créer le fichier

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

et en écrivant ce qui suit:

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

Sauvegarde, puis redémarrage. Le fichier est toujours là, mais il ne semble pas fonctionner du tout.

ÉDITER:

D'accord, j'ai essayé ceci:

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

Après cela, la navigation vers /sys/bus/hid/devices/0003:0A81:0701.0006 et ls donne:

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

Il ne répertorie plus un lien symbolique de "pilote" comme il le faisait auparavant, donc je suppose qu'il l'a dissocié. Cependant, toutes les preuves semblent suggérer que le conducteur est encore usbhid. Par exemple, les périphériques USB produisent:

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 retuns toujours -1 sur usb_claim_interface () ....

cemuler
la source

Réponses:

5

Si vous exécutez simplement le programme libusb en tant que root,

usb_detach_kernel_driver_np()

fonctionne réellement comme prévu.

cemuler
la source
2

Je pense que vous devrez ajouter l'identifiant de l'appareil à udevla liste noire de sorte qu'aucun module, y compris usbhid, ne s'y attache.

Caleb
la source
Comment pourrais-je m'y prendre exactement? Excusez mon manque d'expérience, mais ce lien wiki.archlinux.org/index.php/Blacklisting , auquel j'ai pu accéder en suivant une page sur udev, ne semble pas être spécifiquement associé à udev et ne me dit pas vraiment comment liste noire un appareil particulier avec l'ID du produit du fournisseur.
cimetière
Cette page concerne la mise sur liste noire d'un module en cours de chargement. Vous ne voulez pas faire ça parce que vous avez besoin du module pour votre clavier et votre souris! Ce que vous voulez, c'est empêcher cet appareil particulier de s’associer à lui. Je suis désolé, je ne connais pas la règle udev. Si j'obtiens un changement pour le rechercher, je l'ajouterai à ma réponse, mais je pensais que je vous indiquerais d'abord la direction.
Caleb
1

Je pense que la règle udev suivante fera ce que vous voulez:

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

Votre utilisateur devra être membre du groupe plugdev pour y accéder. Il n'est pas nécessaire de s'exécuter en tant que root avec cette règle en place.

davefiddes
la source
1

Pour moi (Debian Sid / Stretch), l' $idattribut udev est vide lorsque je branche mon périphérique USB. Il $kernelcontient la chaîne nécessaire pour passer à la dissociation USBHID.

Voici les règles udev que j'utilise:

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

Remplacez bien sûr idVendor et idProduct par les ID de votre appareil.


Pour écrire ce genre de règles, la commande suivante vous montrera tous les attributs que vous pouvez utiliser (pour le périphérique USB donné):

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

Enfin, $idet $kernelne sont pas des variables shell; ils sont remplacés par l'analyseur udev. Pour une liste complète de ces variables man udevet recherchez %k.

Jander
la source