|
|
(32 intermediate revisions by one other user not shown) |
Line 1: |
Line 1: |
| == Introduction ==
| | {{#externalredirect: https://www.flashrom.org/supported_hw/supported_prog/serprog/arduino_flasher_3.3v.html }} |
| This explains how to:
| |
| * Easily lower the voltage of an arduino
| |
| * Use that arduino to flash a coreboot image on a GM45 Thinkpad with a SOIC16 chip
| |
| | |
| It requires:
| |
| * An AVR Arduino at 5v
| |
| * An USB<->Serial adapter capable of providing enough current to power up:
| |
| ** The arduino
| |
| ** The flash chip
| |
| ** The circuits around the flash chip
| |
| | |
| It was tested with:
| |
| * An Arduino.org "nano version 3.3"
| |
| * A Sparkfun "FTDI Basic 3v3" (Uses an FTDI FT232R)
| |
| | |
| Caveats:
| |
| * It requires not to ever connect an USB cable between the Arduino USB port and the computer while the flasher is connected to a flash chip. This would result in the I/O voltage being 5V instead of 3.3V. If you think you may accidentally connect it this way, this flasher isn't the right solution for you.
| |
| * For now it requires to patch frser-duino
| |
| | |
| == Theory ==
| |
| In the [http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf Atmega328/P datasheet], the "32.3. Speed Grades" chapter describes (pages 368 and 369) the link between maximum frequency of the microcontroller and the voltage. At 3.3v, the maximum frequency is 12Mhz.
| |
| | |
| == HOWTO ==
| |
| === Build the code and flash it ===
| |
| First download frser-duino:
| |
| git clone --recursive https://github.com/urjaman/frser-duino.git
| |
| cd frser-duino
| |
| Then modify the F_CPU value in main.h to be 12Mhz instead of 16Mhz:
| |
| F_CPU will look like that:
| |
| #define F_CPU 16000000UL
| |
| Change it to:
| |
| #define F_CPU 12000000UL
| |
| * Flash the Arduino with frser-duino
| |
| # make ftdi
| |
| # make flash-ftdi
| |
| | |
| === Build the programmer ===
| |
| * Connect the FTDI adapter to RX and TX of the arduino
| |
| * Connect the 3V3 of the FTDI adapter to the 5V pin of the Arduino
| |
| * Connect the GND of the FTDI adapter to the GDN of the arduino.
| |
| | |
| {| class="wikitable" border="1"
| |
| ! Arduino
| |
| ! USB<->Serial port adapter
| |
| |-
| |
| | RX
| |
| | TX
| |
| |-
| |
| | TX
| |
| | RX
| |
| |-
| |
| | 5v
| |
| | 3.3v
| |
| |-
| |
| | GND
| |
| | GND
| |
| |-
| |
| |}
| |
| | |
| * If you use a clip (Like a SOIC-8 or SOIC16 Pomona clip), connect it to the arduino
| |
| * Connect the chip to the clip, or if you don't use a clip, the chip to the arduino
| |
| * Connect an USB cable between the USB<->Serial adapter and the computer. Never connect the cable between the Arduino USB port and the computer while the flasher is connected to a flash chip. That would result in the I/O voltage being 5V instead of 3.3V.
| |
| | |
| == Flashing ==
| |
| Run flashrom like that:
| |
| flashrom -p serprog:dev=/dev/ttyUSB0:2000000
| |
| With some strange macronix flash chip (that are present in the Thinkpad X200) you might need to add spispeed=100k like that:
| |
| flashrom -p serprog:dev=/dev/ttyUSB0:2000000,spispeed=100k
| |
| | |
| == Thanks ==
| |
| Thanks a lot to SwiftGeek on IRC (#libreboot on Freenode) for finding the first workaround to make it detect flash chips at lower voltage. This project would not have been possible without that.
| |