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