mikrocontroller.net

Forum: Projekte & Code Generischer USB Treiber für Windows mit C++ API


Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

nach über einem Jahr Programmierung habe ich nun die erste Version 
meines generischen USB Treibers fertig gestellt.
Die wichtigsten Features auf einem Blick:

Treiber (EasyUSB):
- Windows XP, XP64, Vista, Vista64
- USB 1.1 Full-Speed Transfers (Bulk, Interrupt, Isochronous)
- USB 2.0 High-Speed Transfers (Bulk, Interrupt)
- Anpassbar für eigene Geräte durch ändern der Treiber VID,PID
- Getestet mit ATmega64 + USBN9604
- Auch Geräte mit mehreren Konfigurationen (USB) werden unterstützt
- KMDF-basiert

C++ API (EasyUSBConnect):
- Objektorientierte API
- Einfacher Zugriff auf Deskriptoren und Endpunkte
- Synchrone und asynchrone Transfers
- Anpassbare Callbacks (über Interface-Klassen) pro Endpunkt
- komplett Doxygen dokumentiert
- einfaches Beispiel vorhanden (benötigt angeschlossenes USB Gerät mit 
obigen Treiber)
- Multi-Threaded via boost::thread
- Einbindung als dynamische (DLL) oder statische (LIB) Bibliothek 
möglich

Für die API wird boost (boost.org) und das PlatformSDK benötigt (u.a. 
enthalten im Visual Studio).

Das komplette Projekt steht unter der BSD License und darf somit 
privat wie auch kommerziell verwendet werden.

Alle Treiber und Pakete befinden sich auf Sourceforge unter:
www.sourceforge.net/projects/easyusb

Es handelt sich um die erste Beta-Version. Ich wäre sehr erfreut über 
weitere Tests und Feedback.

Grüße
Andre

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Womit hast du denn den treiber kompiliert?

Sehe ich das richtig, im grunde handelt es sich um einen Treiber ähnlich 
wie LibUSB-win32? Wo liegen die Vorteile/Nachteile?

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - Windows XP, XP64, Vista, Vista64

Es läuft zum Glück auf keinem Kommunisten-Betriebssystem.

;-)

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lupin:
Der Treiber wurde mit dem Windows Driver Development Kit (WDK) 
kompiliert. Der darin enthaltene Compiler ist speziell für Windows 
Treiber und setzt entsprechende Umgebungsvariablen.

Die Vorteile zu LibUSB-win32 (0.1) sind:
- Isochrone Endpunkte werden unterstützt (vorerst nur Full-Speed)
- Asynchrone Transfers
- C++ API (mit Exception Handling/Error system), ob dies ein Vor- oder 
Nachteil ist liegt aber wohl auch daran was einem eher liegt, C oder C++

Vielleicht werde ich den Treiber später als Portierung der neuen LibUSB 
version (1.0) für windows anbieten. Bin mir aber noch nicht sicher wie 
ich das angehen werde, möglich ist es aber.

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe sowohl den Treiber als auch die API verbessert. Neue aktuelle 
Version ist 0.9.1.

Bei dem Treiber wurde vor allem ein Problem behoben, das auftrat bei 
vielen isochronen Endpunkten. Dabei wurden Lese-Anforderungen nicht mehr 
verarbeitet oder es trat sogar ein Bug Check (Blue Screen) bei mehr als 
4 isochronen Endpunkten auf.

Die API benutzt nun keine Threads mehr, stattdessen wird auf jeden 
Endpunkt vom Benutzer die Funktion Run() aufgerufen. Diese ruft 
Callbacks auf und überprüft den Status der gesendeten Requests.
Dadurch wird auch die boost library nicht mehr zwingend benötigt. Wer 
eine Thread sichere Variante benötigt, kann die API jedoch mit 
EASYUSB_THREAD_SAFE kompilieren. Dazu wird dann allerdings die boost 
library benötigt.
Das Beispiel wurde an den neuen Code angepasst.

Viel Spaß damit

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ne Frage läuft das auch unter Win98SE?

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der Treiber das Windows Kernel Mode Driver Framework (KMDF) benutzt, 
wird leider nur Windows 2000 aufwärts unterstützt. Alles was davor war 
ist nicht kompatibel mit dem KMDF.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich würde den Treiber gerne statt LibUSB-win32 verwenden, da LibUSB 
nicht mit Vista64 funktioniert (und wegen der zwingend nötigen Signatur 
auch keine Besserung in Sicht ist).

Der EasyUSB-Treiber lässt sich zwar installieren, aber nicht laden. Hier 
die Fehlermeldung aus dem Gerätemanager (eines englischen 64-Bit Vista 
SP1):

Windows cannot load the device driver for this hardware. The driver may 
be corrupted or missing. (Code 39)

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne den Treiber von Andre R. abzuwerten, aber es gibt von Microsoft 
ebenfalls einen generischen USB Treiber, seit Vista bereits im OS 
integriert.
WinUSB basiert auf dem UMDF und läuft ab WinXP.
=> http://msdn.microsoft.com/en-us/library/aa476426.aspx

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, das werde ich mir mal angucken!

Autor: bro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe leider auch das Problem feststellen müssen, dass sich der 
libusb-win32 treiber zwar unter vista x64 installieren läßt, aber nicht 
geladen werden kann (Code 39).
Gibt es wirklich keinen Workaround/Lösung für? Wofür taugt denn die 
libusb0_x64 Variante im libusb-win32-Treiberpaket überhaupt?

Gruß

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal sorry, ich hatte fast vergessen, dass ich hier mal nen Thread 
angelegt habe.

Zu dem Problem mit Vista, da ich leider kein Vista habe, kann ich das 
nicht selbst überprüfen. Ich hab ehrlich gesagt auch schon n paar Monate 
nicht mehr daran gearbeitet. Aber du könntest mal DebugView starten 
(gibs bei MS unter: 
http://technet.microsoft.com/en-us/sysinternals/bb...) und 
gucken was da für ausgaben kommen (ich hoffe ich habe die nicht 
ausgestellt in der Release). Bei libusb kann ich leider nicht helfen.

Gruß
Andre

PS: Der Unterschied zu anderen Treibern ist die Unterstützung von 
Isochronous Transfers (Full Speed).

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bro schrieb:
> Hallo zusammen,
>
> ich habe leider auch das Problem feststellen müssen, dass sich der
> libusb-win32 treiber zwar unter vista x64 installieren läßt, aber nicht
> geladen werden kann (Code 39).
> Gibt es wirklich keinen Workaround/Lösung für? Wofür taugt denn die
> libusb0_x64 Variante im libusb-win32-Treiberpaket überhaupt?

Naja, da der ja nicht mehr digital signiert ist, sobald du die inf Datei 
anpasst, musst du den bei jedem Systemstart manuell reinknüppeln. Bei 
x64 gibts nur signierte Treiber. Kannst natürlich eine Verisign ID 
kaufen und den angepassten Treiber bei MS WHQL zertifizieren lassen. 
Dann klappts auch ohne Verrenkungen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.