2016-04-11 5 views
0

Ich habe ein USB-HID-Gerät, das in zwei verschiedenen Modi arbeiten kann. Die Auswahl der Modi basiert auf der Reihenfolge der an sie gesendeten USB-Enumerations-/Initialisierungspakete.Wie kann ich verhindern, dass Linux ein USB-HID-Gerät initialisiert

Ich benutze ein Raspberry Pi 3 mit Raspbian, aber ich sehe auch das gleiche Problem, wenn ich meinen Code für meine Desktop-Ubuntu-Distribution kompilieren.

Das Problem, das ich habe, ist, dass Linux das USB-Gerät als ein HID-Gerät erkennt und dann die Folge von Befehlen sendet, die es für das Starten des Geräts als notwendig erachtet, und das Gerät ordnungsgemäß in "Modus 1" startet.

Allerdings muss ich das Gerät in "Mode 2" starten und dazu muss ich eine etwas andere Anzahl von Enumeration/Initialisierung Befehle senden.

Ich bin neu zu Linux aber sehr erfahren mit LibUSB und LibUSBDotNet unter Windows und kann das Verhalten, das ich unter Windows wünsche.

Windows hat ein ähnliches Verhalten wie Linux, da es aufzählt, das Gerät als USB-HID-Gerät erkennt und es dann so initialisiert, wie es für richtig erachtet wird, wenn das Gerät in "Mode 1" geht. Um zu verhindern, dass Windows dies tut, kann ich einen LibUSB-Filtertreiber für das Gerät erstellen, der dann den Standardtreiber ersetzt, so dass Windows nun die anfängliche Aufzählung durchführt, erkennt, dass die VID und PID des Geräts vom LibUSB-Filtertreiber verwaltet werden als der Windows-HID-Treiber) und dann die Enumeration/Initialisierung stoppen - dies erlaubt meinem Code, die Initialisierung in "Mode 2" zu übernehmen und abzuschließen.

Wie kann ich Linux davon abhalten, dieses Gerät vollständig zu nummerieren/zu initialisieren (wie ich mit Windows). Vielleicht muss ich etwas mit udev-Regeln oder so machen, aber ich hätte keine Ahnung, was ich für Linux neu bin.

Jede Hilfe sehr geschätzt

+0

benutzen, ist von Kernel lösen und Ihre eigene Magie zu tun zu spät für einen Wechsel zu Mode 2? – dryman

Antwort

1

Sie Recht haben, haben Sie mit den udev-Regeln zu spielen.

Zuerst müssen Sie Ihr Gerät identifizieren. Suchen Sie das idProduct und den idVendor Ihres Geräts. Sie können:

lsusb 

dann im rules.d Ordner (/etc/udev/rules.d) erstellen Sie eine neue Datei mit dem Namen:

10-my-usb.rules 

In dieser Datei diese Zeile hinzufügen

SUBSYSTEM=="usb",ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", MODE="666", GROUP+="plugdev" 

Ersetzen Sie die XXXX mit dem Wert, den Sie erhalten, bevor

dann Ihre udev-Regeln neu starten:

sudo udevadm trigger 

Dann ziehen und replug normalerweise können Sie es

Verwandte Themen