Un amigo me pidio restaurar el firmware original en su Linksys WRT54g2 luego de haber instalado DD-WRT. Resulta que volver atras en este caso, no era tan sencillo como usualmente suele ser solo usando software. (Cuando no tienes acceso a tftp)
Primero, debes abrir el router. Los simpaticos usan un tornillo especial, que no tenia :
Fue facil forzar un paleta normal. Por lo que se abrio relativamente facil.
Y la siguiente sorpresa… No habia puerto serial o jtag visible… *suspiro*
Mirando bien la tarjeta, se pueden ver cuadrados negros en un bloque donde al parecer deberian haber algunos pines. Solo que estan verdes.
Mirando te daras cuenta que los 5 pines al medio de la cara superior (esos cubiertos de verde) son para un puerto serial. Hay 6 mas (6 en la cara superior , 6 en la inferior) al medio en el borde derecho, y son para jtag. Es necesario raspar la pintura verde con algo duro, como un atornillador, tip-top, etc, para exponer el cobre del contacto. Cuando ya haya suficiente expuesto para aplicar soldadura, hay que soldar cables o algun tipo de conector. (o adaptar algun otro tipo de conector si quieres dejarlo permanente)
Por ahora, vamos bien.
Se necesita un cable jtag. Se pueden pedir en linea, y hay desde muy baratos a ridiculamente caros. Ademas, es necesario confirmar que soportan el chip que necesitas contactar.
Solucion Economica : Hacer tu propio cable, que consiste de 4 resistencias y un conector DB25 macho (conectando a un puerto de impresora. OJO: Debe ser un puerto «real» de impresora. La gran mayoria de puertos de impresora que conectan por USB no son «reales», y no seran capaces de conversar un protocolo que no sea para imprimir)
* Obtenido de la Wiki de OpenWRT
Este cable, que es sencillo, TIENE que ser corto, ojala de no mas de 10 cm (Es un cable sin buffer). Exceder el largo, significara ruido y problemas. El que utilice yo, es de aproximadamente 7cm (pero la calidad del cable no es la mejor).
Instala tjtag para jugar con la tarjeta. Disponible tanto para Windows y Linux. Como ninguno de mis laptops tenia un puerto «real» de impresora, utilice el equipo de un colega que corre WinXP. Y asi todo se volvera color de hormiga !
Corriendo comandos de prueba, el software reconocio la tarjeta y chip. Todo bien!
El cable estaba bien, la tarjeta esta viva (bueno, estaba funcionando) y el software es compatible.
tjtag3.exe -probeonly
Solo por si acaso, hice un respaldo «wholeflash». Esto grabara todo el contenido de la memoria flash bit por bit, permitiendo restaurar a DD-WRT si quisieramos.
tjtag3.exe -backup:wholeflash
(Repaldo de 2MB, tardo 623 segundos en terminar.)
De acuerdo a los foros de dd-wrt, una vez instalado en este router no hay forma de volver al original. Esto es correcto, en parte.
Como lo indique al inicio, no hay forma «facil» de regresar. Mejor aun, si no hiciste un respaldo «wholeflash» con el firmware original, la forma «menos facil» se vuelve aun mas «menos facil».
Me entregaron este router con DD-WRT instalado, y la idea era regresarlo a original. El hardware estaba completamente intacto, y …. nadie habia realizado un respaldo de algun tipo. Afortunadamente alguien en los foros fue amable y posteo un respaldo de su router. (pero que contiene un chip flash distinto).
Decidi probarlo, asi que cambie el nombre y corri :
tjtag -flash:wholeflash
Comenzo a funcionar…..
Continuo funcionando…..
Algunas lineas y numeros aparecieron en pantalla….
….. (lo deje correr y me fui a trabajar)
Si consideras la informacion y el tiempo entre los numeros en pantalla (asumiendo linealidad), habria tomado 120 horas para escribir completamente la flash. Sabia que jtag era lento, pero esto es demasiado.
Asi que interrumpi (Control C) y trate nuevamente con otras opciones.
La placa empezo a comportarse raro. A veces no reconocia el chip, a veces indicaba que no podia configurar modo debug en el procesador, se colgaba al tratar de escribir, etc.
Despues de un tiempo intentado leer y escribir, decidi usar las opciones /dma, /noreset y /noemw (Forzar el uso de dma (velocidad), deshabilitar reset y escritura en memoria). Alguna veces tuve que especificar el chip (/fc:09). Ahora funcionaba rapido (Entiendase, 2 minutos por cada %).
A trabajar de nuevo, mientras avanza.
Revise 60 minutos despues, y la tarjeta del mal solo llego a 27% y se colgo.
Luego de eso, vino una serie de borrar la flash, e intentar escribirla. Cada intento fallo en lugares distintos (6%, 12% y lo mas que alcance fue 37%).
Revise el cable, trate de aislar interferencia, siempre con el mismo resultado.
Me fui a casa, y deje un intento de programacion. Ya no me importaba si fallaba
Al dia diguiente intente algunas cosas.
Una de ellas me llevo al exito (horas despues!)
Los pasos importantes son estos :
– Conectar el pin 1 del cable a una fuente de voltaje con una resistencia de 100ohm, (el puerto serial tiene un Vcc). En la foto se puede ver el pin conectado.
– Separe cada cable unos milimetros del resto.
– Puse el router en su gabinete, para aislarlo de ruido. Algunos recomiendan usar papel aluminio para hacerlo mas extremo.
Esto me llevo consistentemente a alcanzar 15% de programacion casi siempre. (Se seguia colgando)
Ahi me harte. Decidi dividir el archivo en partes mas chicas (256KB sonaba bien) y comence a flashear parte por parte (8 en total). Para esto es necesario calcular el comienzo del area del flash y el largo a programar. Con toda la informacion que entrega tjgat es relativamente sencillo.
Algunas fallas adicionales. Aun no tengo claro por que, pero luego de flashear la segunda parte (256 a 512KB) obtuve caidas al llegar a ciertas direcciones especificas. Ya estaba agotado, asi que decidi programar «al reves». Literalmente. Borre la flash, y comence a programar desde la parte 8 a la 1.
Funciono perfecto! Sin errores! Cerca de 560 segundos cada parte (75 minutos en total aproximadamente).
Para confirmar, hice un respaldo «wholeflash» y lo compare al que programe… Y obtuve diferencias. La primera cerca de 750KB desde el inicio.
Al revisar la direcciones de donde se almacena el BSP o CFE, es cerca de 750KB desde el inicio. No me voy a extender mucho en esto, pero es importante saber que CFE es el sistema de booteo que se utiliza para iniciar linux (DD-WRT en este caso) y BSP es el sistema usado por linksys , que esta basado en VxWorks.
Considerando esto, reinicie el router. Las luces se prendieron, luego apagaron, y … Exito! ( o casi ).
La luz de prendido quedo parpadeando. Eso significa problemas iniciando el firmware. No parece tan mal. Configure el equipo para tener la ip 192.168.1.20, y me conecte via web a 192.168.1.1. Una pagina muy sencilla titulada «Management Mode – Firmware Upgrade” que me solicitaba un archivo de actualizacion aparecio.
Fui Linksys.com, busque el ultimo firmware para este router (1.04.00) lo subi y envie!
Pasaron un par de minutos y la pagina me solicito reiniciar.
Apagado.
Prendido.
Booteo normal !
Ya regresamos al firmware original.
Archivos y utilidades :
- tjtag v0.3 [ desde : aqui ]
- Whole flash backup [ desde : aqui ]
- Original Linksys Firmware 1.0.04US [ desde : aqui ]
- Splitted Flash : Cada uno de las partes de 256KB. (incluyendo el archivo bat con las lineas de comando a usar)
PD:
Todos los archivos fueron obtenidos de los sitios especificados.
Si crees que puedo estar violando algun derecho de propiedad intelectual, contactame.