Creating bootable media for depthcharge based devices

Depthcharge, the ChromeOS bootloader, is one of coreboot’s (and also libreboot’s) available payloads and as such mostly found on chromebooks. This guide shows how to create bootable media, e.g. an installation media USB drive, for those devices.

Installing required tools
The guide assumes that the current platform is a Gentoo Linux one. The majority of steps however can be performed from any distribution, just translate the Gentoo-specific way of doing things (such as installing software) to the other distribution's practices.

Install, , and

Some drivers might also require proprietary firmware available from.

Preparing the partitions
Throughout the following steps the term "sd*" needs to be replaced with the term currently corresponding to the bootable media – in case of a SD Card something like "mmcblkXp". In any case the "*" represents a letter and the "X" represents a number. This is the recommended partition layout and size:

Depthcharge requires some specific parameters to be set. These signal the bootloader the presence of a valid kernel partition:

Preparing the Root partition

Install a Gentoo rootfs
Get a stage 3 tarball from the main website's download section that is suitable for the architecture (e.g. ) of the target device and extract it to

Switch the bootable media’s Gentoo to unstable to ensure the availability of the latest versions of vboot-utils and u-boot-tools and speed up the bootable media. Replace with the target device's architecture, e.g.  for ARMv7-A based devices.

Set the bootable media’s root password to “gentoo”, cf. Setting the default root password

Finish this step by unmounting the bootable media’s rootfs

Create a cross-compiler
Create a local overlay for the cross toolchain, cf. Custom repository for crossdev:

Then instruct Portage and to use this overlay:

Install and create the cross toolchain. Replace with the system tuple fitting the target architecture, e.g.  for ARMv7-A based devices.

Finally prepare cross-compiling the kernel.

Replace with the target device's architecture, e.g.  for ARMv7-A based devices.

Replace with the system tuple fitting the target architecture, e.g.  for ARMv7-A based devices. Mind the trailing "".

Configuring the Linux kernel
Configure as usual, cf. Configuring the Linux kernel. If all necessary drivers are built into the kernel (i.e. no loadable modules are needed to boot the target device) there's no need to have an initramfs, which keeps things simple. Especially if the host system's architecture differs from the target device's architecture creating an initramfs would at least involve cross-compiling busybox.

Build the kernel and device tree binaries:

From the kernel build directory, copy the zImage and the target device's device tree to the desired working directory. Replace with the filename of the target device's device tree, e.g.  for the Asus Chromebook C201 (which is based on Rockchip's RK3288 CPU and a board with the code-name "veyron-speedy"):

Change to the desired working directory:

Create the configuration file ("gentoo.its") for the FIT image with the following content. Again replace with the filename of the target device's device tree binary, e.g.  for the Asus Chromebook C201.

Pack the FIT image:

Create a file ("kernel.flags") for the CMDLINE parameters:

Sign and pack the kernel:

Install the kernel to the kernel partition. Now the term "sd*" needs to be replaced with the term currently corresponding to the bootable media – in case of a SD Card something like "mmcblkXp". In any case the "*" represents a letter and the "X" represents a number.

Now boot the target device from the created media.