Ao fazer algumas pesquisas on-line, encontrei vários artigos / postagens de pessoas que usam um Raspberry Pi para fazer flash de chips flash SPI. Aparentemente, o Raspberry Pi é muito adequado para esse tipo de coisa, pois possui uma interface SPI e é capaz de rodar linux. Eu estava ansioso para experimentar isso por mim mesmo, então peguei meu Pi 3 modelo B e comecei a trabalhar. Para este projeto eu usei um Winbond 25X80 recuperado de uma placa-mãe que eu tinha por aí.
Esquema das etapas:
- Preparando o Raspberry Pi
- Habilitando a interface SPI
- Instalando o flashrom (da fonte ou via apt get)
- Conectando o Raspberry Pi ao chip
- Usando flashrom para interagir com o chip
Preparando o Raspberry Pi
Como outros apontaram, a versão mais recente do Raspbian (Stretch) também funcionará adicionando o parâmetro spispeed ao comando Flashrom.
Habilitando a interface SPI
A interface SPI é habilitada digitando sudo raspi-config e selecionando P4 SPI nas opções de interface. Depois disso, a interface SPI ficará disponível em:
- /dev/spidev0.0
- /dev/spidev0.1
Em raspi-config selecione a opção 5: Opções de interface
Instalando flashrom
A instalação do flashrom pode ser feita através de um simples apt-get ou da fonte. Para instalar a partir da fonte, primeiro instale as dependências:
sudo apt install git libpci-dev libusb-1.0 libusb-dev
Termine clonando o repositório do flashrom, compilando e instalando o flashrom:
git clone https://github.com/flashrom/flashrom.git
cd flashrom
make
sudo make install
Conectando o Raspberry ao chip flash SPI
A tabela abaixo mostra as conexões entre o RaspberryPi e o chip.
pino RPi | Flash SPI | |
---|---|---|
25 | GND | |
24 | CS | |
23 |
|
|
21 | DO | |
19 | DI | |
17 | VCC 3.3V e /HOLD e /WP |
Interagindo com o chip
Para verificar se o flashrom identifica corretamente o chip, executamos o flashrom sem nenhuma operação.
$ flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=512
flashrom p1.0-76-g291764a on Linux 4.14.34-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25X80" (1024 kB, SPI) on linux_spi.
No operations were specified.
Agora que o Flashrom identifica corretamente o Winbond W25X80, podemos continuar a fazer backup do BIOS atual.
$ flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -r [
oldbios]
flashrom p1.0-76-g291764a on Linux 4.14.34-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25X80" (1024 kB, SPI) on linux_spi.
Reading flash... done.
Depois de fazer o backup do BIOS antigo, podemos gravar com segurança o novo BIOS de volta no chip.
$ flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -w [newbios]
flashrom p1.0-76-g291764a on Linux 4.14.34-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip "W25X80" (1024 kB, SPI) on linux_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip...
Warning: Chip content is identical to the requested image.
Erase/write done.