Hallo,
vielleicht hatte schon jemand ein ähnliches Problem: Ich bekomme einen
Fehler beim Linken mit der LibUSB. Eigentlich möchte ich ein hex-File
erzeugen, um es auf einen AVR-Microcontroller zu laden. Das kompilieren
klappt wunderbar und das Erzeugen von hex-Files geht auch, wenn keine
Abhängigkeiten zur LibUSB eingebaut sind. Aber sobald ich die LibUSB
einbinden möchte, findet der Linker keine Implementierung. Im gleichen
Verzeichnis wie die zu kompilierenden Dateien sind die Dateien usb.h,
libusb.a, libusb0.dll und libusb0.sys.
<include usb.h> ist drin, die Linker-Flags auch. Insgesamt sieht der
Befehl im Makefile so aus:
>avr-gcc -mmcu=at90can128 -I. -L. -Ic:/MinGW/lib/gcc/mingw32/4.5.0/include
-Ic:/MinGW/include -Wl,-Map=Demo.map Helloworld.o
-L"C:\Programme\LibUSB-Win32\lib\gcc" -lusb -o Demo.elf
Als Fehlermeldung kommt:
"undefined reference to `usb_init'"
usw. für alle möglichen LibUSB-Funktionen
Was könnte denn noch fehlen? Ich probiere schon ewig rum und bin bald am
Verzweifeln!
Achso: Die Umgebungsvariablen "AVR", "AVR_PATH", "AVR32_HOME" und
"LIBUSB" sind gesetzt.
Wäre super wenn jemand was weiß!
Erstmal danke für die Tipps!
Ich habe beides mal ausprobiert, hat jedoch nichts geholfen.
Das Umbenennen ändert nichts, da kommt trotzdem der selbe Fehler.
Und wenn ich die Linkerflag ändere kommt ein Fehler (cannot find -lusb0
z.B.)
Ist übrigens mein erstes Windows-Projekt mit AVRs. In so nem Fall wäre
mir Linux auch viel lieber. Da könnte ich jetzt ganz einfach mittracen,
wo er denn überall schaut und was verwendet wird. Geht sowas in Windows?
Uli schrieb:>avr-gcc -mmcu=at90can128 -I. -L. -Ic:/MinGW/lib/gcc/mingw32/4.5.0/include> -Ic:/MinGW/include -Wl,-Map=Demo.map Helloworld.o> -L"C:\Programme\LibUSB-Win32\lib\gcc" -lusb -o Demo.elf
Willst du die libusb auf deinem avr benutzen? Die lib ist doch
eigentlich für den Host-Computer zuständig.
Ja, richtig.
Trotzdem muss ich doch für ein usb_init, usb_find_devices usw. auch was
auf dem AVR haben um drauf zugreifen zu können. Deshalb den Header als
include, oder bring ich da was durcheinander?
Deine Lib ist kompatibel mit deinem Compiler?
Die sollte mit demselben Compiler (avr-gcc) und den selben Settings
(-mcu=at90can128 ... ) kompiliert worden sein, wie der Rest deines
Projektes.
Deshalb ist es oft einfacher, einfach den Lib-Quelltext mit ins
Hauptprojekt zu nehmen.
Eine mit VisualC für intel-CPUs compilierte DLL kriegst du nicht in den
AVR gelinkt.
Ok, da könnte das Problem liegen. Die Lib hab ich fertig aus dem Netz
und nicht selbst gebaut. Das werd ich mal ausprobieren und die Lib
selber kompilieren.
Obwohl. Ähm, Lib-Quelltext? Meinst du usb.h und usb.c? Ich hab das
c-File bisher noch nirgends gefunden. Oder versteh ich das falsch?
Aber: Super Tipp, danke! Da komm ich erst mal etwas weiter.
Ok, jetzt bin ich ganz durcheinander. Also das was ich bisher in irgend
welchen Tutorials gelesen hab, versteh ich so, dass ich z.B.
LibUSB-Win32 installiert haben muss. Dann kann ich gegen die libusb.a
davon linken bzw. das Header-File inkludieren und die dll einbinden.
Ich will jetzt nicht anzweifeln, was du sagst. Ich komm einfach nicht
ganz mit. Das was du sagst würde auch erklären, warum ich problemlos ein
Exe-File bauen kann und das vom Host-Rechner laufen lassen kann. Und
warum dass bauen des hex-Files für das Target nicht geht.
>Ok, jetzt bin ich ganz durcheinander.
Das merkt man.
Der at90can128 kann kein USB. Punkt.
Die Libusb ist für PCs oder evtl. für Boards wo
EmbeddedLinux drauf läuft. Für einen AVR ist sie
jedenfalls NICHT.
Nein, die LibUSB-Win32 ist nicht für deinen AVR geeignet.
Gehe zurück nach "Los!", ziehe nicht 4000 DM ein, und erkläre uns
als erstes mal, was für eine Controllerschaltung du hast und wie
deren USB-Anbindung denn realisiert ist. Da du offenbar einen
AT90CAN128 benutzt, hat der zumindest erstmal keinen USB-PHY in
Silizium drin.
[Edit: Holger war 1 Minute schneller]
Monopoly? Gar nicht so schlecht der Vergleich. Also, von vorne:
Das ist er:
http://shop.embedded-projects.net/index.php?module=artikel&action=artikel&id=18
Dafür habe ich eine dll, ein c- und ein h-file. Dieses inkludiert so
viel ich weiß von Haus aus schon die "usb.h".
Und dann bin ich davon ausgegangen, dass ich die der libusb-win32 nehmen
kann/muss.
Da liegt wohl schon der Fehler, oder?
Uli schrieb:> Kurzer Nachtrag: Die USB-Anbindung muss wohl USBN9604 sein.Das ist doch der entscheidende Punkt. Diesen IC musst du also in
deiner Firmware ansteuern.
Nun lese ich dort:
"Alle Schaltpläne und Quelltexte von der Firmware bis zu den
Bibliotheken und Treibern sind als Open Source freigegeben."
Dann solltest du dir also die dort vorhandene Firmware wohl mal
ansehen. Die müssen ja eine Ansteuerung für den USBN9604 mit
dabei haben.
Die DLL ist für dein Windows, die hat nichts mit der Firmware zu tun.
Ah, so sieht das aus.
Also, jetzt wo du es sagst: Dann werd ich mir mal anschauen, wie das da
gemacht wird. Da siehst du mal, wie wenig Ahnung ich von der Materie
hab.
Aber jetzt weiß ich wenigstens, wie ich mich etwas schlauer machen kann.
Vielen Dank an alle bis hier hin mal!
Ich glaube, in diesem Artikel
http://www.rn-wissen.de/index.php/V-USB:_Ein_Firmware_USB-Treiber_f%C3%BCr_AVR
ist das Zusammenspiel eines USB-Gerätes (mit V-USBB) mit dem Programm
auf der Hostseite ganz gut erklärt.
Ganz grob gesagt, Du baust dir eine inf-Datei, die die AVR-LIB für dein
Gerät zuständig erklärt, dein Anwenderprogramm kommuniziert dann (unter
Windows) mit dem Gerät "libusb" und lässt sich die Verbindung zu deinem
Gerät (VID/PID) herstellen.