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?
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:
Sie können sehen, dass das binäre Präfix 1010_00nn
angibt, dass es sich um eine Sammlung handelt, und das Postfix nnnn_nn01
angibt, 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 COLLECTION
das als angegeben 0b1100_00nn
ist nn
und ignoriert wird. Von hier 0xC0
kommt der.
Sie können auch sehen, wie die anderen Argumente aufgebaut sind. Beispielsweise LOGICAL MINIMUM
ist 0x25
, oder 0b0010_0101
. Daraus können wir ersehen, dass wir eine Datenlänge von 0bnnnn_nn01
oder ein Byte haben und der Spezifizierer für LOGICAL MINIMUM
ist0b0010_01nn
Die Struktur für den USAGE PAGE
Deskriptor ist dieselbe. Der Befehl zum Auswählen der Verwendungsseite lautet 0000_01nn
und nnnn_nn01
gibt 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).
josef.van.niekerk