USB (PI4)

Aus C und Assembler mit Raspberry
Version vom 17. Juli 2026, 06:36 Uhr von Satyria (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Informationen: usbconfigparser.c: Wichtig hier zu wissen: Warum wird hier "Audio" erwähnt? Bei Audio-Geräten, wie USB-Headset gibt es im USB-Standard eine Besonderheit: Ein normaler Endpoint-Deskriptor (DESCRIPTOR_ENDPOINT) hat eine feste Länge von 9 Bytes (sizeof(TUSBEndpointDescriptor)). Bei USB Audio Class 1.0 Geräten enthält der Endpoint-Deskriptor jedoch zusätzliche Audiodaten (z.B. für Synchronisation oder Refresh-Raten) und ist daher 11 Byt…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Informationen:

usbconfigparser.c: Wichtig hier zu wissen: Warum wird hier "Audio" erwähnt? Bei Audio-Geräten, wie USB-Headset gibt es im USB-Standard eine Besonderheit: Ein normaler Endpoint-Deskriptor (DESCRIPTOR_ENDPOINT) hat eine feste Länge von 9 Bytes (sizeof(TUSBEndpointDescriptor)). Bei USB Audio Class 1.0 Geräten enthält der Endpoint-Deskriptor jedoch zusätzliche Audiodaten (z.B. für Synchronisation oder Refresh-Raten) und ist daher 11 Bytes groß.

Wenn der Parser auf ein Interface stößt, das zur USB-Audioklasse gehört:

 bInAudio10Interface = pCurrentPosition->Interface.bInterfaceClass == 0x01
                     && pCurrentPosition->Interface.bInterfaceProtocol != 0x20;

...merkt er sich das über die Flag bInAudio10Interface. Sobald er danach den dazugehörigen Endpoint-Deskriptor analysiert:

 if (bInAudio10Interface)
 {
   // Audio class 1.0 EP descriptors have additional fields.
   ucAlternateLen = sizeof (TUSBAudioEndpointDescriptor);
 }
 

...erlaubt er als alternative, gültige Länge auch die 11 Bytes der Audio-Spezifikation. Ohne diese Unterscheidung würde der Parser den Deskriptor fälschlicherweise als fehlerhaft (beschädigt) einstufen und das Gerät ablehnen.

Warum ist das hier wichtig: Sicherheit vor Abstürzen: Sollte ein Benutzer jemals versehentlich ein USB-Headset oder ein USB-Mikrofon in den Raspberry Pi stecken, sorgt dieser Code dafür, dass der USB-Stack das Gerät sauber als „nicht unterstützt“ ignoriert. Sollte dies fehlen, würde der Parser bei einem solchen Gerät einen Invalid Configuration Descriptor-Fehler werfen und den gesamten USB-Port oder -Stack blockieren.