OpenWrt sul TP-Link VX830v: guida completa al porting

TL;DR — Ho portato OpenWrt su un router TP-Link VX830v (firmware Wind Tre), normalmente bloccato e senza supporto community. WiFi 2.4 GHz + 5 GHz funzionanti, LAN 2.5 GbE, SFP GPON. In questo articolo racconto tutto il percorso, dall’apertura del case fino al boot dalla NAND.


Indice

  1. Il router
  2. Apertura e accesso seriale TTL
  3. Accesso a U-Boot
  4. Creazione del Device Tree (DTS)
  5. Compilazione di OpenWrt
  6. Boot via TFTP
  7. La caccia all’EEPROM WiFi
  8. Flash permanente sulla NAND
  9. Schema delle partizioni
  10. Ripristino del firmware originale
  11. Note e ringraziamenti
  12. Guida pratica: installazione e ripristino OpenWrt

Guida pratica: installazione e ripristino OpenWrt

Questa sezione fornisce una guida passo-passo per installare OpenWrt sul TP-Link VX830v e per ripristinare il firmware originale TP-Link, con particolare attenzione alle variabili d’ambiente U-Boot e alle procedure sicure.

Prerequisiti

  • Accesso seriale TTL al router
  • Server TFTP configurato sul PC
  • Immagini OpenWrt: initramfs e sysupgrade
  • Backup del firmware originale (consigliato)

Installare OpenWrt (“mettere”)

1. Boot da initramfs via TFTP

  1. Collega il PC a una porta LAN del router.
  2. Copia openwrt-mediatek-filogic-tplink_vx830v-initramfs-kernel.bin nella cartella TFTP.
  3. Imposta l’IP del PC su 192.168.1.2.
  4. Accendi il router e interrompi l’autoboot premendo un tasto sulla seriale.
  5. Da U-Boot, esegui:
    tftpboot 0x46000000 openwrt-mediatek-filogic-tplink_vx830v-initramfs-kernel.bin
    bootm 0x46000000
  6. Il router avvierà OpenWrt in RAM (initramfs).

2. (Consigliato) Configura l’environment U-Boot da initramfs

Prima di lanciare il sysupgrade, puoi già impostare le variabili d’ambiente direttamente da OpenWrt initramfs:

echo "/dev/mtd1 0x0 0x100000 0x20000" > /etc/fw_env.config
fw_setenv bootargs "ubi.mtd=ubi0 console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000"
fw_setenv mtdids "nmbm0=nmbm0"
fw_setenv mtdparts "nmbm0:2M(boot),1M(u-boot-env),6M(misc_ro),6M(misc_rw),40M(ubi0),40M(ubi1)"

Così, al primo riavvio dopo il flash, il bootloader troverà già l’environment corretto e tenterà subito il boot da ubi0/OpenWrt.

3. Flash sysupgrade

  1. Da OpenWrt (initramfs), copia il file sysupgrade sul router (via SCP, wget, ecc):
    scp openwrt-mediatek-filogic-tplink_vx830v-squashfs-sysupgrade.bin root@192.168.1.1:/tmp/
  2. Esegui il flash:
    sysupgrade -n /tmp/openwrt-mediatek-filogic-tplink_vx830v-squashfs-sysupgrade.bin
  3. Attendi il riavvio automatico.

4. Configurare l’environment U-Boot dopo il flash

Dopo il flash, imposta le variabili U-Boot per il boot da ubi0:

  1. Interrompi l’autoboot sulla seriale.
  2. Esegui:
    setenv bootargs ubi.mtd=ubi0 console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000
    saveenv
    reset
  3. Se il bootloader non avvia OpenWrt automaticamente, puoi avviare manualmente:
    ubi part ubi0
    ubi read 0x46000000 kernel
    bootm 0x46000000

  1. Avvia il router in OpenWrt initramfs (come sopra, via TFTP).
  2. Copia il dump originale di ubi0 sul router:
    scp ubi0.bin root@192.168.1.1:/tmp/
  3. Cancella e riscrivi la partizione ubi0:
    mtd erase ubi0
    mtd write /tmp/ubi0.bin ubi0
  4. Imposta l’environment per il boot da ubi0 TP-Link:
    setenv bootargs ubi.mtd=ubi0 console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000
    saveenv
    reset

