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


von Andre R. (ryan87)


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

von Lupin (Gast)


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?

von Guru (Gast)


Lesenswert?

> - Windows XP, XP64, Vista, Vista64

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

;-)

von Andre R. (ryan87)


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.

von Andre R. (ryan87)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mal ne Frage läuft das auch unter Win98SE?

von Andre R. (ryan87)


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.

von Gast (Gast)


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)

von Mars (Gast)


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

von Gast (Gast)


Lesenswert?

Danke für den Hinweis, das werde ich mir mal angucken!

von bro (Gast)


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ß

von Andre R. (ryan87)


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/bb896647.aspx) 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).

von Christian R. (supachris)


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.

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