Benutzerdefinierter HID-Geräte-HID-Berichtsdeskriptor

8

Ich habe ein kleines Problem mit der Erzeugung des HID-Deskriptors. Ich möchte einfache Berichte mit ID1 für die Eingabe und ID2 für die Ausgabe mit 64 Bytes Daten verwenden.

Ich erkannte, dass ich trotz RTFMING und GOOGLING immer noch keine Ahnung von einigen Feldern im HID-Deskriptor habe.

Kann mir bitte jemand einen Hinweis oder eine Anleitung geben, wo ich die Bedeutung aller Deskriptorfelder finden kann? Alles, was ich finden konnte, war Beispiele für HID-Maus / Joistick / Tastatur.

Zum Beispiel - REPORT_SIZE - ist die Größe in Bytes oder in Bits? Und warum gibt es auch REPORT_COUNT? Wenn ich 64 Bytes im Bericht habe, muss LOGICAL_MAXIMUM 255 oder 255 * 64 sein?

Sollte ich LOGICAL_MAX und MIN für jeden Bericht schreiben oder nicht?

Oder wird dieser (nur durch Raten erraten) ausreichen?

%Vor%     
Amomum 06.02.2014, 15:26
quelle

4 Antworten

12
  1. Die gesamte offizielle Dokumentation ist auf usb.org verfügbar. Um HID-Berichtsdeskriptoren zu verstehen, müssen Sie einige Dokumente auf der Seite HID-Informationen lesen. Insbesondere sollten Sie versuchen zu verstehen:

    • Das Dokument "Geräteklassendefinition für HID 1.11" - beschreibt das Berichtsformat für das Human Interface Device
    • Das Dokument "HID Usage Tables 1.12" - beschreibt die Werte vieler Usage Pages und Usages innerhalb dieser Seiten, die in einem Report Descriptor erscheinen können

    Nachdem dies gesagt wurde, ist die Dokumentation notorisch stumpf und erfordert erhebliche Anstrengungen, um sie zu verdauen.

  2. REPORT_SIZE ist die Größe eines Berichts in Bits, nicht in Bytes. Stellen Sie sich REPORT_SIZE als die Breite eines Feldes (in Bits) und REPORT_COUNT als die Anzahl der Felder (dieser Breite) vor. Dies wird im Dokument "Geräteklassendefinition für HID 1.11", Abschnitt 6.2.2.7 "Globale Objekte" wie folgt verdeutlicht:

    %Vor%
  3. Als Leitfaden, ein vernünftiger (dh ich habe es nicht getestet) Report Descriptor, der einen 64-Byte-Input-Puffer beschreibt (zum Host mit einer REPORT_ID von 0x01) und einen 64-Byte-Output-Puffer (vom Host mit eine REPORT_ID von 0x02) könnte wie folgt aussehen:

    %Vor%

    Dies entspricht den folgenden C-Strukturdefinitionen:

    %Vor%
  4. Sollten Sie LOGICAL_MINIMUM und LOGICAL_MAXIMUM für jeden Bericht angeben? Nein.

    Einige Elemente sind GLOBAL (was bedeutet, dass die Werte des Berichtsdeskriptors sequenziell analysiert werden, bis sie explizit durch ein anderes GLOBAL-Element geändert werden) und andere sind LOCAL (was bedeutet, dass ihre Werte bei einem MAIN auf die Standardwerte zurückgesetzt werden) Artikel ist aufgetreten). Sowohl LOGICAL_MINIMUM als auch LOGICAL_MAXIMUM sind GLOBAL-Elemente. Sie müssen ihre Werte also nur erneut angeben, wenn der Wert geändert werden soll. Meiner Meinung nach wäre die Spezifikation klarer gewesen, wenn die offiziellen Namen für Artikel mit GLOBAL_, LOCAL_ und MAIN_ vorangestellt wären, aber leider müssen wir alle mit der Spezifikation leben, wie sie ist.

  5. Das obige Beispiel wurde mit einem kostenlosen Tool auf SourceForge mit dem Namen hidrdd

  6. dekodiert
aja 10.02.2014 11:44
quelle
5

Wie oben schon erwähnt, ist die offizielle USB-Dokumentation eher stumpfsinnig. Ich habe diese Vorlage (meistens mit Hilfe dieser Seite) als einfachen Ausgangspunkt für die Kommunikation mit einem benutzerdefinierten Board erstellt. Der HID-Code soll das Virtual COM Port-Protokoll ersetzen. Der große Vorteil von HID ist, dass kein Treiber benötigt wird.

%Vor%

Ein paar Dinge zu beachten:

  • Weitere Eingabe / Ausgabe-Paare können einfach hinzugefügt werden: Geben Sie ihnen einfach eine weitere Bericht-ID. Jede Nachrichtendefinition besteht aus 10 Bytes, so dass es einfach ist, sich zusammenzufassen.
  • Wir verfolgen die Anzahl der Bytes im Deskriptor, so dass die Größe des Arrays berechnet werden kann ( #define REPORT_DESC_SIZE (55) ).

Auf der Windows-Seite verwende ich Mike O'Briens HIDLibrary . HID-Berichte werden in der Regel mit der Berichts-ID vorangestellt. Verwenden Sie in HIDLibrary das Feld HidReport.ReportID , um den Wert festzulegen / abzurufen. Beachten Sie auf der Board-Seite, dass das erste Byte des Berichts die Berichts-ID ist.

    
D. Shinobi 13.10.2017 19:37
quelle
2

Ich habe mein benutzerdefiniertes verstecktes Gerät von Win7 mit diesem entdeckt (gebaut durch Raten und Stehlen von Beispielen):

%Vor%

Ich bin mir nicht sicher, ob es richtig funktioniert. Will sehen.

    
Amomum 18.02.2014 13:21
quelle
0

Hier finden Sie einen Link zum Spezifikationsblatt (oder "Handbuch") für Ihre Lesezwecke.

Um einige Ihrer Fragen zu beantworten, wird REPORT_SIZE in Bits angegeben und REPORT_COUNT kann verwendet werden, um anzugeben, wie viele "Verwendungen" mit den angegebenen Eigenschaften gemeldet werden. Zum Beispiel können Sie die Eigenschaften für die X - und Y -Verwendungen festlegen und die REPORT_COUNT als 2 angeben (eine für X und eine für Y) und dann die INPUT angeben, um diese Verwendungen zur Bericht. Dann fahren Sie fort, andere Verwendungen zu beschreiben.

Vergessen Sie auch nicht, das Byte für die Verwendung auszurichten. Da REPORT_COUNT in Bits angegeben ist, ist es leicht zu vergessen, dass Nutzungen Byte-ausgerichtet sind. Wenn also eine Verwendung nur 1 Bit beträgt, müssen Sie festlegen, dass 7 Bits in diesem Byte nicht verwendet werden, bevor Sie zur nächsten Verwendung wechseln, wenn mehr als 7 Bits benötigt werden.

    
Chef Pharaoh 20.08.2015 15:38
quelle

Tags und Links