Arduino flasher 3.3v: Difference between revisions

From flashrom
Jump to navigation Jump to search
(Replaced content with "{{#externalredirect: https://www.flashrom.org/supported_hw/supported_prog/serprog/arduino_flasher_3.3v.html }}")
Tag: Replaced
 
(28 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
|-
|}
 
* You can now check that the programmer is responding with:
flashrom -p serprog:dev=/dev/ttyUSB0:2000000
Since you didn't connect yet a flash chip, it will says it found no flash chips:
[TODO]
 
 
* 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
 
{| class="wikitable"  border="1"
! Arduino pin number
! Function
|
! Flash chip function
! SOIC8  Flash chip pin
! SOIC16 Flash chip pin
|-
| D13
| CLK
!
| CLK
|
|-
|}
 
* 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.
 
== Page license ==
This page is available under the following licenses:
* [https://creativecommons.org/licenses/by-sa/3.0/legalcode CC-BY-SA 3.0]
* [https://creativecommons.org/licenses/by-sa/4.0/legalcode CC-BY-SA 4.0] or later
* [https://www.gnu.org/licenses/fdl.txt GFDL 1.3] or later

Latest revision as of 09:05, 21 May 2024