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)

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
- Webseite der libhid Bibliothek
zur USB HID Kommunikation basierend auf libusb
.
- Verschiedene offizielle Dokumentationen und Tools zur USB HID
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
- Mac OS X USB Treiber mit aktiviertem Logging und zusätzlichem USB Prober Tools: IOUSBFamily Log release for Mac OS X 10.5.3 Build 9D34 Download

Dokumentation zur nativen HID Kommunikation unter Mac OS X
- Introduction to Working With HID Class Device Interfaces

- New HID Manager APIs for Mac OS X version 10.5

- Direkter Link zur Dokumentation von IOHIDDevice

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":
- Download: PanicButtonHID.zip
