title: ThinkPad X220 external flashing x-toc-enable: true ...
NOTE: Separate ROMs build (in the build system) for X220. Make sure to use the correct one for your laptop.
You can find flashrom under the flashrom/
directory in the Retroboot source
code release archives. Build it (from source) using the
Retroboot build instructions page.
This assumes that you unlocked the regions using ifdtool, and ran me_cleaner, when installing Retroboot the first time. Retroboot currently does not provide pre-compiled utilities, but you can download the source code archive of Retroboot from the download page and build these utilities using the instructions at Retroboot build instructions page.
You do not need to use a flash layout file in flashrom for this, but you can if you want. This guide assumes that you don't. The only time you really need one is when you're doing internal flashing, like when updating/changing your coreboot ROM after already having flashed it externally for the first time.
This guide shows you how to install coreboot (or Retroboot, in this case) onto an X220 that currently has the Lenovo BIOS firmware on it.
Refer to the Raspberry Pi page which tells you how to set up a Raspberry Pi for SPI flashing. Just buy some 2.54mm or 0.1inch dupont leads and use those with a test clip for SO8/SOIC8/SO-IC8 chip.
Ideally, if you know how to solder, you should cut the data wires in the middle (but not power and ground) on the flasher, on the wires from the flasher to the test clip, strip them, and solder 47ohm resistors. That is, don't use straight thru wire connection (0ohm) but use 47ohm resistors on the data lines. However, this isn't strictly required, just recommended. This applies when doing ISP (in system programming) but isn't really required when flashing new chips that have not yet been soldered to a mainboard.
Then with your resistors on the data lines, you can insulate using heat shrink tubing and a hot air jet.
Use of resistors is optional, but highly recommended if you're comfortable with doing a bit of soldering.
Remove all screws from the bottom of your laptop. Then push the keyboard forward and lift it out, disconnect it. Remove the palmrest.
Remove all screws from the bottom of your laptop. Then push the keyboard forward and lift it out, disconnect it. Remove the palmrest.
This photo shows the flash chip (peel back the tape to see it):
NOTE: this image is hotlinked from coreboot.org, for licensing reasons (it is not clear what license coreboot.org is using), because no X220 was physically available for the purpose of making this guide. Look at that picture and, note:
Here's another illustration of the chip pinout:
screen on this side
|5--4|
|6--3|
|7--2|
|8--1|
speakers on this side
It's 8MiB 25XX NOR flash.
It is assumed that you have the ROM images and me_cleaner compiled (well,
the me_cleaner utility is written in Python 3 and does not need to be
compiled). It is also assumed that you have the cbutils
module compiled.
If not, build Retroboot using these instructions
Configure a Raspberry Pi for flashing 25XX NOR flash (you can use any SPI flasher, but the Raspberry Pi is currently the only SPI flasher documented on the Retroboot website).
DISCONNECT the charger and battery, so that there is no power supplied to the X220 mainboard. You will need to fully disassemble your laptop to remove the mainboard, to access the flash chip. No disassembly instructions are yet provided on the Retroboot website.
Connect your RPi via SOIC-8 test clip to the X220 flash chip (see above photo) and dump the firmware. After your clip is connected to a chip (remember, use external 3.3v from your Raspberry Pi. Pin 1 on the RPi GPIO header is 3.3v as specified on the RPi guide)
Never connect the clip while 3.3v is live. Only turn on the power after the clip is connected, to reduce the chance of shorting/frying anything by mistake.
Ideally, your data lines (from RPi to test clip) should have 47ohm resistors on them (manufacturers recommend this when doing ISP, short for In System Programming. it's when you flash a chip that's already mounted to a mainboard which is exactly what you're doing in this case).
On your Raspberry Pi, it is assumed that you're running Raspbian. In Raspbian
you can just do sudo raspi-config
and enable SPI in there.
Assuming you've got your RPi wired correctly, your clip correctly connected and 3.3v is active on the VCC pins of the flash chips, you should be able to flashrom.
Do not flash yet. First, you should make a full backup of the chip:.
sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=32768 -r 8mb_dump.bin
Make several dumps, and compare them in sha512sum
. If the dumps all have the
same checksum, then they are good dumps.
This is flashrom running on your Raspberry Pi, which you SSH'd into. You can actually download Retroboot (from Git) on your Raspberry Pi, and build flashrom using the instructions on the Retroboot website
If flashrom complains about multiple detected flashchips, per definitions,
just do what it says and pick one using -c
option. If it fails, pick another
one. Make sure to get a good dump.
If these are successful, you'll see these files created. Take several of these
and compare in sha512sum
to verify the hashes; if you dump a ROM with the
same checksum several times, then it's very likely a good dump.
Keep these dumps safe, backed up in several places on several storage mediums. You might need them at some point in the future.
Now, please note: the first 5MiB of the dump you made contains descriptor, ME and GbE. You need these!
Extract the 5MiB region (final 3MiB part is BIOS region):
dd if=8mb_dump of=5mb.bin bs=5M count=1
The file 8mb_dump
above is the full backup you made of the flash contents.
Retroboot distributes 8MiB ROM images, for just the BIOS region in the upper 3MiB of the chip on your X220. You should join the 5MiB file from above with the upper 3MiB of your retroboot ROM. However, before you do so:
./meclean 5mb.bin
Then your file will be under bin/neutered/
in the Retroboot build system.
Now use ifdtool to set all regions read-write (this makes internal re-flashing
much easier later on). Like so (ifdtool built in the Retroboot build system):
./coreboot/x230_4mb/util/ifdtool/ifdtool --unlock ./bin/neutered/5mb.bin.neutered
The above commands are from the Retroboot build system, and assume you've
build the cbutils
and me_cleaner
modules. It is strongly recommended that
you run me_cleaner
and unlock your descriptor+ME region using ifdtool, as
above.
When you run the ifdtool
command, you'll have a new file
named 5mb.bin.neutered.new
Now, take your 8MiB ROM from Retroboot and insert the 5MiB file containing your neutered Intel ME with unlocked IFD regions:
dd if=5mb.bin.neutered.new of=8mb.x220.retroboot.rom bs=5M count=1 conv=notrunc
Previously, the first 5MiB of the Retroboot ROM was just 0xFF padding but now it should contain your descriptor, GbE and Intel ME. The ROM is now ready to flash on your machine.
In the above example, 5mb.bin.neutered.new
is the first 5MiB of the dump
from your X220 (prior to flashing), run through me_cleaner
and then run
through ifdtool --unlock
; combined, these two tasks neutered the Intel ME
and set all regions read-write in the flash. The 8mb.x220.retroboot.rom
file
in the above example is simply a 8MiB X220 ROM (of your choice) from
Retroboot, either in a release or compiled by you from the source code.
Now flash Retroboot (8MiB image). We will use the ROM images prepared above. Like so (Raspberry Pi was used, when writing this guide):
sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=32768 -w 8mb.x220.retroboot.rom
Ditto about multiple flashchip definitions thing. Use -c
option if flashrom
tells you to. When you've successfully flashed.
If successful, flashrom will say VERIFIED
after you've finished flashing.
If you're not successful, check RPi wiring and check you're connecting the clip the right way round. Also, check the software configuration on your RPi.
If you still can't get it working, check the voltage again on the flash chip vcc pins. Ensure that you are correctly providing 3.3v to pin 8 of the flash chip.