usbprog Fans aufgepasst: JTAG USB (OpenOCD, ARM7)

OP (Firma: embedded projects GmbH) #550879
Lesenswert?

Hallo an alle Bastler und Entwickler da draussen!

Mit usbprog versuche ich einen freien Programmieradapter zu schaffen,
mit dem man alles, was das Bastelherz so begehrt programmieren kann.

Alle Quelltexte stehen unter der GNU/GPLv2

Homepage: http://www.embedded-projects.net/usbprog

Die Technik ist ganz einfach gehalten. Ohne viel Schnickschnack, so dass 
es schön billig und einfach zum Nachbauen ist. Über USB kann man bequem 
verschiedene "Firmwares" einspielen. Dafür gibt es ein grafisches Tool 
(Windows und Linux) mit dem man im "Online Pool" surfen kann und sich 
dann die gewünschte Firmware per klick einspielen kann.

Aktuell bastle hauptsächlich ich alleine an neuen Firmwares aber ich 
hoffe dass sich bald Leute finden, die eigene Versionen beisteuern.

Aktuelle Firmwares:

- AVRISP mk2 Klon
- JTAG USB Adapter (unteranderem für OpenOCD (ARM7,ARM9))
- USB zu Seriell Wandler (ohne Treiber, CDC)
- SimplePort (einfach die 6 IO Leitungen des Adapters nutzen)
- es entsteht gerade ein JTAGICE mk2 Klon
(stoppen und starten über den GDB funktioniert bereits, leider fehlt mir
gerade etwas die Zeit)
- es gibt ebenfalls Pläne für einen PIC Programmer


NEU NEU NEU USB JTAG ADAPTER mit OpenOCD Unterstützung:
http://www.embedded-projects.net/index.php?page_id=175
Gast #551979
Lesenswert?

Interessantes Projekt! Für den Anfang würde mich die OpenOCD
Firmware interessieren. Allerdings nur zum Flashen, Debugger
habe ich mir schon vor Jahren abgewöhnt. Welche Übertragungsrate
erreicht das Gerät denn so ungefähr? Der LPC21xx Bootloader
ist mir etwas zu langsam.

 - Michael
OP (Firma: embedded projects GmbH) #553687
Lesenswert?

Ich mess es heute mal. Wobei ich noch ein paar Schrauben kenne, an denen 
man drehen kann.

Der schnellste wird er nicht sein, aber will es so haben, dass das 
arbeiten mit Adapter ok ist.

Wie lange braucht denn dieser Bootloder?

Hast du da irgendwie zahlen? Also was braucht 1K oder so?


Gruss Bene
Gast #553698
Lesenswert?

Nicht weit weg von der Bitrate der Seriellen die ihn bedient. Nur ist 
genau die das Problem. Denn während deren UARTs mittlerweile oft 
fraktionale Baudraten können, hat der Bootloader davon noch nichts 
mitgekriegt und besteht hartnäckig auf maximal 38400 - es sei denn der 
Quarz hat zufällig 14,7MHz, was sich aber schlecht mit den 12MHz eines 
USB-Interface oder den 1MHz eine CAN-Bus verträgt.
Gast #553961
Lesenswert?

Bei mir läuft ein LPC2136/01 mit einem 20MHz Quarz. Bis zu
38.4 kBaud kann ich beim Flashen einstellen was ich will - also
zumindest im Philips Flash-Tool. Die 23xx können zumindest 115kBaud.

Gemessen habe ich mal etwa 100 Sekunden zum Lesen der gesamten
256k.

 - Michael
#573080
Lesenswert?

Hab ein Problem beim kompilieren von OpenOCD für usbprog, hoffe es kann 
mir wer helfen.

