Forum: Mikrocontroller und Digitale Elektronik STM32 USB HID Descriptor Länge anpassen und Custom HID vs. HID


von Heinz M. (subi)


Lesenswert?

Hallo,

ich möchte einen USB Joystick selbst bauen. Ich habe mich jetzt schon 
einige Stunden in USB eingearbeitet. Aber zu ein paar wichtigen Fragen 
finde ich einfach keine Antworten.

Projektaufbau:
STM32F072RBT6 erfasst die Sensoren und sendet sie über USB HID 
(Joystick) zum PC. Bei der ST Maus Demo den Descriptor von Maus auf 
Joystick geändert funktioniert soweit.
Programmiert wird mit CubeMX und Eclipse.

Fragen:
1. Custom HID vs. HID
Auch hier im Forum wurde die Frage schon mal gestellt. Jedoch ohne 
Antwort. Ist HID nur für die STM32 Maus Demo und für alles andere die 
Custom HID? Oder ist die HID für alles was mit vorinstallierten Windows 
Treibern läuft und Custom HID braucht zwingend einen extra Treiber?

Ich würde mir die Treiberprogrammierung gern ersparen, da die Standard 
Windows Treiber alles haben was ich brauche.

2. In CubeMX wenn man Custom HID wählt gibt es bei USB Device 
Configuration unter Class Parameters 2 Zeilen:
USBD_CUSTOM_HID_REPORT_DESC_SIZE (Total length for Report descriptor (IN 
ENDPOINT))
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE (Maximum report buffer size (OUT 
ENDPOINT))

2a Beim oberen wird in vielen Youtube Videos 33 eingetragen, aber ohne 
Erklärung. Ist das die Anzahl der Bytes im Descriptor?

2b Beim unteren 64. Ist das der Puffer, falls Daten nicht gesendet oder 
empfangene Daten nicht weiterverarbeitet werden können?

3. Die ST Maus Demo funktioniert hervorragend. Den Descriptor auf 
Joystick umsetzen funktioniert auch. Jetzt wollte ich den Descriptor 
erweitern (Mehr Taster, mehr Achsen, ...). Wenn ich es richtig 
verstanden habe muss ich zusätzlich 2 Angaben ändern.

3a Erstens die Länge des Descriptors in Byte. Bei HID habe ich dies in 
Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usb_hid.h unter 
#define HID_MOUSE_REPORT_DESC_SIZE gefunden. Bei Custom HID vermutlich 
das in Frage 2a.

3b Neben der Länge des Descriptors muss ich natürlich noch die Länge des 
eigentlichen Datenpakets anpassen. Hier konnte ich keine Infos finden. 
Wo muss ich das eintragen?

4. Beim USB HID Descriptor von der USB.org gibt es scheinbar keine 
Exportfunktion. Kennt jemand Alternativen?

Danke für die Antworten.

von Jim M. (turboj)


Lesenswert?

Heinz M. schrieb:
> 2a Beim oberen wird in vielen Youtube Videos 33 eingetragen, aber ohne
> Erklärung. Ist das die Anzahl der Bytes im Descriptor?

Offensichtlich. Man beachte den Namen.

> 2b Beim unteren 64. Ist das der Puffer, falls Daten nicht gesendet oder
> empfangene Daten nicht weiterverarbeitet werden können?

Nein. Das ist die Größe des Interrupt OUT Endpoints - für die Richtung 
PC->Joystick. Die nutzt man für sowas wie LEDs, Force Feedback oder 
Vibration. Die meisten Joysticks verwenden das gar nicht.

> Jetzt wollte ich den Descriptor
> erweitern (Mehr Taster, mehr Achsen, ...). Wenn ich es richtig
> verstanden habe muss ich zusätzlich 2 Angaben ändern.

Du musst den Report Deskriptor ändern, dafür gab es mal ein Tool. Schau 
Dich mal auf USB.org um. Die Anzahl der Bytes muss stimmen, siehe oben.


> 3b Neben der Länge des Descriptors muss ich natürlich noch die Länge des
> eigentlichen Datenpakets anpassen. Hier konnte ich keine Infos finden.
> Wo muss ich das eintragen?

Die steht indirekt im Report Deskriptor drin.


> 4. Beim USB HID Descriptor von der USB.org gibt es scheinbar keine
> Exportfunktion. Kennt jemand Alternativen?

Brille putzen. Dann ändert man bei "Speichern unter..." den "Dateityp" 
auf "Header File (*.h)".

von Heinz M. (subi)


Lesenswert?

Danke für die Infos, aber das hätte man auch freundlicher schreiben 
können.
Das mit dem Interrupt Out ist interessant, weil als nächstes soll Force 
Feedback kommen.


Ich habe es gestern Nacht noch durch sehr viel probieren hinbekommen. 
Für andere die darüber stolpern, hier ein paar Tipps. Es müssen 
unbedingt 4 Dinge übereinstimmen:
- Die Größe des Wertes (z.B. 8 Tasten) muss auch in der Report_Size 
(hier 8 Bit für 8 Tasten) angepasst werden
- Report Count muss gändert werden, wenn man die Anzahl der Achsen 
ändert. Achtung beim Hat gibt Report_Count die Mindestdatenbreite an und 
nicht Report_Size. Sonst funktioniert es nicht.
- In usbd_hid.h die #define HID_Mouse_Report_Desc_Size in Byte.
- In der main muss das struct mouseHID_t angepasst werden, damit die 
Byte Zahl passt.

Das klingt zwar logisch, aber im Eifer des Gefechts vergisst man immer 
wieder mal einen der 4 Punkte anzupassen und Windows reagiert nur mit 
einem nicht ragierenden Joystick oder mit "Fehler 10". Deswegen klapper 
ich inzwischen jedes mal alle 4 Punkte ab.

Hier noch ein Tipp: Der Hat ("Umsichtschalter") braucht bei 4 Wege 3 Bit 
und bei 8 Wege 4 Bit. Um die 4 Bit nicht zu verschenken kann man Hat und 
Tasten im Descriptor hintereinander anordnen. Im Descriptor gibt man 28 
Tasten und 4 Bit für Hat an. Damit hat man 32 Bit (4 Byte). Im struct 
definiert man die Tasten als uint32_t und lässt den Hat weg. Vor dem 
senden "mouseHID.buttons = buttons + 268435456*Hat;". Damit wird der Hat 
an die oberen 4 Bit der Variable buttons geschoben und wird von Windows 
als 2 Objekte ausgelesen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Heinz M. schrieb:
> Vor dem senden
>
1
mouseHID.buttons = buttons + 268435456*Hat;
 > Damit wird der Hat an die oberen 4 Bit der Variable buttons geschoben

Das geht lesbarer, wenn man den Schiebeoperator verwendet, und dann gibt 
es diese merkwürdige und willkürlich erscheinende Konstante nicht.
1
mouseHID.buttons |= Hat << 28;

von Heinz M. (subi)


Lesenswert?

Danke

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.