1=============== 2Arduino flasher 3=============== 4 5.. container:: danger, admonition 6 7 **WARNING** 8 9 Make sure that the Arduino SPI voltages and the flash chip voltages matches: Without any extra resistors or level shifter, 10 the Arduino Uno and Duemillanove SPI pins are at 5V, while most chips operate at 3.3v. 11 12Hardware basics 13=============== 14 15You'll need to have: 16 17* a supported Arduino, these are 18 19 * any based on the ATmega328 (/168/88 will work with small changes too), like the Arduino Uno R3. 20 * Arduino Mega or Mega2560, but notice that the software has a different branch for them. 21 22* a way to convert the 5V logic levels to 3.3V (except if 3.3V arduino, these are rarer) 23* a 3.3V SPI flash chip that is supported by flashrom 24 25Notes: 26 27* The FTDI based usb-serial converters are the fastest. 28* 1.8V conversion isnt covered here, yet. 29 30There are some simple schematics included here (`source <https://github.com/flashrom/wiki-arduino-spi-example-schematics>`_). 31The idea is that you pick one version from each part 1 through 3, and connect the pin/net names. 32 33Part 1: The Arduino 34------------------- 35 36ATmega328 based ones: 37 38.. image:: P1v1_arduino328.png 39 40For the Arduino Megas: 41 42.. image:: P1v2_arduino1280.png 43 44Part 2: Level translation 45------------------------- 46 47There are a few options here, ranging from the simple resistors (v1) to a buffer chip (v3). 48 49One thing to remember about the resistor dividers is that they're not strong enough to do ISP. 50 51Here's the simple resistors: 52 53.. image:: P2v1_resdivider.png 54 55The part count for the resistor divider is 6 resistors of 2 types or 9 of one type. 56 57Here's one with 5 resistors, the downside is that you'll need to modify the firmware a little: 58 59.. image:: P2v2_oc_cs.png 60 61The 3rd version is using the DIP16 HEF4050 buffer chip: 62 63.. image:: P2v3_buffer4050.png 64 65Part 3: The SPI Flash chip 66-------------------------- 67 68The DIL-8 and SOIC-8 versions connect like this: 69 70.. image:: P3v1_dil8_so8_spi.png 71 72For the SMD SOIC-16 chips the pinout is: 73 74.. image:: P3v2_so16_spi.png 75 76Gallery of some flashers 77======================== 78 79.. image:: 166px-Serprogduino_v2.jpeg 80 81.. _arduino shield: 82 83Alternative: Shield with SPI and LPC/FWH for 5V Arduinos 84======================================================== 85 86.. image:: 250px-Arduino_5V_lpc_spi_shield.jpg 87 88.. image:: 250px-Arduino_lpcspi_shield_render.png 89 90`Firmware and hardware sources <https://github.com/urjaman/frser-m328lpcspi>`_ 91 92`Shield PCB shared at oshpark <https://oshpark.com/shared_projects/E6jwmbWy>`_ 93 94* This shield and firmware was built for 5V ATMega328s with FTDI, variations to that will need adaptations in building the shield and/or in the firmware. 95 The Uno R3 will work with the fast-usbserial U2 firmware. 96* This shield uses a different pin for SPI CS than the other circuits on this page, and has LPC/FWH capability, thus different firmware. 97 Frser-duino does have the code for using the CS like in this shield, but you need to modify spihw.h. 98* Note: do check for any incompatibilities between your arduino and the shield, eg. the PD7 used as LPC CLK clashes with BT reset in BT arduinos. 99* For LPC/FWH, current (16/02/01) flashrom trunk will be really slow, please use this branch instead. 100 101Software and setup 102================== 103 104The Arduino Uno R3 and other arduinos with an ATmega8U2/16U2 as an usb-serial converter have lots of bugs in their usb-serial firmware 105that prevent it from operating at more than a limited 115200 baud. The frser-duino firmware works around this by default if you use the appropriate make target, 106but there exists a firmware that allows these to be used like the FTDI at 2Mbaud: `fast-usbserial <https://github.com/urjaman/fast-usbserial>`_. 107 108Setup 109----- 110 111Required software 112^^^^^^^^^^^^^^^^^ 113 114To make it work you need: 115 116* A recent flashrom with the serprog protocol compiled in (most packaged versions do) 117* `frser-duino which runs on the arduino <https://github.com/urjaman/frser-duino>`_ 118 119 * This page used to link to `serprog-duino <https://gitorious.org/gnutoo-personal-arduino-projects/serprog-duino>`_, 120 frser-duino should build in a similar fashion and has better serial buffering and some other features (spi speed setting). 121 122* The avr toolchain(avr-gcc, avr-libc,make etc...) 123 124Building the software 125^^^^^^^^^^^^^^^^^^^^^ 126 127First get the firmware source:: 128 129 $ git clone --recursive git://github.com/urjaman/frser-duino 130 $ cd frser-duino 131 132Then build it: 133 134For a board with a 8u2 or a 16u2:: 135 136 $ make u2 && make flash-u2 137 138For a board with an ftdi:: 139 140 $ make ftdi && make flash-ftdi 141 142Building for the Mega1280 or 2560 143^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 144 145As above, except use the branch for the 1280:: 146 147 $ git clone --recursive git://github.com/urjaman/frser-duino -b arduino-mega-1280 148 149For the Mega2560, change the Makefile to target the correct MCU (replace 1280 with 2560). Please also verify that the avrdude command is as expected for your device. 150 151Running flashrom 152^^^^^^^^^^^^^^^^ 153 154The right flashrom arguments are explained in the :doc:`/classic_cli_manpage`, or here. 155 156Available targets: 157 158* ftdi, flash-ftdi: 159 For the Arduinos with an FTDI 160 compatible flashrom arguments:: 161 162 flashrom -p serprog:dev=/dev/ttyUSB0:2000000 163 164 Other boards using an hardware USB<->Serial converter might work too. 165 166* u2, flash-u2: 167 For the Arduino with a 8u2 or a 16u2 168 compatible flashrom arguments:: 169 170 flashrom -p serprog:dev=/dev/ttyACM0:115200 171 172So for a board that has an ftdi that would give:: 173 174 flashrom -p serprog:dev=/dev/ttyUSB0:2000000 175 176Speed 177^^^^^ 178 179The speed is very dependant on the flash chip used: 180 181* Its capacity impacts the speed a lot, as you would expect. 182* The chip model as also a huge impact. 183 184Duemillanove 185^^^^^^^^^^^^ 186 187With the duemillanove:: 188 189 # time flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -r duemillanove.rom 190 flashrom v0.9.7-r1711 on Linux 3.18.3-gnu-1 (i686) 191 flashrom is free software, get the source code at http://www.flashrom.org 192 193 Calibrating delay loop... delay loop is unreliable, trying to continue OK. 194 serprog: Programmer name is "serprog-duino" 195 Found Winbond flash chip "W25Q32.V" (4096 kB, SPI) on serprog. 196 Reading flash... done. 197 flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -r duemillanove.rom 198 199we have:: 200 201 4.23s user 0.29s system 8% cpu 56.010 total 202 203Uno 204^^^ 205 206With the Arduino uno:: 207 208 # flashrom -p serprog:dev=/dev/ttyACM0:115200 -r uno.rom 209 flashrom v0.9.7-r1711 on Linux 3.18.3-gnu-1 (i686) 210 flashrom is free software, get the source code at http://www.flashrom.org 211 212 Calibrating delay loop... delay loop is unreliable, trying to continue OK. 213 serprog: Programmer name is "serprog-duino" 214 Found Winbond flash chip "W25Q32.V" (4096 kB, SPI) on serprog. 215 Reading flash... done. 216 flashrom -p serprog:dev=/dev/ttyACM0:115200 -r uno.rom 217 218we have:: 219 220 4.77s user 0.65s system 1% cpu 6:02.43 total 221 222Tested chips 223^^^^^^^^^^^^ 224 225* SST25VF016B => huge issues, not recognized by the 3.3v version, had to use the 5v version which is over maximum allowed voltage, 226 also had to lower the serial speed to 115200, ultra slow to write(seem related to the chip itself, since that with the openmoko programmer it's even slower...)... 227* W25X80 works well in 3.3v mode(5v works also but it's highly not advised to use 5v) 228