Forum: Mikrocontroller und Digitale Elektronik STM32 USB OTG-Host Library


von Rainer F. (ferdiflachmann)


Lesenswert?

Hallo

Ich habe einen Host Adapter auf einem Nucleo L476 aufgebaut. Das 
Grundgerüst stammt aus dem CubeMX. Es werden CDC und HID 
(Tastatur/Generic) unterstützt.

Damit sollen drei verschiedene Geräte Typen geprüft/konfiguriert werden, 
ohne jedes mal am PC als neues Gerät erkannt werden zu müssen.

Die Daten der Geräte werden per USB UART vom Nucleo an den PC zum 
Prüfprogramm weitergereicht.

Da die Beispiele nur sehr einfach gehalten sind, musste ich schon 
einiges anpassen. Devices mit mehreren Konfigurationen werden gar nicht 
unterstützt. Auch gibt es kein Beispiel für den Report Transport, z.B. 
setFeature.

Eigendlich läuft alles. Aber ein altes Produkt benutzt als HID Tastatur 
einen zusätzlichen Endpoint, um dort die Tastenbelegung verändern zu 
können.

Das schreiben an einen für HID nicht vorgesehen Endpoint wird immer auf 
Endpoint 0 (Stall) oder 3 (Tastatur->nutzlos) umgeleitet.
Mir ist nicht klar, wo in der langen Kette der Aufrufe bis zum 
eigentlichen schreiben, es zum verbiegen der Endpoint Adresse kommt.

Ich habe in kein Library File eingegriffen. Alles, um meine speziellen 
Zugriffe auszuführen erfoglen über usb_host.c, die dafür ja vorgesehen 
ist.

Hat hier jemand schon einmal Endpointer mit der STM Host Library 
beschrieben und kann mir einen Tipp geben?

von Jim M. (turboj)


Lesenswert?

Rainer F. schrieb:
> Eigendlich läuft alles. Aber ein altes Produkt benutzt als HID Tastatur
> einen zusätzlichen Endpoint, um dort die Tastenbelegung verändern zu
> können.

Sitzt der dann nicht auch auf einem anderen Interface, und wird dadurch 
NICHT als HID angesprochen..? Wie sehen Interface und Endpoint 
Deskriptoren aus?

In dem Falle müsste man in den STM32 Code einen zusätzlichen "Treiber" 
für dieses Interface einbauen.

von Rainer F. (ferdiflachmann)


Lesenswert?

Ja, es ist eine zweite Konfiguration eines HID ohne SubClass. Es wird 
enumeriert und bekommt ein anderes Interface zugeordnet.
Ich kann es als aktives Device auswählen (Eine Funktion mußte extra 
dafür erstellt werden. Das Beispiel nimmt immer die erste Konfiguration) 
und die Rohdaten (Generic) lesen.
In der Struktur hUsbHostFS ist unter dieser Konfiguration der weitere 
Endpoint auch in der Liste eingetragen.

von Thomas Z. (usbman)


Lesenswert?

Ich glaube du verwechselst Configuration mit Compount Device.
Es ist richtig dass die Spec mehre Konfigurationen unterstützt die beim 
SetConfig ausgewählt werden können. Ein solches Device wäre aber sehr 
ungewöhnlich, ich hab damit Mal experimentiert und aufgegeben. Win 
unterstützt sowas sowieso nicht. Sehr viel wahrscheinlicher ist ein 
Compount device, also ein Device was mehrere Interfaces hat. Dann wird 
unter win auf Interface Ebene der Treiber zugeordnet.
Zeig die Deskriptoren.

: Bearbeitet durch User
von Rainer F. (ferdiflachmann)


Lesenswert?

Da ich mit USB nicht so bewandert bin kann das mit den Namen schon sein.

Das Device ist unter Windows ein USB-Verbund Gerät. Zwei mal HID. Eimal 
SubClass 0 (Generic), einmal Class 3 Tastatur.

Die Host Software trägt beide in seine Liste (ItF_Desc[x]) ein. Die 
Endpoints dann entsprechend unter Ep_Desc[x].

Die Software kann verschieden Classes bedienen. Aber immer nur eine 
alleine. Welche das ist, bestimmt die Reihenfolge, wie ein Device diese 
ausgibt. Ein HID und CDC Verbund Gerät kann benutzt werden. Aber es wird 
immer das aktiv, was in ItF_Desc[0] eingetragen wurde. Häng also vom 
Hersteller des Device ab.
Das habe ich flexibel gehalten und kann es durch umsortieren des Arrays 
selbst bestimmen.

Bei meinem Device brauch ich das gar nicht tun. Es gibt die Diskriptoren 
für HID(SubClas0) immer zuerst aus. Es wird also als aktives Gerät von 
der Host Software bedient.

Ich will nur ein write auf Endpoint 2 hinbekommen. Also keine HID 
Funktionalität wie SetReport o.ä. benutzten.
An einem Windows Rechner ist so eine einfache OUT transaction z.B. mit 
SimpleHIDWrite möglich.

Aber einen solchen low Level write bekomme ich mit der STM Software 
nicht hin

von Thomas Z. (usbman)


Lesenswert?

Zeig bitte mal den Deskriptor Satz dieses Device. Das geht ganz gut 
UsbDevView. Beherrscht dein Host das Pipe Konzept? Wenn der Host nur mit 
dem ersten Interface klarkommt, bleibt dir nichts anderes übrig als das 
zu erweitern...

Setze mal einen GetFeature für den Endpoint auf diesem Interface ab. Was 
kommt da? Ev musst du den Endpoint einfach mit SetFeature freischalten. 
Das wäre dann aber eine Spec Verletzung da bei SetConfig alle Eps 
betriebsfähig gemacht werden müssen. Das wird aber gern Mal vergessen 
und win handled das automatisch.

: 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.