EJTAG

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
- 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
-
- http://feadispace.fe.funpic.de/
- ursprüngliche Beschreibung der Rettung einer Fritz!Box 7050
-
- 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
-
- 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
-
- http://wiki.openwrt.org/OpenWrtDocs/Customizing/Hardware/JTAG_Cable
- OpenWrt-Wiki-Eintrag zum Thema JTAG
-
- http://downloads.openwrt.org/utils/HairyDairyMaid_WRT54G_Debrick_Utility_v45.zip
- wrt54g EJTAG Flash-Leser/Schreiber von HairyDairyMaid
-
- http://openwince.sourceforge.net
- http://urjtag.org/book/_compilation_and_installation.html#_installing_from_subversion_repository
- openwince-Projekt JTAG-Software, Urjtag svn Beschreibung
-
- 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.
-
- http://ar7-firmware.berlios.de/qemu/index.html.de
- Erweiterte Version von QEMU mit AR7- und Fritz!Box-Unterstützung.
-
- http://focus.ti.com/lit/an/ssya002c/ssya002c.pdf
- 1149.1 TAPI Standart pdf.
-
- http://www.freelabs.com/~whitis/electronics/jtag/
- Ausfühliche Erklärung, als Einführung zu empfehlen aber in englischer Sprache.
-
- http://www.xilinx.com/support/documentation/application_notes/xapp139.pdf
- Mehr Details in den Applikationnotes von Xilinx