Rescatando una placa vieja Parte 1: Linux Moderno

Encontré esto en la feria 16 de julio:

¿Será que podemos correr Linux acá?

Conociendo la placa

Revisando la caja de plástico, dice que es un TP-Link MR3020. Nueva se vería algo así:

Supuestamente esta no funciona al momento de comprarla, y al probarla en casa, efectivamente solo el LED de energía se prende. El puerto Ethernet igual está muerto y no hay señales de que se esté emitiendo alguna red Wi-Fi.

Software adicional

Reseteando no se consigue mucho. Ni siquiera usando el botón apenas se encienda el aparato pasa algo: esto es malo, ya que el hacer esto usualmente nos da acceso a un sistema de recuperación que nos permite cargar firmware.

Eso significa que, en el caso de reinstalar el sistema operativo, debo hacerlo de la forma difícil.

Esta es la parte trasera de la placa — el único chip que destaca es un Spansion FL032PIF. Esta es la memoria flash del aparato, tiene 4 MB de capacidad y el sistema operativo completo está acá dentro. El firmware de TP-Link está basado en Linux, y sí, hay un Linux dentro de esos 4 MB. Quizás la versión 2.6.32, recuerdo alguna vez haberlo visto en otro momento.

Debemos manipular directamente ese chip si queremos resolver el problema. Todo esto asumiendo que ningún otro componente del router esté quemado o dañado 😅

Más memoria flash

Mi intención no solo es rescatar la placa, eso sirve para tener esto funcionando como un router, y los que me conocen saben que tengo más de una docena de estos para jugar. No me serviría tener uno más, y bien podemos jugar a probar otro software para demostrar lo flexible que es esto con sus 400MHz de CPU y 32 MB de RAM.

Para esto necesitamos un Linux moderno. Y esto nos exige más memoria flash. Hay toooda una historia detrás de esto, pero en OpenWrt se tuvieron discusiones muy largas y extendidas sobre qué hacer cuando 4 MB no sean suficientes. Hubieron peleas incluso entre core devs en el proyecto, pero al final el soporte para estos aparatos se puso como obsoleto y se previene a la gente no comprarlos más.

Entonces necesitamos más memoria flash, no solo para este router que quizás funcione o no, sino para otros modelos similares que tengo, casi todos TP-LINKs antiguos que también han quedado afectados.

Reciclaje

Hace poco se me había ocurrido una idea:

Esto es un router de fibra. Se fabrican en masa en China y son de marca blanca. Cuando un pequeño ISP (proveedor de Internet) quiere ofrecer el servicio, compra al por mayor esta cosa y les da uno a sus clientes.

Como estos son de pésima calidad, no tardan en arruinarse y luego se venden como chatarra por mayor, o incluso por kilo si tienes suerte. Me compré como una docena de esos: estaban a 5 Bs en la feria cada uno y me regalaron uno más, en total 13.

Si vemos en detalle, estos routers vienen con esto:

Este es un Winbond 25Q128BV: una memoria flash de 16 MB (128 Mb * (1 MB / 8 Mb)).

Podré desoldarles la memoria a estos routers quemados, flashearlos con un programador SPI (un Raspberry Pi sirve también) y soldarlos en los routers que sí me sirven. Y así poder tener Linux moderno.

Este es el chip luego de ser extraído:

También extraeré el chip antiguo de 4 MB. Lo pondré en mi programador SPI para sacarme una copia de lo que sea que tenga:

sudo flashrom -p ch341a_spi -r mr3020-ac3ed1-fulldump.bin

Linux Moderno

Vamos a usar OpenWrt. La meta es que el sistema al menos pueda arrancar, y ahora que tenemos nuestros 16M de flash, debemos compilar nuestra versión de OpenWrt que sea compatible.

Mis cambios están listos, y el commit de git con los cambios es este:

https://github.com/LuisMitaHL/LooperWrt/commit/23ac0330531796dc1c515675eb54334a3bb80ffd

¿Por qué estos cambios?

En casi cualquier dispositivo que no sea x86 como una PC o laptop, no existe un BIOS/UEFI que prepare tu máquina, sino que Linux debe conocer todo tu hardware de antemano y «hardcodearlo».

De fábrica TP-Link deja sus routers con estas particiones:

  • u-boot (un bootloader, algo parecido a un «BIOS» muy sencillo y simple)
  • firmware (el Linux en si)
  • art (binario que calibra la interfaz Wi-Fi)

Se puede notar en el commit que tuve que hacer un cálculo en hexadecimal: antes tenía 0x400000 (4 MB) de capacidad y ahora tengo 0x1000000 (16 MB). Por tanto, u-boot y art deben continuar con la capacidad usual (0x20000 = 128KB y 0x10000 = 64 KB respectivamente) y asignarle el espacio restante a mi firmware Linux.

Recordemos que hice un backup del chip de 4 MB. De acá, con el comando dd, puedo partir este backup en las particiones adecuadas. Por ejemplo, el u-boot original de TP-Link lo puedo sacar así:

dd if=mr3020-ac3ed1-fulldump.bin of=u-boot.bin bs=1 skip=$((0x000000000000)) count=$((0x000000020000))

No usaré eso en esta ocasión. Aprovecharé en instalar https://github.com/pepe2k/u-boot_mod: es una versión mejorada, incluye sistema de recuperación usando botones que estoy seguro me salvará la vida luego.


Nos vemos en un siguiente post, para ver cómo está yendo la instalación. Mientras les dejo una foto del router ya (más o menos) vivo, siendo controlado por su interfaz serial.