Forum: Mikrocontroller und Digitale Elektronik Verständnisfragen zu USB


von Alex K. (Gast)


Lesenswert?

Hallo,

ich möchte ein kleines Projekt mit einem USB-Mikrocontroller realisieren 
und habe noch einige allgemeine Fragen zum USB.

 -Wie kann ich bei einem Composite-Device einzelne Interfaces aktivieren 
oder deaktivieren. Ich habe in einem Buch gelesen, dass man über den 
USB-Host ganz bequem zwischen einzelnen Interfaces hin- und herschalten 
kann. Ich denke jedoch, dass in der Regel mehrere Interfaces parallel 
nebeneinander laufen(z.B. Usb-Tastatur mit eingebauten Lautsprechern). 
Von dem her muss es doch auch möglich sein, ein einzelnes Interface ein 
oder abzuschalten. Wie geht das?

 -Kann ich im IN-Interrupt Transfer Modus im nachhinein über den Host 
noch die Polling Frequenz ändern? Z.B von 15ms auf 1ms. Könnte das 
vielleicht über den Standard Device Request GetDescriptor funktionieren? 
Oder evtl. über ein Alternate Setting?

 -Wenn ich mein Device als HID-Class konfiguriere, kann ich dann auch 
mit einer weitern evtl. selbst geschriebenen Anwendung(Hostseitig) eine 
Verbindung mit dem selben Endpunkt aufbauen wie mit dem 
HID-Klassentreiber? Wenn der Host das Device als Hid-Class erkennt, lädt 
das OS ja automatisch den entsprechenden Klassentreiber. In meinem Fall 
sollte jedoch auch eine weitere Anwendung die Daten von diesem Endpunkt 
(hier Interrupt IN) auslesen können.

Passt vielleicht nicht ganz zur Überschrift, ich möchte die folgenden 
Fragen aber troztdem stellen:

 -Wer hat schon Erfahrungen mit dem MSP430-USB-Descriptor Tool gemacht. 
(Ich meine nicht das Descriptor Tool von USB.org, sonder das von TI)

 -Wer hat Erfahrung mit der Android USB API? Wo sind hier die 
Standard-Device Requests zu finden??
https://developer.android.com/guide/topics/connectivity/usb/host.html

Vielen Dank für eure Antworten im voraus.

Gruß Alex

von Andreas D (Gast)


Lesenswert?

Unterschiedliche Interfaces koennen selbverstaendlich gleichzeitig 
benutzt werden.
Es gibt bei USB noch das Konzept
"Alternate Configuration", davon wird dann immer nur eine benutzt.

Die Interfaces muessen nicht abgeschaltet werden.
Eine Anwendung kann ein Interface oeffnen ("claim") und verwenden,
und dann wieder freigeben.

Andreas

von Alex K. (Gast)


Lesenswert?

Andreas D schrieb:
> Es gibt bei USB noch das Konzept
> "Alternate Configuration", davon wird dann immer nur eine benutzt.

Ja, man könnte auch eine zweite Konfiguration verwenden. Das Problem ist 
nur, dass ich ein MSP430F55xx USB-Mikrocontroller verwenden möchte, 
dessen USB-Stack von TI nur eine Single-Configuration unterstützt.

> Die Interfaces muessen nicht abgeschaltet werden.

Nein müssen sie nicht, aber wenn mehrere Endpunkte im Interrupt Transfer 
arbeiten und der ein oder andere für eine gewisse Zeit nicht benötigt 
wird, wird unnötig Bandbreite auf dem Bus belegt, der dann evtl. für 
andere Endpunkte verwendet werden könnte.
Da fällt mir gerade zur ersten Frage ein, dass ich hierfür ein Alternate 
Setting eines Interfaces, welches ich für die zweite Frage vorgeschlagen 
habe verwenden könnte. Setze ich für ein Interface die FIFO-Größe über 
den Host zu Null ist er damit ja eigentlich "ausgeschaltet", da das 
Interface keine Bandbreite mehr belegt. Oder wofür wird ein Alternate 
Setting überlicherweise sonst verwendet?

