www.mikrocontroller.net

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


Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

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

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rotax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super. Danke. Melde mich wenn ich zum testen gekommen bin.

Autor: Holger .. (aronadaal)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Holger .. (aronadaal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Dennis,
kannst du bitte mal noch deine OpenOCD-Konfiguration posten?

Besten Dank!

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bitte.

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

Autor: Holger .. (aronadaal)
Datum:

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

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

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger .. (aronadaal)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Cahya Wirawan (cahya)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Cahya Wirawan (cahya)
Datum:

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

Autor: morxi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
bus-0/\\.\libusb0-0028--0x1781-0x0c63     1781/0C63
- Manufacturer : Cahya Wirawan
- Product      : usbprog-jtag
  wTotalLength:         41
  bNumInterfaces:       1
  bConfigurationValue:  1
  iConfiguration:       0
  bmAttributes:         a0h
  MaxPower:             25
    bInterfaceNumber:   0
    bAlternateSetting:  0
    bNumEndpoints:      2
    bInterfaceClass:    0
    bInterfaceSubClass: 0
    bInterfaceProtocol: 0
    iInterface:         0
      bEndpointAddress: 82h
      bmAttributes:     02h
      wMaxPacketSize:   64
      bInterval:        0
      bRefresh:         0
      bSynchAddress:    0
      bEndpointAddress: 02h
      bmAttributes:     02h
      wMaxPacketSize:   64
      bInterval:        0
      bRefresh:         0
      bSynchAddress:    0

Kann wer helfen? Danke im Vorraus.

Autor: Morxi Macht murcks (morxi)
Datum:

Bewertung
0 lesenswert
nicht 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:
D:\eclipse_workspace\ATSAM3U4E_Project\openocd>openocd_usb
Open On-Chip Debugger 0.4.0 (2010-04-20-15:13)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.berlios.de/doc/doxygen/bugs.html
Info : USBProg JTAG Interface ready
Info : RCLK (adaptive clock speed)
Info : JTAG tap: sam3.cpu tap/device found: 0x4ba00477 (mf
, ver: 0x4)
Info : sam3.cpu: hardware has 6 breakpoints, 4 watchpoints

Mal schauen wie ich weiter voran komme.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.