Ich versuche openocd mit cygwin unter Windows zu kompilieren und benutze 
dazu die fertig angepassten sourcen 
(http://www.ixbat.de//files/admin/embedded/usbprog/downloads/openocd4usbprog.tar.gz).

bootstrap - ok
./configure --enable-usbprog - ok
make - problem:

sobald das Makefile den "src/jtag"-Ordner erreicht, bricht das makefile 
mit fogender fehlermeldung ab:
1
maruchinu@nbi-mplaner /cygdrive/c/Downloads/USBprog/openocd4usbprog/src/jtag
2
$ make
3
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../src/helper      -g -O2 -MT usbprog.o -MD -MP -MF .deps/usbprog.Tpo -c -o usbprog.o usbprog.c
4
usbprog.c: In function `usbprog_init':
5
usbprog.c:180: error: called object is not a function
6
make: *** [usbprog.o] Error 1

Zum fehler führt also folgender teil der usbprog.c:
1
int usbprog_init(void)
2
{
3
  usbprog_jtag_handle = usbprog_jtag_open();
4
        ...

meiner meinung nach bindet er zwar die header-datei ein und findet den 
prototyp der funktion, aber die funktion selbst in der library 
libusbprogjtag.a findet er nicht.

hab darauf hin nochmal die libusbprogjtag neu kompiliert und 
installiert, jedoch auch ohne erfolg. langsam bin ich echt am 
verzweifeln :( ^^

danke für jegliche Hilfe :)

MfG
Martin Planer
Gast #573295
Lesenswert?

Hi,

Du solltest vieleicht erstmal zählen lernen. Oder wenigstens die 
Fehlermeldung auch richtig lesen!
Die Zeile, in der Du den Fehler vermutest ist 177 und nicht 180!
Außerdem stammt die Fehlermeldung vom Compiler und nicht vom Linker. Und 
der Compiler hat mit irgendwelchen Libraries erstmal überhaupt nichts am 
Hut.
Das Neukompilieren der libusbprogjtag war also ziemlich sinnlos.

CU Frank

PS: Hätte ich ja fast vergessen.
Der Grund für den Fehler ist, das sich die zu OpenOCD gehöhrende log.h 
(in src/helper) mit der von libusb-win32 (von cygwin) zur Verfügung 
gestellten usb.h (genauer gesagt mit der von dieser via windows.h 
eingebundenen wingdi.h) beißt.
Zur Behebung des Fehlers sollte es reichen Zeile 51 zu löschen (oder 
besser einen Kommentar draus zu machen).
Also aus:
1
#include <usb.h>
 sowas:
1
//#include <usb.h>

#573361
Lesenswert?

Also mal danke für deine Antwort!

Arbeite das erste mal richtig mit cygwin und bin nicht (mehr) so 
wirklich fit beim gcc :)

Das kompilieren läuft jetzt wirklich einwandfrei, doch meldet sich jetzt 
wirklich der Linker zu Wort und zwar mit ein paar Referenzproblemen:
1
make[3]: Entering directory `/cygdrive/c/Downloads/USBprog/openocd4usbprog/src'
2
gcc  -g -O2    -o openocd.exe openocd.o ../src/xsvf/libxsvf.a ../src/target/libtarget.a ../src/jtag/libjtag.a ../src/helper/libhelper.a ../src/server/libserver.a ../src/helper/libhelper.a ../src/flash/libflash.a ../src/target/libtarget.a ../src/pld/libpld.a    -lusb -lusbprogjtag
3
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x17): undefined reference to `_usb_init'
4
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x1c): undefined reference to `_usb_find_busses'
5
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x21): undefined reference to `_usb_find_devices'
6
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x26): undefined reference to `_usb_get_busses'
7
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x79): undefined reference to `_usb_open'
8
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x99): undefined reference to `_usb_set_configuration'
9
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0xae): undefined reference to `_usb_claim_interface'
10
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0xc3): undefined reference to `_usb_set_altinterface'
11
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x108): undefined reference to `_usb_close'
12
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x146): undefined reference to `_usb_bulk_write'
13
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x18e): undefined reference to `_usb_bulk_read'
14
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x2bb): undefined reference to `_usb_bulk_write'
15
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x2e7): undefined reference to `_usb_bulk_read'
16
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x3db): undefined reference to `_usb_bulk_write'
17
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x407): undefined reference to `_usb_bulk_read'
18
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbprogjtag.c:(.text+0x530): undefined reference to `_usb_bulk_write'
19
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libusbprogjtag.a(usbprogjtag.o):usbpr
20
ogjtag.c:(.text+0x57a): undefined reference to `_usb_bulk_write'
21
collect2: ld returned 1 exit status
22
make[3]: *** [openocd.exe] Error 1
23
make[3]: Leaving directory `/cygdrive/c/Downloads/USBprog/openocd4usbprog/src'
24
make[2]: *** [all-recursive] Error 1
25
make[2]: Leaving directory `/cygdrive/c/Downloads/USBprog/openocd4usbprog/src'
26
make[1]: *** [all-recursive] Error 1
27
make[1]: Leaving directory `/cygdrive/c/Downloads/USBprog/openocd4usbprog'
28
make: *** [all] Error 2

