Wiki-Bereiche:

Informationstechnik (IT)
Hobbys

Artikel in diesem Bereich:

Zum Ende der Metadaten springen
Zum Anfang der Metadaten springen

Hier sind meine ersten Erfahrungen mit der USB Programmierung dokumentiert, die beim Auslesen des USB Panic Buttons gesammelt werden konnten.

Besonderheiten bei der Ansteuerung des USB Panic Buttons

Der USB Panic Button ist ein USB HID Gerät, welches von Windows, Linux und Mac OS X direkt beim Anschluß ohne zusätzliche Treiber als solches erkannt wird. So wird z.B. unter Linux das Gerät mittels des Kernelmoduls/-treibers "usbhid" erkannt und über /dev/input/xxx Gerätedateien verfügbar gemacht. Der Panic Button sendet jedoch nicht von selbst USB Nachrichten beim Betätigen des Knopfs. Nach Analyse der USB Datenverkehrs mittels USB Monitoring-Tools unter Windows (siehe weiter unten) zwischen dem USB Panic Button und dem mitgelieferten Windows Programm hat sich herausgestellt, dass der Button aktiv per sogenannten Get_Report-Requests abgefragt werden muss. Get_Report-Request gehören zur Klasse der Class-Specific-Requests - hierzu ein Ausschnitt von Kapitel 7 aus der Device Class Definition for HID 1.11 von usb.org:



Nach Analyse des Datenverkehrs konnten alle Bestandteile des Get_Report-Requests identifiziert werden:

  • bmRequestType: Device to host {{ 10100001 }} 0xA1
  • bRequest: GET_REPORT = 0x01
  • wValue: Report Type (Feature) + Report ID (not used {{ 0x00) }} 0x0300
  • wIndex: Interface Nummer (siehe lsusb oder Sniffer) = 0x0
  • wLength: Datenlänge laut USB Sniffing: 0x8

Es ergibt sich folgendes zusammengesetztes Get_Report-Request:

Als Antwort erhält man 8 Bytes, die bis auf das erste Byte immer 0x00 sind. Das erste Byte ist 0x01, wenn der Button seit dem letzten Auslesen gedrückt wurde. Falls er nicht gedrückt wurde, ist auch diese Byte 0x00.

Taste wurde seit letzter Abfrage nicht gedrückt:

Taste wurde seit letzter Abfrage gedrückt:

Dabei wird der Status im Gerät gespeichert. Auch wenn das Programm, dass den Button ausliest während einer Statusänderung nicht aktiv ist, wird der Status im Gerät festgehalten (natürlich nur, wenn es mit dem USB Port verbunden und mit Strom vesorgt ist). Wenn man den Knopf zwischen zwei Abfragen (pollings) mehrfach betätigt, dann bekommt man als erstes Byte des Feature Reports auch die entsprechende Anzahl, anstatt eine 0x01.

Da für den USB Panic Button schon der im Betriebssystem integrierte USB HID Treiber aktiv ist, kann nicht ohne weiteres mit dem USB Gerät z.B. mit libusb kommuniziert werden. Unter Linux muss z.B. vorher das usbhid Kernelmodul entladen werden (oder von vornherein "geblacklistet" werden). Eine bessere Alternative ist die detach-Funktion (detach_kernel_driver_np()) des Perl-Moduls Dev::USB (bzw. von libusb), welches nur dieses Gerät vom HID-Treiber "entlädt". Auch libhid bietet eine ähnliche Funktion (hid_force_open()), die mit einem bereits verbundenen USB Device umgehen kann.

 Genau dieses Entladen ist auch für eine genauere Analyse eines USB HID Geräts mit "lsusb -vvv ID" nötig.

USB Monitoring unter Windows

Sehr mächtiges USB-Monitoring-Tool

http://www.hhdsoftware.com/Products/home/usb-monitor.html

USB Protocoll Analyzer mit div. Decoding Funktionen (z.B. HID)

http://www.usblyzer.com

Perl-Modul Device::USB::PanicButton zur einfachen Ansteuerung

Im Zuge meiner Experimente mit dem PanicButton ist ein Perl-Modul zur einfachen Ansteuerung entstanden und wurde auch bei CPAN veröffentlicht:

http://search.cpan.org/~bkendi/Device-USB-PanicButton-0.04/

Beispielcode

Einrichtung unter Debian Etch

Ansteuerung mit C und libhid (libusb)

Dokumentation

Tipps

  • Mit "lsusb -vvv" lassen sich Informationen über die HID Struktur eines USB Geräts ermitteln.

Beispielcode

Ansteuerung mit Perl und Device::USB (libusb)

Dokumentation

Beispielcode

Ansteuerung mit CoreFoundation unter Mac OS X

Tools

Dokumentation zur nativen HID Kommunikation unter Mac OS X

Beispielcode

Thorsten Karrer hat mir freundlicherweise seine Basisimplementierung unter Mac OS X als Xcode-Projekt zur Verfügung gestellt. Es ist ein Commandline-Tool ohne Loop, der den Button immer wieder "pollt":

Stichwörter

panicbutton panicbutton Löschen
Geben Sie Stichwörter ein, die dieser Seite hinzugefügt werden sollen:
Please wait 
Sie suchen ein Stichwort? Beginnen Sie einfach zu schreiben.