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?
Antworten:
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:
Sie können sehen, dass das binäre Präfix
1010_00nn
angibt, dass es sich um eine Sammlung handelt, und dass das Postfixnnnn_nn01
angibt, 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 COLLECTION
angegeben0b1100_00nn
istnn
und ignoriert wird. Hier kommt das0xC0
her.Sie können auch sehen, wie die anderen Argumente aufgebaut sind. Zum Beispiel
LOGICAL MINIMUM
ist0x25
, oder0b0010_0101
. Daraus können wir erkennen, dass wir eine Datenlänge von0bnnnn_nn01
oder ein Byte haben und der Bezeichner fürLOGICAL MINIMUM
ist0b0010_01nn
Die Struktur für den
USAGE PAGE
Deskriptor ist dieselbe. Der Befehl zum Auswählen der Verwendungsseite lautet0000_01nn
undnnnn_nn01
gibt 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 ).
quelle