Forum: Mikrocontroller und Digitale Elektronik ATmega32U4 USB-Treiber


von CManiac (Gast)


Lesenswert?

Hallo,

ich muss für ein Gerät mit USB-Anschluss (da sitzt ein ATmega32U4 drauf 
mit integriertem USB) einen Gerätetreiber erstellen.

Nun habe ich noch nie einen Treiber erstellt und will jetzt mal von euch 
hören, was da dazu gehört.

Bisher haben wir immer einen FTDI FT232RL genutzt mit dem wir über den 
mitgelieferten Treiber kommuniziert haben (Geräteverbindung Öffnen / 
Daten senden / Empfangen etc)

Jetzt habe ich hier u.a. vom der usblib gelesen. Meine Frage ist, was 
kann man damit genau anfangen?!

Zum Verständnis, ich komme aus der Windowswelt :-) (C#, Java, Delphi,C)

Vielen Dank schonmal

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

In einem AVR mit USB Interface kannst du jede beliebige Device-Klasse 
implementieren. Deshalb musst du (oder der Furmware-Programmierer) 
wissen welches Protokoll verwendet wird.

Mit der usblib kannst du direkt auf das USB Protokoll zugreifen, das 
heisst, du brauchst keinen Driver, wenn deine Applikation gegen usblib 
gelinkt wurde. Es haengt IIRC auch von der verwendeten Device-Klasse ab 
ob Windows einen Dialog zur Driverinstallation anzeigt oder nicht.

Siehe zum Beispiel diesen Thread:
http://groups.google.com/group/myusb-support-list/browse_thread/thread/e240c5b7d964d33a

von CManiac (Gast)


Lesenswert?

Hey danke für deinen Post,

also usblib erzeugt aber auch einen Treiber (*.sys, *.dll, *.inf) um 
dann auf das implementierte Device zuzugreifen zu können, oder?

Wenn man USBLIB nutzen würde bräucht müsste man dann das Gegenstück in 
der Firmware einbauen?!
Habe das doch richtig verstanden, oder?

Muss man an der USBLIB nochetwas ändern, oder kann man diese so 
übernehmen?
Mann muss sie dann sicherlich noch komplieren (mit einem C++ Compiler?!)

Danke Dir!

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

CManiac wrote:
> also usblib erzeugt aber auch einen Treiber (*.sys, *.dll, *.inf) um
> dann auf das implementierte Device zuzugreifen zu können, oder?

Nicht dass ich wuesste.
usblib laesst dich in deiner Applikation das machen wofuer du ansonsten 
einen Driver braeuchtest. Du verwendest also entweder das eine oder das 
andere.

> Wenn man USBLIB nutzen würde bräucht müsste man dann das Gegenstück in
> der Firmware einbauen?!

Das Gegenstueck zu usblib oder einem Driver in der Firmware auf einem 
AVR ist LUFA (http://www.fourwalledcubicle.com/LUFA.php) oder die USB 
Bibliothek von ATMEL oder dein eigenes Sueppchen.

> Habe das doch richtig verstanden, oder?

Ich fuerchte, nicht ganz.

> Muss man an der USBLIB nochetwas ändern, oder kann man diese so
> übernehmen?

Ich habe usblib nur einmal, vor langer Zeit unter Linux verwendet. Der 
Code (< v1.0) wurde schon lange nicht mehr weitergepflegt, also denke 
ich dass du ein paar Anpassungen vornehmen musst.

Thomas

von CManiac (Gast)


Lesenswert?

Hi

>Nicht dass ich wuesste.
>usblib laesst dich in deiner Applikation das machen wofuer du ansonsten
>einen Driver braeuchtest. Du verwendest also entweder das eine oder das
>andere.


Nochmal eine Frage, was gibt mir denn usblib auf PC Seite damit ich mit 
einer Applikation (*.exe wie z.B.: in C#) auf das USB-Device drauf 
zugreifen kann?

Gibts dort eine DLL, oder wie erfolgt der Softwaermäßigezugriff?

Vielen Dank

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

CManiac wrote:
> Nochmal eine Frage, was gibt mir denn usblib auf PC Seite damit ich mit
> einer Applikation (*.exe wie z.B.: in C#) auf das USB-Device drauf
> zugreifen kann?

usblib gibt dir ein konsistentes Interface auf USB-Geraete, ohne dass du 
dich um Systemdetails kuemmern musst. Im besten Fall kannst du deine 
Applikation sehr einfach auf Windows und Linux portieren.

usblib ist kein Driver. Du nimmst den Source-code, erstellst daraus 
eine .dll Library oder du linkst die Bibliothek statisch zu deiner 
Applikation.

Also:
- Sobald du das Geraet an den USB port anschliesst, wirde es vom 
Betriebssystem enumeriert, aber kein Driver wird geladen.
- Wenn der Anwender deine Applikation startet, greift diese ueber usblib 
auf das Geraet zu.

Dieser Ansatz ist gut geeignet, wenn deine Applikation das einzige 
Programm ist, das auf das USB-Geraet zugreifen soll. Wenn andere 
Programme das auch sollen, ist es wahrscheinlich besser einen Driver zu 
entwickeln.

Die CDC-ACM Device-Klasse ist wahrscheinlich die einzige Device-Klasse 
fuer die alle gaengigen Betriebssysteme einen Driver mitliefern. (Unter 
Windows musst du eine .inf Datei installieren.)
Diese Klasse ist eine serielle Emulation und funktioniert sehr gut, wenn 
du nicht die volle Geschwindigkeit von USB ausschoepfen musst.

Der einzige Nachteil ist dass das Geraet als serielle Schnittstelle 
gefuehrt wird. Also unter Windows musst du alle COMx abfragen und unter 
Linux alle /dev/ttyACMx.

Thomas

von CManiac (Gast)


Lesenswert?

Hey erstmal super vielen Dank für deine Erklärungen.

Die Applikation ist bei mir wirklich die einzige die auf das Gerät 
zugreifen muss.
Bis jetzt läuft es als CDC Device, welches aber anscheinend Probleme 
macht.
Die direkte USB-Ansteuerung, falls man dies überhaupt so nennen darf ist 
wohl besser angebracht.

Ist es denn mit USBLIB möglich ein eingestecktes Device zu erkennen? 
Also bekommt man die VID/PID irgendwie raus (denke schon, da das Device 
sich ja so im Gerätemanager anmeldet)

Danke nochmals.

Gruß
CManiac

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

CManiac wrote:
> Ist es denn mit USBLIB möglich ein eingestecktes Device zu erkennen?
> Also bekommt man die VID/PID irgendwie raus (denke schon, da das Device
> sich ja so im Gerätemanager anmeldet)

Ja das ist moeglich.

Noch eine Anmerkung: Ich kenne mich mit Windows-Drivern nicht sehr gut 
aus. Etwas was du herausfinden musst ist wie du den "Neue Hardware 
gefunden" Assistenten unterdrueckst sobald du das USB_Geraet 
anschliesst.
Ich kann mir vorstellen dass man das mit einer einfachen .inf Date 
bewerkstelligen kann, bin mir aber nicht sicher.

Waere interessant wenn du deine Erfahrungen in diesem Forum posten 
wuerdest.

Thomas

von Christian U. (z0m3ie)


Lesenswert?

usblib kenn ich nicht aber libusb.
welche es unter Linux tatsächlich ermöglicht auf alle USB Geräte 
zuzugreifen. Unter Windows braucht man dafür aber einen Treiber der bei 
libusb mitgeliefert wird. Man kann auf kein Usb gerät ohne Treiber 
zugreifen.

von Thomas P. (tpircher) Benutzerseite


Lesenswert?

Christian U. wrote:
> usblib kenn ich nicht aber libusb.

Sorry, das meite ich.

> Unter Windows braucht man dafür aber einen Treiber der bei
> libusb mitgeliefert wird.

Wie schon oben gesagt, habe ich libusb nur unter Linux verwendet. Der 
Windows Port ist schon 5 Jahre alt. Hast du Informationen wie gut es 
noch unter XP und Vista funktioniert?

Thomas

von Christian R. (supachris)


Lesenswert?

Also es gibt ja bei der LibUSB Win32 zwei verschiedene Sachen. Einmal 
den Filtertreiber, der zwischen Original-Treiber und deiner Anwendung 
sitzt. Das ist aber etwas murksig, und wenn man nicht aufpasst, 
zerschießt man sich das ganze System. Dann gibts den Device Treiber, der 
direkt für das entsprechende USB Gerät geladen wird, ohne dass man einen 
anderen Treiber benötigt. Auf den kannst du dann über die DLL zugreifen. 
Wir haben das hier auch mal probiert, für unsere eigene Hardware mit dem 
Cypress FX2 Chip, klappt ganz gut, allerdings kann die uralte Version da 
nur synchrone Transaktionen.
Du kannst also deinen ATmega mit USB so programmieren, dass er halt erst 
mal das Control Interface mit dem Endpoint 0 und alles was dazu gehört, 
zur Verfügung stellt, und dann eben noch mindestens einen Endpoint, über 
den du dann deine Daten verschickst. Das kann dann ein BULK, Interrupt 
oder Isochroner EP sein. Die LibUSB spricht dann die Endpoints an. Und 
das funktioniert dann mit jedem USB Gerät, unabhängig vom 
Hersteller-Treiber. Musst nur das Paket mit dem Device Treiber 
runterladen und in der inf Datei die VID/PID anpassen, und den Treiber 
installieren.
Eine weitere Möglichkeit wäre das hier: 
Beitrag "Generischer USB Treiber für Windows mit C++ API" ist ebenso wie die LibUSB 
ein generischer USB Treiber. Kann auch asynchrone Transaktionen.

von Christian U. (z0m3ie)


Lesenswert?

>Der
>Windows Port ist schon 5 Jahre alt. Hast du Informationen wie gut es
>noch unter XP und Vista funktioniert?

Ja, XP,XP64 funktioniert mit Device Treiber ziemlich gut.
Vista 32 geht, 64 nicht.
Liegt aber wohl daran das Vista 64 gar keine unsignierten Treiber 
zulässt. Das signieren bei MS ist für ein open Source Treiber natürlich 
absouluter Quark.
Der Filter Treiber läuft nur unter XP und drt auf ca 50% der Systeme den 
Rest zerschießt er ist aber nach Deinstallation wieder alles ok.

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.