Grundlagen



USB HID Geräte werden heutzutage oft verwendet und sind vor allem als Maus, Tastatur oder Joystick bekannt.

Man kann sie aber auch zum individuellen Datenaustausch, ähnlich einer serielle Schnittstelle (RS232), verwenden. Der große Vorteil ist, daß kein spezieller Treiber auf Seiten von Windows benötigt wird und die HID Geräte somit sofort einsatzbereit sind.

Lediglich die Programmierung der HID Schnittstelle auf PC Seite ist nicht ganz einfach. Umfangreiche USB Kenntnisse werden benötigt, um einen Treiber selbst zu entwickeln. Oder man verwendet eines der viele Open Source Projekte für die Treiber-Entwicklung. Aber auch das ist nicht ganz einfach, aufgrund der oftmals sehr umfangreichen APIs. Hinzu kommt, daß die meisten APIs ausschließlich C++ unterstützen. Verwendet man eine andere Sprache, dann hat man Pech gehabt.

Aber alle diese Probleme werden von der AHid.dll gelöst!

Die folgenden Abschnitte befassen sich mit den Grundlagen der AHid.dll und beschreiben, wie ein HID Geräte an die AHid.dll und somit an den PC angebunden wird. Dabei wird speziell auf die wenigen Vorraussetzungen eigegangen, die Ihre HID Geräte dazu erfüllen müssen.

Berichte, Deskriptoren und IDs


Prinzipiell werden HID Geräte mit bestimmten Eigenschaften verknüpft. Eine Maus überträgt ihre Position und den Zustand der Knöpfe und eine Tastatur gibt Auskunft über seine Tasten.

Diese Daten werden in sog. Berichten (Reports) zwischen dem HID Gerät und dem PC ausgetauscht. Die Berichte wiederum werden in Berichts-Deskriptoren definiert.

Berichts-Deskriptoren beschreiben also die Daten, die zwischen Gerät und PC ausgetauscht werden. Für Maus und Tastatur, sowie viele weitere Geräte, finden sich die Deskriptoren in der HID Spezifikation. Damit weiß der PC nun, wie er mit den entsprechenden Daten umzugehen hat.

Das Konzept der Berichte und deren Definition durch Berichts-Deskriptoren ermöglicht aber auch das Hinzufügen neuer Konfigurationen (der Fantasie sind dabei keine Grenzen gesetzt). Und genau das macht man sich zu Nutze, bei der Verwendung eines HID Gerätes als allgemeine serielle Schnitstelle.

Hersteller-definierte Geräte

Da sich die Eigenschaften eines Berichts, also der zu übertragenden Daten, frei definieren lassen, kann man sie einfachheitshalber auch gleich ganz weglassen.

Der folgende Bild zeigt einen einfachen Berichts-Deskriptor zur Verwendung mit der AHid.dll:

Bild 1: Berichtsdeskriptor für ein Hersteller-definiertes HID Gerät

Die Elemente eines solchen Deskriptors treten immer paarweise auf: Zuerst kommt der Element-Typ und danach folgt sein Wert, der aus einem oder mehreren Bytes bestehen kann. Im obigen Beispiel haben fast alle Werte eine Größe von einem Byte, mit Ausnahme von Usage Table (Typ = 0x06, 2 Bytes), Logical Maximum (Typ = 0x26, 2 Bytes) und End Collection (Typ = 0xC0, kein Byte).

Die wesentlichen Elemente im Zusammenhang mit der AHid.dll sind Report ID, Report Count, Report Size, sowie Input und Output und werden im Folgenden genauer betrachtet. Ausführliche Informationen zu den HID Berichts-Deskriptoren finden Sie in der HID Spezifikation auf usb.org.

Berichts-ID, -Größe und -Typ

Um ein HID Gerät mit der AHid.dll verwenden zu können, werden einige Parameter benötigt, die die sich u.a. im Berichts-Deskriptor finden. Hierzu gehören die Berichts-ID, die Größe des Berichts (Report Size und Report Count), sowie der Berichts-Typ (Input oder Output).

Die Berichts-ID des Output-Berichts aus Bild 1 hat den Wert 1. Die des Input-Berichts hat den Wert 2.

Die Größe der Berichte errechnet sich aus Report Size und Report Count. Dabei gibt Report Count die Anzahl der Daten an und Report Size steht für die Bitanzahl der Daten (hier 8): Das ergibt für den Output-Bericht eine Größe von 63 * 8 Bit = 63 Bytes und für den Input Bericht eine Größe von 31 Bytes.

Die Berichts-Typen beschreiben die Übertragungsrichtung der Daten, und zwar aus sicht des PC. Der Output Bericht wird also vom PC an das HID Gerät (aus)gesendet und der Input Bericht vom PC (ein)gelesen, also vom HID Gerät an den PC gesendet.

Drei wichtige Parameter für die AHid.dll sind somit identifiziert: Berichts-ID, Berichts-Größe und Übertragungsrichtung.

Einfacher ohne ID

Übrigens kann man auch die Berichts-ID einfach weglassen indem man in Bild 1 die beiden Zeilen mit dem Elementtyp 0x85 entfernt. Das hat den Vorteil, daß die Berichts-ID nicht mit übertragen werden muß. Hierfür wird nämlich normalerweise das erste Byte der Berichtsdaten reserviert. Wenn keine ID definiert wurde, dann wird diese auch nicht übertragen und die Anzahl der nutzbaren Daten erhöht sich um 1 Byte.

VID und PID

Ausser den Angaben im Berichts-Deskriptor werden noch zwei weitere Parameter benötigt, um eine Verbindung zwischen HID Gerät und PC herzustellen: Die VID (Vendor ID, Hersteller-ID) und die PID (Product ID, Produkt-ID).

Bild 2: HID Gerät im Windows Geräte Manager

Die VID wird von der USB IF vergeben und ist von Hersteller zu Hersteller verschieden. Die PID wiederum vergibt der Hersteller selber. Sie ist einem Produkt zugeordnet. Beide Angaben können Sie dem Windows Geräte-Manager entnehmen. Öffnen Sie dazu den Geräte Manager und wählen Sie das HID Gerät aus. Bei den Details finden Sie die Informationen.

Die VID des HID Gerätes in Bild 2 hat den Wert 0xFFFF, die PID ist 0x0005.

Zusammenfassung

In den vorigen Abschnitten haben wir die Parameter des HID Gerätes ermittelt. Diese Parameter werden mit der Funktionen AHid_Register() an die AHid.dll übermittelt. Als Ergebnis erhält man zwei Verbindungen zum HID Gerät:

AHid_Register(&output, 0xFFFF, 0x0005, -1, 1, 63, AHID_REPTYPE_INT_OUT)
AHid_Register(&input, 0xFFFF, 0x0005, -1, 2, 31, AHID_REPTYPE_INT_IN)

Die vereinfachte Ausführung (keine IDs) des Berichts-Deskriptors in Bild 1 würde zu folgenden Funktionsaufrufen führen:

AHid_Register(&output, 0xFFFF, 0x0005, -1, 0, 63, AHID_REPTYPE_INT_OUT)
AHid_Register(&input, 0xFFFF, 0x0005, -1, 0, 31, AHID_REPTYPE_INT_IN)


Sollten Sie noch Fragen zu diesem Thema haben, dann wenden Sie sich per Email an uns.