Forum: Mikrocontroller und Digitale Elektronik Neue OpenOCD-Firmware für USBProg (18x schneller)


von Cahya W. (cahya)


Lesenswert?

Hi,

Weil die jetzige OpenOCD-Firmware für USBProg sehr langsam ist
(circa 0.6 KB/s Übertragungsrate auf Flash), habe ich versucht
meine source code (estick-jtag) auf USBProg zu portieren.
Das Ergebnis ist usbprog-jtag (http://code.google.com/p/usbprog-jtag/).
Diese neue firmware ist ungefähr 18 mal schneller als die originale
(circa 10.9 KB/s Übertragungsrate auf Flash).
Es gibt eigentlich noch Raum für weitere Optimierungen, also bitte
diese neue firmware testen und mir Bescheid über das Ergebnis sagen.

Cahya.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Cahya Wirawan schrieb:
>...
> (circa 10.9 KB/s Übertragungsrate auf Flash).
>...
Nur aus Interesse (habe kein USBProg): Controller? JTAG-Frequenz?

von Cahya W. (cahya)


Lesenswert?

Martin Thomas schrieb:
> Cahya Wirawan schrieb:
>>...
>> (circa 10.9 KB/s Übertragungsrate auf Flash).
>>...
> Nur aus Interesse (habe kein USBProg): Controller? JTAG-Frequenz?

Für den Test habe ich, wie in der Website oben schon aufgelistet wurde,
folgende Konfiguration verwendet:

    * Mac OS X 10.5.8, 2.33 GHz Intel Core 2 Duo, 2GB RAM
    * OpenOCD rev 1454
    * ARM GNU gdb (GDB) 7.0.1
    * AVR gcc version 4.3.2 (GCC)
    * Firmware was compiled with optimization: -Os
    * Target board: LM3S2110 CAN Device Evaluation Board
    * jtag_speed 0
    * File size to flash: 64984 bytes
    * File size to ram: 15832 bytes

cahya.

von Rotax (Gast)


Lesenswert?

genial! Ich war gerade dabei nach einem richtigen JTAG-Adapter Ausschau 
zu halten, da der usbprog einfach nicht in die Gänge kommt!
Mein Cortex M3 EvalBoard kommt in ein paar Tagen, da werd ich das gleich 
mal austesten!
Derweil installier ich mal die Toolchains...

von Dennis (Gast)


Lesenswert?

Hallo,

erstmal danke für die Portierung. Werde sie die Tage testen.
Mir ist aufgefallen, dass Du die gepatchten Quellen von openocd einfach 
dabei gepackt hast. Es wäre hilfreicher nur den Patch mit in Dein 
Projekt aufzunehmen. Möchte ich eine andere Version von openocd 
verwenden muss ich hunderte von Dateien überprüfen um heraus zu finden 
was geändert wurde. Vielleicht kannst Du mir ja einen Tipp geben was Du 
an openocd geändert hast und warum es nötig war.


Danke schon mal,
Dennis

von Cahya W. (cahya)


Lesenswert?

Hi,

danke für den Vorschlag. Der Patch für die originale OpenOCD liegt in
http://usbprog-jtag.googlecode.com/svn/trunk/openocd/patch
Nur das File src/jtag/usbprog.c wurde ersezt/geändert, alle andere
bleiben unverändert.

Cahya.

von Dennis (Gast)


Lesenswert?

Super. Danke. Melde mich wenn ich zum testen gekommen bin.

von Holger .. (aronadaal)


Lesenswert?

So, ich hatte mal etwas Zeit gefunden, um die Firmware zu testen!
Einfach super! Aus dem Stand erreiche ich eine Übertragungsrate von 11,3 
Kb/s. Wenn ich die Firmware mit -02 statt mit -0s kompiliere, werden es 
sogar 13 Kb/s!
Das wären dann ca. 21,5-fache Geschwindigkeit gegenüber der 
Original-Firmware!

CPU: Luminary Micro lm3s8962 (Cortex M3)

von Dennis (Gast)


Lesenswert?

Hallo,

hier meine ersten Testergebnisse für einen AT91SAM7S256:


> flash write_image getting-started-project-at91sam7s-ek-at91sam7s256-flash.bin 
0x00100000 bin
wrote 7188 byte from file 
getting-started-project-at91sam7s-ek-at91sam7s256-flash.bin in 1.618768s 
(4.336342 kb/s)


> load_image getting-started-project-at91sam7s-ek-at91sam7s256-sram.bin 0x00200000 
bin
7184 byte written at address 0x00200000
downloaded 7184 byte in 0.842960s

Entspricht 8,33KB/s


Ich denke der Flaschenhals ist hier der CPU Takt. Man müsste ein kleines 
OpenOCD script schreiben welches die MCK erst einmal konfiguriert. Wenn 
ich das Flash lösche und noch nichts initialisiert ist, d.h. die MCK ist 
32KHz, dauert es sogar noch länger:

> flash write_image getting-started-project-at91sam7s-ek-at91sam7s256-flash.bin 
0x00100000 bin
wrote 7188 byte from file 
getting-started-project-at91sam7s-ek-at91sam7s256-flash.bin in 2.462644s 
(2.850404 kb/s)


Insgesamt auf jeden Fall eine riesige Verbesserung. Danke dafür! Mache 
momentan gar nichts mit ARM, würde aber auf Zuruf die Firmware trotzdem 
gelegentlich testen wenn Bedarf besteht.

Habe mir die Firmware noch nicht angeguckt. Bringt die geänderte 
Pinbelegung der JTAG-Schnittstelle irgendwelche 
Geschwindigkeitsvorteile, oder könnte man die bei Bedarf noch ändern?

von Holger .. (aronadaal)


Lesenswert?

Hey Dennis,
kannst du bitte mal noch deine OpenOCD-Konfiguration posten?

Besten Dank!

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Bitte.

Die usbprog.cfg ist ja dabei gewesen. Die sam7s256.cfg habe ich von der 
sam7se512.cfg abgeleitet.

von Holger .. (aronadaal)


Lesenswert?

ok, ich hab mal einwenig gesucht und dazu auch eine mögliche Lösung 
gefunden:

http://www.mikrocontroller.net/articles/AT91SAM7S_mit_OpenOCD_programmieren

Unter dem Punkt: /etc/openocd_at91sam7_flash.script
findest du ein paar Settings, um den CPU-Takt anzuheben. Teste es doch 
mal an...

von Dennis (Gast)


Lesenswert?

Habe nochmal alles probiert.

Schneller wird es nicht. Mit 48MHz und 54MHz (55 wären Maximum). Kann 
aber sein das einfach nicht mehr geht. Probiere es auf der Arbeit 
nochmal mit einer 'professionellen' JTAG-Probe. Kann man die JTAG 
Geschwindigkeit vom USB-Prog noch irgendwie einstellen? Bekomme folgende 
Ausgabe:

> jtag_speed 200
Requested speed 200kHz exceeds maximum of 66kHz, ignored

von Holger .. (aronadaal)


Lesenswert?

Hm, bei der Speed-Konfiguration wusste ich nicht so recht was ich da 
einstellen soll. Habe mich dann für das hier entschieden:
jtag_speed 0
#jtag_khz 500

(jtag_khz also auskommentiert)

von Cahya W. (cahya)


Lesenswert?

Vielen dank für euren Tests, ich habe mal auch die AT91SAM7S256
mit der originalen Firmware getestet, da war sie auch noch langsamer als
üblich, beim speichern auf flash schafft sie nur 200 bytes/s. also die
Übertragungsrate hängt auch vom Zielsystem ab.

>Bringt die geänderte
>Pinbelegung der JTAG-Schnittstelle irgendwelche
>Geschwindigkeitsvorteile, oder könnte man die bei Bedarf noch ändern?

Die TAP-Zustandübergänge werden in Form von TDI und TMS bit Folge
vom Host zum JTAG-Adapter übertragen. z.B. sieht ein Byte von
TAP-Zustandübergänge wie folgendes aus:

TAPs = {TMS,TDI,TMS,TDI,TMS,TDI,TMS,TDI}.

Diese 2 Bit Werte von TDI und TMS müssen dann jedes mal
auf TDI-Pin und TMS-Pin geschickt werden. Das wäre dann
sehr praktisch wenn die TDI-Pin und TMS-Pin neben einander
liegen. Dann braucht die Firmware nur wenige CPU-Zyklen um
TDI&TMS Bits auf JTAG-Schnittstelle zu übertragen.

Der Code, um ein Byte dieser TAP-Zustandübergänge auf
JTAG-Schnittstelle zu übertragen, sehen dann wie folgendes aus:

#define TMS_TDI_MASK 0x3

for(i=0;i<4;i++) {
  tms_tdi = TAPs & TMS_TDI_MASK;
  PORTB = ( PORTB & ( ~TMS_TDI_MASK ) ) | tms_tdi;
  TAPs = TAPs>>2;
  ...
}

Wenn TDI&TMS Pin nicht neben einander liegen, dann wird der Code
bisschen länger und kostet bisschen mehr CPU-Zyklen. Also die
Pin-Belegung gehört hier zu einer der Optimierungen in der Firmware.

jtag_speed und jtag_khz werden bei dieser Version noch nicht
unterstützt, die firmware verwendet also jtag_speed=0.

von Dennis (Gast)


Lesenswert?

Hallo,

ja das mit der Pin-Belegung hatte ich mir schon gedacht. Ist natürlich 
nicht ganz einfach bei einem so universellen Konzept wie beim USB-Prog. 
Aber ein Adapterkabel ist ja  schnell gekrimpt.
Habe jetzt mal eine andere JTAG-Probe mit anderen Tools getestet. Leider 
wird dort nur ein Fortschrittsbalken mit der momentanen 
Übertragungsgeschwindigkeit angezeigt und keine Zusammenfassung in kB/s. 
Das Ganze ist so schnell das man den Fortschrittsbalken gar nicht sieht. 
Es es wohl noch einiges mehr drin ;)
Mir ist noch aufgefallen, dass nachdem ich ARM DCC downloads aktiviert 
habe, ich lauter Fehlermeldungen beim laden ins RAM bekommen habe. Ob 
DCC den download schneller machen würde weiß ich nicht, beim laden ins 
Flash ändert sich dadurch nichts.

