In this post I will describe the process I went trough of flashing the BIOS chip on a P5B motherboard using an Arduino Duemilanove.
My cousin gave me this motherboard and asked me to have a look at it after a failed BIOS update turned his computer into paperweight. I’ve actually attempted to fix this board before using a method described here but I eventually gave up after I realised I lacked the necessary skills and shelved the project. Fast forward a year or so I come across a post on hackaday about a Arduino based BIOS flasher and decided the time had come to give it another try.
- a BIOS chip compatible/supported by Flashrom, in my case a Macronix mx25L8005 (a list of all supported chips can be found here)
- any of the supported Arduinos (I used a duemilanove):
- any based on the ATmega328 (/168/88 will work with small changes too), like the Arduino Uno R3.
- Arduino Mega or Mega2560, but notice that the software has a different branch for them.
- a way to convert the 5V logic levels to 3.3V (except if 3.3V arduino, these are rarer)
- frser-duino (formerly known as serprog-duino)
- the AVR toolchain
Preparing the environment (I used a Ubuntu VM):
sudo apt-get install flashrom gcc-avr binutils-avr gdb-avr avr-libc avrdude git
git clone --recursive git://github.com/urjaman/frser-duino cd frser-duino
Depending on the Arduino model:
For models with a FTDI chip:
make ftdi && make flash-ftdi
For models without a FTI chip:
make u2 && make flash-u2
Before you can actually flash the chip you must first connect the flasher to the chip. Some motherboards have a SPI header which makes connecting the Arduino a breeze. Other motherboards may have a removable chip which you transport to a breadboard. If your motherboard doesn’t have either one you will still be able to use this method but you might need some wires/clips specially designed for working with chips and or microprocessors.
The ASUS P5B motherboard has a SPI header located near the BIOS chip. The pinout can be seen in the picture below. Please note that pin names can differ between chips ( i.e. the SO pin can also be named MISO or DO depending on the chip).
Pinout (depends on the chip)
Connecting the Arduino to the chip
|3.3V||VCC +/WP + /HOLD|
To start flashing use the following command:
flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -w P5B.rom
To check if everything went according to plan you can dump the chip’s content by using this command. Or use the -v option while running flashrom to verify that the flashing was successful.
flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -r good.rom
After completing the dump you can use a hex editor to compare the files. If they match it means you’ve successfully flashed your chip 🙂 .