Forum: Mikrocontroller und Digitale Elektronik STM32 USB HID Keyboard


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
zum Thema STM32 als USB-HID-Keyboard finde ich hier auf µC.net viele 
Fragen, z.B.
Beitrag "STM32 USB-HID-programm"
Beitrag "STM32 Fehler in USB-HID-HOST-Demo von ST"
Beitrag "USB HID Frage"
aber wenig Antworten.

Mein Ziel ist es, eine normale HID-USB-Tastatur zu emulieren. Ich habe 
mir ein USB-eval-Board wie das hier besorgt: http://r.ebay.com/YQ56wP
Später werden daran einfach Taster angeschlossen und das Ganze an einen 
PC angeschlossen werden. Bei der Erkennung eines Tastendrucks sollen 
dann Tastenkombinationen (so wie Ctrl+A usw) an den PC gesendet werden. 
Ich will sozusagen eine Sondertastentastatur "bauen".

An sich ist das eine sehr überschaubare Aufgabe. Allerdings habe ich 
noch nie etwas mit USB gemacht.

Als Entwicklungsumgebung für STM32 nutze ich die CooCox IDE mit dem 
ARM-GCC none EABI. Bislang habe ich nur das "Hallo Welt" (Rechtecksignal 
ausgeben) gemacht um zu testen, ob das Boards in Ordnung ist - mehr habe 
ich momentan noch nicht ausprobiert.

1. Ist dafür die STM32 USB-FS-Device Lib:
Beitrag "USB HID Frage"
der richtige Einstieg oder sollte man sich vorher noch mit anderen 
Themen beschäftigen?

2. Gibt es eine Möglichkeit (vielleicht ein PC-Programm, das alle 
USB-Kommunikation mit einem Geräte mitloggt oder alle Eingaben einer 
bestimmten Tastatur aufzeichnet oder oder ...) womit ich meine 
USB-Implementierung überprüfen kann?

3. Ist die CooCox "USB_FS" mit der obengenannten Library identisch?

4. Muß ich bei den USB-HID-Deskriptoren irgendetwas beachten, wenn ich 
das Projektchen später als Open Source weitergeben will?

Viele Grüße
W.T.

Edit: Numerierung der Fragen hinzugefügt. Frage 3 hat sich schon fast 
erledigt - so ziemlich alle Variablen/Deklarationen passen zu der 
Beschreibung von STmicro.

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Walter Tarpan schrieb:
> 4. Muß ich bei den USB-HID-Deskriptoren irgendetwas beachten, wenn ich
> das Projektchen später als Open Source weitergeben will?

Da du ja keine eigene, lizensierte USB Vendor ID besitzen wirst, wirst 
du dir für dein Projekt irgendeine VID "borgen".
Für private Zwecke ist das natürlich legitim, aber der Hersteller, dem 
die VID gehört wird nicht entzückt sein, diese in fremdem Code 
wiederzufinden.
Es gab schon Fälle, in denen irgendwelche Pappnasen einfach Deskriptoren 
aus dem Netz genommen haben, vergessen haben die VID anzupassen, und das 
Produkt für einen ganz anderen Hersteller auf den Markt geschmissen 
haben...
Also am Besten die Vendor- und Product-ID im Deskriptor vor dem 
veröffentlichen durch einen Platzhalter ersetzen.

von pit (Gast)


Lesenswert?

Walter Tarpan schrieb:
> An sich ist das eine sehr überschaubare Aufgabe.

Richtig, ...

Walter Tarpan schrieb:
> Allerdings habe ich
> noch nie etwas mit USB gemacht.

... falls man sich mit USB auskennt.

Walter Tarpan schrieb:
> der richtige Einstieg oder sollte man sich vorher noch mit anderen
> Themen beschäftigen?

Mit der USB Spezifikation?

Walter Tarpan schrieb:
> 2. Gibt es eine Möglichkeit (vielleicht ein PC-Programm, das alle
> USB-Kommunikation mit einem Geräte mitloggt oder alle Eingaben einer
> bestimmten Tastatur aufzeichnet oder oder ...) womit ich meine
> USB-Implementierung überprüfen kann?