> Eine Anwendung kann ein Interface oeffnen ("claim") und verwenden,
> und dann wieder freigeben.

Also du meinst, es kann sich immer nur eine Anwendung mit dem selben 
Endpunkt verbinden? Angenommen ich habe eine einfache USB-Tastatur, bei 
welchem über den Endpunkt 1 im Interrupt-IN Transfer die Scancodes zum 
HID-Klassentreiber gesendet werden. Jetzt möchte ich mit meiner eigenen 
Anwendung die Scancodes des selbigen Endpunktes auslesen(Nur ein 
Beispiel!) und verbinde mich über usb_claim_interface(). Bedeutet das 
dann, wenn ich jetzt nebenbei noch irgendein Schreibprogramm (z.B MS 
Word) öffne, kann ich hier keine Buchstaben mehr eingeben, weil ja die 
Scancodes der Tastatur nicht mehr zum Treiber sondern nur noch zu meiner 
Anwendung gesendet werden??

von Alex K. (Gast)


Lesenswert?

Hmmh...Scheint wohl das falsche Forum zu sein für Fragen run um die 
USB-Spekzifikation. Weiß keiner einen Rat?

von Oliver (Gast)


Lesenswert?

Alex K. schrieb:
> Scheint wohl das falsche Forum zu sein für Fragen run um die
> USB-Spekzifikation.
Ich denke eher Deine Fragen sind zu speziell.
Außerdem ist (noch) Urlaubszeit + Wochenende...

> Weiß keiner einen Rat?
Die USB-Spec durcharbeiten?

Oliver

von Jim M. (turboj)


Lesenswert?

Alex K. schrieb:
> Nein müssen sie nicht, aber wenn mehrere Endpunkte im Interrupt Transfer
> arbeiten und der ein oder andere für eine gewisse Zeit nicht benötigt
> wird, wird unnötig Bandbreite auf dem Bus belegt, der dann evtl. für
> andere Endpunkte verwendet werden könnte.

Interrupt Endpoints sind lahm. Die können maximal 1 Paket pro Frame. 
Das merkt man in der Praxis nicht.

Alex K. schrieb:
> Jetzt möchte ich mit meiner eigenen
> Anwendung die Scancodes des selbigen Endpunktes auslesen(Nur ein
> Beispiel!) und verbinde mich über usb_claim_interface().

Das geht (mit den OS Treibern) so konkret nur unter Linux, und dort 
würde damit der HID-Teil abgehängt werden. Unter Windows hat man ein 
anders arbeitendes HID API, das IIRC normalwerweise nicht exclusiv 
arbeitet.

von potter (Gast)


Lesenswert?

Alex K. schrieb:
> ich möchte ein kleines Projekt mit einem USB-Mikrocontroller realisieren
> und habe noch einige allgemeine Fragen zum USB.

Ein kleines Projekt also?

Alex K. schrieb:
> Wie kann ich bei einem Composite-Device einzelne Interfaces aktivieren
> oder deaktivieren.

Dann vergiss das gleich wieder - es wird sonst zu kompliziert.
Wenns denn unbedingt sein muss, dann würde ich einfach im EEPROM ein 
Flag setzen und abhängig davon einen komplett anderen Satz an 
Deskriptoren auslesen.

Alex K. schrieb:
> Kann ich im IN-Interrupt Transfer Modus im nachhinein über den Host
> noch die Polling Frequenz ändern?

Was soll das?

Das macht kein Mensch - und Du sollstest auch nicht damit anfangen.

Alex K. schrieb:
> Wenn der Host das Device als Hid-Class erkennt, lädt
> das OS ja automatisch den entsprechenden Klassentreiber. In meinem Fall
> sollte jedoch auch eine weitere Anwendung die Daten von diesem Endpunkt
> (hier Interrupt IN) auslesen können.

