Forum: PC-Programmierung libusb-Problem


von Alexx (Gast)


Lesenswert?

Hallo,

Ich habe ein Problem mit libusb unter Windows. Bei mir funktioniert die 
normale libusb nicht, sondern nur die libusb-winx32. Ich finde diesen 
Port von libusb für Windows nicht so schön, weil man erst für alle 
Geräte, die man später ansprechen will, einen Treiber installieren muss. 
Zum Test hab ich das mal mit meinem USB-Stick gemacht. Das Kompilieren 
eines Beispiels hat funktioniert, jedoch zeigt das Programm an, dass es 
keine Hardware finden kann:( Das Test-Tool von der libusb-win zeigt den 
Stick aber an. Komisch.
Ich würde wirklich gerne lieber die normale libusb für Windows benutzen 
und frage mich, ob das möglich ist. Von mir aus wäre es auch OK die dlls 
einfach zu benutzen, ist mir schnuppe! Ich hab schon Vieles versucht, 
aber es hat nicht geklappt irgendwas zu erstellen (weder in Bloodshed 
Dev C++, in VC++ 2005 Express, noch in VS 2010 Pro).
Kennt sich hier vielleicht jemand damit aus?

Gruß
-Alex

von Christian R. (supachris)


Lesenswert?

Die Original LibUSB ist für Linux. Der Windows Port ist LibUSB-win32 und 
das funktioniert dann unter Windows. Selbstverständlich musst du für 
jedes Gerät welches du mit LibUSB bearbeiten möchtest, den LibUSB 
Treiber installieren. Erst dann hast du über die User Mode DLLs Zugriff. 
Und das klappt bestens. Ich hab da schon einiges gemacht. Wir haben dann 
aber für produktive Systeme doch lieber WinUSB genommen, ist stabiler 
und schon im Windows drin. Natürlich kann man dann keine Software für 
mehrere OS erstellen.

von Alexx (Gast)


Lesenswert?

Also MUSS ich libusbwin32 unter Windows nehemen. Ich hab ja mal den 
Treiber für meinen USB-Stick installiert, aber danach hat Windows ihn 
nicht mehr richtig erkannt, ist das normal? Ich glaube er war nicht mal 
im Gerätemanager zu sehen.
Was hat denn WinUSB für Vorteile gegenüber dem Windows-Port von libusb?

von Christian R. (supachris)


Lesenswert?

Ja natürlich ist der Stick dann weg, denn dann ist der unter 
LibUSB-Win32 Devices zu finden und ist über die LibUSB ansprechbar, also 
generisches USB Device. LibUSB bringt ja nur was für eigene Geräte, die 
keiner USB Standardklasse entsprechen.

Der größte Vorteil war bis vor kurzen, dass WinUSB WHQL signiert ist und 
damit auch unter x64 problemlos installiert werden kann. LibUSB ist aber 
mittlerweile auch signiert. Und ich weiß nicht, ob LibUSB mittlerweile 
asynchrone Transfers beherrscht. Ansonsten ist es halt ein 
Systembestandteil und wird von MS gepflegt.

von Alexx (Gast)


Lesenswert?

Achso ist das. Ist das bei WinUSB genau so?

Ich glaube libusb beherrscht asynchrone Tranfers.

Wo bekomme ich denn WinUSB und wo gibt es eine Dokumentation? Ich 
glaube, dass ich dann zu WinUSB wecheln werden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Ja natürlich ist der Stick dann weg

Wenn man die Filter-Version installiert, dann klinkt die libusb sich
in alle existierenden Treiber ein (eben an der Filter-Schnittstelle).
Dann hat man beides: den normalen Windows-Treiber (den es dann aber
für jedes Gerät geben muss) und den Zugriff über libusb.

von Christian R. (supachris)


Lesenswert?

Alexx schrieb:
> Wo bekomme ich denn WinUSB und wo gibt es eine Dokumentation? Ich
> glaube, dass ich dann zu WinUSB wecheln werden.

http://msdn.microsoft.com/en-us/library/ff540196.aspx

WinUSB kann aber keine isochronen USB Transfers. Ich glaube LibUSB kann 
das. Musst du selbst entscheiden, was die besser passt, ein besser oder 
schlechter gibts da meiner Meinung nach nicht mehr.

von Alexx (Gast)


Lesenswert?

Ist die Library im Download von VC++ 2010 entahlten? Bei mir ist die 
Library von vc++ nämlich überhaupt nicht vollständig! Nichtmal windows.h 
oder stdlib.h sind dabei! Oder brauche ich das Windows SDK?

Ich probiere mal die  Filter-Version bei libusb aus.

von Christian R. (supachris)


Lesenswert?

Für die WinUSB brauchst du nicht nur das Windows SDK sondern auch das 
WDK. Ist aber beides kostenlos herunterladbar.

von Alexx (Gast)


Lesenswert?

OK!
Ich hole mir gerade das neue Visual Studio 11b Prof., da scheint alles 
dabei zu sein.
Ist WinUSB auch kompatibel mit libFTDI, kannst du mir das sagen?

Gruß,
Alex

von nix_guru (Gast)


Lesenswert?

Alexx schrieb:
> OK!
> Ich hole mir gerade das neue Visual Studio 11b Prof., da scheint alles
> dabei zu sein.
> Ist WinUSB auch kompatibel mit libFTDI, kannst du mir das sagen?
>
> Gruß,
> Alex

WinUSB und libFTDI sind doch 2 Treiber auf der selben Ebene, wie sollen 
die miteinander kompatibel sein? Oder hab ich da grad was falsch im 
Kopf.

Es gibt zu WinUSB und libUSB noch mehr Alternativen. für jene die sich 
nicht entscheiden können gibt es auch libUsbK, die API ist kompatible 
mit WinUSB.sys, libusb0.sys und libusbk.sys. Was das beste ist 
entscheiden wohl folgende Fragen:
- Welche Programmiersprache?
- Auf was willst du zugreifen?
- Welche Transfertype brauchst du?

von Christian R. (supachris)


Lesenswert?

Alexx schrieb:
> Ist WinUSB auch kompatibel mit libFTDI, kannst du mir das sagen?

Nee, natürlich nicht. LibFTDI ist doch wieder was ganz anderes.
Was genau willst du denn überhaupt machen? Irgendwie ist das unklar.

von Alexx (Gast)


Lesenswert?

OK, um jetzt mal zu erklären,was ich genau machen will:

Ich möchte in C/C++ ein Tool schreiben, mit dem ich, wie in libusb, 
Daten an einen USB-Port und an das angeschlossene Gerät transferieren 
kann.
In Linux hab ich schon sowas geschrieben (mit libusb) und möchte mein 
Tool jetzt auch für Windows schreiben.
Außerdem würde ich gerne als zweites "Projekt" meinen FTDI Chip auf 
einem Dev-Board unter Windows ansteuern. In Linux braucht man dazu 
libusb, deswegen wollte ich wissen, ob libFTDI mit WinUSB kompatibel 
ist.

Gruß,
Alex

von Christian R. (supachris)


Lesenswert?

Achso, na dann nimm am besten LibUSB-win32, da kannst du den Quellcode 
fast 1:1 übernehmen.
Die LibFTDI gibts meines Wissens unter Windows gar nicht so recht, 
höchstens über Cygwin.
Unter Windows kommuniziert man über die D2XX.dll mit den FTDI Chips, den 
Treiber nimmst man dann den originalen von FTDI.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alexx schrieb:
> Ist die Library im Download von VC++ 2010 entahlten? Bei mir ist die
> Library von vc++ nämlich überhaupt nicht vollständig! Nichtmal windows.h
> oder stdlib.h sind dabei!

Das sind Headerdateien und keine Libraries. Und die müssen im Umfang von 
VC 2010 enthalten sein.

Üblicherweise finden sie sich in <installationsort>\vc\include, auf 
einem 64-Bit-Windows ist das
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include

Windows.h gehört zum Windows-SDK, das aber automatisch mit VC 
installiert werden sollte.
Das landet üblicherweise in
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

von Alexx (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das sind Headerdateien und keine Libraries. Und die müssen im Umfang von
> VC 2010 enthalten sein.

Meines Wissens gehört die stdlib.h zur Standartbibliothek von C. 
Außerdem habe ich jetzt das neue VS 11b, da ist alles dabei:)

Christian R. schrieb:
> Unter Windows kommuniziert man über die D2XX.dll mit den FTDI Chips, den
> Treiber nimmst man dann den originalen von FTDI.

Ist die dll im Treiberpacket entahlten oder wo finde ich die? Wie 
benutze ich diese dann in meinem C code? Ich brauche doch noch eine 
lib-file oä für den Kompiler...?

Gruß,
Alex

von Christian R. (supachris)


Lesenswert?

Alexx schrieb:
> Ist die dll im Treiberpacket entahlten oder wo finde ich die? Wie
> benutze ich diese dann in meinem C code? Ich brauche doch noch eine
> lib-file oä für den Kompiler...?

Genau, sind im Treiber-Paket enthalten, sowohl als 32 Bit als auch 64 
Bit Version. Zum Beispiel da drin: 
http://www.ftdichip.com/Drivers/CDM/CDM%202.08.24%20WHQL%20Certified.zip

von Alexx (Gast)


Lesenswert?

Hallo,

also Kompilieren und Linken hat jetzt geklappt! Ich konnte mein erstes 
libusb-Projekt erstellen:) Danke euch allen für die Hilfe!