Protokoll-Analysator nennt man sowas.

Walter Tarpan schrieb:
> 4. Muß ich bei den USB-HID-Deskriptoren irgendetwas beachten, wenn ich
> das Projektchen später als Open Source weitergeben will?

Später? Die Deskriptoren sind das Entscheidende bei Deinem Projekt - 
Einlesen und Lernen oder irgendwo rauskopieren.

von Walter T. (nicolas)


Lesenswert?

Die STM32 Joystick-Demo läuft jetzt auf meinem Board (mit deutlich 
weniger Aufwand als erwartet). Das Problem war ein bischen, daß die im 
CooCox-Repository liegenden Versionen der Library etwas älter sind - 
nachdem ich das Repository links liegen gelassen und die library aus dem 
Download von STmicro komplett genutzt habe, ging alles ganz einfach.

Jetzt geht es darum, von der Maus zur Tastatur zu schwenken.

pit schrieb:
> Walter Tarpan schrieb:
>> 2. Gibt es eine Möglichkeit (vielleicht ein PC-Programm, das alle
>> USB-Kommunikation mit einem Geräte mitloggt oder alle Eingaben einer
>> bestimmten Tastatur aufzeichnet oder oder ...) womit ich meine
>> USB-Implementierung überprüfen kann?
>
> Protokoll-Analysator nennt man sowas.

Kannst Du da ein Programm empfehlen?

Viele Grüße
W.T.

von Walter T. (nicolas)


Lesenswert?

Tja, so ganz bin ich noch nicht weitergekommen...

Das Programm "HID Demo" von ST kann keine angeschlossenen Devices 
erkennen (weder an einer VMware noch am PC). Bei dem Alter gehe ich mal 
davon aus, daß es auf 32-Bit-Systeme beschränkt ist, auch wenn im Readme 
nichts derartiges steht.

Das "Simple HID-Write" von 
http://mikrocontroller.bplaced.net/wordpress/?page_id=1993 ist auch 
nicht mehr zu bekommen.

Irgendwie fehlt mir gerade die Möglichkeit, angeschlossene USB-Geräte zu 
testen.

Kennt jemand eine Lösung?

von Ersi (cell85)


Lesenswert?

Walter Tarpan schrieb:
> Die STM32 Joystick-Demo läuft jetzt auf meinem Board (mit deutlich
> weniger Aufwand als erwartet). Das Problem war ein bischen, daß die im
> CooCox-Repository liegenden Versionen der Library etwas älter sind -
> nachdem ich das Repository links liegen gelassen und die library aus dem
> Download von STmicro komplett genutzt habe, ging alles ganz einfach.
>
> Jetzt geht es darum, von der Maus zur Tastatur zu schwenken.
>
> Viele Grüße
> W.T.


Wäre es möglich das du den Code für das HID mit uns teilst?
Ich würde gerne vier Tasten und eine Joystick Achse zu emulieren und 
suche genau das was du programmiert hast, da meine Platform auch ein 
STM32 ist.

Wäre wirklich großartig.
Geht mir wirklich nur um HID und vier Tasten + 1 x-Achse.

VG
E

von hp-freund (Gast)


Lesenswert?

Was gefällt euch nicht bei:

http://mikrocontroller.bplaced.net/wordpress/?page_id=1993 ?

Unten gibt es links für den STM und das PC Prog...

von Walter T. (nicolas)


Lesenswert?

hp-freund schrieb:
> Was gefällt euch nicht bei:
>
> http://mikrocontroller.bplaced.net/wordpress/?page_id=1993 ?

Nun, daran gefällt mir nicht, daß es

a) für die STM32F4-Serie ist und
b) der link zu dem Werkzeug nicht funktioniert.

Ersan G. schrieb:
> Wäre es möglich das du den Code für das HID mit uns teilst?
> Ich würde gerne vier Tasten und eine Joystick Achse zu emulieren und
> suche genau das was du programmiert hast, da meine Platform auch ein
> STM32 ist.

