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