:(
#573396
Lesenswert?

Also das sollte alles installiert sein. Cygwin hat da libusb-win32, also 
im lib-Ordner befinden sich einige Dateien, die darauf schließen lassen, 
dass alles korrekt installiert wurde, wie z.B.:
1
/lib
2
   -> libusb.dll.a
3
   -> /libusb
4
      -> libusb0.sys
5
      -> inf-wizard.exe
6
      -> install-filter.exe
7
   ...
8
   -> libusbprogjtag.a

Also eigentlich alles da :)
OP (Firma: embedded projects GmbH) #573402
Lesenswert?

Ja du hast ja jetzt den include zur usb.h entfernt?

Eigentlich brauch man im Linux den include schon, und dazu muss man noch
das libusb-dev paket installieren. Gibts sowas für Cygwin auch?
In dem Paket sind die benötigten Header Dateien drin.


Gruss Bene
#573435
Lesenswert?

Ok. Hab das Miniprogramm erfolgreich erstellen können. Also muss ich die 
usb.h warscheinlich doch einbinden.

Danke mal für die Hilfe, ich hab nun eine 2 Stündige Zugfahrt vor mir, 
wo ich wieder probieren kann. Werde dann am Abend/Nachmittag meine 
(Miss-)Erfolge posten ;)

Vielen, vielen Dank auf jedenfall schonmal für die nette Hilfe :)

MfG
Martin Planer
#573561
Lesenswert?

So, Problem gelöst! Hab das Programm nun endlich erfolgreich erstellen 
können. Der Fehler ist meiner Meinung nach ziemlich komisch:

Ich hab nur im Makefile im Hauptverzeichnis (/src) die Linkerparameter 
vertauschen müssen, also einfach
1
USBPROGLIB = -lusb -lusbprogjtag
in Zeile 199 auf
1
USBPROGLIB = -lusbprogjtag -lusb
ändern müssen. Danach funktioniert das Makefile einwandfrei. Hab nicht 
gewusst, dass die Stellung der Parameter irgendeinen Unterschied macht. 
Auf jeden Fall bin ich nun glücklich, dass alles funktioniert und ich 
kann mich endlich an die ersten Schritte mit OpenOCD wagen. :)

Für alle die es nun selbst unter Cygwin kompilieren wollen nochmal eine 
Zusammenfassung:

1
1)  Cygwin installieren
2
    mit allen benötigten Paketen: gcc, libc, make, automake, autoconf, libusb-win32, etc. (weiß auch nicht mehr genau was alles ;)
3
2)  alles irgendwohin extrahieren
4
3)  libusbprogjtag erstellen und installieren   
5
    - cd libusbprogjtag/lib
6
    - make
7
    - make install
8
5)  in der openocd4usbprog/src/jtag/usbprog.c folgende Änderungen durchführen
9
    - Zeile 51 auskommentieren (//#include <usb.h>)
10
    - Ich hab noch in Zeile 29 <sys/io.h> in <io.h> ändern müssen (kann vielleicht auch weggelassen werden)
11
6)  cd openocd4usbprog
12
7)  ./bootstrap
13
8)  ./configure --enable-usbprog
14
9)  im Makefile in /src folgendes ändern
15
    - Zeile 199: USBPROGLIB = -lusb -lusbprogjtag in USBPROGLIB = -lusbprogjtag -lusb ändern
16
10) make
17
11) make install

Für alle, die sich das nicht antun wollen, hab ich die binary angehängt. 
Zum ausführen benötigt ihr noch 2 dll Dateien von Cygwin: cygwin1.dll 
(erstellt mit version 1005.24.0.0) und cygusb0.dll (version 0.1.12.1)

Danke nochmal für die freundliche Unterstützung Benedikt Sauter!

Schönen Tag noch.

MfG
Martin Planer
Angehängte Dateien:
OP (Firma: embedded projects GmbH) #573567
Lesenswert?

Hallo Martin,

bist du mit JTAG und AVR programmierung etwas vertraut?
Das Modul ist jetzt etwas lahm, aber es gibt ne Möglichkeit das zu 
beschleunigen, nur hab ich gerade kaum Zeit da ich an meiner 
Diplomarbeit gerade hänge.

Gemeinsam könnte man das vielleicht mal in Angriff nehmen?


Gruss Bene
#573711
Lesenswert?

Argh! Dass, das auch nie so funktioniert, wie ich das haben will! ^^

