Chromebook Samus

First, you need the following binary blobs:

  • descriptor.bin - Intel flash descriptor
  • me.bin - Intel Management Engine
  • mrc.bin - Memory Reference Code, which sets up SDRAM
  • refcode.elf - Additional Reference code
  • vga.bin - video ROM, which sets up the display

If you have a samus you can obtain them from your flash, for example, in developer mode on the Chromebook (use Ctrl-Alt-F2 to obtain a terminal and log in as ‘root’):

cd /tmp
flashrom -w samus.bin
scp samus.bin username@ip_address:/path/to/somewhere

If not see the coreboot tree where you can use:

bash crosfirmware.sh samus

to get the image. There is also an ‘extract_blobs.sh’ scripts that you can use on the ‘coreboot-Google_Samus.*’ file to short-circuit some of the below.

Then ‘ifdtool -x samus.bin’ on your development machine will produce:

flashregion_0_flashdescriptor.bin
flashregion_1_bios.bin
flashregion_2_intel_me.bin

Rename flashregion_0_flashdescriptor.bin to descriptor.bin Rename flashregion_2_intel_me.bin to me.bin You can ignore flashregion_1_bios.bin - it is not used.

To get the rest, use ‘cbfstool samus.bin print’:

samus.bin: 8192 kB, bootblocksize 2864, romsize 8388608, offset 0x700000
alignment: 64 bytes, architecture: x86
Name Offset Type Size
cmos_layout.bin 0x700000 cmos_layout 1164
pci8086,0406.rom 0x7004c0 optionrom 65536
spd.bin 0x710500 (unknown) 4096
cpu_microcode_blob.bin 0x711540 microcode 70720
fallback/romstage 0x722a00 stage 54210
fallback/ramstage 0x72fe00 stage 96382
config 0x7476c0 raw 6075
fallback/vboot 0x748ec0 stage 15980
fallback/refcode 0x74cd80 stage 75578
fallback/payload 0x75f500 payload 62878
u-boot.dtb 0x76eb00 (unknown) 5318
(empty) 0x770000 null 196504
mrc.bin 0x79ffc0 (unknown) 222876
(empty) 0x7d66c0 null 167320

You can extract what you need:

cbfstool samus.bin extract -n pci8086,0406.rom -f vga.bin
cbfstool samus.bin extract -n fallback/refcode -f refcode.rmod
cbfstool samus.bin extract -n mrc.bin -f mrc.bin
cbfstool samus.bin extract -n fallback/refcode -f refcode.bin -U

Note that the -U flag is only supported by the latest cbfstool. It unpacks and decompresses the stage to produce a coreboot rmodule. This is a simple representation of an ELF file. You need the patch “Support decoding a stage with compression”.

Put all 5 files into board/google/chromebook_samus.

Now you can build U-Boot and obtain u-boot.rom:

$ make chromebook_samus_defconfig
$ make all

If you are using em100, then this command will flash write -Boot:

em100 -s -d filename.rom -c W25Q64CV -r

Flash map for samus / broadwell:

fffff800:SYS_X86_START16
ffff0000:RESET_SEG_START
fffd8000:TPL_TEXT_BASE
fffa0000:X86_MRC_ADDR
fff90000:VGA_BIOS_ADDR
ffed0000:SYS_TEXT_BASE
ffea0000:X86_REFCODE_ADDR
ffe70000:SPL_TEXT_BASE
ffbf8000:CONFIG_ENV_OFFSET (environemnt offset)
ffbe0000:rw-mrc-cache (Memory-reference-code cache)
ffa00000:<spare>
ff801000:intel-me (address set by descriptor.bin)
ff800000:intel-descriptor