Werde die Tage noch ein paar Test machen. Im großem und ganzen könnte 
ich, wenn Interesse besteht, noch folgenden Tests zum Vergleich 
anbieten:

OpenOCD mit SAM-ICE an einem AT91SAM7
OpenOCD mit SAM-ICE an einem AT91SAM9
OpenOCD mit USB-Prog an einem AT91SAM9

Ggf. noch

OpenOCD mit Amontec-JTAGkey (2005er Version)an einem AT91SAM7
OpenOCD mit Amontec-JTAGkey (2005er Version)an einem AT91SAM9

Aber das wird sich ein paar Wochen hinziehen. Trotzdem sind 4 und 8 KB/s 
für den Hobbybereich vollkommen ausreichend. Wenn das ganze etwas 
getestet ist, wäre es sinnvoll die default OpenOCD Firmware des USBProgs 
mit dieser Version zu ersetzen. Vielleicht finden sich ja noch ein paar 
Mitstreiter nachdem die USBProg Firmware Entwicklung etwas eingeschlafen 
ist.

BTW OpenOCD 0.40 wurde released.

http://openocd.berlios.de/web/

von Cahya W. (cahya)


Lesenswert?

Hallo Dennis,

Das wäre natürlich super wenn du noch andere Tests zum Vergleich machen
kannst. Natürlich ist die Übertragungsrate von USBProg weit weg von
den anderen kommerziellen JTAG-Adapter. Die Flaschenhals hier ist
einfach die Performance des Mikrocontrollers, der USBProg verwendet 
(ATMega32).

