EJTAG

Aus Zebradem WIKI
Zur Navigation springenZur Suche springen

Das Board mit Freiheiten




Was ist EJTAG überhaupt?

JTAG, kurz für Joint Test Action Group, ist ein in IEEE 1149.1 standardisierter, serieller Bus, der in erster Linie zum Prüfen und Steuern von integrierten Schaltkreisen (IC) während Entwicklung gedacht ist; EJTAG ist eine Erweiterung dieses Standards durch den Hersteller MIPS. Die JTAG-Schnittstelle ermöglicht es, auch auf interne Teile eines Schaltkreises zuzugreifen, die normalerweise, d.h. über die eigentlich für den Betrieb vorgesehenen Anschlüsse nicht zugängig sind.

JTAG-fähige Bausteine verfügen über fünf Steuerleitungen und können in einer Kette hintereinander geschaltet werden. Während die Taktleitung alle Bausteine parallel bedient, wird der Datenausgang eines ICs mit dem Dateneingang des nachfolgenden verbunden. Die Daten werden dann wie in einer Eimerkette von einem IC zum nächsten weitergereicht.


Hardware

Alle Fritz!Boxen, die ich bisher in der Hand hatte, haben auf der Unterseite der Platine einen 2x14 poligen EJTAG-Anschluss. Das Original-EJTAG-Pinout aus der |MIPS-EJTAG-Spezifikation, S. 122 ist wie folgt:


   TRST  + o  GND
    TDI  o o  GND
    TDO  o o  GND
    TMS  o o  GND
    TCK  o o  GND
    RST  o    key
   DINT  o o  VIO (3.3V)

Das Original-JTAG-Pinout für die TI DSP C6000 Serie ist wie folgt:

TMS      o o  TRST
TDI      o o  GND
PD(Vcc)  o    key
TOD      o o  GND
TCK_RET  o o  GND
TCK      o o  GND
EMU0     o o  EMU1

Diesen beiden Pinouts folgen auch die Anschlüsse auf der Unterseite der Fritzbox.

Um den EJTAG-Anschluss zu benutzen, benötigt man im einfachsten Fall einen PC mit Parallelport und ein geeignetes EJTAG-Kabel. Im Link oben findet man die "passive" Variante des Xilinx DLC5-Kabels, das nur aus einem männlichen DB-25Stecker, fünf Widerständen und einem Stück Flachbandkabel besteht. Bei diesem Kabel wird die "Pegelwandlung" zwischen PC-Parallelport und EJTAG mit Hilfe von simplen Vorwiderständen zur Strombegrenzung und den Eingangsschutzdioden des AR7 vorgenommen. Das funktioniert "meistens", aber das Kabel sollte nicht länger als ca. 20cm werden. Wenn es nicht funktioniert oder das Kabel länger sein soll, benötigt man eine "aktive" Variante des Kabels, die einen 74HC244 oder ähnlich zur Pegelanpassung verwendet. Der oft zitierte Nachteil, einsolches Kabel brauche eine Stromversorgung, ist hier keiner, da die 3.3V VIO ja am EJTAG-Anschluss zur Verfügung stehen. Mehr Details dazu gibt es im |OpenWrt-Wiki.

Das Flachbandkabel kann man - entsprechendes Geschick vorausgesetzt - direkt an der Platine anlöten. Dabei sollte man immer abwechselnd eine Ader für ein Signal und die nächste als Masseleitung verwenden. Das macht die Verbindung etwas störsicherer und entspricht auch der Belegung bei der Verwendung von Schneid-Klemm-Federleisten.

Etwas eleganter ist natürlich die Verwendung einer zweireihigen Pfostenleiste im 1,27mm Raster, die man auf die Platine auflötet. Darauf kann man dann einfach z.B. eine kleine Adapterplatine mit dem passenden Gegenstückaufstecken. Passende Stiftleisten gibt es z. B. bei SAMTEC in der CLP Serie. Muster sind unterwegs ...

