Verhindern Sie, dass usbhid ein neues USB-Gerät beansprucht, damit ich es mit libusb steuern kann?

9

Ich habe einen USB-Raketenwerfer, mit dem ich experimentieren möchte libusb. Libusb kann die Schnittstelle jedoch nicht beanspruchen. vermutlich weil die Ausgabe von usb-devicesListen 'usbhid' als Treiber für das Gerät.

Durch das Lesen im Internet bin ich nur zu dem Schluss gekommen, dass ich diesen Treiber vom Gerät trennen muss, damit ich ihn mit libusb verwenden kann. Ich habe jedoch keinen einzigen endgültigen Weg gefunden, nur einige verschiedene Ideen und Fehlerberichte.

Gibt es also eine Möglichkeit, den USBBID-Treiber von einem Gerät zu trennen, das für den Kernel und die mit Ubuntu 11.04 gelieferten Tools relevant ist?

BEARBEITEN:

Ich habe versucht, die Datei zu erstellen

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

und schreiben Sie Folgendes:

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

Speichern, dann neu starten. Die Datei ist noch vorhanden, scheint aber überhaupt nicht zu funktionieren.

BEARBEITEN:

Okay, ich habe es versucht:

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

Wenn Sie danach zu /sys/bus/hid/devices/0003:0A81:0701.0006 navigieren, erhalten Sie:

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

Es wird kein "Treiber" -Symlink mehr wie zuvor aufgelistet, daher würde ich davon ausgehen, dass er nicht mehr gebunden ist. Alle Beweise scheinen jedoch darauf hinzudeuten, dass der Fahrer immer noch usbhid ist. Zum Beispiel ergibt USB-Geräte:

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 wiederholt -1 auf usb_claim_interface () ....

cemulieren
quelle

Antworten:

5

Wenn Sie das libusb-Programm einfach als root ausführen,

usb_detach_kernel_driver_np()

funktioniert tatsächlich wie erwartet.

cemulieren
quelle
2

Ich denke, Sie müssen die Geräte-ID zur udevBlacklist hinzufügen , damit kein Modul, einschließlich usbhid, daran angehängt wird.

Caleb
quelle
Wie genau würde ich das machen? Verzeihen Sie meine mangelnde Erfahrung, aber dieser Link wiki.archlinux.org/index.php/Blacklisting , den ich durch Folgen einer Seite auf udev erhalten habe, scheint nicht spezifisch mit udev verbunden zu sein und sagt mir eigentlich nicht, wie Blacklist eines bestimmten Geräts mit der Produkt-ID des Herstellers.
Cemulate
Auf dieser Seite geht es darum, ein Modul vom Laden auf die schwarze Liste zu setzen. Sie möchten das nicht tun, weil Sie das Modul für Ihre Tastatur und Maus benötigen! Sie möchten verhindern, dass dieses bestimmte Gerät mit ihm verbunden wird. Es tut mir leid, dass ich die udev-Regel nicht sofort kenne. Wenn ich eine Änderung bekomme, um sie nachzuschlagen, füge ich sie meiner Antwort hinzu, aber ich dachte, ich würde Sie zuerst in die Richtung weisen.
Caleb
1

Ich denke, dass die folgende udev-Regel tun wird, was Sie wollen:

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

Ihr Benutzer muss Mitglied der Plugdev-Gruppe sein, um Zugriff zu erhalten. Mit dieser Regel muss nicht als Root ausgeführt werden.

Davefiddes
quelle
1

Für mich (Debian Sid / Stretch) ist das udev- $idAttribut leer, wenn ich mein USB-Gerät anschließe. Es $kernelenthält die erforderliche Zeichenfolge, die zum Aufheben der Bindung von USBHID übergeben werden soll.

Hier sind die udev-Regeln, die ich verwende:

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

Ersetzen Sie den idVendor und das idProduct natürlich durch die IDs Ihres Geräts.


Zum Schreiben dieser Art von Regeln zeigt der folgende Befehl alle Attribute an, die Sie verwenden können (für das angegebene USB-Gerät):

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

Schließlich $idund $kernelsind keine Shell-Variablen; Sie werden durch den udev-Parser ersetzt. Für eine vollständige Liste dieser Variablen man udevund suchen Sie nach %k.

Jander
quelle