Ich habe Berechnungen bei der OpenOCD-Firmware für eStick
(mit AT90USB162) durchgeführt. AT90USB162 hat nur 512 bytes SRAM,
also ich verwende hier nur 350 bytes als Daten-Buffer.
Die Hauptfunktion von der Firmware ist jtag_tap_output_*,
sie überträgt die TAP-Zustandübergänge vom Daten-Buffer zum Zielsystem,
liest das Ergebnis (TDO-Werte) und speicher sie im Daten-Buffer zurück.

Bei der Kompilierung der Firmware mit -Os verwendet die Funktion 
jtag_tap_output_* 125 CPU-Zyklen per Byte, oder 43.750 Zyklen um 350
Bytes vom Adapter zum Zielsystem zu übertragen. Das ist ungefähr
5.5 ms bei einem AT90USB162 mit 8MHz.
Dazu müssen auch die Übertragungszeit dieser 350 Bytes vom Host
zum Adapter (theoretisch ist das 1 ms bei
USB Full-Speed, praktisch ist das 2ms) und die Übertragungszeit der
TDO-Werte vom Adapter zum Host (wieder 2ms). Also insgesamt kostet
eine Übertragung von 350 Bytes der TAP-Zustandübergänge
5.5+2+2 = 9.5 ms (oder ungefähr 0.027 ms/byte)
Bei meiner Betrachtung erzeugt eine File-Übertragung mehr als 3.2 mal
soviel TAP-Zustandübergänge. Z.B. eine File-Übertragung von 10KB erzeugt 
mindestens Übertragung von 32KB TAP-Zustandübergänge. Das macht also
mindestens 32KB * 0.027ms/byte = 864ms. Das ist also eine
Übertragungsrate von 10KB/864ms = 11.6KB/s.
Diese Zahl stimmt ungefähr mit der Messung überein.

Also mich würde interessieren diese Firmware auf eine ARM Board zu
portieren, dann kann man mit anderen kommerziellen JTAG-Adaptern
vergleichen. Ich nehme an, die verwenden Mikrocontroller von ARM,
oder?

von Dennis (Gast)


Lesenswert?

Hallo Cahya,