Die Device-Lib gibt es hier:

http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF258157?s_searchtype=keyword#

und was Du suchst, ist das Joystick-Demo. Ich habe die Variante für das 
STM3210E-Demo-Board genutzt und einfach die Ports entsprechend meinem 
eigenen Board angepaßt.

Viele Grüße
W.T.

von Walter T. (nicolas)


Lesenswert?

Irgendwie fehlt mir noch immer ein USB-Analyzer-Programm. Momentan hängt 
alles: Mit den Descriptoren aus dem Joystick-Demo funktioniert alles, 
mit den eigenen Descriptoren nicht.

Gibt es nicht irgendeine Möglichkeit festzustellen, an welcher Stelle 
die Anmeldung des USB-Devices fehlschlägt?

von Walter T. (nicolas)


Lesenswert?

Wie kann das sein, daß die einzige Antwort, wenn man eine Frage zum 
Implementierung einer HID-Tastatur auf einem STM32f10x lautet: "Ätsch, 
ja das ist einfach, wenn man ein USB-Experte ist!"

Ich kann mir nicht vorstellen, daß das noch niemand gemacht hat, das das 
irgendwie Geheimwissen ist oder das meine Fragen zu unkonkret sind. Und 
wenn die Fragen falsch sind, wäre das ja durchaus auch eine hilfreiche 
Information.

Momentan lautet die Frage: Wie kann man auf einem (Windows- oder Linux-) 
PC feststellen, woran die Enumeration eines USB-HID-Geräts 
schiefgegangen ist?

von Ersi (cell85)


Lesenswert?

Hi,

ich glaube einfach das du zuviel verlangst von diesem Forum :D
Es gibt doch bei USB.org diesen HID Debugger bzw. von einigen 
Herstellern diverese USB Debugging Software Tools. Hast du keine 
passende gefunden?

Ich denke damit könnte man das USB Debugging erleichtern und siehst wo 
dein Problem ist. Jedoch kann es sein, dass wenn sich das Device mit nem 
fehlerhaften Discr. anmeldet etwas mit der Hardware / Firmware nicht 
stimmt....

Ich kann dir leider nicht helfen ich bin kein USB Experte.

