Tplink
TL-WR1043ND
Zugriff auf Uboot
- Verbindung via Serial Port (115200,8,n,1)
- Gerät neu starten
- Bootet das Gerät so kommen einige Ausschriften auf der Konsole. Interessant ist die Flashaufteilung, da die Offsets später
beim manuellem Schreiben des Flashes verwendet werden. Die physikalische Adresse des Flashspeichers liegt hier bei diesem Router an 0x9f000000 (Suche nach ## Booting image at ...). Es ist in der Flashaufteilung gut zu erkennen, dass UBoot den Kernel startet.
## Booting image at 9f020000 ... ........ [ 0.806670] Creating 5 MTD partitions on "spi0.0": [ 0.811535] 0x000000000000-0x000000020000 : "u-boot" [ 0.818025] 0x000000020000-0x0000001674fc : "kernel" [ 0.824266] 0x0000001674fc-0x0000007f0000 : "rootfs" [ 0.830002] mtd: device 2 (rootfs) set to be root filesystem [ 0.835803] 1 squashfs-split partitions found on MTD device rootfs [ 0.842118] 0x000000490000-0x0000007f0000 : "rootfs_data" [ 0.849820] 0x0000007f0000-0x000000800000 : "art" [ 0.855781] 0x000000020000-0x0000007f0000 : "firmware"
- Gerät nochmals starten.
- Sobald "Autobooting in n seconds" erscheint folgendes auf der Konsole eingeben (via Copy&Paste einfügen, da Zeit sehr knapp ist).
tpl <enter>
U-Boot 1.1.4 (Jun 13 2014 - 15:14:01) ap135 - Scorpion 1.0DRAM: sri Scorpion 1.0 ath_ddr_initial_config(178): (16bit) ddr2 init tap = 0x00000003 Tap (low, high) = (0x0, 0x1d) Tap values = (0xe, 0xe, 0xe, 0xe) 64 MB Flash Manuf Id 0xef, DeviceId0 0x40, DeviceId1 0x17 flash size 8MB, sector count = 128 Flash: 8 MB Using default environment *** Warning *** : PCIe WLAN Module not found !!! *** Warning *** : PCIe WLAN Module not found !!! In: serial Out: serial Err: serial Net: ath_gmac_enet_initialize... athrs_sgmii_res_cal: cal value = 0x1 No valid address in Flash. Using fixed address No valid address in Flash. Using fixed address ath_gmac_enet_initialize: reset mask:c02200 Scorpion ----> S17 PHY * athrs17_reg_init: complete : cfg1 0x80000000 cfg2 0x7114 eth0: ba:be:fa:ce:08:41 eth0 up athrs17_reg_init_wan done SGMII in forced mode athr_gmac_sgmii_setup SGMII done : cfg1 0x800c0000 cfg2 0x7214 eth1: ba:be:fa:ce:08:41 eth1 up eth0, eth1 Setting 0x18116290 to 0x50a1a14f Autobooting in 1 seconds ap135>
- printenv - zeigt alle uboot Variablen an.
ap135> printenv bootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),6336k(rootfs),1408k(uImage),64k(mib0),64k(ART) bootcmd=bootm 0x9f020000 bootdelay=1 baudrate=115200 ethaddr=0xba:0xbe:0xfa:0xce:0x08:0x41 dir= lu=tftp 0x80060000 ${dir}u-boot.bin&&erase 0x9f000000 +$filesize&&cp.b $fileaddr 0x9f000000 $filesize lf=tftp 0x80060000 ${dir}ap135${bc}-jffs2&&erase 0x9f050000 +0x630000&&cp.b $fileaddr 0x9f050000 $filesize lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f680000 +$filesize&&cp.b $fileaddr 0x9f680000 $filesize stdin=serial stdout=serial stderr=serial ethact=eth0 filesize=680004 fileaddr=F ipaddr=192.168.1.111 serverip=192.168.1.31
- setenv - Wenn nötig können die Server/Client IP angepasst werden. Hier im Beispiel hat der PC die 192.168.1.31
setenv serverip 192.168.1.31
- Auf dem PC sollten in verschiedenen Terminals (nicht die serielle Konsole) zwei Programme gestartet werden. tftpd lauscht auf der angegebenen IP und liefert auf Anfrage, die unter /var/lib/tftpboot abgelegten Files and den tftp-client (Router)
Terminal 1: in.tftpd -lL --secure --address 192.168.1.31:69 /var/lib/tftpboot Terminal 2: tcpdump -tni any port 69
- In der seriellen Konsole kann mit tftp ein File/image an eine RAM Adresse im Router geladen werden. Um eine gute Adresse zu finden, die nicht gerade vom Uboot selbst verwendet wird, kann man sich die Ausgabe von printenv ansehen. Dort findet man oft vordefinierte Befehle. Hier im Beispiel sind 3 Variablen lu,lf,lk definiert. Diese enthalten schon Befehle, um via tftp
- Uboot
- Kernel
- Filesystem
zu laden. Da es den Befehl run scheinbar nicht in allen UBoot Varianten gibt, müssen die Befehle (lk und lf) manuell durchgeführt werden.
Dabei aber trotzdem prüfen, ob die Adressen dem Flash-Offset (+Flash Startadresse) entsprechen.
ap135> tftp 0x80060000 firmware.bin eth1 link down Using eth0 device TFTP from server 192.168.1.31; our IP address is 192.168.1.111 Filename 'firmware.bin'. Load address: 0x80060000 Loading: T ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################ done Bytes transferred = 3801092 (3a0004 hex)
- Kernelbereich Flash löschen
Jetzt wird erstmal soviel für den Kernel gelöscht, dass das gerade heruntergeladene File später geschrieben werden kann.
Der Befehl erase hat zwei Parameter. Der erste gibt die Flashadresse an (Flashadresse+Offset), der zweite die Länge in HEX aber ohne 0x davor. Die Länge wurde beim Befehl tftp am Ende in Klammern angegeben (oder mit printenv anzeigen lassen). Das '+' bedeutet, dass eine bestimmte Länge gelöscht wird.
ap135> erase 0x9f020000 +3a0004 Erasing flash... First 0x2 last 0x3c sector size 0x10000 60 Erased 59 sectors ap135>
- Kernelbereich schreiben: Mit dem Befehl cp.b (copy byte). cp.b hat drei Parameter: RAM Adresse, Flash-Adresse, und Länge. Die Länge wird auch in Hex angegeben, aber ohne '+'
ap135> cp.b 0x80060000 0x9f020000 3a0004 Copy to Flash... write addr: 9f020000 done ap135>
- Router neu starten