Ich hab jetzt noch eine spezielle Frage zu libusb:
Was ist den denn ein End Point? Es gibt einen (oder zwei?) für read und 
write und der für read ist meistens 0x81...? Warum? Kann man ihn 
irgendwie ermitteln?
Ich brauche den End Point z.B. für:

int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, 
int timeout);


Den Treiber für den FTDI Chip hab ich installiert und konnte ihn auch 
ansprechen:)


Gruß,
Alex

von Christian R. (supachris)


Lesenswert?

Alexx schrieb:
> Ich hab jetzt noch eine spezielle Frage zu libusb:
> Was ist den denn ein End Point?

Oha, da hat jemand aber überhaupt keine Ahnung von USB. JEDE 
Kommunikation mit einem USB Device läuft über Endpoints, davon kann es 
mehrere geben, wenn du mit dem Gerät kommunizieren willst, musst du 
natürlich wissen, welche Endpoints da was machen. Ist denn dokumentiert, 
wie man die Endpoints eines FTDI ohne deren Treiber verwendet? Ich frage 
mich immer noch, was das soll? Wieso willst du den FTDI mit LibUSB 
ansprechen? Irgendwie ergibt das für mich wenig Sinn.

von Alexx (Gast)


Lesenswert?

Ja, ich hab davon echt keine Ahnung!
Nein, mit dem FTDI-Projekt hat das nix zu tun, das klappt so 
hervorragend!
Ich meinte jetzt mein 2. Projekt: mit libusb ein Gerät ansteuern.
Kannst du mir erklären, was ein End Point ist? Kann man den auslesen?

