ATmega32U4 USB-Treiber

Gast #1153208
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
Persönliche Seite #1153242
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
Gast #1153254
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!
Persönliche Seite #1153264
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
Gast #1153275
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
Persönliche Seite #1153307
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
Gast #1153388
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
Persönliche Seite #1153418
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
#1153498
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.
#1153871
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren