Hallo Leute, ich würde gerne über USB Daten an einen AT90USB647 schicken. Alles was ich brauche ist, die Daten zum uC zu schicken und zurückbekommen. Ich habe die Beispielanwendungen HID und CDC vom Atmel getestet. Es lief so weit gut, nur war es sehr langsam. Die CDC Firmware von Atmel habe ich etwas angepasst, und ich kam auf cca. 0,2Mbit/s. Ich habe gelesen, dass viele Leute das Problem haben und es liegt wohl auf dem CDC Treiber von Windows. USB 2.0 muss etwas im Bereich von 1Mbit/s locker schaffen und da er uC die Daten nur zurückschicken soll dürfte er damit auch klar kommen. Nun habe ich mir überlegt, die USB Ansteuerung mit Hilfe von Libusb zu machen. Ich kenne mich mit USB noch zu wenig aus und weiss ich nicht, ob es ne gute Idee ist, ich meine ob ich dadurch die Übertragungsgeschwindigkeit erhöhen kann. Das wäre also die erste Frage. Die zweite Frage wäre, dass wenn ich das mal so machen möchte, weiss ich gar nicht wie ich anfangen soll. Genauer gesagt, wie muss die Firmware auf dem Atmel aussehen, soll es als CDC, HID oder so von PC erkannt werden, damit ich mit libusb den uC ausfindig machen und Daten mit ihm austauschen kann? Danke Patrik
Patrik Krizan wrote: > USB 2.0 muss etwas im Bereich von 1Mbit/s locker schaffen und > da er uC die Daten nur zurückschicken soll dürfte er damit auch klar > kommen. "USB 2.0" sagt nix über die Geschwindigkeit aus, die USB 2.0 Spec enthält schließlich auch noch den LowSpeed Modus... > Genauer gesagt, wie muss die Firmware > auf dem Atmel aussehen, soll es als CDC, HID oder so von PC erkannt > werden, damit ich mit libusb den uC ausfindig machen und Daten mit ihm Das ist egal, nimm am besten was eigenes ("Vendor Specific", 0xFF), dann funkt dir auch bestimmt kein anderer Treiber dazwischen.
Hallo Ernst, danke für die Anwort. D.h., wenn ich das CDC Beispiel von Atmel nehme und dort einfach 'VendorID' ändere, reicht es schon oder muss ich dort mehr ändern? grüsse Patrik
Vermutlich schon, allerdings müsstest du einen Windows-Experten fragen, ob sich dann trotzdem der Windows-eigene CDC-Treiber das Device krallt. (Unter Linux wär das so) Und dann müsstest du in deinem LibUSB-Programm das ganze CDC-Gedöhns nachprogrammieren. Einfacher ist: ein Vendor Specific device/interface deklarieren, einen Bulk-Endpoint für jede Richtung, und fertig.
Aha, ok. Ich werde mich wohl mehr ins Thema USB einarbeiten müssen denn das mit Vendor Specific device/interface deklarieren und Bulk-Endpoint verstehe ich noch nicht ganz. Im CDC Firmware von Atmel habe ich schon die Stellen mit Usb_Set_Endpoint zwar gefunden, ist mir aber nicht klar wozu das gut ist. Ich weiss jetzt aber ungefähr wo ich Anfangen soll und die Richtung die ich verfolgen muss. Aber noch eine Frage hätte ich. Wenn ich etwas eigenes mache, dann wird doch das USB-Device als Unbekanntes Gerät erkannt oder? Wenn ich dann das entsprechende Program/Dll für PC schreibe ... daraus entsteht doch kein Treiber. Wie sieht dann also die ganze Geschichte auf der PC Seite aus? danke Patrik
Patrik Krizan wrote: > Aha, ok. Ich werde mich wohl mehr ins Thema USB einarbeiten müssen denn > das mit Vendor Specific device/interface deklarieren und Bulk-Endpoint > verstehe ich noch nicht ganz. Im CDC Firmware von Atmel habe ich schon > die Stellen mit Usb_Set_Endpoint zwar gefunden, ist mir aber nicht klar > wozu das gut ist. Ich weiss jetzt aber ungefähr wo ich Anfangen soll und > die Richtung die ich verfolgen muss. Jede Kommunikation bei USB läuft über so genannten Endpoints. Im wesentlichen gibt es IN Endpoints und OUT Endpoints, wobei OUT aus dem PC heraus bedeutet. Den Endpoint 0 gibts noch, da wird das USB Gerät drüber eingestellt. Im einfachsten Fall musst du einen BULK-OUT und einen BULK-IN Endpoint machen. Damit kannst du dann über die LibUSB kommunizieren. > Aber noch eine Frage hätte ich. Wenn ich etwas eigenes mache, dann wird > doch das USB-Device als Unbekanntes Gerät erkannt oder? Wenn ich dann > das entsprechende Program/Dll für PC schreibe ... daraus entsteht doch > kein Treiber. LibUSB ist ein generischer USB Treiber, der für alle USB Geräte verwendet werden kann. Du musst dir dann eine USB Vendor ID kaufen, die in den Chip eintragen, eine Product ID ausdenken, die ebenfalls eintragen, und die selben beiden IDs in das inf File eintragen, was bei der LibUSB dabei ist. Wichtig ist, dass du LibUSB Win 32 Device Driver benutzt, und nicht den Filter Driver. Mittlerweile gibts auch im Windows einen eigenen universellen USB Treiber, den WinUSB, der kann im Gegensatz zur LibUSB auch asynchrone Transaktionen.
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.