Note importanti

  • Il bootloader TP-Link ha un meccanismo di fallback: se non trova il volume ‘uboot’ su ubi0, passa automaticamente a ubi1.
  • Per avviare OpenWrt da ubi0, può essere necessario il boot manuale da U-Boot.
  • Fai sempre un backup delle partizioni prima di scrivere sulla NAND.
  • Se vuoi ripristinare anche ubi1, ripeti la procedura cambiando ubi0 in ubi1.

Guida pratica aggiornata a marzo 2026


Il router

Il TP-Link VX830v è un router VDSL2/GPON fornito da Wind Tre in Italia. Sulla carta è un dispositivo di fascia alta:

CaratteristicaDettaglio
SoCMediaTek MT7986A (Filogic 830)
RAM512 MiB DDR4
FlashSPI-NAND (NMBM)
WiFiMT7975 dual-band 802.11ax (WiFi 6)
LAN3× GbE + 1× 2.5 GbE (Airoha EN8811H)
WAN1× 2.5 GbE + SFP GPON combo
VoIP2× FXS (Si3218x)
USB1× USB 3.0

Peccato che il firmware Wind lo tenga completamente blindato. Nessun accesso SSH, nessuna personalizzazione. Tempo di cambiare le cose.

TP-Link VX830v - Vista esterna


Apertura e accesso seriale TTL

Il primo passo è stato aprire il case. Quattro clip plastiche sul fondo, niente viti nascoste. Una volta aperto, la PCB rivela subito i pad UART/TTL:

PCB del VX830v con pin TTL

Connessione seriale

Pin TTLCollegamento
GNDGND dell’adattatore USB-TTL
TXRX dell’adattatore
RXTX dell’adattatore
VCCNON collegare (il router si alimenta da solo)

Parametri della seriale:

Baud rate: 115200
Data bits: 8
Stop bits: 1
Parity: None
Flow control: None

Software consigliato: PuTTY o Tera Term su Windows.


Accesso a U-Boot

All’accensione, il router mostra il boot log sulla seriale. Premendo un tasto entro 5 secondi si entra nella shell U-Boot. Da qui possiamo fare boot via rete (TFTP) senza toccare la NAND.

Layout delle partizioni NAND (originale)

Per estrarre le partizioni originali della NAND il metodo migliore è avviare il firmware da ubi1 poiché possiede il logging su terminale attivo (ubi0 non lo permette). Per farlo lo si avvia in RAM.

ubi part ubi1
ubi read 0x46000000 kernel
bootm 0x46000000
mtd0: 00200000  "boot"        (U-Boot, 2 MiB)
mtd1: 00100000  "u-boot-env"  (Variabili U-Boot, 1 MiB)
mtd2: 00600000  "misc_ro"     (Factory data / EEPROM WiFi, 6 MiB)
mtd3: 00600000  "misc_rw"     (Configurazione TP-Link, 6 MiB)
mtd4: 02800000  "ubi0"        (Firmware slot A, 40 MiB)
mtd5: 02800000  "ubi1"        (Firmware slot B, 40 MiB)
mtd6: 00600000  "misc_rw_bak" (Backup config, 6 MiB)
mtd7: 00600000  "bflag"       (Boot flags, 6 MiB)
mtd8: 00600000  "misc_isp"    (Dati ISP, 6 MiB)

Il firmware originale usa uno schema A/B dual-firmware: due slot (ubi0 e ubi1) con fallback automatico in caso di upgrade fallito.


Creazione del Device Tree (DTS)

Ho estratto il DTS originale del firmware TP-Link e l’ho analizzato per capire il mapping hardware. Da lì ho creato il DTS per OpenWrt (mt7986a-tplink-vx830v.dts) con:

  • Ethernet: GMAC0 (switch MT7531 con 3× GbE) + GMAC1 (WAN 2.5 GbE)
  • PHY: Due Airoha EN8811H a 2.5 Gbps (LAN3 + WAN), con gpio-hog per il reset
  • SFP: Cage GPON/combo sulla WAN con I2C, TX-disable, LOS e MOD-DEF0
  • Switch: MT7531 con porte 0-2 (GbE) e porta 5 (2.5 GbE verso EN8811H)
  • WiFi: MT7975 dual-band con pin groups wf_2g e wf_5g
  • LED: 15 LED (power, internet, SFP, LAN, DSL, phone, USB, LOS)
  • Pulsanti: Reset (GPIO 26), WPS (GPIO 24), WiFi toggle (GPIO 25)