Software

wrt54g debrick-Utility von HairyDairyMaid

Das ist das klassische JTAG-Flash-Utility aus der OpenWrt-Szene und funktioniert auch mit den Fritz!Boxen. Der Sourcecode kann bei Openwrt heruntergeladen werden. Ab der Version 0.45 ist der AR7-Prozessor bereits ins Programm eingebaut und wird erkannt. Bei neueren Boxen mit meheren ICs in der Kette ist das nicht der Fall, und es müssen von feadi beschrieben die Parameter

/skipdetect
/instrlen:5

angegeben werden. Funktioniert jedoch sehr unzuverlässig und man muss die Kettenlänge kennen.

Eine erweiterten HairyDairyMaid Software, die erkennt nun auch einen W701, diese ist auch bei allen AVM Routern brauchbar. |wrtjp.5.1


Folgende Kommndowzeile funktioniert praktisch bei allen AVM Routern:

Urlader lesen: 
wrtjp.5.1 -backup:custom /bypass /skipdetect /window:90000000 /start:90000000 /length:10000

Urlader schreiben: 
wrtjp.5.1 -flash:custom /bypass /skipdetect /window:90000000 /start:90000000 /length:10000

Ein frei für 14 Tage verwendbares Toll das verwendet werden könnte: [|ultimat scan] Das Flash-Layout der Fritz!Boxen ist nicht ins Programm eingebaut. Daher werden immer die "custom"-Varianten der Befehle verwendet und die Adressen der Flash-Bereiche manuell angegeben. Die Parameter dafür lauten wie folgt:

/window:90000000 # Basisadresse des Flash-EPROMs
/start: <startadresse in HEX>
/length: <länge in HEX>

Dabei gilt für /start und /length:

Flashgröße Bereich mtd /start /length
alle Urlader mtd2 90000000 10000
4MiB Kernel/FS mtd0 90010000 3B0000
Environment 1 mtd3 903C0000 20000
Environment 2 mtd4 903E0000 20000
8MiB Kernel/FS mtd0 90010000 7B0000
Environment 1 mtd3 907C0000 20000
Environment 2 mtd4 907E0000 20000

Example Backup von einen 7113:

==================================================
WRT54G/GS/AVM/Speedport EJTAG Debrick Utility v5.1
==================================================

***--------------------------------------------------------------------------------------------------------------***

Beginning dedect scan leangth... 
Switch on power!...
Chain lenght: 14 IR-Chain: 00010010000011 (00000483)
Probing bus ...

*** CHIP Device number: '1' SET BY COMMANDLINE OPTION ***
Device number: '1' Chip ID: 00000000000000000001000000001111 (0000100F)
 *** Found a TI AR7WRD TNETD7200ZWD Rev 1 CPU chip ***
Device number: '2' Chip ID: 00001011011011000000000000101111 (0B6C002F)
 *** Found a 0B6C002F ????? chip ***
Device number: '3' Chip ID: 00010001110000010000000010010011 (11C10093)
 *** Found a XC3S100E FPGE chip ***
---- Selected: '1' Chip ID: 00000000000000000001000000001111 (0000100F)
 *** Found a TI AR7WRD TNETD7200ZWD Rev 1 CPU chip ***


Count devives: '3' selected device: '3' count header bits added to DR: '2' count trailing bits added to DR: '0'
Chain length: '14' Selected IR length: '5' Sum of added header bits to IR: '9' Sum of added trailer bits to IR: '0'

Chip ID: 00000000000000000001000000001111 (0000100F)
 *** Found a TI AR7WRD TNETD7200ZWD Rev 1 CPU chip ***

check EJTAG ... 
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG IMPCODE ....... : 01000001010000000100000000000000 (41404000)
    - EJTAG Version ....... : 2.6
    - EJTAG DMA Support ... : No


