• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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