X279128S — Flash partition map & versions
Versions discovered
Version Value Source
Bootloader (U-Boot) V9.0.10P10N2 (Dec 16 2022) printenv versioninfo
Software (firmware) V9.0.10P1N12A (SoftWareVerExt=07e5P1N12A0324) /etc/zte_ver_num, ver_num_des
CSP (driver package) V3.1.00P01T04 bspdriver.ko string
Kernel Linux 4.1.25 (SMP ARMv7) module vermagic
Build date Wed Aug 4 22:17 CST 2021 /etc/version
Region Manufacturing default (India/Viettel/Indonesia/Manufacture variants in image) /etc/regioncode
GPON FW BOB_GN25L95_GPONZX279128S{27,28,29,30,31,32,76}.bin /etc
Partition table (SPI NAND, 256 MB)
- Python 37.5%
- C 34.9%
- Shell 23.1%
- Makefile 4.5%
Status 2026-10-31: persistent OpenWrt boot + English LuCI + LAN + 5GHz all working. Records the v0.2.x release history, the bypass-fsload boot fix, the 5GHz firmware resolution (kmod-mt7663-firmware-ap baked in; mt7916-firmware disabled), the baked English default (luci lang en), and open items (random MACs, LAN-LED GPIO sweep). |
||
|---|---|---|
| openwrt | ||
| tools | ||
| .gitignore | ||
| BRINGUP-F670L.md | ||
| BUILD-MILESTONE.md | ||
| F670L-BUILD.md | ||
| F670L-FLASH-RE.md | ||
| FINDINGS.md | ||
| FLASH-F670L.md | ||
| FLASHING.md | ||
| HANDOVER.md | ||
| README.md | ||
| REPORT.md | ||
| zx279128s-vendor-kernel-config.txt | ||
ZTE Router Reverse Engineering — OpenWrt Driver Porting Lab
Goal: reverse engineer the WiFi, LAN (switch/PHY), and USB drivers from a ZTE fiber router so they can be ported to OpenWrt.
📥 Flash OpenWrt on the F670L: see
FLASHING.md— the safe dual-slot install/restore procedure. Firmware release: tagv0.1.0(attached assets:openwrt-f670l-slot.bin,f670l-flash, docs).
Target
- Bootloader: ZTE U-Boot
V9.0.10P10N2(Dec 16 2022), ARM (LE v7) - Flash: SPI NAND, 256 MB (
0x10000000), 2 KB page / 128 KB erase block - Storage: NAND via custom
zx_*SPI-NAND / OneNAND drivers - Partitions (
mtddebug):boot,env,kernel,kernel1,other,all - Console:
ttyAMA0,115200n8(SoC UART)
Environment / Toolset
Windows (installed)
| Tool | Purpose |
|---|---|
| Ghidra 12.2 + JDK 25 | Decompilation / disassembly of ARM firmware & drivers |
| JDK 21 | (backup JVM) |
| Git for Windows 2.56 | source control / clone OpenWrt |
| Python 3.12+ | custom scripts (tools/) |
| 7-Zip / tar | archive extraction |
WSL2 + Ubuntu (pending — needs reboot + BIOS virtualization)
To be installed after the firmware dump finishes:
binwalk— carve partitions / kernel / rootfssquashfs-tools(unsquashfs) — extract OpenWrt-style squashfs rootfsdevice-tree-compiler(dtc) — read the board.dts(reveals exact WLAN/ switch/PHY/USB chips)binutils(readelf/objdump),file,stringsvmlinux-to-elf— recover vmlinux from the zImage for Ghidra kernel analysis- OpenWrt SDK / git checkout of
openwrt/openwrt— build host toolchain
Firmware material
bootloader.bin(1.5 MB) — U-Boot (dumped & Ghidra-imported)full_firmware.bin(256 MB) — full NAND dump (in progress on COM5)
Workflow
- Dump →
full_firmware.bin(running in background, ~24 h). - Confirm layout via live-boot
/proc/mtdormtddebugprobing; fill inpartition_split.pyconfig. - Split the 256 MB image into
boot/env/kernel/kernel1/other. - Extract the kernel image and squashfs rootfs (binwalk/unsquashfs).
- Identify chips: read the device-tree
.dts→ WLAN MAC, Ethernet switch (e.g. RTL/MTK/single-SoC GPHY integrated), USB host (DWC3/EHCI) controllers. - Locate driver
.kofor WiFi (e.g.mt76,ath9k,brcmfmac, vendor), LAN/switch, and USB in the extracted modules dir. - Decompile those drivers (Ghidra, ARM LE) and the corresponding kernel driver code to learn register programming, DMA, and DTS bindings.
- Port to OpenWrt target (SoC-specific target in
target/linux/), write the.dts, add drivers/Kconfig, build with the SDK.
Tools in this repo (Windows side)
tools/fw_scan.py— scan image for kernel/FS/compression signaturestools/partition_split.py— carve named partitions (config TBD)
Notes / gotchas
- Reboot required after WSL2 install; virtualization must be enabled in BIOS.
- The full dump owns COM5; do not kill/restart it (interrupting U-Boot's
md.bcorrupts subsequent captures).