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
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.