"Problem": I've bought my first chromebook because I've finally found one at a fair price (< 150 €). It seems to be a worthy substitute to my previous netbook - an Acer ES1-111M, with only 2 USB ports and famously poor touchpad & case (but on the flip side, ethernet and removable DDR3L memory, as well as the ability to add a SATA drive if you're good at Tiny Soldering); by the way, despite being 1 year old, it was mostly new with barely 8 charge cycles and very good external condition!
Problem: Reputable sources, or in fact just the one that's left, are not interested in writing an unlocked firmware for it
Problem: The official way doesn't even work!
So, let's start by making a "Full EFI" firmware. First we need to enable developer mode (Esc+[F3=Refresh]+Power, Ctrl+D), then open a shell (for example, Ctrl+Alt+[F2=Next], "root") and get both the current firmware for backup purposes and the official image to use as a base:
cd /media/external/Acodin
flashrom -r originalbios1.bin
flashrom -r originalbios2.bin
flashrom -r originalbios3.bin
/usr/sbin/chromeos-firmwareupdate --sb_extract /tmp/dump
cp /tmp/dump/images/*lick* .
(In this example, Acodin is the label of my microSD, of course)
Then, on a real PC running Devuan Chimaera:
sudo apt install git build-essential gnat flex bison libncurses5-dev zlib1g-dev acpica-tools autoconf uuid-dev nasm python3-distutils python-is-python3
git clone https://review.coreboot.org/coreboot
cd coreboot
git submodule update --init --checkout
cd util/cbfstool && make && sudo make install
cd ../..
mkdir -p 3rdparty/blobs/soc/intel/glk/nhlt-blobs
mkdir -p 3rdparty/blobs/mainboard/google/octopus/lick
Not all of the above installed programs are actually required - the procedure written on this page was tried from scratch except for the package installation, which I reconstructed only by reading the .bash_history; still better, of course, than trial and error with configure/make with programs that don't tell you all the dependencies in advance, right?
Next, take the official "bios" file and extract the blobs from it:
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin read -r IFWI -f ifwi.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n fspm.bin -f fspm.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n fsps.bin -f fsps.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n vbt.bin -f vbt.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dmic-2ch-48khz-16b.bin -f dmic-2ch-48khz-16b.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dmic-4ch-48khz-16b.bin -f dmic-4ch-48khz-16b.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n max98357-render-2ch-48khz-24b.bin -f max98357-render-2ch-48khz-24b.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n dialog-2ch-48khz-24b.bin -f dialog-2ch-48khz-24b.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin read -r SI_DESC -f descriptor.bin
cbfstool bios-lick.ro-11297-159-0.rw-11297-159-0.bin extract -r FW_MAIN_A -n cpu_microcode_blob.bin -f cpu_microcode_blob.bin
Then move them in place:
And then you make menuconfig (or nconfig) and have fun with the options, notably (relatively to defaults):
Not so soon - you will need to waste some time building a compiler:
make crossgcc-i386
And finally:
make
The result will be at build/coreboot.rom, but after copying it to the laptop you will need to remember to unplug the battery and boot it only with the power brick (very interesting, after years of computers with stupid manufacturer provided flashing programs that try to ensure revenue by requiring an official charged battery) and write the command as flashrom vaguely told you while creating the backups: flashrom -p internal --ifd --image bios --noverify-all -w coreboot.rom
Boot order does not save - you "must" make your bootloader/kernel/etc available at EFI/BOOT/bootx64.efi on the EFI partition (if you don't want to manually select it each time)
Sound doesn't appear to work in Linux 5.10 and 5.15 - it might by adapting the ChromeOS one…
USB-C is untested apart from charging with the official power brick;
Keyboard works with the limitations of missing keys (installing the right packages from GalliumOS may improve this);
USB-A, touchpad (1 finger click and 2 finger scrolling by default), fold sensor, webcam, standby, emmc (including trim), wifi (with firmware) all seem fine :)
The command is the same as the one used for installation, so flashrom -p internal --ifd --image bios --noverify-all -w originalbios1.rom, but make sure you're using a new enough version of flashrom (I built it from source) or it won't recognize the chipset!
(You will also need a Windows/Mac OS/ChromeOS computer to create an installation disk, at least with the official extension)
Now that you hopefully have understood how I did all of this (if you didn't, there's probably a problem with this page!), you have earned the right to skip it in the future and download the one I made which is based on the above instructions and:
Coreboot 8b17cb8a8c, official firmware "bios-lick.ro-11297-159-0.rw-11297-159-0.bin", and… whatever version of Tianocore was downloaded by the makefile, I guess!