von Mark 99 (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Wie kann das sein, daß die einzige Antwort, wenn man eine Frage
> zum
> Implementierung einer HID-Tastatur auf einem STM32f10x lautet: "Ätsch,
> ja das ist einfach, wenn man ein USB-Experte ist!"

Erstens ist es nicht die einzige Antwort. Zweitens ist die Antwort 
richtig. Du kommst bei der Fehlersuche nicht drumherum USB-Experte zu 
werden. Ansonsten musst du verdammt viel Glück haben durch puren Zufall 
die Probleme zu finden und dann noch über eine Lösung zu stolpern.

> Ich kann mir nicht vorstellen, daß das noch niemand gemacht hat, das das
> irgendwie Geheimwissen ist oder das meine Fragen zu unkonkret sind.

Nein, aber die Erwartung ist, dass du dir das Wissen selber aneignest, 
statt zu versuchen dass andere für dich arbeiten. USB zu debuggen ist 
nervig, kompliziert und zeitaufwendig. Zu versuchen USB in einem Forum 
debugged zu bekommen ist naiv.

> Momentan lautet die Frage: Wie kann man auf einem (Windows- oder Linux-)
> PC feststellen, woran die Enumeration eines USB-HID-Geräts
> schiefgegangen ist?

Die Antwort hast du bereits bekommen. Sogar mehrere. Mit einem 
Protokoll-Analysator suchen. Gepflegt, Stück für Stück den eigenen 
Deskriptor durchgehen und mit dem Standard vergleichen. Ja, das ist 
Arbeit.

Als zusätzliche Antwort, bevor du weiter jammerst: Eventuell findet man 
im verwendeten Treiber oder der Bibliothek Debugging-Optionen. Dazu muss 
man sich in den Treiber / die Bibliothek einarbeiten. Um dann zu 
verstehen was die beim Debuggen machen und Anzeigen - wenn überhaupt 
etwas - muss man wiederum USB verstehen. Also sind wir wieder beim 
Anfang: USB lernen.

von Micha (Gast)


Lesenswert?

Ich kann dir nur empfehlen etwas auf http://janaxelson.com/hidpage.htm 
und im angeschlossenen Forum zu stöbern. Janet hat u.a. diverse Links zu 
nützlichen Tools dort gesammelt.

An Tools haben mir schon USBlyzer (zeitbeschränkt) und USBtreeview 
(Freeware) von Uwe Sieber weitergeholfen.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Micha schrieb:
> An Tools haben mir schon USBlyzer (zeitbeschränkt) und USBtreeview
> (Freeware) von Uwe Sieber weitergeholfe

Hallo Micha,
danke für die beiden Programmtipps. USBtreeview hat schon seine erste 
Hilfe gezeigt: Ich sollte HID-Descriptor und Report Descriptor noch 
einmal gründlich durchsehen... obwohl schon dreimal geschehen.


Mark 99 schrieb:
> [...]
> Die Antwort hast du bereits bekommen. Sogar mehrere. Mit einem
> Protokoll-Analysator suchen. Gepflegt, Stück für Stück den eigenen
> Deskriptor durchgehen und mit dem Standard vergleichen. Ja, das ist
> Arbeit.
>
> Als zusätzliche Antwort, bevor du weiter jammerst: Eventuell findet man
> im verwendeten Treiber oder der Bibliothek Debugging-Optionen. Dazu muss
> man sich in den Treiber / die Bibliothek einarbeiten. Um dann zu
> verstehen was die beim Debuggen machen und Anzeigen - wenn überhaupt
> etwas - muss man wiederum USB verstehen. Also sind wir wieder beim
> Anfang: USB lernen.
> [...]

Hallo Mark 99,
"mit einem Protokoll-Analysator suchen"...diese Info ist jetzt schon 
mehrmals gekommen. Das ist ungefähr so hilfreich wie "benutze ein 
passendes Landfahrzeug, wenn Du nach Niederfischbach willst". Hilfreich 
wäre eine Information gewesen wie "Ich habe mal Wireshark/USBPcap für 
einen ähnlichen Zweck ausprobiert. Bas braucht aber etwas Einarbeitung 
und man muß das Beobachten ständig unterbrechen, um sich die Ergebnisse 
anzugucken."

Die Debug-Optionen baue ich in die Library gerade ein. Nur leider 
unterscheiden sich die Debug-Ausgaben eines funktionierenden Devices 
(Maus) und des nicht-funktionierenden Devices (Tastatur) so wenig, daß 
sich dadurch nicht so schnell feststellen läßt, ab welcher Stelle 
Windows der Meinung ist, daß ihm das USB-Device nicht gefällt (siehe 
angehängtes Log).

Mark 99 schrieb:
> [...]
> Nein, aber die Erwartung ist, dass du dir das Wissen selber aneignest,
> statt zu versuchen dass andere für dich arbeiten. USB zu debuggen ist
> nervig, kompliziert und zeitaufwendig. Zu versuchen USB in einem Forum
> debugged zu bekommen ist naiv.
> [...]

Die HID-1.11-Spezifikation und die Hut- 1.12v2-Spezifikation sind für 
Spezifikationen richtig gut geschrieben. Lesbar. Und ich wüßte keinen 
Grund, warum man sich darum drücken sollte.

Auch hier wieder: " ... die Erwartung ist, dass du dir das Wissen selber 
aneignest ..." ist wenig hilfreich. Besser wäre gewesen: "Bei 
http://www.beyondlogic.org/usbnutshell gibt es einen prima Erklärungen 
zu Sachen, die im USB-Standard nicht so gut erklärt sind und gibt sogar 
noch Tipps, in welcher Reihenfolge man das gut lesen kann". Aber beides 
wäre ohnehin eine Antwort auf eine Frage gewesen, die nicht gestellt 
war.


Ich frage niemanden danach, ob er meine Arbeit macht (auch wenn's nur 
Hobby ist). Ich frage nur danach, ob jemand, der das schon gemacht hat, 
einen Tipp geben kann, um lange Irrwege zu vermeiden. Was ist daran 
verkehrt?

Viele Grüße
W.T.

von Walter T. (nicolas)


Lesenswert?

Das Programm "USB Tree View" war tatsächlich das, was mir zu meinem 
Glück gefehlt hat.

Es war ein "one-off"-Tippfehler im Report Descriptor.

von Walter T. (nicolas)


Lesenswert?

Nachtrag: Ich habe den vorherigen Beitrag gelöscht, damit sich niemand 
durch meinen ekligen Quelltext hangeln muß, um eine Frage, deren Antwort 
ich schon gefunden habe, zu beantworten.

Sinngemäß ging es darum, daß ich auf die Mithilfe jemandes hoffte, der
soetwas schon einmal gemacht hat.

Ich nutze die STM32_USB-FS-Device_Lib_V4.0.0 auf einem STM32F103C8T6,
der auch schon korrekt als HID-Keyboard erkannt wird, und der
Tastendrücke korrekt an den PC schickt.

Wenn der PC die Tastatur-Status-LEDs ändern will, schickt er zweimal
einen ein Byte großen Set Report, der mit einem "Stall" quittiert wird, 
wenn innerhalb des Data-Setup-Callbacks für SET REPORT nicht die 
passende CopyRoutine hinterlegt ist.

Im "CustomHID"-Beispiel ist die fehlende Funktion als
"CustomHID_SetReport_Feature" implementiert und kann direkt an der 
gleichen Stelle übernommen werden.

Und wer sich wirklich gerne durch meinen ekligen Quelltext quält, kann 
gerne das Gesamtpaket haben, sobald es fertig ist. Von der Funktion ist 
jetzt alles vollständig. Jetzt geht es noch darum, ein paar wichtige 
Details genau zu verstehen und das Ganze anschließend schön zu machen.

Danke nochmal für die passenden Werkzeuge. Sie haben auf dem Endspurt 
sehr geholfen.

Viele Grüße
W.T.

: Bearbeitet durch User
von Michael (Gast)


Lesenswert?

Hallo,
ich möchte das selbe tun wie Walter...
ich will mit dem STM32f103c8T6 Minimal Board Tastaturdrucke
statt einer echten Tastatur an den PC schicken.

Habe das Beispiel Custom_HID compiliert und auf das Stm32 system 
gespielt.
es wird auch richtig als  STM32 Custm HID device von Windows erkannt.

wie schicke ich nun konkret ein Tastendruck raus?
aus dem Interrupt habe ich die Zeilen:

Send_Buffers[0] = 0x01;
Send_Buffers[1] = 0x19;
PrevXferComplete = 0;
USB_SIL_Write(EP1_OUT, (uint8_t*) Send_Buffers, 2);
SetEPTxValid(ENDP1);

kopiert und ausgeführt.

Das Problem ist: es passiert nichts auf der PC Seite?

Gruß,
Michael

von Walter T. (nicolas)


Lesenswert?

Michael schrieb:
> Das Problem ist: es passiert nichts auf der PC Seite?

Das wundert mich nicht. Du brauchst einen gültigen HID-Descriptor einer 
Tastatur - sonst weiß der PC ja nicht, wie er das Telegramm 
interpretieren soll: Als Maus- oder Joystick-Bewegung, als Tastendruck, 
als Braille-Zeile oder sonstwas.

Hier ist mein fertiges Projekt:

http://dl1dow.de/artikel/hid_keyboard/index.htm

Da solltest Du alles passend zusammenkupfern können.

Viele Grüße
W.T.

von michael (Gast)


Lesenswert?

Danke Walter,
jetzt tut alles so wie es soll.

Bei Bedarf kann ich mein Projekt auch noch hier reinstellen...

Gruß,
Michael

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.