Wo finde ich Werte zum Erstellen eines USB-HID-Deskriptors?

Ich versuche, mich ein wenig über das Erstellen eines USB-HID-Deskriptors in C für ein PIC32-USB-Projekt zu informieren, das ich versuchen möchte.

Ich habe das Dokument HID Usage Tables von http://www.usb.org/developers/hidpage/ heruntergeladen und versuche herauszufinden, wo die tatsächlichen Werte für verschiedene Elemente im HID-Deskriptor angezeigt werden.

Lassen Sie es mich anhand eines Auszugs aus dem Beispiel erklären, das ich mir anschaue:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

Aus dem obigen Beispiel wird deutlich, dass das BYTE-Array aus Schlüssel/Wert-Paaren besteht, wenn ich es so nennen darf. Zum Beispiel die zweite Zeile: 0x05,0x01 gibt den Schlüssel 0x05 an, der die Usage Page ist, und 0x01 ist der Wert, der Generic Desktop angibt

Ich versuche herauszufinden, wo diese Werte im PDF-Dokument HID Usage Table angegeben sind. Zum Beispiel kann ich keinen Hinweis darauf finden

USAGE_PAGE == 0x05

und zum Beispiel

COLLECTION == 0xA1

Ich habe versucht, das PDF nach 0xA1 zu durchsuchen, kein Ergebnis. Ich kann die Werte nur herausfinden, indem ich mir entweder die Kommentare des Beispiels anschaue oder das USB Descriptor Tool über den obigen Link verwende.

Ich frage mich nur, ob ich total dumm bin, weil ich diese Schlüssel/Wert-Referenzdokumentation vermisse?

Es gibt viele Beispiele online, wie zum Beispiel der folgende Link: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Aber selbst dies verweist auf eine Menge Zeichenfolgenwerte wie END_COLLECTION == 0xc0

Wo finde ich die Referenz für diese Werte? Was vermisse ich?

Sieht so aus, als müsste ich das USB Descriptor Tool verwenden, um den HID-Deskriptor zu erstellen. :)

Antworten (1)

Die USB-Dokumentation ist ziemlich schrecklich. Es leidet unter übermäßiger Generisierung, bei der versucht wird, alles so generisch und allgemein zu machen, dass es schwierig ist, von der Dokumentation zu einer bestimmten Anwendung zu gelangen.

Das Deskriptorformat befindet sich im Dokument „ Definition der Geräteklasse für HID “ unter dem von Ihnen bereitgestellten Link zu usb.org.

Das Entscheidende, was Sie übersehen, ist, dass die verschiedenen Segmente (z. B. 0x05) nicht mit dem Präfix 0x dokumentiert sind . Tatsächlich beschreiben sie sie im Allgemeinen in roher Binärdatei .

Zum Beispiel in Bezug auf 0xA1:Geben Sie hier die Bildbeschreibung ein

Sie können sehen, dass das binäre Präfix 1010_00nnangibt, dass es sich um eine Sammlung handelt, und das Postfix nnnn_nn01angibt, dass es 1 Byte lang ist. Dann wird das nachfolgende Byte als Sammlungstyp interpretiert, in diesem Fall vom Typ Anwendung. Dies setzt dann den Kontext, in dem die weiteren Bytes interpretiert werden, bis der HID-Deskriptor-Parser entweder ein anderes Sammlungs-Tag oder eine End-Sammlung-Markierung sieht.

Sie können sehen, dass END COLLECTIONdas als angegeben 0b1100_00nnist nnund ignoriert wird. Von hier 0xC0kommt der.

Sie können auch sehen, wie die anderen Argumente aufgebaut sind. Beispielsweise LOGICAL MINIMUMist 0x25, oder 0b0010_0101. Daraus können wir ersehen, dass wir eine Datenlänge von 0bnnnn_nn01oder ein Byte haben und der Spezifizierer für LOGICAL MINIMUMist0b0010_01nn

Geben Sie hier die Bildbeschreibung ein

Die Struktur für den USAGE PAGEDeskriptor ist dieselbe. Der Befehl zum Auswählen der Verwendungsseite lautet 0000_01nnund nnnn_nn01gibt an, dass sie 1 Byte lang ist. Ich würde vermuten, dass, da die Dokumentation besagt, dass Nutzungsseiten 32 Bit sind, die oberen Bits als Null angenommen oder aus einem anderen Teil der Dokumentation abgeleitet werden. Ich weiß wirklich nicht, wie sie spezifiziert sind.

Es gibt hier eine gute Seite mit den verschiedenen HID - Konstanten .

Und eine neuere Version aus den BSD-Quellen hier (Danke, @crazysim!) (neueste HEAD , hält möglicherweise nicht lange an).

Genau das, was ich brauchte. Vielen Dank für die ausführliche Antwort. Es hilft wirklich sehr! ;)
@josef.van.niekerk - Kein Problem. Es ist eine Weile her, bevor ich mich mit den USB-Standards beschäftigt habe, und sie sind so undurchsichtig, wie ich sie in Erinnerung hatte.
Ich entschuldige mich für die Totengräberei, aber der Link zu USB.org funktioniert nicht mehr.
@RobvanderVeer sollte jetzt behoben sein.
Sollte diese "gute Seite mit verschiedenen HID-Konstanten" in eine neuere Version dieser Datei aus den FreeBSD-Quellen geändert werden? ?