Issuing Processor / Peripheral Reset ... 
Done
-- > Halting Processor ... 
<------ Processor Entered Debug Mode ------>
Clearing Watchdog (0xb8000080) ... Done

Probing Flash at (Flash Window: 0x90000000) Done

Flash Vendor ID: 00000000000000000000000011000010 (000000C2)
Flash Device ID: 00000000000000000010001001111110 (0000227E)
*** Found a MX  29lv640MTTC 2Mx16 TopB (8MB) Flash Chip ***

    - Flash Chip Window Start .... : 90000000
    - Flash Chip Window Length ... : 00400000
    - Selected Area Start ........ : 90000000
    - Selected Area Length ....... : 00010000

*** You Selected to Backup the CUSTOM.BIN ***
 100%   byte count: 65536
Done  (CUSTOM.BIN.SAVED_20090812_132627 saved to Disk OK)

bytes written: 65536
=========================
Backup Routine Complete
=========================
elapsed time: 264 seconds


 *** REQUESTED OPERATION IS COMPLETE ***

jtag-Tools des openwince-Projekts

Es gibt eine um EJTAG erweiterte Version der jtag-Tools aus dem openwince-Projekt, das ebenfalls verwendet werden kann. Nach Auspacken der ZIP-Datei kann man die Software mit folgenden Kommandos bauen:

$ patch -p1 <<'EOF'
--- b/src/flash.c       2006-02-28 19:49:27.000000000 +0100
+++ a/src/flash.c       2007-03-25 12:22:21.000000000 +0200
@@ -64,7 +64,7 @@
 };
 
 extern cfi_array_t *cfi_array;
-static flash_driver_t *flash_driver = NULL;
+flash_driver_t *flash_driver = NULL;
 
 static void
 set_flash_driver( void )
EOF
$ ./configure --with-include=$PWD/include-0.4.2
$ make

In den jtag-Tools ist keine Beschreibung des AR7 oder der Fritz!Boxen enthalten, so dass man die Parameter entweder manuell einstellen oder mit folgendem Skript setzen kann (ist im Prinzip eine erweiterte Kopie des ADM5120-Skripts aus den jtag-Tools):

cable ppdev /dev/parport0 DLC5
detect

register        BR               1
register        BSR              1
register        DIR             32
register        EJIMPCODE       32
register        EJADDRESS       32
register        EJDATA          32
register        EJCONTROL       32
register        EJALL           96
register        EJFASTDATA      33

instruction length 5

instruction     BYPASS          11111   BR
instruction     SAMPLE/PRELOAD  00010   BSR
instruction     IDCODE          00001   DIR
instruction     EJTAG_IMPCODE   00011   EJIMPCODE
instruction     EJTAG_ADDRESS   01000   EJADDRESS
instruction     EJTAG_DATA      01001   EJDATA
instruction     EJTAG_CONTROL   01010   EJCONTROL
instruction     EJTAG_ALL       01011   EJALL
instruction     EJTAGBOOT       01100   BR
instruction     NORMALBOOT      01101   BR
instruction     EJTAG_FASTDATA  01110   EJFASTDATA

initbus ejtag
endian little
detectflash 0x30000000
print

Warum das Flash hier bei Adresse 0x30000000 erscheint, ist seltsam. Mit diesem Skript erhält man z.B. folgende Ausgabe (4MiB Fritz!Box Fon ATA mit Macronix Flash):

$ ./src/jtag 
JTAG Tools 0.6-cvs-20051228
Copyright (C) 2002, 2003 ETC s.r.o.
JTAG Tools is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for JTAG Tools.

Warning: JTAG Tools may damage your hardware! Type "quit" to exit!

Type "help" for help.

jtag> script init.fbox
Initializing Xilinx DLC5 JTAG Parallel Cable III on ppdev port /dev/parport0
IR length: 5
Chain length: 1
Device Id: 00000000000000000001000000001111
Cannot open /usr/local/share/jtag/MANUFACTURERS
  Unknown manufacturer!