Punti critici del DTS

Il passaggio più delicato è stato il mapping dei PHY Airoha EN8811H. Questi PHY hanno bisogno che la linea di reset sia tenuta HIGH durante l’init del GPIO controller, altrimenti il firmware interno del PHY non si avvia. La soluzione è stata usare gpio-hog nel nodo &pio:

phy14_rst: phy14-rst-hog {
    gpio-hog;
    gpios = <6 GPIO_ACTIVE_HIGH>;
    output-high;
    line-name = "en8811h-a-reset";
};

Compilazione di OpenWrt

Prerequisiti

# Clona OpenWrt
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
 
# Aggiorna i feed
./scripts/feeds update -a
./scripts/feeds install -a

Configurazione

make menuconfig

Selezionare:

  • Target System → MediaTek Ralink ARM
  • Subtarget → Filogic 8x0 (MT798x)
  • Target Profile → TP-Link VX830v

Build

make -j$(nproc)

Il risultato sono due file:

  • openwrt-mediatek-filogic-tplink_vx830v-initramfs-kernel.bin — per boot via TFTP
  • openwrt-mediatek-filogic-tplink_vx830v-squashfs-sysupgrade.bin — per flash sulla NAND

Boot via TFTP

Setup

  1. Configurare un server TFTP sul PC (es. Tftpd64 su Windows)
  2. IP del PC: 192.168.1.2
  3. Copiare openwrt-mediatek-filogic-tplink_vx830v-initramfs-kernel.bin nella cartella TFTP
  4. Collegare il PC a una porta LAN del router via cavo ethernet

Comandi U-Boot

MT7986> tftpboot 0x46000000 openwrt-mediatek-filogic-tplink_vx830v-initramfs-kernel.bin
MT7986> bootm 0x46000000

Il router boota OpenWrt direttamente in RAM, senza toccare la NAND. Perfetto per i test.


La caccia all’EEPROM WiFi

Questa è stata la parte più complicata dell’intero porting. Il WiFi funzionava solo a metà — il 2.4 GHz partiva ma con dati di calibrazione default, il 5 GHz era completamente assente.

Il problema

Il kernel mostrava:

mt798x-wmac 18000000.wifi: eeprom load fail, use default bin
mt798x-wmac 18000000.wifi: Direct firmware load for mediatek/mt7986_eeprom_mt7975_dual.bin failed with error -2

Il DTS originale TP-Link indicava che l’EEPROM WiFi si trovava nella partizione misc_ro a offset 0x0. Ma leggendo il raw MTD si otteneva:

00000000  55 42 49 23 01 00 00 00  ...  |UBI#............|

UBI# è l’header UBI! La partizione misc_ro non contiene dati raw, è formattata come volume UBI con filesystem UBIFS dentro.


La scoperta

Montando il filesystem UBIFS:

mkdir -p /tmp/misc_ro
mount -r -t ubifs ubi1:misc_ro /tmp/misc_ro
ls -la /tmp/misc_ro/
-rw-r--r--  1 root root      96 Dec 31  2015 0x0034B300
-rw-r--r--  1 root root     176 Dec 31  2015 0x0034B500
...
----------  1 root root  655360 Dec 31  2015 0x003A0000   ← EEPROM WiFi!
-rw-r--r--  1 root root   35200 Jan 22 15:07 0x00440000

Il file 0x003A0000 (640 KiB) contiene l’EEPROM WiFi. I primi byte confermano:

