Forum: Mikrocontroller und Digitale Elektronik USB HID: Host fragt nach dem Report Deskriptor


von Potter S. (potter68)


Lesenswert?

Hallo,

nach der Konfiguration meines Geräts fragt der Host nach dem Report 
Deskriptor. Das Status-Byte hat dabei den Wert 0x81 (Device->Host, 
Standard Interface Request). Die Request-Nummer ist 0x06 und der 
Descriptor-Typ 0x22.

Laut Jan Axelsons Buch gibt es keine GetDescriptor-Request, die an das 
Interface gerichtet ist (GetDescriptor geht ausschlieslich an das 
Gerät). Warum bekomm ich dann eine?

Also das Gerät funktioniert, aber verstanden hab ich das nicht so ganz. 
Kann mir den Widerspruch jemand erklären?

Gruß Ralf

von René K. (king)


Lesenswert?

Ich habe zwar die entsprechende Stelle des Buches gerade nicht greifbar, 
aber ich vermute mal, dass Axelson von Standard-Deskriptoren spricht. 
Und damit hat er recht, denn diese Anfragen gehen tatsächlich 
ausschließlich an das Device. Schau Dir mal in der Spezifikation den 
Punkt 9.4.3 an. Hier siehst Du sogar, welche Deskriptoren von diesem 
Request unterstützt werden. Dass die Anfragen nur an das Device gehen, 
ist durchaus sinnvoll, denn die Deskriptoren in Frage sind für das ganze 
Device einmalig und eindeutig; schließlich wird das Device beschrieben.

Zusätzlich zur eigentlichen Spezifikation gibt es Device Class 
Definitions. In Deinem Fall geht es um die HID Spezifikation. Diese 
erweitert nun den Standard-Request um die Möglichkeit, 
klassen-spezifische Deskriptoren abzufragen. Dass es sich um einen 
Class-Descriptor handelt, siehst Du an den Bits 5..6 des 
Descriptor-Types (1 == class). In diesem speziellen Fall muß sich die 
Anfrage an ein Interface richten, da es mehrere Interfaces mit 
klassen-spezifischen Deskriptoren geben kann. Du kannst beispielweise 
Geräte entwickeln, die mit zwei HID Interfaces daherkommen. Das ergibt 
zwei Report-deskriptoren, die Du voneinander unterscheiden können mußt.

Das Verhalten eines HIDs beim GetDescriptor-Request ist in der HID 
Spezifikation unter 7.1.1 zu finden.

Wenn man also die Device Class Definitions als Erweiterung ansieht, ist 
es auch gar nicht mehr so widersprüchlich. Wenn es so wäre, dürfte es 
streng genommen nicht eine Anfrage an einen Deskriptor des Typs 0x22 
geben.

USB:
http://www.usb.org/developers/docs/usb_20_040907.zip

HID:
http://www.usb.org/developers/devclass_docs/HID1_11.pdf

von Potter S. (potter68)


Lesenswert?

Hallo René,

zunächst muß ich etwas korrigieren: Es handelt sich nicht um das 
Status-Byte mit dem Wert 0x81, sondern um bmRequestType. Die Bits 5-6 
sind Null (Standard) und Bits 0-4 sind 1 (Interface). Die Richtung 
(Bit7) ist Device -> Host.

Ich hab mir nun das Kapitel 7.1.1 angesehn und da steht ja gleich ganz 
oben, daß die 0x81 einen HID-Klassen-Descriptor anfordert (auch wenn die 
Bits5-6 ( = 0) eine Standard-Anforderung sugerieren).

Danke für Deinen Hinweis.

Gruß Ralf

von René K. (king)


Lesenswert?

> Die Bits 5-6 sind Null (Standard) und Bits 0-4 sind 1 (Interface). Die
> Richtung (Bit7) ist Device -> Host.

Die Bits 5..6 sind Standard, da es sich im Wesentlichen um einen 
Standard-Request handelt. Dieser wird nun aber zur Abfrage von 
nicht-standard Deskriptoren verwendet (die USB Spezifikation sieht 
Report-Deskriptoren nicht vor). Wenn Du Dir jetzt den Descriptor-Type 
anschaust (0x22), siehst Du Bits 5..6 == 1 == Class, und das meinte ich 
eigentlich auch.

Du findest das in der HID Spezifikation unter 7.1 schön aufgeschlüsselt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.