ATmega32U4 USB-Treiber

Gast #1153208
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
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
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
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
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
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
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
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
#1153430
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.
Persönliche Seite #1153452
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
#1153498
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
>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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.