Hab shcon wieder ein Problem :(

Wenn ich openocd starte (mit openocd.exe -f usbprog.cfg), dann schaut 
auch alles fürn anfang ganz gut aus:
1
C:\Dokumente und Einstellungen\maruchinu\Desktop\openocd>openocd -f usbprog.cfg
2

3
Info:    openocd.c:86 main(): Open On-Chip Debugger (2007-04-11 16:20 CEST)
4
Info:    usbprog.c:184 usbprog_init(): USB JTAG Interface ready!

Aber danach geht nichts mehr weiter und ich kann mich auch nicht per 
telnet auf Port 4444 verbinden :(

Hat wer nen Vorschlag? ^^

thx
Martin
#573971
Lesenswert?

Also das Board ist wie auf dem Bild im Anhang angeschlossen.

Bei dir auf der Homepage steht ja dabei Vref unbedingt auf Vcc vom 
USBprog hängen, was ich aber nicht machen kann, da:

1) Vref auf meinem Board nicht zugänglich ist und auf dem Board rumlöten 
werd ich sicher nicht ;) - dafür wars mir zu teuer :P

2) Vref auf dem Board von fix mit einer 3.3V Referenzspannung verbunden 
ist. (zu sehen auf http://www.olimex.com/dev/images/LPC2378-STK-sch.gif 
, am linken Rand bei ca. 2/3 von oben ist der JTAG Stecker)
Angehängte Dateien:
#573992
Lesenswert?

Ja, da kommt eindeutig mehr :)

1
C:\Dokumente und Einstellungen\maruchinu\Desktop\openocd>openocd -d 3 -f usbprog.cfg
2
Info:    openocd.c:86 main(): Open On-Chip Debugger (2007-04-11 16:20 CEST)
3
Debug:   jtag.c:1342 jtag_init(): -
4
Info:    usbprog.c:184 usbprog_init(): USB JTAG Interface ready!
5
Debug:   usbprog.c:152 usbprog_reset(): trst: 0, srst: 0
6
Debug:   jtag.c:285 jtag_call_event_callbacks(): jtag event: TRST asserted
7
Debug:   jtag.c:1133 jtag_reset_callback(): -
8
Debug:   bitbang.c:246 bitbang_execute_queue(): statemove end in 0
9
Debug:   jtag.c:285 jtag_call_event_callbacks(): jtag event: TRST asserted
10
Debug:   jtag.c:1133 jtag_reset_callback(): -
11
Debug:   bitbang.c:260 bitbang_execute_queue(): scan end in 0
12
Debug:   jtag.c:1003 jtag_build_buffer(): fields[0].out_value: 0x7fea0000000000ff
13
Debug:   usbprog.c:111 usbprog_write_and_read(): write and read 640


Danach hängts wie gewohnt ;)
#574425
Lesenswert?

Ok, das mit den Leitungen probier ich morgen aus (hab heute keine Zeit 
mehr dafür).

Hab heute einige Zeit das Programm debuggt und hab den Fehler eingrenzen 
können. Er tritt in usbprogjtag.c auf und zwar ziemlich am ende, in der 
Zeile 125. Das ist folgende:
1
while(usb_bulk_read(usbprog_jtag->usb_handle,2, tmp, 64, 1000) < 1);

Bis dort hin läuft alles wie geschmiert und ab dort hängt dann plötzlich 
alles und ich muss es abwürgen. Wer morgen da mal weitersehen ;)
Gast #574570
Lesenswert?

Ok, also ich kenne jetzt drei Installationen unter Linux mit denen das 
so funktioniert.

Ich kann heute abend mal deine Windows Version ausprobieren. Muss da nur 
mal meine alte Windowshobel anschmeissen.

Gruss Bene
Gast #601047
Lesenswert?

Windows hängt genau, wie hier im Thread beschrieben, unter Linux wurde 
kurz das USBPROG gefunden, aber der JTAG Scan scheiterte. Das kann an 
einen zu niedrigen ARM Clock liegen, dann habe ich diese hochgedreht, 
allerdings ohne Erfolg. Einen Tag später wurde in identischer Konfig 
nicht mal mehr der USBPROG gefunden :(

Gruß
Mathias
#603845
Lesenswert?

Hallo Bene ;)

Sollte eigentlich noch alles so daheimliegen, wie ich es damals aus 
Verzweiflung in die Ecke geschmissen habe ^^

Nur so auf die schnelle komm ich da jetz nicht hin - komm frühestens am 
Wochenende wieder mal nach hause (wohn nämlich wegen Ausbildung etc 
weiter weg)

PS: Hab nur jetz irgendwie auch ein Problem mit dem USBprog - er wird 
nicht mehr richtig erkannt von Windows (vl. mal die Firmware neu 
aufspielen...) - trotzdem komisch, hab doch noch letztes Wochenende 
damit AVRs programmiert :(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren