|
|
(9 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 you to to never 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 installing it on the arduino ===
| |
| ==== Building frser-duino ====
| |
| 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
| |
| * You can then build the code:
| |
| $ make ftdi
| |
| | |
| ==== Installing the code on the arduino ====
| |
| Before installing the code on arduino we want to make sure that we are talking to the right device.
| |
| To do that make sure that the arduino is not connected to your computer and run:
| |
| $ ls -l /dev/ttyUSB0
| |
| If everything went fine it will output something like that:
| |
| ls: cannot access '/dev/ttyUSB0': No such file or directory
| |
| If instead it looks like that:
| |
| crw-rw---- 1 root uucp 188, 0 27 févr. 14:30 /dev/ttyUSB0
| |
| then something else is connected to your computer at /dev/ttyUSB0.
| |
| If you can't figure what's going on by yourself, it's better to get help
| |
| on the flashrom IRC channel to fix the issue.
| |
| | |
| Then connect your arduino to the computer and run the same command:
| |
| $ ls -l /dev/ttyUSB0
| |
| This time it's supposed to output a line that looks more or less like that
| |
| crw-rw---- 1 root uucp 188, 0 27 févr. 14:30 /dev/ttyUSB0
| |
| | |
| At this point we're pretty confident that /dev/ttyUSB0 corresponds to the arduino, so we can install the code with:
| |
| $ make flash-ftdi
| |
| | |
| Once it is installed we can now test that everything went fine with:
| |
| $ flashrom -p serprog:dev=/dev/ttyUSB0:2000000
| |
| This will make flashrom talk to the arduino to verify if everything is fine up to this point.
| |
| | |
| If everything went fine it will look more or less like that:
| |
| $ flashrom -p serprog:dev=/dev/ttyUSB0:2000000
| |
| /sys/firmware/dmi/tables/smbios_entry_point: Permission denied
| |
| /dev/mem: Permission denied
| |
| /sys/firmware/dmi/tables/smbios_entry_point: Permission denied
| |
| /dev/mem: Permission denied
| |
| flashrom v1.0 on Linux 4.15.2-gnu-1 (i686)
| |
| 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"
| |
| serprog: requested mapping AT45CS1282 is incompatible: 0x1080000 bytes at 0xfef80000.
| |
| No EEPROM/flash device found.
| |
| Note: flashrom can never write if the flash chip isn't found automatically.
| |
| This is the important line:
| |
| serprog: Programmer name is "frser-duino"
| |
| It means that flashrom is able to talk to the flasher, which reports itself as "frser-duino"
| |
| We also have the following line:
| |
| No EEPROM/flash device found.
| |
| which tells that it didn't find any flash. This is what's supposed to happen since we didn't connect any yet.
| |
| | |
| === Build the programmer ===
| |
| ==== Connect the programmer to the USB<->Serial adapter ====
| |
| To do that:
| |
| * Connect the FTDI adapter RX to the TX of the arduino
| |
| * Connect the FTDI adapter TX to the RX 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.
| |
| | |
| Here's a sumarry of the above:
| |
| {| 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:
| |
| $ flashrom -p serprog:dev=/dev/ttyUSB0:2000000
| |
| /sys/firmware/dmi/tables/smbios_entry_point: Permission denied
| |
| /dev/mem: Permission denied
| |
| /sys/firmware/dmi/tables/smbios_entry_point: Permission denied
| |
| /dev/mem: Permission denied
| |
| flashrom v1.0 on Linux 4.15.2-gnu-1 (i686)
| |
| 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"
| |
| serprog: requested mapping AT45CS1282 is incompatible: 0x1080000 bytes at 0xfef80000.
| |
| No EEPROM/flash device found.
| |
| Note: flashrom can never write if the flash chip isn't found automatically.
| |
| | |
| Again like before the important parts are:
| |
| serprog: Programmer name is "frser-duino"
| |
| And:
| |
| No EEPROM/flash device found.
| |
| | |
| If you made it up to this point, you successfully built the flasher.
| |
| | |
| === Using the programmer ===
| |
| ==== Connect the programmer to a flash cihp ====
| |
| Since the flasher has been built, you probably want to use it.
| |
| | |
| * 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
| |
| | |
| Here's how to connect the flash chips to the programmer:
| |
| {| class="wikitable" border="1"
| |
| ! Arduino pin
| |
| ! Function
| |
| |
| |
| ! Flash chip pin name
| |
| ! SOIC8 Flash chip pin
| |
| ! SOIC16 Flash chip pin
| |
| |-
| |
| | D13
| |
| | CLK (Clock)
| |
| !
| |
| | CLK
| |
| |
| |
| |
| |
| |-
| |
| | D12
| |
| | MISO (Master In Slave Out)
| |
| !
| |
| | MISO or SO
| |
| |
| |
| |
| |
| |-
| |
| | D11
| |
| | MOSI (Master Out Slave In)
| |
| !
| |
| | MOSI or SI
| |
| |
| |
| |
| |
| |-
| |
| | D10
| |
| | CS# (Chip Select)
| |
| !
| |
| | CS# or CS OR SS
| |
| |
| |
| |
| |
| |-
| |
| | GND
| |
| | GND (Ground)
| |
| !
| |
| | GND
| |
| |
| |
| |
| |
| |-
| |
| | 5V
| |
| | 3.3V
| |
| !
| |
| | VCC
| |
| |
| |
| |
| |
| |-
| |
| | 5V
| |
| | 3.3V
| |
| !
| |
| | WP# (Write Protect)
| |
| |
| |
| |
| |
| |-
| |
| | 5V
| |
| | 3.3V
| |
| !
| |
| | HOLD#
| |
| |
| |
| |
| |
| |-
| |
| |}
| |
| | |
| * 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
| |