Forum: Projekte & Code USB mit HID für STM32


von Max G. (l0wside) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

mit HID funktionieren USB-Geräte auch unter Windows "einfach so" ohne 
expliziten Treiber. Serielle Schnittstelle und CDC sind 2023 meines 
Erachtens längst reif für die Rente.

Auf der Basis der Library von W.S. habe ich deswegen die angehängte 
kleine Library für STM32 geschrieben. Sie kann Reports mit 63 Byte 
zwischen Host (PC) und Device (µC) hin und her schicken.
Bisher ist der Code nur auf einem STM32F042 getestet. Ich wäre dankbar, 
wenn jemand versuchen würe, das auf einem STM32F103 o.ä. zu testen und 
ggf. den Code anzupassen (bitte passende #define setzen)

Code anbei. Anwendungshinweise:
1. Rechner samt USB in STM32CubeMX konfigurieren. USB-Middleware NICHT 
einbinden/konfigurieren. Wer mag, kann natürlich CubeMX ganz weglassen 
und die Register (Clock und GPIO) per HAL oder zu Fuß setzen.
2. usb.c und usb.h ins Projekt einbinden
3. Den USB_IRQHandler() in stm32xxx_it.c auskommentieren oder mit 
"__attribute((weak))" versehen bzw. (für die HAL-Fraktion) dafür sorgen, 
dass der USB-Interrupt USB_IRQHandler() in usb.c aufruft.
4. Der Rest sollte über die main.c und die Kommentare in usb.h halbwegs 
klar sein.
5. Test unter Windows mit SimpleHIDWrite (das Programm muss man an und 
ab neu starten). Reports von Host an Device haben die ReportID 2. Wenn 
man "Falscher Parameter (57)" in SimpleHIDWrite bekommt, hat man die 
falsche ReportID angegeben. Reports vom Device an den Host kommen mit 
ReportID 1.
6. Für Python gibt es PyWinUSB und HidAPI. Erfahrungsberichte 
willkommen.

Wenn es nicht tut:
1. Passen alle Clocks, und sind sie aktiviert? USB braucht 48 MHz.
2. Ist der NVIC richtig eingestellt? Die Interrupt-Nummer für USB steht 
im Reference Manual unter "Interrupt and exception vectors"
3. Wird der Pullup für die USB-Erkennung aktiviert? Die neueren Devices 
machen das über DPPU, aber ältere wie der SM32F103 brauchen da etwas 
Handarbeit und einen externen Widerstand. Anpassung am Ende von 
UsbSetup().

Anmerkungen:
* Über das "Warum" mag ich nicht diskutieren.
* Ich erhebe nicht den Anspruch auf Perfektion. Sachliche Kritik an der 
Library ist willkommen, bevorzugt mit Korrekturvorschlag.
* Wer nicht weiß, welche Polling Rate er nehmen soll, kann 125 
reinschreiben (das ist der USB-Standardwert)
* Mein Coding Style unterscheidet sich von dem von W.S. Das führt im 
Ergebnis zu einem etwas unschönen Mix. Ist so.
* Ein paar Kommentare sind aus CDC-Zeiten übrig geblieben und sind noch 
aufzuräumen.

Frohes neues Jahr allen!

von Ben K. (bkaiser)


Lesenswert?

Cool, werde ich mit meinem neuen Board mal ausprobieren, dass basiert 
auf einem STM32F070.

Ben

von Fragebär (Gast)


Lesenswert?

Was macht man denn mit einem HID auf einem Controller? Bitte
um Aufkläreung bzw. Bedarfsweckung.
Bin da gerade etwas phanasielos, mache alles was ich brauche
mit CDC und bin "glücklich" damit.

von Max G. (l0wside) Benutzerseite


Lesenswert?

- Definierte Latenz bis runter zu 1ms (ok, real eher < 2)
- Kein Raten „welcher COM-Port ist es denn“, sondern Identifikation mit 
PID/VID
- Datenrate bis echte 64 KByte/s (das wären beim UART so 700 kBit/s 
durch Start- und Stopbits)
- Keine Treiberinstallation unter Windows
- Mehrere gleiche Geräte lassen sich über die Seriennummer 
unterscheiden.

Aus Nutzersicht: Anstecken, läuft.


Mir ist noch eingefallen, dass bei höheren Tempo die Library vermutlich 
zickt, weil sich ACK und zu sendende Pakete in die Quere kommen. Fixe 
ich, wenn es mich stört.

von Oldie (Gast)


Lesenswert?

Max G. schrieb:
> CDC sind 2023 meines
> Erachtens längst reif für die Rente.

Ethernet over USB ist reif für die Rente?

von Ben K. (bkaiser)


Lesenswert?

Ich nutze es zur Joystick/Gamepad emulation. Und unschlagbar: anstecken 
-> läuft.

von W.S. (Gast)


Lesenswert?

Max G. schrieb:
> mit HID funktionieren USB-Geräte auch unter Windows "einfach so" ohne
> expliziten Treiber. Serielle Schnittstelle und CDC sind 2023 meines
> Erachtens längst reif für die Rente.

Da hast du eine recht eigentümliche Sichtweise.

Also erstmal die technische Seite: Die HID-Geräteklasse ist vorgesehen 
für Geräte, die als Bedienelemente für den PC fungieren sollen, also 
Tastaturen, Mäuse und dergleichen. Jegliche anderweitige Verwendung ist 
eigentlich ein Mißbrauch, wengleich auch möglich.
Virtuelle und echte COM-Ports sind hingegen genau dafür vorgesehen, 
Daten zwischen Geräten zu transportieren. Wenn du also mit deinem µC 
oder der Mondfähre oder deinem kleinen grünen Kumpel vom Mars 
kommunizieren willst, sind solche Kanäle wie COM-Ports (egal ob virtuell 
oder nicht) eigentlich das genau dafür Vorgesehene.

So nun die eher untechnische Seite: Der ganze USB ist eigentlich eine 
geschlossene Gesellschaft: Man zahlt Eintritt und kriegt ein vid&pid und 
hat zu seinem Produkt eben auch den passenden Treiber für's OS 
mitzuliefern. Das gehört zu den Regeln des Clubs. Ehe jetzt all die 
Linuxer und FOSS-Leute aufkreischen, sollten sie sich fragen, ob sie 
eine vid&pid gekauft haben oder ob sie sich einfach nur breitgemacht 
haben wie damals die Goldgräber in Kalifornien mit dem Revolver.
Ja, das ist eigentlich eine recht unbefriedigende Situation. Bildlich 
gesagt ist das Eis dünn für alle, die da etwas programmieren wollen ohne 
zuvor besagte Eintrittskarte bezahlt zu haben. Also nicht allzu laut 
herumtrampeln.

W.S.

von Max G. (l0wside) Benutzerseite


Lesenswert?

W.S. schrieb:
> Also erstmal die technische Seite: Die HID-Geräteklasse ist vorgesehen
> für Geräte, die als Bedienelemente für den PC fungieren sollen, also
> Tastaturen, Mäuse und dergleichen. Jegliche anderweitige Verwendung ist
> eigentlich ein Mißbrauch, wengleich auch möglich.

Lieber W.S.,

alleine die Tatsache, dass ich deine Library umgeschrieben habe, zeugt 
von meinem Respekt dir gegenüber. Insofern hoffe ich, dass du dich durch 
mein Werk nicht angegriffen fühlst. Eher darauf, dass du die Library mal 
testest und mir sagst, wo ich überall einen Wurm drin habe.

Unter praktischen Gesichtspunkten ist das Suchen nach COM-Ports einfach 
nur nervig, und ich sehe den Vorteil darin absolut nicht. Wenn es ein 
Missbrauch von USB/HID ist, das anwenderfreundlicher zu gestalten, sei 
es drum. Da hat jeder von uns schon bösere Sünden begangen.

Abgesehen davon sind viele Geräte, mit denen wir herumspielen, 
letztendlich HIDs - jedes Messgerät ist doch eines. Nach meiner 
Erinnerung melden sich auch die schweineteuren 
Keysight-Spannungsversorgungen mit USB als HID-Geräte. Und die blöden 
KNX-Dongles ebenfalls. Auch KNX-USB-Schnittstellen sind als HID 
definiert, wobei das nur bei sehr großzügiger Auslegung von "HID" 
stimmt. Immerhin haben beide Firmen ihre VIDs bezahlt :)

