1. Diagnose:
Ausgangspunkt für diesen Beitrag war ein nicht mehr bootender WDR4300 Router, die in der Firmware integrierte TFTP Recovery Funktion schlug fehl. Also habe ich nach der Anleitung im OpenWrt Wiki ein serielle Konsole angeklebt, ich weiß das Lötstellen besser aussehen sollten.Im OpenWRT Wiki gibt es für die meisten TPLink Router passende Bilder wo eine Schnittstelle zu finden ist.
Mit einem USB TTL Adapter konnte ich dann den Grund im Terminalprogramm ( z.b. picocom,minicom ) sehen:
Bytes transferred = 8060928 (7b0000 hex)
original_product_id = 00
original_product_ver = 00
recovery_product_id = 43000001
recovery_product_ver = 01
auto update firmware: product id verify fail!
Ein Boot hing dann mit:
Uncompressing Kernel Image … OK
Starting kernel ...
Das heißt wie @Metatron herausgefunden hat das der Router seine eigene Product ID nicht mehr kennt. Metatron hatte dann ein China Tool gefunden das diese IDs wohl passend setzten kann:
Name des Tools: tp路由固件头修改工具.exe
Eine Quelle: http://sqzk.cqedu.net/tz/s/
Sieht dann so aus (hier mit 841 v9 Image):
$ hexdump -s 64 -n 8 tplink.bin
0000040 43 00 00 01 00 00 00 01
0000048
Für mich sieht es fast so aus als würde das Tool nur diese 8 Bytes umsetzen. Meine Idee war sich mit einem Hexeditor zu behelfen, ich habe es letztlich nicht getestet.
2. Software Tools
Für die Reparatur habe folgende Debian Pakete verwendet:- picocom
- minicom
- tftpd-hpa
- wireshark
3. Software Setup
Da ich keine Lust habe auf die Dauer einen TFTP Server zu betreiben, habe ich den Daemon direkt nach der Installation per apt wieder deaktiviert:update-rc.d -f tftpd-hpa remove
Danach kann ich den Daemon einfach als Root starten und mit ctrl-c beenden wenn sinnvoll:
in.tftpd --foreground -s -v --verbosity 10 /srv/tftp
Picocom braucht kein Setup:
picocom -b 115200 /dev/ttyUSB0
Ich habe die ganze Zeit wireshark mit laufen lassen, da man dort einfache Protokolle wie TFTP gut überwachen kann.
4. Recovery Image besorgen
Vorsicht hier sollte man wissen was man tut, es empfiehlt sich das OpenWRT Wiki aufmerksam zu lesen oder das Image z.b. bei [http://www.friedzombie.com/tplink-stripped-firmware/][2] herunterladen.dd if=wdr4300v1_en_3_14_3_up_boot\(150518\).bin of=tplink.bin skip=257 bs=512
cp tplink.bin /srv/tftp/wdr4300v1_tp_recovery.bin
So liegt das Image für den TFTP Push Button Recovery bereit. Auf einem TPLink 1043 habe ich fürs Push Button recovery auch schon ein Gluon Factory Image verwendet.
5. Recovery
Nun wird es spannender, wenn das Terminal Programm, in meinem Fall picocom laeuft muss man sobald die Zeile **Autobooting in 1 seconds** sehr schnell das Passwort **tpl** eingeben um zum db12x Prompt zu kommen, ich habe das mit minicom nicht geschafft, mit picocom hat es beim 2. Mal geklappt. hier braucht man Geduld schnelle Finger und viele Resets des Routers. U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)U-boot DB120
DRAM: 128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash: 8 MB
Using default environment
PCIe Reset OK!!!!!!
In: serial
Out: serial
Err: serial
Net: ag934x_enet_initialize...
No valid address in Flash. Using fixed address
wasp reset mask:c03300
WASP ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
Autobooting in 1 seconds
db12x> tftpboot
dup 1 speed 1000
*** Warning: no boot file name; using '6F01A8C0.img'
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename '6F01A8C0.img'.
Load address: 0x81000000
Loading: T
Abort
Hier habe ich erkannt ich brauche auf meinem Linux System die Adresse 192.168.1.100 und habe die Datei von wdr4300v1_tp_recovery.bin nach 6F01A8C0.img kopiert. Das T bei Loading steht wohl fuer timeout.
db12x> tftpboot
Unknown command 'tftpboot' - try 'help'
db12x> tftpboot
Unknown command 'tftpboot' - try 'help'
An diesem Prompt werden Tippfehler nicht toleriert daher kannte er ein korrigiertes ttfpboot nicht.
db12x> tftpboot
*** Warning: no boot file name; using '6F01A8C0.img'
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename '6F01A8C0.img'.
Load address: 0x81000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
...
#################################################################
###############
done
Bytes transferred = 8060928 (7b0000 hex)
db12x> erase 0x9f020000 +7b0000
First 0x2 last 0x7c sector size 0x10000
124
Erased 123 sectors
Das OpenWRT Wiki empfiehlt das Flash zu löschen, also habe ich es gemacht.
db12x> cp.b 0x81000000 0x9f020000 0x7c0000
Copy to Flash... write addr: 9f020000
done
db12x> reset
Danach wird die Firmware von der Adresse an die sie per TFTP geladen wurde kopiert so das sie bei Start gefunden wird, und nun die Router resettet.
Und schon zeigt sich der Erfolg:
U-Boot 1.1.4 (Jun 17 2013 - 12:31:57)
U-boot DB120
DRAM: 128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash: 8 MB
Using default environment
PCIe Reset OK!!!!!!
In: serial
Out: serial
Err: serial
Net: ag934x_enet_initialize...
No valid address in Flash. Using fixed address
wasp reset mask:c03300
WASP ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
Autobooting in 1 seconds
## Booting image at 9f020000 ...
Uncompressing Kernel Image ... OK
Starting kernel ...
Booting Atheros AR934x
[ 0.000000] Linux version 2.6.31--LSDK-9.2.0_U6.616 (root@liaozhiming) (gcc version 4.3.3 (GCC) ) #1 Mon May 18 19:25:55 CST 2015
[ 0.000000] Ram size passed from bootloader =128M
[ 0.000000] flash_size passed from bootloader = 8
[ 0.000000] CPU revision is: 0001974c (MIPS 74Kc)
[ 0.000000] ath_sys_frequency: cpu srif ddr srif cpu 560 ddr 450 ahb 225
[ 0.000000] Determined physical RAM map:
[ 0.000000] memory: 08000000 @ 00000000 (usable)
[ 0.000000] Zone PFN ranges:
[ 0.000000] Normal 0x00000000 -> 0x00008000
[ 0.000000] Movable zone start PFN for each node
[ 0.000000] early_node_map[1] active PFN ranges
[ 0.000000] 0: 0x00000000 -> 0x00008000
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
...
Damit hat der Router wieder eine TPLink Firmware, ich habe dann noch dreist per Push Button Recovery ein Gluon Factory Image geflashed.