Gruß,
Alex

von Christian R. (supachris)


Lesenswert?

Achso, schau mal hier: 
http://www.beyondlogic.org/usbnutshell/usb3.shtml#Endpoints
Und ja, man kann den auslesen, wenn es ein IN Endpoint ist (oberstes Bit 
in der Adresse gesetzt, also beispielsweise 0x81) und wenn Daten bereit 
gestellt wurden.

von Alexx (Gast)


Lesenswert?

Aha, das hilft schon ein bisschen!
Wenn ich jetzt mein Device ansteuern will und ein Befehl schicken will 
benutze ich:
usb_bulk_write(usb_handle, OUT_ENDPT, commmand, 5, USB_TIMEOUT);

Dabei ist OUT_ENDPT der End Point fürs Output bzw. schreiben. Doch wie 
bekomme ich den jetzt raus?

von Christian R. (supachris)


Lesenswert?

Du musst doch eine Doku zu dem Gerät haben?!? Die Endpoints zeigt dir 
auch USBView an.

von Alexx (Gast)


Lesenswert?

Christian R. schrieb:
> Du musst doch eine Doku zu dem Gerät haben?!? Die Endpoints zeigt dir
> auch USBView an.

Nein, ich hab keine Doku, da das Gerät eigentlich nicht dafür gedacht 
ist, dass man es mit eigenen Tools selber ansteuert...

Danke für den USBView-Tipp! Diese Application scheint auch libusb zu 
benutzen.

Ich bekomme bei usb_bulk_write immer -22 als Rückgabewert zurück:/
Hier mal der gekürzte source mit dem selben Problem:
http://dl.dropbox.com/u/41173070/tools/TEST.rar

Gruß,
Alex

von Christian R. (supachris)


Lesenswert?

USBView nutzt sicher nicht LibUSB. Das war mal ein Demo-Projekt von MS 
im WDK. Was genau willst du denn da ansteuern? Die VID/PID ist ein 
Sandisk Cruzer Stick. Wenn da ein Fehler auftritt, musst du dann halt 
erst mal gucken, was -22 bedeutet und dann rätseln, was das Gerät da 
eventuell nicht haben will. Oder mal die USB Mass Storade Doku 
anschauen, was du denn überhaupt übertragen kannst.

von Alexx (Gast)


Lesenswert?

Den Sandisk Cruzer Stick habe ich  nur als Beispiel genommen. Egal 
welches Gerät ich ansteuern will, ich bekomme immer -22 als Returnwert.

von Christian R. (supachris)


Lesenswert?

Mach doch mal ein libusb_error_name auf den Errorcode, dann siehst du, 
was es bdeutet.

von Alexx (Gast)


Lesenswert?

Ah, die normale libusb funktioniert jetzt unter Windows! Ich habe ja die 
ganze Zeit die libusb-win32 benutzt...
Die libusb kennt den Errorcode nicht (UNKNOWN), aber das liegt 
wahrscheinlich daran, dass ich den Error mit der libusb-win32 erzeuge 
und mir von den normalen libusb auswerten lasse!
Einen Moment, ich werde gleich nochmal posten...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Error 22 ist (außerhalb der libusb) ein "Invalid argument".

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.