OpenWRT parte 2: ressuscitando roteadores pela conexão serial


A segunda parte dos tutorias de OpenWRT será um pouco diferente do que eu esperava, mas isso me parece necessário.

Eu tenho dois roteadores tp-link aqui em casa que estavam “brickados” ou, como eu costumo dizer, “em modo tijolo”, um wr1043nd no qual eu acidentalmente instalei o software de outro roteador e um mr3220 em que um colega fez testes e corrompeu os arquivos do kernel.
Ambos os casos tem solução, mas não espere que essa solução seja fácil, prossiga com um ferro de solda e mão firme…

Hardware

O processo de restauração nesses casos não pode ser feito pelo SSH ou interface gráfica pois os dispositivos não ligam nem em modo de segurança, é preciso gravar o software no chip dos roteadores novamente e para isso é necessária uma conexão direta com a placa através de uma conexão serial, o detalhe é que o conector não existe e você terá que solda-lo na placa do roteador.

Muitos tutoriais utilizam um cabo JTAG. Eu cheguei a tentar o método do JTAG, primeiro foi um parto fazer o cabo (tive que construir circuitos e gravar chips) e no final não funcionou pois o JTAG tem apenas acesso de leitura na maioria dos roteadores e não é possível gravar o firmware por ele.

Dentro do roteador existem os contatos onde os pinos do serial deveriam estar, mas por não serem utilizados esses pinos não são colocados na versão final do produto:

Local dos conectores

A ordem do que representa cada pino pode variar de acordo com o seu roteador mas são quatro pinos que representam TX (transferência de dados), RX (recebimento de dados), VCC (corrente continua, 3.3v) e GND (terra) recomendo conferir a ordem na wiki do openwrt para o seu modelo especifico.

Uma coisa importante que eu descobri na marra é que depois de colocar os pinos você não pode simplesmente ligar em uma porta serial de um computador antigo, isso porque as portas antigas operam em 12v e o roteador em 3.3v, se você conectar em uma porta dessas você pode queimar o seu roteador e, mesmo que não queime, o sinal enviado pelo roteador estará muito abaixo do que a porta espera e você receberá apenas caracteres aleatórios:

caracteres aleatorios

Para esse procedimento você precisará de um cabo USB-Serial, o USB funciona com 5V que é muito mais próximo do roteador que uma porta serial e consiguirá receber e enviar os dados.
Eu estava para sair e comprar um cabo desses, mas olhando ma minha gigantesca caixa de cabos eu encontrei um cabo de um antigo celular LG que eu optei por destruir para salvar o roteador. Celulares antigos tinham conectores próprios para cada marca e não usavam USB, esses conectores eram portas seriais e esses cabos tem circuitos de interface, quando você conecta um cabo desses ele vai ser reconhecido pelo computador como uma porta serial. Na maioria das vezes o windows não terá o driver para esses cabos, mas no Linux são reconhecidos nativamente, na dúvida antes de destruir um cabo plugue-o no linux e rode o comando dmesg, você deve ver algo parecido com isso:

Serial reconhecido

Se você estiver usando um cabo que termina em uma porta serial você não precisa destruí-lo, os pinos necessários são o 2, 3 e 5:

Serial DB-9 Macho
Serial DB-9 Macho

O terra é muito importante para a transmissão de dados, mas o conector de energia não precisa ser conectado e nem deve, o roteador já está energizado e a tensão do USB ainda é maior que a do roteador. Eu por acidente conectei o pino do VCC no roteador desligado da fonte e ele ligou com a energia do USB, realmente recomendo não conectar esse pino.

Software

Feita a conexão, você pode usar o Putty (no Windows) ou o Screen (no Linux) para acessar o roteador escolhendo a porta e a taxa de baud, que nos roteadores TP-Link é 115200.

Primeiro conecte o cabo e depois ligue o roteador, assim você verá todas as mensagens do boot, é importante interromper o boot no momento certo, você vera algo parecido com isso:

U-Boot 1.1.4 (Feb 1 2010 - 10:11:24)

