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.
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)".
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.
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; |
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.