Custom HID device HID report descriptor
Ich habe ein bisschen ein problem mit dem erzeugen der HID-descriptor.
Ich will einfache Berichte mit ID1 für die Eingabe und ID2 für die Ausgabe mit 64 Byte Daten.
Erkannte ich, dass trotz rtfming und googeln habe ich immer noch keine Ahnung haben, über einige Felder, die in der HID-descriptor.
Kann bitte jemand mir einen Tipp geben oder eine Anleitung, wo finde ich die Bedeutung von all-Deskriptor Felder? Alle, die ich finden konnte, war die Beispiele für HID-Maus/joistick/Tastatur.
Beispielsweise - REPORT_SIZE - ist es die Größe in bytes oder bits? Und warum gibt es auch REPORT_COUNT?
Wenn ich 64 bytes in dem Bericht, LOGICAL_MAXIMUM werden müssen, 255 oder 255*64?
Soll ich schreiben LOGICAL_MAX und MIN für jeden Bericht oder nicht?
Oder vielleicht dieses hier (generiert, sondern durch raten) ausreichen wird?
char ReportDescriptor[39] = {
0x05, 0x01, //USAGE_PAGE (Generic Desktop)
0x09, 0x00, //USAGE (Undefined)
0xa1, 0x01, //COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x40, // REPORT_SIZE (64)
0x96, 0x00, 0x02, // REPORT_COUNT (512)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x75, 0x40, // REPORT_SIZE (64)
0x96, 0x00, 0x02, // REPORT_COUNT (512)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
0xc0 //END_COLLECTION
};
- Ich weiß, du hast gesagt, du RTFM, aber auch gebeten, ein Handbuch eh - haben Sie überprüft, die HID-Spezifikation von usb.org, insbesondere Abschnitt 6.2.2 auf Bericht Deskriptoren?
- Berichts-Größe wird in bytes. Bericht count ist die Anzahl der Berichte, die Sie unterstützen. In Abschnitt 5.8 beschrieben, das logische minimum und maximum. Wenn Sie möchten, dass etwas weniger "spec"-y, dann schauen Sie unter Jan Axelson ' s USB Komplett, es hat einen tollen HID-Beschreibung.
- eigentlich ja, habe ich. Und alles, was ich sehen kann, ist die Beschreibung einiger Felder. DIE NUTZUNG, ERHEBUNG, EINGABE, AUSGABE. Und ein Beispiel für eine HID-Maus. Das ist nützlich, aber wohl kaum genug. Wenn der Berichts-count ist die Anzahl der reports - warum es drei von Ihnen in eine HID-Maus descriptor? Vielen Dank für das Buch, ich guck hinein!
- Bericht size in bits statt bytes. Es ist korrekt angegeben in der akzeptierten Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle offiziellen Dokumente stehen auf usb.org. Um zu verstehen, HID Report-Deskriptoren sollten Sie Lesen, einige der Dokumente, auf die VERSTECKTE Informationen Seite. Insbesondere sollten Sie versuchen, Sie zu verstehen:
Having said that, die Dokumentation ist notorisch stumpfen und wird erhebliche Anstrengungen erfordern, um zu verdauen.
REPORT_SIZE ist die Größe von einem Bericht im bits nicht bytes. Denken REPORT_SIZE als die Breite eines Feldes (in bits) und die REPORT_COUNT als die Anzahl der Felder (der Breite). Deutlich wird dies in der "Device Class Definition for HID 1.11" Dokument, Abschnitt 6.2.2.7 "Globale Elemente" wie folgt:
Als eine Anleitung, eine vernünftige (ich.e ich habe es noch nicht getestet) Report-Deskriptor beschreibt, dass eine 64-byte-input-buffer (zum host mit einer REPORT_ID von 0x01) und eine 64-byte-output-Puffer (vom host mit einer REPORT_ID von 0x02) könnte wie folgt Aussehen:
Entspricht die folgenden C-Sprache-Struktur-Definitionen:
Sollten Sie angeben, LOGICAL_MINIMUM und LOGICAL_MAXIMUM für jeden Bericht? Nein.
Einige Elemente sind GLOBAL, was bedeutet, dass, wie der report-Deskriptor wird analysiert nacheinander, Ihre Werte bleiben erhalten, bis Sie explizit geändert werden, indem ein weiteres GLOBALES Element) und andere sind LOKAL (was bedeutet, dass Ihre Werte werden auf Standardwerte zurücksetzen, wenn ein HAUPT-Element angetroffen wird). Beide LOGICAL_MINIMUM und LOGICAL_MAXIMUM sind GLOBALE Elemente, so brauchen Sie nur zu re-geben Sie Ihre Werte, wenn Sie möchten, den Wert zu ändern. Meiner Meinung nach, ist die Angabe gewesen wäre klarer, wenn die offiziellen Namen für die Elemente wurden mit dem Präfix GLOBAL_, LOCAL_ und MAIN_ aber leider haben wir alle zu Leben mit der Skillung so wie es da steht.
Obigen Beispiel wurde entschlüsselt mit einem kostenlosen tool auf SourceForge namens hidrdd
hidrdd
Sie empfohlen.Als @aja bereits erwähnt, ist die offizielle USB-Dokumentation ist eher stumpf. Ich habe dieses template (meist mit Hilfe von dieser Seite) als einfache Ausgangspunkt für die Kommunikation mit einem custom board. Die HID-Codes ersetzen soll der Virtuelle COM-Port-Protokoll. Der große Vorteil mit HID ist, dass kein Treiber erforderlich ist.
Ein paar Dinge zu beachten:
#define REPORT_DESC_SIZE (55)
).Auf der Windows-Seite, die ich verwenden Mike O 'Brien' s HIDLibrary. HID-reports sind in der Regel vorangestellt, der mit dem Berichts-ID--in HIDLibrary, verwenden Sie die
HidReport.ReportID
Feld/Wert bekommen. Auf der board-Seite, denken Sie daran, dass das erste byte des Berichts werden die Bericht-ID.Hab ich meine custom hid device erkannt von Win7 mit diesem (gebaut von guess und stehlen von Beispielen):
Ich bin mir nicht sicher, ob es richtig funktioniert aber. Sehen.
Hier ist ein link zu der Datenblatt (oder "manuell") für Ihre Lesung Zwecke.
Beantworten einige Ihrer Fragen,
REPORT_SIZE
wird angegeben in bits undREPORT_COUNT
können verwendet werden, um anzugeben, wie viele "Verwendungen" berichtet wird mit den angegebenen Eigenschaften. Zum Beispiel können Sie die Eigenschaften für dieX
undY
Nutzungen und die haben dieREPORT_COUNT
angegeben als 2 (eine für X und eine für Y) und geben Sie dann dieINPUT
für die Nutzungen auf den Bericht. Dann weiter auf der Beschreibung von anderen Verwendungen.Auch, vergessen Sie nicht, die Verwendungen byte ausgerichtet. Da
REPORT_COUNT
wird angegeben in bits, ist es leicht zu vergessen, haben die Verwendungen in byte ausgerichtet. Also, wenn eine Verwendung ist nur 1 bit, dann müssen Sie angeben, dass es 7 bits in diesem byte nicht verwendet wird, bevor Sie zur nächsten Verwendung, wenn es erfordert mehr als 7 bits.