danke für die Erklärung. Wie gesagt das mit den Tests kann etwas dauern.
Auf der Probe die ich zu Verfügung habe sitzt ein ARM9 + CPLD.
Ich habe auch schon mal mit dem Gedanken einer neuen Hardware gespielt. 
Das Konzept von USBProg finde ich sehr gut, aber die Hardware ist in 
mehrerer Hinsicht eher Suboptimal. Ich hatte an einen AT32UC3A3 gedacht. 
Hat Hi-Speed USB und DMA für GPIO, so dass das wackeln der Pins nicht 
mal unbedingt die CPU machen müsste. Theoretisch kann der Pins bis zu 
33Mhz togglen, da sollte man bei ARM basierten Chips sehr genau hin 
gucken wie viel Zyklen die brauchen bis sich Level des Pins ändert. 
Außerdem liegt schon so ein Exemplar bei mir in der Schublade ;)
Werfe bei Gelegenheit mal einen Blick in die Quellen und vielleicht 
komme ich ja zu einer ersten POC Portierung. Hatte mir den USBProg extra 
zugelegt um auf einer Plattform die bereits Funktioniert Erfahrungen in 
Sachen JTAG, ISP usw. machen zu können. Die Fehlersuche ist ja meistens 
einfacher wenn es schon irgendwo läuft.

von Cahya W. (cahya)


Lesenswert?

Hi,

Ich habe die Firmware auch auf USB AVR-Lab portiert, die muss man
aber noch einiges testen. Weil das Board nur Low Speed USB unterstüzt,
erreicht die Test-Version derzeit nur 1KB/s für die 
Flash-Programmierung.
Hier ist die Addresse:
http://code.google.com/p/usbvlab-jtag/

von Cahya W. (cahya)


Lesenswert?

Ich habe die USBProg-Treiber für die OpenOCD Version 0.4.0 upgedated.
Hier ist der Patch:
http://usbprog-jtag.googlecode.com/files/openocd-0.4.0-usbprog-0.1.diff

von Cahya W. (cahya)


Lesenswert?

Der USB AVR-Lab-Treiber wurde entsprechend auch auf OpenOCD
version 0.4.0 upgedatet:
http://usbvlab-jtag.googlecode.com/files/openocd-0.4.0-usbvlab-0.1.diff

von morxi (Gast)


Lesenswert?

Hallo,

kann ich denn mit dem USBprog jetzt auch ARM 3 Controller flashen und 
debuggen? Es geht speziell um den Atmel SAM3U4E. Zumindestens gibt es 
für den ein paar script files die mit openocd mitgeliefert werden.

Anderes Problem, hab die neueste Firmware auf den USBprog geflasht und 
das neueste OpenOCD compiliert. Jetzt kommt über OCD aber jedes mal die 
Fehlermeldung "Error: The spezified JTAG interfaces are not found 
(usbprog)"

Hab ich irgendwas vergessen? Den usbprog habe ich mit den neuesten 
Treibern installiert. Er wird auch korrekt erkannt. Hier mal ein Auszug 
aus dem LibUSB-Test:
1
bus-0/\\.\libusb0-0028--0x1781-0x0c63     1781/0C63
2
- Manufacturer : Cahya Wirawan
3
- Product      : usbprog-jtag
4
  wTotalLength:         41
5
  bNumInterfaces:       1
6
  bConfigurationValue:  1
7
  iConfiguration:       0
8
  bmAttributes:         a0h
9
  MaxPower:             25
10
    bInterfaceNumber:   0
11
    bAlternateSetting:  0
12
    bNumEndpoints:      2
13
    bInterfaceClass:    0
14
    bInterfaceSubClass: 0
15
    bInterfaceProtocol: 0
16
    iInterface:         0
17
      bEndpointAddress: 82h
18
      bmAttributes:     02h
19
      wMaxPacketSize:   64
20
      bInterval:        0
21
      bRefresh:         0
22
      bSynchAddress:    0
23
      bEndpointAddress: 02h
24
      bmAttributes:     02h
25
      wMaxPacketSize:   64
26
      bInterval:        0
27
      bRefresh:         0
28
      bSynchAddress:    0

Kann wer helfen? Danke im Vorraus.

von Morxi M. (morxi)


Lesenswert?

Hat sich erst mal erledigt. Hab noch mal neu compiliert diesmal 
allerdings beim ./config befehl mit dem anhang --enable-usbprog.

Jetzt wird USBprog erkannt.

Bekomme jetzt folgende Meldun:
1
D:\eclipse_workspace\ATSAM3U4E_Project\openocd>openocd_usb
2
Open On-Chip Debugger 0.4.0 (2010-04-20-15:13)
3
Licensed under GNU GPL v2
4
For bug reports, read
5
        http://openocd.berlios.de/doc/doxygen/bugs.html
6
Info : USBProg JTAG Interface ready
7
Info : RCLK (adaptive clock speed)
8
Info : JTAG tap: sam3.cpu tap/device found: 0x4ba00477 (mf
9
, ver: 0x4)
10
Info : sam3.cpu: hardware has 6 breakpoints, 4 watchpoints

Mal schauen wie ich weiter voran komme.

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.