Deine Anmerkung zur geschlossenen Gesellschaft ist vollkommen richtig, 
wird aber selbst von großen Firmen in der Praxis gerne großzügig 
ignoriert. Und gilt für CDC/VCP-Devices ebenso.

Hat deine Library eigentlich eine bestimmte Lizenz? Wenn nein, würde ich 
über mein Ergebnis (bei deiner Zustimmung) BSD drüber schreiben und das 
Ganze auf Gitlab packen.

Gruß

Max

: Bearbeitet durch User
von Pieter (Gast)


Lesenswert?

moin,

ab STM32F4xx funktioniert dieser Treiber nicht mehr, andere USB-Core.

Pieter

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Max G. schrieb:
> Serielle Schnittstelle und CDC sind 2023 meines
> Erachtens längst reif für die Rente.

Ist das Missbrauchen von HID aber auch...

Max G. schrieb:
> mit HID funktionieren USB-Geräte auch unter Windows "einfach so" ohne
> expliziten Treiber.

WinUSB-Geräte mit OS Compat Descriptor auch. Anstecken, funktioniert 
sofort. Braucht auch keine Admin-Rechte. Anzusteuern über WinUSB oder 
libusb. Dadurch hat man die volle Flexibilität von USB, man kann mehrere 
Endpoints beliebigen Typs nutzen. Auf Geräteseite ist nur minimaler 
Zusatzaufwand in Form der zusätzlichen Deskriptoren nötig.

https://github.com/pbatard/libwdi/wiki/WCID-Devices

Max G. schrieb:
> Hat deine Library eigentlich eine bestimmte Lizenz?

Da wurde schon ausführlich drüber gestritten. W.S. hat sich nach langem 
Betteln dazu herabgelassen hier eine "Lizenz" anzugeben:

Beitrag "Re: USB CDC von Stefan Frings und WS"

Ich hatte hier eine fehlerkorrigierte Version des W.S.-Code hochgeladen 
(aufgrund W.S.' Verweigerung gegenüber Debugging hatte er seit Jahren 
die Bugs in seinem Code nicht finden können):

https://github.com/Erlkoenig90/WSusb

: Bearbeitet durch User
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.