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ß!
Arbeite zwar normal nicht unter Windows und bin mir daher auch nicht sicher, aber benenn die libusb0.dll mal in libusb.dll um, evtl. hilfts ;)
Uli schrieb: > Was könnte denn noch fehlen? Ich probiere schon ewig rum und bin bald am > Verzweifeln! Linke mal -lusb und zusätzlich -lusb0 oder -lusb-1 oder so ähnlich. Siehe auch http://www.myunitsconverter.com/thread/813394/Wo%20befindet%20sich%20die%20Definition%20von%20'void%20usb_init(void)%20';
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.
Der avr ist doch ein ein USB-Device oder? Wenn ja, brauchst du auch eine USB-Lib für ein Device und nicht für einen Host, wie es die libusb ist.
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.
Guck dich mal bei Atmel um, die müssten doch eigentlich einen USB-Stack für ihre Controller haben.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.