00000000  86 79 06 00 00 0c 43 26  60 00 ...  |.y....C&`...|

86 79 = chip ID MT7986 in little-endian. Trovato!


La soluzione

I primi 4096 byte del file contengono i dati di calibrazione per entrambe le bande:

dd if=/tmp/misc_ro/0x003A0000 of=/lib/firmware/mediatek/mt7986_eeprom_mt7975_dual.bin bs=4096 count=1

Dopo aver ricaricato il driver WiFi:

echo 18000000.wifi > /sys/bus/platform/drivers/mt798x-wmac/unbind
sleep 2
echo 18000000.wifi > /sys/bus/platform/drivers/mt798x-wmac/bind

Risultato:

Wiphy phy2  →  Band 1 (2.4 GHz)  ✓
Wiphy phy3  →  Band 2 (5 GHz)    ✓

Entrambe le bande WiFi 6 funzionanti con i dati di calibrazione reali del dispositivo.

Automatizzazione nel firmware

Per rendere il tutto automatico al boot, ho modificato due script:

09_mount_cfg_part — monta il volume UBIFS misc_ro durante il preinit:

tplink,vx830v)
    mount_ubi_part "misc_ro" "misc_ro"
    ;;

11-mt76-caldata — copia l’EEPROM dal file montato quando il driver la richiede:

tplink,vx830v)
    dd if=/tmp/misc_ro/0x003A0000 of=/lib/firmware/$FIRMWARE \
        bs=4096 count=1 2>/dev/null
    ;;

Flash permanente sulla NAND

Una volta verificato che tutto funziona via initramfs, si può flashare il firmware sulla NAND:

sysupgrade -n openwrt-mediatek-filogic-tplink_vx830v-squashfs-sysupgrade.bin

Il comando riscrive ubi0 con i volumi OpenWrt (kernel, rootfs, rootfs_data). Al riavvio successivo, U-Boot carica OpenWrt direttamente dalla NAND senza bisogno di TFTP.

Variabili U-Boot

Per verificare/modificare lo slot di boot:

# Crea il config se non esiste
echo "/dev/mtd1 0x0 0x20000 0x20000" > /etc/fw_env.config
 
# Leggi
fw_printenv
 
# L'importante è: bootargs=ubi.mtd=ubi0

Schema delle partizioni

┌─────────────────────────────────────────────────────────┐
│  NAND Flash (SPI-NAND con NMBM)                        │
├──────────┬──────────┬───────────────────────────────────┤
│ 0x000000 │  2 MiB   │ boot (U-Boot)                    │
│ 0x200000 │  1 MiB   │ u-boot-env                       │
│ 0x300000 │  6 MiB   │ misc_ro (UBIFS: EEPROM WiFi)     │
│ 0x900000 │  6 MiB   │ misc_rw (UBIFS: config TP-Link)  │
│ 0xF00000 │ 40 MiB   │ ubi0 → OpenWrt (kernel+rootfs)   │
│ 0x3700000│ 40 MiB   │ ubi1 → Firmware TP-Link backup   │
│ 0x5F00000│  6 MiB   │ misc_rw_bak                      │
│ 0x6500000│  6 MiB   │ bflag                            │
│ 0x6B00000│  6 MiB   │ misc_isp                         │
└──────────┴──────────┴───────────────────────────────────┘

Ripristino del firmware originale

Il firmware TP-Link originale è preservato su ubi1. Per tornare indietro:

fw_setenv bootargs "ubi.mtd=ubi1 console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000"
reboot

Per tornare a OpenWrt:

fw_setenv bootargs "ubi.mtd=ubi0 console=ttyS0,115200n1 loglevel=8 earlycon=uart8250,mmio32,0x11002000"
reboot

Note e ringraziamenti

Cosa funziona

  • ✅ Boot da NAND
  • ✅ WiFi 2.4 GHz (802.11ax)
  • ✅ WiFi 5 GHz (802.11ax)
  • ✅ Ethernet LAN (3× GbE + 1× 2.5 GbE)
  • ✅ WAN 2.5 GbE
  • ✅ USB 3.0
  • ✅ LED e pulsanti
  • ✅ SFP GPON (con modulo compatibile)

Cosa non è stato testato

  • ⚠️ VoIP (FXS, chip Si3218x — richiede driver proprietario)
  • ⚠️ DSL (xDSL non supportato da OpenWrt su questa piattaforma)

Hardware necessario

  • TP-Link VX830v
  • Adattatore USB-TTL (3.3V!)
  • Cavo ethernet
  • PC con server TFTP