doc: Convert serprog docs to rst and add to doc directory
Change-Id: Ie52f1e051ed215d61d5fb535e3eddeac71f64d13 Signed-off-by: Anastasia Klimchuk <aklm@flashrom.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/82018 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Sydney <git@funkeleinhorn.com> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
@ -749,7 +749,7 @@ chips at once and selecting which one to flash by software means (rather than re
|
||||
The particular programmer implementation needs to support this feature, for it to work. If the requested chip
|
||||
select isn't available, flashrom will fail safely.
|
||||
|
||||
More information about serprog is available in **serprog-protocol.txt** in the source distribution.
|
||||
More information about serprog is available in this document: :doc:`/supported_hw/supported_prog/serprog/serprog-protocol`.
|
||||
|
||||
|
||||
buspirate_spi programmer
|
||||
|
@ -12,6 +12,7 @@
|
||||
dev_guide/index
|
||||
user_docs/index
|
||||
contrib_howtos/index
|
||||
supported_hw/index
|
||||
classic_cli_manpage
|
||||
contact
|
||||
release_notes/index
|
||||
|
8
doc/supported_hw/index.rst
Normal file
@ -0,0 +1,8 @@
|
||||
==================
|
||||
Supported hardware
|
||||
==================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
|
||||
supported_prog/index
|
7
doc/supported_hw/supported_prog/index.rst
Normal file
@ -0,0 +1,7 @@
|
||||
Supported programmers
|
||||
=====================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
serprog/index
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 59 KiB |
BIN
doc/supported_hw/supported_prog/serprog/300px-Serprog_0001.jpeg
Normal file
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 21 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P1v1_arduino328.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P1v2_arduino1280.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P2v1_resdivider.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P2v2_oc_cs.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P2v3_buffer4050.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P3v1_dil8_so8_spi.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
doc/supported_hw/supported_prog/serprog/P3v2_so16_spi.png
Normal file
After Width: | Height: | Size: 22 KiB |
227
doc/supported_hw/supported_prog/serprog/arduino_flasher.rst
Normal file
@ -0,0 +1,227 @@
|
||||
===============
|
||||
Arduino flasher
|
||||
===============
|
||||
|
||||
.. container:: danger, admonition
|
||||
|
||||
**WARNING**
|
||||
|
||||
Make sure that the Arduino SPI voltages and the flash chip voltages matches: Without any extra resistors or level shifter,
|
||||
the Arduino Uno and Duemillanove SPI pins are at 5V, while most chips operate at 3.3v.
|
||||
|
||||
Hardware basics
|
||||
===============
|
||||
|
||||
You'll need to have:
|
||||
|
||||
* a supported Arduino, these are
|
||||
|
||||
* any based on the ATmega328 (/168/88 will work with small changes too), like the Arduino Uno R3.
|
||||
* Arduino Mega or Mega2560, but notice that the software has a different branch for them.
|
||||
|
||||
* a way to convert the 5V logic levels to 3.3V (except if 3.3V arduino, these are rarer)
|
||||
* a 3.3V SPI flash chip that is supported by flashrom
|
||||
|
||||
Notes:
|
||||
|
||||
* The FTDI based usb-serial converters are the fastest.
|
||||
* 1.8V conversion isnt covered here, yet.
|
||||
|
||||
There are some simple schematics included here (`source <https://github.com/flashrom/wiki-arduino-spi-example-schematics>`_).
|
||||
The idea is that you pick one version from each part 1 through 3, and connect the pin/net names.
|
||||
|
||||
Part 1: The Arduino
|
||||
-------------------
|
||||
|
||||
ATmega328 based ones:
|
||||
|
||||
.. image:: P1v1_arduino328.png
|
||||
|
||||
For the Arduino Megas:
|
||||
|
||||
.. image:: P1v2_arduino1280.png
|
||||
|
||||
Part 2: Level translation
|
||||
-------------------------
|
||||
|
||||
There are a few options here, ranging from the simple resistors (v1) to a buffer chip (v3).
|
||||
|
||||
One thing to remember about the resistor dividers is that they're not strong enough to do ISP.
|
||||
|
||||
Here's the simple resistors:
|
||||
|
||||
.. image:: P2v1_resdivider.png
|
||||
|
||||
The part count for the resistor divider is 6 resistors of 2 types or 9 of one type.
|
||||
|
||||
Here's one with 5 resistors, the downside is that you'll need to modify the firmware a little:
|
||||
|
||||
.. image:: P2v2_oc_cs.png
|
||||
|
||||
The 3rd version is using the DIP16 HEF4050 buffer chip:
|
||||
|
||||
.. image:: P2v3_buffer4050.png
|
||||
|
||||
Part 3: The SPI Flash chip
|
||||
--------------------------
|
||||
|
||||
The DIL-8 and SOIC-8 versions connect like this:
|
||||
|
||||
.. image:: P3v1_dil8_so8_spi.png
|
||||
|
||||
For the SMD SOIC-16 chips the pinout is:
|
||||
|
||||
.. image:: P3v2_so16_spi.png
|
||||
|
||||
Gallery of some flashers
|
||||
========================
|
||||
|
||||
.. image:: 166px-Serprogduino_v2.jpeg
|
||||
|
||||
.. _arduino shield:
|
||||
|
||||
Alternative: Shield with SPI and LPC/FWH for 5V Arduinos
|
||||
========================================================
|
||||
|
||||
.. image:: 250px-Arduino_5V_lpc_spi_shield.jpg
|
||||
|
||||
.. image:: 250px-Arduino_lpcspi_shield_render.png
|
||||
|
||||
`Firmware and hardware sources <https://github.com/urjaman/frser-m328lpcspi>`_
|
||||
|
||||
`Shield PCB shared at oshpark <https://oshpark.com/shared_projects/E6jwmbWy>`_
|
||||
|
||||
* 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.
|
||||
The Uno R3 will work with the fast-usbserial U2 firmware.
|
||||
* This shield uses a different pin for SPI CS than the other circuits on this page, and has LPC/FWH capability, thus different firmware.
|
||||
Frser-duino does have the code for using the CS like in this shield, but you need to modify spihw.h.
|
||||
* 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.
|
||||
* For LPC/FWH, current (16/02/01) flashrom trunk will be really slow, please use this branch instead.
|
||||
|
||||
Software and setup
|
||||
==================
|
||||
|
||||
The Arduino Uno R3 and other arduinos with an ATmega8U2/16U2 as an usb-serial converter have lots of bugs in their usb-serial firmware
|
||||
that 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,
|
||||
but there exists a firmware that allows these to be used like the FTDI at 2Mbaud: `fast-usbserial <https://github.com/urjaman/fast-usbserial>`_.
|
||||
|
||||
Setup
|
||||
-----
|
||||
|
||||
Required software
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
To make it work you need:
|
||||
|
||||
* A recent flashrom with the serprog protocol compiled in (most packaged versions do)
|
||||
* `frser-duino which runs on the arduino <https://github.com/urjaman/frser-duino>`_
|
||||
|
||||
* This page used to link to `serprog-duino <https://gitorious.org/gnutoo-personal-arduino-projects/serprog-duino>`_,
|
||||
frser-duino should build in a similar fashion and has better serial buffering and some other features (spi speed setting).
|
||||
|
||||
* The avr toolchain(avr-gcc, avr-libc,make etc...)
|
||||
|
||||
Building the software
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
First get the firmware source::
|
||||
|
||||
$ git clone --recursive git://github.com/urjaman/frser-duino
|
||||
$ cd frser-duino
|
||||
|
||||
Then build it:
|
||||
|
||||
For a board with a 8u2 or a 16u2::
|
||||
|
||||
$ make u2 && make flash-u2
|
||||
|
||||
For a board with an ftdi::
|
||||
|
||||
$ make ftdi && make flash-ftdi
|
||||
|
||||
Building for the Mega1280 or 2560
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
As above, except use the branch for the 1280::
|
||||
|
||||
$ git clone --recursive git://github.com/urjaman/frser-duino -b arduino-mega-1280
|
||||
|
||||
For 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.
|
||||
|
||||
Running flashrom
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
The right flashrom arguments are explained in the :doc:`/classic_cli_manpage`, or here.
|
||||
|
||||
Available targets:
|
||||
|
||||
* ftdi, flash-ftdi:
|
||||
For the Arduinos with an FTDI
|
||||
compatible flashrom arguments::
|
||||
|
||||
flashrom -p serprog:dev=/dev/ttyUSB0:2000000
|
||||
|
||||
Other boards using an hardware USB<->Serial converter might work too.
|
||||
|
||||
* u2, flash-u2:
|
||||
For the Arduino with a 8u2 or a 16u2
|
||||
compatible flashrom arguments::
|
||||
|
||||
flashrom -p serprog:dev=/dev/ttyACM0:115200
|
||||
|
||||
So for a board that has an ftdi that would give::
|
||||
|
||||
flashrom -p serprog:dev=/dev/ttyUSB0:2000000
|
||||
|
||||
Speed
|
||||
^^^^^
|
||||
|
||||
The speed is very dependant on the flash chip used:
|
||||
|
||||
* Its capacity impacts the speed a lot, as you would expect.
|
||||
* The chip model as also a huge impact.
|
||||
|
||||
Duemillanove
|
||||
^^^^^^^^^^^^
|
||||
|
||||
With the duemillanove::
|
||||
|
||||
# time flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -r duemillanove.rom
|
||||
flashrom v0.9.7-r1711 on Linux 3.18.3-gnu-1 (i686)
|
||||
flashrom is free software, get the source code at http://www.flashrom.org
|
||||
|
||||
Calibrating delay loop... delay loop is unreliable, trying to continue OK.
|
||||
serprog: Programmer name is "serprog-duino"
|
||||
Found Winbond flash chip "W25Q32.V" (4096 kB, SPI) on serprog.
|
||||
Reading flash... done.
|
||||
flashrom -p serprog:dev=/dev/ttyUSB0:2000000 -r duemillanove.rom
|
||||
|
||||
we have::
|
||||
|
||||
4.23s user 0.29s system 8% cpu 56.010 total
|
||||
|
||||
Uno
|
||||
^^^
|
||||
|
||||
With the Arduino uno::
|
||||
|
||||
# flashrom -p serprog:dev=/dev/ttyACM0:115200 -r uno.rom
|
||||
flashrom v0.9.7-r1711 on Linux 3.18.3-gnu-1 (i686)
|
||||
flashrom is free software, get the source code at http://www.flashrom.org
|
||||
|
||||
Calibrating delay loop... delay loop is unreliable, trying to continue OK.
|
||||
serprog: Programmer name is "serprog-duino"
|
||||
Found Winbond flash chip "W25Q32.V" (4096 kB, SPI) on serprog.
|
||||
Reading flash... done.
|
||||
flashrom -p serprog:dev=/dev/ttyACM0:115200 -r uno.rom
|
||||
|
||||
we have::
|
||||
|
||||
4.77s user 0.65s system 1% cpu 6:02.43 total
|
||||
|
||||
Tested chips
|
||||
^^^^^^^^^^^^
|
||||
|
||||
* SST25VF016B => huge issues, not recognized by the 3.3v version, had to use the 5v version which is over maximum allowed voltage,
|
||||
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...)...
|
||||
* W25X80 works well in 3.3v mode(5v works also but it's highly not advised to use 5v)
|
237
doc/supported_hw/supported_prog/serprog/arduino_flasher_3.3v.rst
Normal file
@ -0,0 +1,237 @@
|
||||
====================
|
||||
Arduino flasher 3.3v
|
||||
====================
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
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 and warnings:
|
||||
|
||||
* 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.
|
||||
* You need to read the tutorial, if you don't understand it, it's probably not for you. In doubt you could ask for some help in flashrom real-time channels
|
||||
or on the mailing list, see :doc:`/contact`.
|
||||
* For now it requires to patch frser-duino
|
||||
|
||||
Theory
|
||||
========
|
||||
|
||||
In the `Atmega328/P datasheet <https://web.archive.org/web/20181004225154/ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf>`_,
|
||||
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 try get help on the flashrom channels to fix the issue, see :doc:`/contact`.
|
||||
|
||||
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 summary of the above:
|
||||
|
||||
======== =========================
|
||||
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 chip
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
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:
|
||||
|
||||
=========== ========================== =================== =====================
|
||||
Arduino pin Function Flash chip pin name SOIC16 Flash chip pin
|
||||
=========== ========================== =================== =====================
|
||||
D13 CLK (Clock) CLK 16
|
||||
D12 MISO (Master In Slave Out) MISO or SO 8
|
||||
D11 MOSI (Master Out Slave In) MOSI or SI 15
|
||||
D10 CS# (Chip Select) CS# or CS OR SS 7
|
||||
GND GND (Ground) GND 10
|
||||
5V 3.3V VCC 2
|
||||
5V 3.3V WP# (Write Protect) 9
|
||||
5V 3.3V HOLD# 1
|
||||
=========== ========================== =================== =====================
|
||||
|
||||
Then 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 models of 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 Libera) for finding the first workaround to make it detect flash chips at lower voltage.
|
||||
Thanks also for telling me about the Macronix issues on the Thinkpad X200. This project would not have been possible without that.
|
||||
|
||||
Page license
|
||||
============
|
||||
|
||||
This page is available under the following licenses:
|
||||
|
||||
* `CC-BY-SA 3.0 <https://creativecommons.org/licenses/by-sa/3.0/legalcode>`_
|
||||
* `CC-BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/legalcode>`_ or later
|
||||
* `GFDL 1.3 <https://www.gnu.org/licenses/fdl-1.3.txt>`_ or later
|
11
doc/supported_hw/supported_prog/serprog/index.rst
Normal file
@ -0,0 +1,11 @@
|
||||
Serprog
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
overview
|
||||
serprog-protocol
|
||||
arduino_flasher_3.3v
|
||||
arduino_flasher
|
||||
teensy_3_1
|
83
doc/supported_hw/supported_prog/serprog/overview.rst
Normal file
@ -0,0 +1,83 @@
|
||||
==================
|
||||
Serprog (overview)
|
||||
==================
|
||||
|
||||
This page collects information about the serprog protocol and the programmers implementing it.
|
||||
|
||||
Protocol
|
||||
========
|
||||
|
||||
See :doc:`/supported_hw/supported_prog/serprog/serprog-protocol`. It is designed to be compact and allow efficient storage in limited memory of programmer devices.
|
||||
|
||||
AVR flasher by Urja Rannikko
|
||||
============================
|
||||
|
||||
.. image:: 300px-Avr_rs232_programmer.jpg
|
||||
|
||||
The Prototype RS232 AVR parallel flash programmer of Urja Rannikko was the first implementation of the serprog protocol.
|
||||
|
||||
The source code can be found `here <https://github.com/urjaman/frser-atmega88>`_.
|
||||
|
||||
InSystemFlasher by Juhana Helovuo
|
||||
=================================
|
||||
|
||||
This was the first one that talks to SPI devices via serial over USB.
|
||||
Details can be found in the `coreboot wiki <https://www.coreboot.org/InSystemFlasher>`_ and in this
|
||||
`coreboot mailing list thread <https://mail.coreboot.org/pipermail/coreboot/2011-February/063349.html>`_.
|
||||
|
||||
atmegaXXu2-flasher by Stefan Tauner
|
||||
===================================
|
||||
|
||||
Like the InSystemFlasher this one uses LUFA on an AVR microcontroller to tunnel the serial data over USB.
|
||||
|
||||
.. image:: 300px-AtmegaXXu2-flasher.jpg
|
||||
|
||||
Various Arduino based flashers
|
||||
==============================
|
||||
|
||||
Frser-duino
|
||||
-----------
|
||||
|
||||
This project contains `source code <https://github.com/urjaman/frser-duino/>`_ to install on Arduino devices.
|
||||
|
||||
This developer also have various ports on `github repo <https://github.com/urjaman?tab=repositories>`_ for several microcontroller boards, such as:
|
||||
|
||||
* `frser-teensyflash <https://github.com/urjaman/frser-teensyflash>`_: A port for the teensy microcontroller board
|
||||
|
||||
There also various other interesting projects such as:
|
||||
|
||||
* `fast-usbserial <https://github.com/urjaman/fast-usbserial>`_: A software to make arduino with 8u2 or 16u2 flashing faster and more reliable]
|
||||
* :ref:`arduino shield`
|
||||
|
||||
Using a 5v Arduino at 3.3V
|
||||
--------------------------
|
||||
|
||||
Information on it can be found in this doc: :doc:`/supported_hw/supported_prog/serprog/arduino_flasher_3.3v`
|
||||
|
||||
5V arduino with level shifter
|
||||
-----------------------------
|
||||
|
||||
For detailed instructions on how to use different Arduino models to access SPI flash chips see :doc:`/supported_hw/supported_prog/serprog/arduino_flasher`
|
||||
|
||||
.. image:: 300px-Serprog_0001.jpeg
|
||||
|
||||
Teensy 3.1 SPI + LPC/FWH Flasher
|
||||
--------------------------------
|
||||
|
||||
A Teensy 3.1 based small flasher by Urja Rannikko documented here: :doc:`/supported_hw/supported_prog/serprog/teensy_3_1`
|
||||
|
||||
HydraBus multi-tool
|
||||
-------------------
|
||||
|
||||
HydraBus (hardware) with HydraFW (firmware) is an open source multi-tool for learning, developing, debugging, hacking and penetration testing
|
||||
of embedded hardware. It is built upon an ARM Cortex-M4 (STM32F405). The source code for HydraFW is available
|
||||
`on GitHub <https://github.com/hydrabus/hydrafw>`_. Refer to `their GitHub Wiki <https://github.com/hydrabus/hydrafw/wiki/HydraFW-SPI-guide#flashrom-usage>`_
|
||||
for more details on how to use HydraBus with flashrom.
|
||||
|
||||
.. image:: 300px-HydraFW_Default_PinAssignment.png
|
||||
|
||||
stm32-vserprog by Chi Zhang
|
||||
-----------------------------
|
||||
|
||||
A powerful option is `stm32-vserprog <https://github.com/dword1511/stm32-vserprog#stm32-vserprog>`_, a firmware for various STM32-based boards
|
||||
that turns them into serprog-based programmers with SPI clock speeds up to 36 MHz.
|
@ -1,83 +1,103 @@
|
||||
Serial Flasher Protocol Specification - version 1 (0x01 return value == 1)
|
||||
=====================================
|
||||
Serial Flasher Protocol Specification
|
||||
=====================================
|
||||
|
||||
Version 1 (0x01 return value == 1)
|
||||
==================================
|
||||
|
||||
Command And Answer Sequence - all commands give an answer.
|
||||
|
||||
PC: COMMAND(8bit) <parameters determined by opcode>
|
||||
|
||||
DEV: ACK/NAK(8bit) <OPTIONAL RETURN BYTES (only if ACK)> / nothing
|
||||
|
||||
Command 0x10 (SYNCNOP) has a special return of NAK+ACK for synchronization.
|
||||
|
||||
ACK = 0x06
|
||||
|
||||
NAK = 0x15
|
||||
|
||||
All multibyte values are little-endian. Addresses and lengths are 24-bit.
|
||||
|
||||
COMMAND Description Parameters Return Value
|
||||
0x00 NOP none ACK
|
||||
0x01 Query programmer iface version none ACK + 16bit version (nonzero)
|
||||
0x02 Query supported commands bitmap none ACK + 32 bytes (256 bits) of supported cmds flags
|
||||
0x03 Query programmer name none ACK + 16 bytes string (null padding) / NAK
|
||||
0x04 Query serial buffer size none ACK + 16bit size / NAK
|
||||
0x05 Query supported bustypes none ACK + 8-bit flags (as per flashrom) / NAK
|
||||
0x06 Query connected address lines none ACK + 8bit line count / NAK
|
||||
0x07 Query operation buffer size none ACK + 16bit size / NAK
|
||||
0x08 Query maximum write-n length none ACK + 24bit length (0==2^24) / NAK
|
||||
0x09 Read byte 24-bit addr ACK + BYTE / NAK
|
||||
0x0A Read n bytes 24-bit addr + 24-bit length ACK + length bytes / NAK
|
||||
0x0B Initialize operation buffer none ACK / NAK
|
||||
0x0C Write to opbuf: Write byte 24-bit addr + 8-bit byte ACK / NAK (NOTE: takes 5 bytes in opbuf)
|
||||
0x0D Write to opbuf: Write n 24-bit length + 24-bit addr + ACK / NAK (NOTE: takes 7+n bytes in opbuf)
|
||||
+ length bytes of data
|
||||
0x0E Write to opbuf: delay 32-bit usecs ACK / NAK (NOTE: takes 5 bytes in opbuf)
|
||||
0x0F Execute operation buffer none ACK / NAK
|
||||
0x10 Sync NOP none NAK + ACK (for synchronization)
|
||||
0x11 Query maximum read-n length none ACK + 24-bit length (0==2^24) / NAK
|
||||
0x12 Set used bustype 8-bit flags (as with 0x05) ACK / NAK
|
||||
0x13 Perform SPI operation 24-bit slen + 24-bit rlen ACK + rlen bytes of data / NAK
|
||||
+ slen bytes of data
|
||||
0x14 Set SPI clock frequency in Hz 32-bit requested frequency ACK + 32-bit set frequency / NAK
|
||||
0x15 Toggle flash chip pin drivers 8-bit (0 disable, else enable) ACK / NAK
|
||||
0x16 Set SPI Chip Select 8-bit ACK / NAK
|
||||
0x17 Set SPI Mode 8-bit ACK / NAK
|
||||
0x18 Set CS Mode 8-bit ACK / NAK
|
||||
0x?? unimplemented command - invalid.
|
||||
|
||||
======== =============================== ================================================== =================================================
|
||||
COMMAND Description Parameters Return Value
|
||||
======== =============================== ================================================== =================================================
|
||||
0x00 NOP none ACK
|
||||
0x01 Query programmer iface version none ACK + 16bit version (nonzero)
|
||||
0x02 Query supported commands bitmap none ACK + 32 bytes (256 bits) of supported cmds flags
|
||||
0x03 Query programmer name none ACK + 16 bytes string (null padding) / NAK
|
||||
0x04 Query serial buffer size none ACK + 16bit size / NAK
|
||||
0x05 Query supported bustypes none ACK + 8-bit flags (as per flashrom) / NAK
|
||||
0x06 Query connected address lines none ACK + 8bit line count / NAK
|
||||
0x07 Query operation buffer size none ACK + 16bit size / NAK
|
||||
0x08 Query maximum write-n length none ACK + 24bit length (0==2^24) / NAK
|
||||
0x09 Read byte 24-bit addr ACK + BYTE / NAK
|
||||
0x0A Read n bytes 24-bit addr + 24-bit length ACK + length bytes / NAK
|
||||
0x0B Initialize operation buffer none ACK / NAK
|
||||
0x0C Write to opbuf: Write byte 24-bit addr + 8-bit byte ACK / NAK (NOTE: takes 5 bytes in opbuf)
|
||||
0x0D Write to opbuf: Write n 24-bit length + 24-bit addr + length bytes of data ACK / NAK (NOTE: takes 7+n bytes in opbuf)
|
||||
0x0E Write to opbuf: delay 32-bit usecs ACK / NAK (NOTE: takes 5 bytes in opbuf)
|
||||
0x0F Execute operation buffer none ACK / NAK
|
||||
0x10 Sync NOP none NAK + ACK (for synchronization)
|
||||
0x11 Query maximum read-n length none ACK + 24-bit length (0==2^24) / NAK
|
||||
0x12 Set used bustype 8-bit flags (as with 0x05) ACK / NAK
|
||||
0x13 Perform SPI operation 24-bit slen + 24-bit rlen + slen bytes of data ACK + rlen bytes of data / NAK
|
||||
0x14 Set SPI clock frequency in Hz 32-bit requested frequency ACK + 32-bit set frequency / NAK
|
||||
0x15 Toggle flash chip pin drivers 8-bit (0 disable, else enable) ACK / NAK
|
||||
0x16 Set SPI Chip Select 8-bit ACK / NAK
|
||||
0x17 Set SPI Mode 8-bit ACK / NAK
|
||||
0x18 Set CS Mode 8-bit ACK / NAK
|
||||
0x?? unimplemented command - invalid
|
||||
======== =============================== ================================================== =================================================
|
||||
|
||||
Additional information of the above commands:
|
||||
|
||||
About unimplemented commands / startup sequence:
|
||||
Only commands allowed to be used without checking anything are 0x00,0x10 and 0x01 (NOP,SYNCNOP,Q_IFACE).
|
||||
If 0x01 doesn't return 1, dont do anything if you dont support a newer protocol.
|
||||
Then, check support for any other opcode (except 0x02) by using 0x02 (Q_CMDMAP).
|
||||
|
||||
0x02 (Q_CMDMAP):
|
||||
The map's bits are mapped as follows:
|
||||
cmd 0 support: byte 0 bit 0
|
||||
cmd 1 support: byte 0 bit 1
|
||||
cmd 7 support: byte 0 bit 7
|
||||
cmd 8 support: byte 1 bit 0, and so on.
|
||||
|
||||
0x04 (Q_SERBUF):
|
||||
If the programmer has a guaranteed working flow control,
|
||||
it should return a big bogus value - eg 0xFFFF.
|
||||
|
||||
0x05 (Q_BUSTYPE):
|
||||
The bit's are defined as follows:
|
||||
bit 0: PARALLEL, bit 1: LPC, bit 2: FWH, bit 3: SPI.
|
||||
|
||||
0x06 (Q_CHIPSIZE):
|
||||
Only applicable to parallel programmers.
|
||||
An LPC/FWH/SPI-programmer can report this as not supported in the command bitmap.
|
||||
|
||||
0x08 (Q_WRNMAXLEN):
|
||||
If a programmer reports a bigger maximum write-n length than the serial buffer size,
|
||||
it is assumed that the programmer can process the data fast enough to take in the
|
||||
reported maximum write-n without problems.
|
||||
|
||||
0x0F (O_EXEC):
|
||||
Execute operation buffer will also clear it, regardless of the return value.
|
||||
|
||||
0x11 (Q_RDNMAXLEN):
|
||||
If this command is not supported, assume return of 0 (2^24).
|
||||
|
||||
0x12 (S_BUSTYPE):
|
||||
Set's the used bustype if the programmer can support more than one flash protocol.
|
||||
Sending a byte with more than 1 bit set will make the programmer decide among them
|
||||
on it's own. Bit values as with Q_BUSTYPE.
|
||||
|
||||
0x13 (O_SPIOP):
|
||||
Send and receive bytes via SPI.
|
||||
Maximum slen is Q_WRNMAXLEN in case Q_BUSTYPE returns SPI only or S_BUSTYPE was used
|
||||
to set SPI exclusively before. Same for rlen and Q_RDNMAXLEN.
|
||||
This operation is immediate, meaning it doesn't use the operation buffer.
|
||||
|
||||
0x14 (S_SPI_FREQ):
|
||||
Set the SPI clock frequency. The 32-bit value indicates the
|
||||
requested frequency in Hertz. Value 0 is reserved and should
|
||||
@ -86,30 +106,37 @@ Additional information of the above commands:
|
||||
lower than the one requested. If there is no lower frequency
|
||||
available the lowest possible should be used. The value
|
||||
chosen is sent back in the reply with an ACK.
|
||||
|
||||
0x15 (S_PIN_STATE):
|
||||
Sets the state of the pin drivers connected to the flash chip. Disabling them allows other
|
||||
devices (e.g. a mainboard's chipset) to access the chip. This way the serprog controller can
|
||||
remain attached to the flash chip even when the board is running. The user is responsible to
|
||||
NOT connect VCC and other permanently externally driven signals to the programmer as needed.
|
||||
If the value is 0, then the drivers should be disabled, otherwise they should be enabled.
|
||||
|
||||
0x16 (S_SPI_CS):
|
||||
Set which SPI Chip Select pin to use. This operation is immediate,
|
||||
meaning it doesn't use the operation buffer.
|
||||
|
||||
0x17 (S_SPI_MODE):
|
||||
Set which SPI Mode to use for 0x13 O_SPIOP commands.
|
||||
This operation is immediate, meaning it doesn't use the operation buffer.
|
||||
The current defined modes are:
|
||||
0x00: SPI Half Duplex (default)
|
||||
0x01: SPI Full Duplex
|
||||
|
||||
* 0x00: SPI Half Duplex (default)
|
||||
* 0x01: SPI Full Duplex
|
||||
|
||||
0x18 (S_CS_MODE):
|
||||
Set which CS Mode to use. The CS Mode determines the CS behaviour.
|
||||
This allows manual control over the CS.
|
||||
This operation is immediate, meaning it doesn't use the operation buffer.
|
||||
The current defined modes are:
|
||||
0x00: CS Auto Mode. The CS gets selected before 0x13 O_SPIOP commands and
|
||||
deselected afterwards. (default)
|
||||
0x01: CS Selected. The CS will be selected until another mode is set.
|
||||
0x02: CS Deselected. The CS will be deselected until another mode is set.
|
||||
|
||||
* 0x00: CS Auto Mode. The CS gets selected before 0x13 O_SPIOP commands and
|
||||
deselected afterwards. (default)
|
||||
* 0x01: CS Selected. The CS will be selected until another mode is set.
|
||||
* 0x02: CS Deselected. The CS will be deselected until another mode is set.
|
||||
|
||||
About mandatory commands:
|
||||
The only truly mandatory commands for any device are 0x00, 0x01, 0x02 and 0x10,
|
||||
but one can't really do anything with these commands.
|
||||
@ -120,4 +147,4 @@ Additional information of the above commands:
|
||||
In addition, support for these commands is recommended:
|
||||
S_CMD_Q_PGMNAME, S_CMD_Q_BUSTYPE, S_CMD_Q_CHIPSIZE (if parallel).
|
||||
|
||||
See also serprog.c
|
||||
See also ``serprog.c``
|
81
doc/supported_hw/supported_prog/serprog/teensy_3_1.rst
Normal file
@ -0,0 +1,81 @@
|
||||
================================
|
||||
Teensy 3.1 SPI + LPC/FWH Flasher
|
||||
================================
|
||||
|
||||
Note: this was made for the Teensy 3.1, but 3.2 should be compatible too.
|
||||
|
||||
Hardware
|
||||
========
|
||||
|
||||
.. image:: 300px-Teensy31_lpcspi_flasher.jpg
|
||||
|
||||
The hardware is made of a `Teensy 3.1 <https://www.pjrc.com/teensy/teensy31.html>`_ and a shield-like PCB over it.
|
||||
Schematic and board files for the PCB can be found `in the github <https://github.com/urjaman/frser-teensyflash/tree/master/hardware>`_.
|
||||
The PCB is also shared `at OshPark <https://oshpark.com/shared_projects/izukIxq8>`_.
|
||||
|
||||
Other components required:
|
||||
|
||||
* pin headers (total 28, but get more)
|
||||
* a DIL8 socket (if you want to use SPI DIL8)
|
||||
* a PLCC32 SMD socket (if you want to use LPC/FWH)
|
||||
* optional: small SMD capacitor - pad exists under the shield PCB
|
||||
|
||||
Assembly
|
||||
--------
|
||||
|
||||
* start by installing the SMD cap (if available) and the DIL8 socket on the shield PCB
|
||||
* split appropriate strips of pin headers for the teensy and solder them on the teensy, you can use the shield pcb to align them
|
||||
|
||||
* my arrangement was as pictured in order to have more ground clearance under the teensy for the prog button
|
||||
|
||||
* push the shield pcb only a little bit on the pin headers, just so the headers dont come over the top of the PCB
|
||||
* solder two corner pins to keep the shield PCB in place, these can be done from above
|
||||
* solder the rest of headers from the underside while watching that you dont flood the topside with too much solder, especially for the ones close to the PLCC socket
|
||||
* in order to solder the SMD PLCC32 socket, you'll need to break out the middle plastic bit, but keep it safe
|
||||
|
||||
* to protect from solder bridges forming between the pin headers and PLCC socket, i placed a very thin tape over the pin header holes on the pcb during the soldering
|
||||
* notice that the PLCC footprint isnt centered on the PCB, meaning dont try to align the PLCC socket exactly on the PCB
|
||||
|
||||
* after soldering the PLCC socket, i installed the plastic bit back with a little bit of glue
|
||||
|
||||
Software
|
||||
========
|
||||
|
||||
Firmware for the Teensy is available at https://github.com/urjaman/frser-teensyflash
|
||||
|
||||
Also see the README in that directory, both it or this document might be outdated ;)
|
||||
|
||||
As of writing the setup would be:
|
||||
|
||||
* download arduino, extract it somewhere where you have write access
|
||||
* download the `Teensyduino thingy <https://www.pjrc.com/teensy/td_download.html>`_
|
||||
* run it on that arduino tree
|
||||
* install the udev rules provided in the above url
|
||||
* compile and install the `teensy_loader_cli <https://www.pjrc.com/teensy/loader_cli.html>`_ in your path
|
||||
|
||||
::
|
||||
|
||||
git clone --recursive https://github.com/urjaman/frser-teensyflash.git
|
||||
cd frser-teensyflash
|
||||
nano Makefile # Edit the TEENSYDIR path to include your arduino directory
|
||||
make
|
||||
make program-cli # If this waits you need to press the PROG button on the teensy
|
||||
|
||||
After this you should be able to use it with flashrom serprog, for speedups and enhancements to serprog before they're upstreamed
|
||||
I'd suggest to use this flashrom tree: https://github.com/urjaman/flashrom/tree/sp-upstream3
|
||||
|
||||
Device should be something like /dev/ttyACM0 and the baudrate doesnt matter::
|
||||
|
||||
flashrom -p serprog:dev=/dev/ttyACM0:2000000
|
||||
|
||||
ISP Usage
|
||||
---------
|
||||
|
||||
The same software could be used on a bare teensy 3.1 for ISP SPI programming - this is untested and also the 3.3V supply in the teensy is not strong, so beware, but the SPI pins used would be:
|
||||
|
||||
* CS: "Pin 2", PD0
|
||||
* SCK: "Pin 14", PD1
|
||||
* MOSI: "Pin 7", PD2
|
||||
* MISO: "Pin 8", PD3
|
||||
|
||||
See https://forum.pjrc.com/threads/25643-Combined-Pin-Assignments-card for a good Teensy pinmap picture.
|