In this post I will describe how to flash a BIOS (SPI) chip using a Arduino Duemilanove. I first learned about this method after reading about it on hackaday. At the time I had a Asus P5B motherboard that suffered from a bad BIOS flash and needed to be recovered. I tried other methods before but found none were as easy as this one. So lets get started. The following steps:
- Preparing the environment
- Connecting the programmer to the chip
- Flashing the chip
Preparing the environment
- Arduino Duemilanove (full list can be found here https://www.flashrom.org/Serprog/Arduino_flasher )
- A flash chip that is supported by flashrom ( full list available here https://www.flashrom.org/Supported_hardware )
- Ubuntu 16/18 VM
sudo apt install git libpci-dev libusb-dev libusb-1.0 gcc-avr binutils-avr avr-libc avrdude
git clone git://github.com/flashrom/flashrom.git cd flashrom make && sudo make install
git clone --recursive git://github.com/urjaman/frser-duino cd frser-duino make ftdi <--- depends on your Arduino make flash-ftdi <--- same
Connecting the programmer and the chip
The table below shows which pins on the Arduino should go to which pin on the SPI flash chip:
Flashing the SPI chip
To verify that everything is working correctly we first run flashrom without any operations:
tom@ubuntu-vm:~$ sudo flashrom -p serprog:dev=/dev/ttyUSB0:2000000 flashrom v0.9.9-91-g0bfa819 on Linux 4.10.0-28-generic (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is "frser-duino" Found Macronix flash chip "MX25L8005" (1024 kB, SPI) on serprog. No operations were specified.
As can be seen from the above command output, both the Arduino and the SPI chip are detected. Now we can continue with writing the new BIOS to the chip:
tom@ubuntu-vm:~$ sudo flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -w <NEWBIOS> flashrom v0.9.9-91-g0bfa819 on Linux 4.10.0-28-generic (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). serprog: Programmer name is "frser-duino" Found Macronix flash chip "MX25L8005" (1024 kB, SPI) on serprog. Reading old flash chip contents... done. Erasing and writing flash chip... Erase/write done. Verifying flash... VERIFIED.
And thats it, the new BIOS is written to the chip and all that is left is testing if my computer boots up again.
- https://github.com/flashrom/ http://systats.or8.net/hpspi/