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
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
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!
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
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
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
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
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
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.
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
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.
>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.