AP83 (ar9100) U-boot 0.0.11
DRAM:
sri
32 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash: 8 MB
Using default environment

In: serial
Out: serial
Err: serial
Net: ag7100_enet_initialize...
No valid address in Flash. Using fixed address
: cfg1 0xf cfg2 0x7114
eth0: 00:03:7f:09:0b:ad
eth0 up
eth0

Depois disso quando aparecer a mensagem:

Autobooting in 1 seconds

Digite rapidamente (em menos de um segundo) a senha: tpl.

Isso vai interromper o boot e te dar acesso a um terminal básico.

Se você conseguiu chegar até aqui seu roteador está praticamente salvo, o próximo passo é passar o firmware certo para ele e instalá-lo, para isso será necessário configurar um servidor tftp, existem vários e o trabalho de configurá-los pode ser bastante extenso, não explicarei os detalhes mas recomendo para o windows o tftp-util e para o linux o tftpd, ambos são fáceis de configurar e você encontra o passo a passo na primeira busca.

O grande truque do tftp está na verdade no ip em que ele tem que estar, cada roteador procura o tftp em um ip pré determinado, no caso do wr-1043nd foi no 192.168.0.5 mas o outro procurou no 192.168.1.26, você precisa verificar qual o ip o seu roteador pede na wiki ou tentar atualizar, ele mostra onde está procurando os arquivos.

Baixe o arquivo do firmware que você vai instalar, renomeie-o para “code.bin” e coloque na raiz do servidor tftp, depois conecte um cabo do roteador para a maquina que está executando o tftp e defina o ip fixo para ela, o roteador vai se atribuir um pré-definido e deve conseguir se comunicar com o servidor, em seguida tudo que você precisa fazer é digitar uma série de comandos repletos de “números mágicos”. Um desses números varia de acordo com o firmware que você está instalando pois ele representa o tamanho do arquivo em hexadecimal (numero de bytes), ele está destacado em azul.

O primeiro passo é apagar o firmware instalado com:

erase 0xbf020000 +7c0000

 

que deve ter o resultado:

First 0x2 last 0x7d sector size 0x10000 125
Erased 124 sectors

em seguida copiar o firmware para a RAM do roteador:

tftpboot 0x81000000 code.bin

note que após a transferência será exibido o tamanho do arquivo que deve bater com o dos comandos:

dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.0.5; our IP address is 192.168.0.2
Filename 'code.bin'.
Load address: 0x81000000
Loading: #################################################################
[...]
done
Bytes transferred = 8126464 (7c0000 hex)

Explicando os números mágicos

O que são esses números:

bf020000: É o primeiro endereço de memória do “HD”, onde ele vai procurar o boot.
7c0000: É o tamanho do arquivo de firmware
81000000: É o primeiro endereço de Ram que você pode usar

O numero 7c0000 só é válido para o wr-1043nd com a versão que eu usei, tentei instalar o software original sem sucesso até descobrir que esse número varia de arquivo para arquivo, se for menor tudo bem, mas com arquivos maiores você terá problemas, a menos que a memória do seu roteador seja menor que esse tamanho, como foi o caso do mr3220 em que eu tive que usar o número 3c0000, o ideal é você usar o tamanho do arquivo.

Espero ter ajudado, seguem as fotos:

[pe2-gallery album=”http://picasaweb.google.com/data/feed/base/user/114612966219450043348/albumid/5872848019340455073?alt=rss&hl=en_US&kind=photo” ]

,

4 responses to “OpenWRT parte 2: ressuscitando roteadores pela conexão serial”

  1. consegui fazer a conexão, estou usando um cabo RS232 x USB, só que quando ligo o router começa a aparecer um monte de dados ilegíveis.

  2. ola rodrigo,meu nome é jose.gostaria de saber se esse metodo tambem funciona no roteador tp-link tl wr740n, pois coloquei o firmware dd-wrt nele. e acabou travando. se voce puder me orientar ficarei muito agradecido,obrigado. e parabens pelo site.