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