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??
Hmmh...Scheint wohl das falsche Forum zu sein für Fragen run um die USB-Spekzifikation. Weiß keiner einen Rat?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.