chain.c(110) Part 0 without active instruction
chain.c(133) Part 0 without active instruction
chain.c(110) Part 0 without active instruction
ImpCode=01000001010000000100000000000000
EJTAG version: 2.6
EJTAG Implementation flags: R4k DINTsup ASID_8 NoDMA MIPS32
dev ID=22a7   man ID=00c2
Using CFI flash chip detection, not jedec
Query identification string:
        Primary Algorithm Command Set and Control Interface ID Code: 0x0002 (AMD/Fujitsu Standard Command Set)
        Alternate Algorithm Command Set and Control Interface ID Code: 0x0000 (null)
Query system interface information:
        Vcc Logic Supply Minimum Write/Erase or Write voltage: 2700 mV
        Vcc Logic Supply Maximum Write/Erase or Write voltage: 3600 mV
        Vpp [Programming] Supply Minimum Write/Erase voltage: 0 mV
        Vpp [Programming] Supply Maximum Write/Erase voltage: 0 mV
        Typical timeout per single byte/word program: 16 us
        Typical timeout for maximum-size multi-byte program: 0 us
        Typical timeout per individual block erase: 1024 ms
        Typical timeout for full chip erase: 0 ms
        Maximum timeout for byte/word program: 512 us
        Maximum timeout for multi-byte program: 0 us
        Maximum timeout per individual block erase: 16384 ms
        Maximum timeout for chip erase: 0 ms
Device geometry definition:
        Device Size: 4194304 B (4096 KiB, 4 MiB)
        Flash Device Interface Code description: 0x0002 (x8/x16)
        Maximum number of bytes in multi-byte program: 1
        Number of Erase Block Regions within device: 2
        Erase Block Region Information:
                Region 0:
                        Erase Block Size: 8192 B (8 KiB)
                        Number of Erase Blocks: 8
                Region 1:
                        Erase Block Size: 65536 B (64 KiB)
                        Number of Erase Blocks: 63
 No. Manufacturer              Part                 Stepping Instruction          Register  
---------------------------------------------------------------------------------------------
   0                                                         EJTAG_DATA           EJDATA    

Active bus:
*0: EJTAG compatible bus driver via PrAcc (JTAG part No. 0)
        start: 0x00000000, length: 0x20000000, data width: 8 bit
        start: 0x20000000, length: 0x20000000, data width: 16 bit
        start: 0x40000000, length: 0x20000000, data width: 32 bit
jtag> 

Und hier noch ein Beispiel für das Auslesen des AR7-Bootroms, z.B. zur Verwendung im AR7 qemu als mips_bios.bin:

jtag> readmem 0x1fc00000 4096 mips_boot.bin
address: 0x1FC00000
length:  0x00001000
reading:
addr: 0x1FC01000
Done.
jtag> quit
$ od -tx1 mips_boot.bin | head
0000000 04 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00
0000020 00 10 08 0c 61 a8 1a 3c 00 1a 5a 37 00 00 5a 8f
0000040 07 00 5a 33 01 00 01 24 13 00 41 13 00 00 00 00
0000060 02 00 01 24 13 00 41 13 00 00 00 00 03 00 01 24
0000100 1a 00 41 13 00 00 00 00 04 00 01 24 1a 00 41 13
0000120 00 00 00 00 05 00 01 24 21 00 41 13 00 00 00 00
0000140 06 00 01 24 1e 00 41 13 00 00 00 00 07 00 01 24
0000160 17 00 41 13 00 00 00 00 00 b0 1a 3c 08 00 40 03
0000200 00 00 00 00 61 a8 1a 3c 08 16 5a 37 00 00 5a 8f
0000220 03 00 5a 33 03 00 01 24 f7 ff 41 17 00 00 00 00


