Forum: Mikrocontroller und Digitale Elektronik AT90USB647 und libusb


von Pat R. (patrik)


Lesenswert?

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

von Pat R. (patrik)


Lesenswert?

Hi Leute,
kann mir wirklich keiner weiterhelfen?
patrik

von Εrnst B. (ernst)


Lesenswert?

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.

von Pat R. (patrik)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von Pat R. (patrik)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.