TP-Link flash upgrade 4MB -> 8MB

írta: sonar, 5 éve

Aki használ régi routert valamelyik alternativ FW-rel az tudja, hogy a 4 MegaByte nem sok. De kis trükközéssel elég sok mindent (is) ki lehet hozni ezekből az eszközökből. Akár saját VPN szervert is üzemeltethetünk. Persze csak módjával hiszen nem egy sokmagos magas órajelű routerről beszélünk.
Nekem az elsődleges célom a kísérletezés, tapasztalat szerés az ismeretek bővítése volt.
Szóval MBazsee barátom adott egy nyugdíjazott TP-Link 841-et.

A kísérleti router. TP-Link 841

Először csak Custom Buildeket gyártottam. Device fórumtárs blog bejegyzése remek kondulási alap volt a témában. De sajnos hamar eljutottam arra a pontra, hogy a 4 Mega flash bizony nem sok. Ezt át lehet hidalni az úgynevezett extrootolással. Dióhéjban a folyamat lényege, hogy egy pendrivera kiterjesztjük a root particiót és a pendrive méreténél fogva megnőnek a lehetőségeink az alkamazások telepítésre. Igen ám, de a már említett router nem rendelkezik USB porttal. Ekkor vettem elő hcl fórumtárs bejegyzését. Ezen írás mentén először a 841-ből 3240-et csináltam. Majd idő hiányában a forrasztások elmaradtak, csupán a soros porthoz való tüskéket forrasztottam be. Viszont a sok sok böngészés közben volt egy mod. Mégpedig a flash IC cseréje egy nagyobbra. A témában elég sok, szerintem pongyola leírás van. És kezdőként nehézkes eligazodni, hogy mit is kellene pontosan csinálni. Ahhoz, hogy meg tudjuk ejteni a flash IC cserét szükségünk van egy nagyobb méretű flash IC-re.
Az én esetemben az eredeti IC típusa: s25fl032a
Googlizás és adatlap böngészés után vásároltam az ebay-ről 5 db MX25L6406E SOP8 IC Chip-et ~1000 Forintért [link]
Illetve rendeltem még egy CH341A programozót is kevesebb, mint 3000 Forintért. [link]

Miután megjött a Flash IC meg a programozó kiforrasztottam a flash-t és kiolvastam a tartalmát a CH341a programmer segítségével.

CH341A-24-25-EEPROM-BIOS-USB-PROGRAMMER

S25FL032A és MX25L6406E

Ezután letöltöttem a routerhez tartozó OpenWrt Upgrade Image file-t [link] Majd következik a 8 MB-s flash tartalom megkreálása Linux alatt.
Elöször is ismerni kell vmennyire a flash struktúráját. Három fő részt különböztetünk meg:
Bootloader vagy uboot a flash elején, középen helyezkedik el a Firmware és a legvégén az úgynevezett art rész, ahol a MAC, wifi-hez kapcsolódó információk találhatóak.

Flash címek:
4MB: u-boot 0-0x20000, Firmware 0x20000-0x3F0000 , art 0x3F0000-0x400000
8MB: u-boot 0-0x20000, Firmware 0x20000-0x7F0000 , art 0x7F0000-0x800000

Linux dd parancs segítségével szedjük szét a kiolvasott flash-t.
A két parancs közül az első ahol HEXában vannak az értékek, a második változat DECimális.

# get u-boot (first 128kB)
dd if=s25fl032a_read.bin of=uboot.bin bs=1 skip=$((0x0)) count=$((0x20000))
dd if=s25fl032a_read.bin of=uboot.bin bs=1 skip=0 count=131072
# get Firmware
dd if=fullflash.bin of=fw.bin bs=1 skip=$((0x20000)) count=$((0x3d0000))
# get art (last 64kB)
dd if=s25fl032a_read.bin of=art.bin bs=1 skip=$((0x3F0000)) count=$((0x10000))
dd if=s25fl032a_read.bin of=art.bin bs=1 skip=4128768 count=65536

Most, hogy megvan a darabolás és az OpenWRT oldaláról letöltött binárisunk állítsuk össze a 8 MB-s flash-t. Ehhez egy jó kis script: [link]. Futtatás előtt szerkesszük meg a sysupgrade_OpenWRT, art_file, boot_loader kezdetű sorokat. (Megj.: a scriptet ott futtassuk ahol a flash file-ok is vannak)

set -e
flash_size_in_MB=8
sysupgrade_OpenWRT="openwrt-squashfs-sysupgrade.bin"
art_file="art.bin"
boot_loader="uboot.bin"

sysupgrade_OpenWRT_size=$(wc -c $sysupgrade_OpenWRT | cut -f 1 -d " ")
art_file_size=$(wc -c $art_file | cut -f 1 -d " ")
boot_loader_size=$(wc -c $boot_loader | cut -f 1 -d " ")

echo "sysupgrade_OpenWRT_size: " $sysupgrade_OpenWRT_size
echo "art_file_size: " $art_file_size
echo "boot_loader_size: " $boot_loader_size

padcount=$(($flash_size_in_MB * 1024 * 1024 - $boot_loader_size - $art_file_size - $sysupgrade_OpenWRT_size))

echo " Write boot loader"
dd if=$boot_loader bs=512 >> "${sysupgrade_OpenWRT}_dump".bin
echo "Write firmware"
dd if=$sysupgrade_OpenWRT bs=512 >> "${sysupgrade_OpenWRT}_dump".bin
echo "Write padding FF"
dd if=/dev/zero ibs=1 count="$padcount" | tr "\000" "\377" >> "${sysupgrade_OpenWRT}_dump".bin
echo "Write art partition"
dd if=$art_file bs=512 >> "${sysupgrade_OpenWRT}_dump".bin

A script tulajdonképpen más nem csinál csak szépen sorban összefűzi a file-okat és a firmware és art közötti területet feltölti FF-fel.

Ezután már csak fel kell programozni a 8MB-os Flash IC-ét és visszaforrasztani.
Ha mindent jól csináltunk akkor 4MB-os üres overlay particiónk lett ahová kedvünkre telepíthetünk.

A forrasztás nem a legszebb, mert realizáltam, hogy a páka hegye bizony megértett a cserére.
A témában a leghasznosabb YouTube videó: [link]

Következő challange tervem szerint a RAM megnövelése lesz 32MByte-ról 64MByte-ra
Illetve lehet, hogy teszek egy kisérletet a 16MByte-os flash IC-vel.

(Lassan az OpenWRT is beszünteteti a Rom: 4MB Ram: 32MB routerek támogatását 432 Warning)