Das nennt man dann generic HID : Ein HID Gerät das eben keine 
Maus/Tastatur darstellt, sondern ähnlich RS232 einen allgemeinen 
Datenaustausch erlaubt.

Ein kleines Projekt sollte man einfach halten - ein großes übrigens 
auch.

von Alex K. (Gast)


Lesenswert?

> Wenns denn unbedingt sein muss, dann würde ich einfach im EEPROM ein
> Flag setzen und abhängig davon einen komplett anderen Satz an
> Deskriptoren auslesen.

Ja klar , so kann man es sicher auch machen, wobei die Einstellungen 
direkt über den Host (ohne erneute Enumeration) vorzunehmen, wäre schon 
die smartere Möglichkeit.

Wenn ich es mache wie du sagst, muss ich ja das Device vom Bus trennen 
um eine erneute Enumeration zu erzwingen. Ich habe gelesen, dass dazu 
beide Signalleitung für mindestens 2,5us auf Low gehalten werden müssen. 
Ich hätte das dann in folgender Reihenfolge gemacht. Ist das so in etwa 
richtig?

Discriptor_change_flag^=1;
USB_disconnect();  // Interner Pull-up des Device wird deaktiviert und 
somit
                      D+ auf Low gelegt
USB_reset();
USB_connect();     // Hier beginnt die erneute Enumeration

Ok, nach Disconnect() muss ich warscheinlich noch ein bisschen warten.

von 123 (Gast)


Lesenswert?

Moin. Du solltest dir im klaren sein das USB ein host gesteuerter bus 
ist. Das device macht nur was der host ihm sagt.

Configurationen umschalten löst der host aus. Z.B. um die Stromaufnahme 
festzulegen. Setconfiguration

Bei hid die interrupt Speer zu verstellen bringt dir nichts weil das der 
host macht. Du sagst eigentlich nur das alle n ms neu daten vorliegen. 
Ob das dann der host auch macht ist dem host seine Sache. Er startet ja 
jede Anfrage.

Unter Windows können parallel mehrere Programme auf das hid device 
zugreifen. Was unter Umständen sogar zu Problemen führen kann. Je nach 
Protokoll das auf dem hid Kanal läuft.
Windows hat hier eine eigene API dafür.

von potter (Gast)


Lesenswert?

Wie gesagt: Halte es einfach. Ich würde garnicht anfangen irgendwelche 
Konfigurationen umzuschalten - es sei denn, es muss sein.

Es wäre gut, wenn Du uns mal sagst, worum es hier überhaupt geht. Dann 
bekommst Du auch passende Lösungen.

von Alex K. (Gast)


Lesenswert?

123 schrieb:
> Bei hid die interrupt Speer zu verstellen bringt dir nichts weil das der
> host macht. Du sagst eigentlich nur das alle n ms neu daten vorliegen.
> Ob das dann der host auch macht ist dem host seine Sache. Er startet ja
> jede Anfrage.

Also da hab ich was anderes gelesen. Der Interrupt-Transfer garantiert 
das Nicht-überschreiten einer maximalen Latenzzeit. Der Host wird die 
Daten SPÄTESTENS zu dem Zeitpunkt abholen, wie er im Endpunkt-Deskriptor 
festgelegt ist. Oder eben früher aber danach geht nicht. Das steht so 
jedenfalls in meinem vorliegendem USB-Buch.

von 123 (Gast)


Lesenswert?

Nu ja wir wissen ja alle, das windows kein echtzeit OS ist was zeiten 
angeht sind ms schall und rauch.

Ich bezweifle nicht das der host das machen sollte. nur ich bezweifle 
das er das immer machen wird. und ich glaube mal gesehen zu haben, das 
windows unter eine bestimmte zeit gar nicht geht.

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.