Fritzbox retten

  • Normalerweise ist nur die Firmware erneut per FTP zu ersetzen wenn ein Update per Webinterface nicht mehr möglich ist.
  • Dazu gibt es von AVM Recover Windows Executeabels. Auch für Boxen von denen kein offizielles Recover.exe vorahnen ist sind per Speed-to-fritz recover.exe erstellbar.
  • Auch per FTP kann recovert werden. Mehrere Möglichkeiten sind üblich. Unter LINUX mit FTP oder Windows mit NCFP, dem Total Kommander oder mit Tools (zB: ruKernelTool) die darauf aufbauen.
  • Mit einem angeschlossene analogen Telefon kann die Fritzbox durch die Eingabe der Zeichenfolge "#991*15901590*" zurückgesetzt werden. Anschließend muss man ca. eine Minute warten, bis der Reset-Vorgang abgeschlossen ist.
  • Bootloader ersetzen und dadurch z.B. eine "gebrickete" Fritzbox zu retten.
  • Dokumentation zu EJTAG. Normalerweise wenn die LEDs der Box noch blinken ist der Bootloader in Takt.EJTAG

Quellenangaben

http://www.wehavemorefun.de/fritzbox

Wichtige Links

  1. http://www.xjtag.com/support-jtag/jtag-technical-guide.php
    http://www.universalscan.com
    Grundlagen erklärt und freie Testsoftware für 30 Tage kostenlos verwendbar zum runterladen
  2. http://feadispace.fe.funpic.de/
    ursprüngliche Beschreibung der Rettung einer Fritz!Box 7050
  3. http://www.mips.com/secure-download/index.cfm?filename=application-notes-secure/MD00071%2D2B%2DEJTAG%2DAPP%2D01.00.pdf
    http://www.mips.com/secure-download/index.cfm?filename=mips-architecture/MD00047%2D2B%2DEJTAG%2DSPC%2D03.10.pdf
    MIPS-EJTAG-Spezifikation, ganz unten auf der Seite. Zum Download der PDFs ist eine kostenlose Registrierung erforderlich
  4. http://www.ti.com/litv/pdf/spru641
    http://focus.ti.com/lit/an/spra439d/spra439d.pdf
    http://tiexpressdsp.com/wiki/index.php?title=BSDL
    http://focus.ti.com/lit/ug/spru732g/spru732g.pdf
    TMS320C6000 DSP Designing for JTAG Emulation Reference Guide, Texas jtag Tool beschreibung, Texas wiki zu BSDL, C6000 Prozessordatenblatt
  5. http://wiki.openwrt.org/OpenWrtDocs/Customizing/Hardware/JTAG_Cable
    OpenWrt-Wiki-Eintrag zum Thema JTAG
  6. http://downloads.openwrt.org/utils/HairyDairyMaid_WRT54G_Debrick_Utility_v45.zip
    wrt54g EJTAG Flash-Leser/Schreiber von HairyDairyMaid
  7. http://openwince.sourceforge.net
    http://urjtag.org/book/_compilation_and_installation.html#_installing_from_subversion_repository
    openwince-Projekt JTAG-Software, Urjtag svn Beschreibung
  8. http://www.amelek.gda.pl/rtl8181/jtag/, http://star.oai.pp.ru/jtag/jtag-brecis-ok.zip
    Erweiterte Versionen der openwince-JTAG-Software mit EJTAG-Unterstützung. Die ZIP-Datei im zweiten Link enthält auch die openwince-includes, die zum Compilieren benötigt werden.
  9. http://ar7-firmware.berlios.de/qemu/index.html.de
    Erweiterte Version von QEMU mit AR7- und Fritz!Box-Unterstützung.
  10. http://focus.ti.com/lit/an/ssya002c/ssya002c.pdf
    1149.1 TAPI Standart pdf.
  11. http://www.freelabs.com/~whitis/electronics/jtag/
    Ausfühliche Erklärung, als Einführung zu empfehlen aber in englischer Sprache.
  12. http://www.xilinx.com/support/documentation/application_notes/xapp139.pdf
    Mehr Details in den Applikationnotes von Xilinx