Neste post vou explicar como fazer flash de chips de bios com um Arduino. Estaremos usando um Arduino Duemilnove (uno, mega ou clones também funcionam) e uma placa-mãe ASUS P5B que não inicializa mais após uma falha na atualização do BIOS.
Aqui está um resumo das etapas (algumas dessas etapas não são estritamente necessárias, mas achei que poderiam ajudar os não iniciados):
- Identificar placa
- Encontrar documentação para o conselho
- Localize e identifique o chip da bios
- Encontrar documentação para o chip
- Encontrar pinagem e tensões de operação (importante)
- Prepare o Arduino e instale o flashrom
- Conectando o Arduino ao chip
- Teste
- Piscando e verifique
- Solução de problemas
Identifique a placa e encontre a documentação
Como mencionado na introdução, estamos usando uma placa-mãe ASUS P5B. O manual desta placa pode ser encontrado no site da ASUS (um link direto pode ser encontrado na lista de referências).
Localize e identifique o chip da bios
No manual encontramos um layout de placa que mostra a localização do chip, à direita do slot pci 3.
Caso o local não esteja documentado, temos que encontrá-lo nós mesmos. A página a seguir fornece instruções sobre como localizar o chip bios: http://www.bios-chip24.com/Information/Bios-Chip-localization
O próximo passo é identificar com qual marca e tipo de chip estamos lidando para encontrar a ficha técnica. Normalmente, a escrita no chip é tudo o que precisamos, pois indica o fabricante e o número do modelo. O manual da placa-mãe menciona um “MXIC 25L8005” e se olharmos para a placa vemos que o modelo é de fato uma 25L8005 da Macronix.
MX25L8005
Digitar o número do modelo no google retorna a folha de dados como um dos primeiros resultados. A informação que estamos procurando é a pinagem e a tensão de operação. A imagem a seguir mostra a pinagem do 25L8005:
Os nomes dos pinos não fazem muito sentido se você os estiver vendo pela primeira vez, então a folha de dados também inclui uma descrição dos nomes dos pinos:
Para obter mais informações sobre o que exatamente os pinos fazem, consulte a folha de dados.
Preparando o Arduino
Para que o Arduino possa atuar como um programador serial precisamos primeiro prepará-lo usando frser-duino. Os comandos a seguir irão baixar e instalar os pacotes necessários, instalar o flashrom, clonar o frser-duino e fazer o flash do Arduino.
sudo apt install git flashrom gcc-avr binutils-avr avr-libc avrdude git clone --recursive https://github.com/tomvanveen/frser-duino.git cd frser-duino fazer ftdi sudo make flash-ftdi
Conectando o Arduino ao chip SPI
A imagem a seguir é um exemplo de esquema retirado do flashrom GitHub e mostra os pinos do Arduino e os pinos do chip ao qual eles devem se conectar (observe que o PB0 não precisa estar conectado):
Edição de emergência aqui: Eu sei entender porque as pessoas usam resistores entre os pinos do Arduino e o chip. O Arduino opera em 5V, o que significa que seus níveis lógicos também estão em 5V. Isso precisa ser reduzido para 3,3v usando um seletor de nível.
Piscando o chip SPI
Para verificar se tudo está funcionando corretamente, primeiro executamos o flashrom sem nenhuma operação:
sudo flashrom -p serprog:dev=/dev/ttyUSB0:2000000
A saída deve ficar assim:
flashrom v0.9.9-91-g0bfa819 no Linux 4.10.0-28-genérico (x86_64) flashrom é um software livre, obtenha o código fonte em https://flashrom.org Usando clock_gettime para loops de atraso (clk_id: 1, resolução: 1ns). serprog: O nome do programador é "frser-duino" Encontrado o chip flash Macronix "MX25L8005" (1024 kB, SPI) no serprog. Nenhuma operação foi especificada.
Se o comando anterior funcionou como esperado, agora estamos prontos para nossa etapa final. Para gravar o novo BIOS no chip, usamos o seguinte comando:
sudo flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -w [NEWBIOS]
A saída deve ficar assim:
flashrom v0.9.9-91-g0bfa819 no Linux 4.10.0-28-generic (x86_64) flashrom é software livre, obtenha o código fonte em https://flashrom.org Usando clock_gettime para loops de atraso (clk_id: 1, resolução: 1ns ). serprog: O nome do programador é "frser-duino" Encontrado o chip flash Macronix "MX25L8005" (1024 kB, SPI) no serprog. Lendo o conteúdo do chip flash antigo... feito. Apagando e gravando o chip flash... Apagar/gravar concluído. Verificando flash... VERIFICADO.
E é isso. Nós piscamos com sucesso um chip usando a interface SPI. Se você tiver alguma dúvida ou feedback sobre este post, deixe um comentário abaixo!
Referências
- O post que me levou a iniciar este projeto
- As instruções que usei para este projeto
- folha de dados 25L8005
- Boa discussão no fórum da HP sobre como recuperar invejas da HP usando esse método