Wo suche ich nach Werten zum Erstellen eines USB-HID-Deskriptors?

10

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 versucht herauszufinden, wo die tatsächlichen Werte für verschiedene Elemente im HID-Deskriptor angegeben sind.

Lassen Sie mich mit einem Auszug aus dem Beispiel erklären, das ich mir ansehe:

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 geht hervor, dass das BYTE-Array aus Schlüssel / Wert-Paaren besteht, wenn ich es so nennen darf. Zum Beispiel gibt die 2. Zeile: 0x05,0x01 den Schlüssel 0x05 an, der die Verwendungsseite ist , und 0x01 ist der Wert, der den generischen Desktop angibt

Ich versuche herauszufinden, wo diese Werte im PDF-Dokument der HID-Verwendungstabelle 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. Die einzige Möglichkeit, die Werte herauszufinden, besteht darin, entweder die Kommentare des Beispiels zu lesen oder das USB-Deskriptor-Tool über den obigen Link zu verwenden.

Ich frage mich nur, bin ich total dumm, diese Schlüssel- / Wertreferenzdokumentation zu verpassen?

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

Aber auch dies verweist auf viele Zeichenfolgenwerte wie END_COLLECTION == 0xc0

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

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

Antworten:

19

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

Das Deskriptorformat befindet sich im Dokument " Geräteklassendefinition für HID " unter dem von Ihnen angegebenen Link zu usb.org.

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

Zum Beispiel in Bezug auf die 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 dass das Postfix nnnn_nn01angibt, dass es 1 Byte lang ist. Das nachfolgende Byte wird dann als Auflistungstyp interpretiert, in diesem Fall vom Typ Anwendung. Dies legt dann den Kontext fest, in dem die weiteren Bytes interpretiert werden, bis der HID-Deskriptor-Parser entweder ein anderes Sammlungs-Tag oder einen End-Sammlungsmarker sieht.

Sie können sehen, dass dies END COLLECTIONangegeben 0b1100_00nnist nnund ignoriert wird. Hier kommt das 0xC0her.

Sie können auch sehen, wie die anderen Argumente aufgebaut sind. Zum Beispiel LOGICAL MINIMUMist 0x25, oder 0b0010_0101. Daraus können wir erkennen, dass wir eine Datenlänge von 0bnnnn_nn01oder ein Byte haben und der Bezeichner 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 in der Dokumentation angegeben ist, dass Verwendungsseiten 32 Bit sind, die oberen Bits als Null angenommen oder aus einem anderen Teil der Dokumentation abgeleitet werden. Ich weiß eigentlich nicht, wie sie spezifiziert sind.

Es gibt eine gute Seite der verschiedenen HID Konstanten hier .

Und eine neuere Version aus den BSD-Quellen hier (Danke, @crazysim!) (Neuester HEAD , möglicherweise nicht von Dauer ).

Connor Wolf
quelle
Genau das, was ich brauchte. Vielen Dank für die ausführliche Antwort. Es hilft wirklich sehr! ;)
josef.van.niekerk
1
@ josef.van.niekerk - Kein Problem. Es hat eine Weile gedauert, bis ich mich mit den USB-Standards befasst habe, und sie sind so undurchsichtig, wie ich mich erinnerte.
Connor Wolf
Ich entschuldige mich für die Totengräber, aber der Link zu USB.org funktioniert nicht mehr.
Rob van der Veer
1
@RobvanderVeer sollte jetzt behoben sein.
HoosierEE
1
Sollte diese "gute Seite mit verschiedenen HID-Konstanten" in eine spätere Version dieser Datei aus den FreeBSD-Quellen geändert werden ? ?
Crazysim