1 Running U-Boot from coreboot on Chromebooks
2 ===========================================
4 U-Boot can be used as a secondary boot loader in a few situations such as from
5 UEFI and coreboot (see README.x86). Recent Chromebooks use coreboot even on
6 ARM platforms to start up the machine.
8 This document aims to provide a guide to booting U-Boot on a Chromebook. It
9 is only a starting point, and there are many guides on the interwebs. But
10 placing this information in the U-Boot tree should make it easier to find for
11 those who use U-Boot habitually.
13 Most of these platforms are supported by U-Boot natively, but it is risky to
14 replace the ROM unless you have a servo board and cable to restore it with.
17 For all of these the standard U-Boot build instructions apply. For example on
20 sudo apt install gcc-arm-linux-gnueabi
22 make O=b/nyan_big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
24 You can obtain the vbutil_kernel utility here:
26 https://drive.google.com/open?id=0B7WYZbZ9zd-3dHlVVXo4VXE2T0U
29 Snow (Samsung ARM Chromebook)
30 -----------------------------
34 https://www.chromium.org/chromium-os/firmware-porting-guide/using-nv-u-boot-on-the-samsung-arm-chromebook
40 Compiled based on information here:
41 https://lists.denx.de/pipermail/u-boot/2015-March/209530.html
42 https://git.collabora.com/cgit/user/tomeu/u-boot.git/commit/?h=nyan-big
43 https://lists.denx.de/pipermail/u-boot/2017-May/289491.html
44 https://github.com/chromeos-nvidia-androidtv/gnu-linux-on-acer-chromebook-13#copy-data-to-the-sd-card
48 Open include/configs/tegra124-common.h
52 #define CONFIG_SYS_TEXT_BASE 0x80110000
56 #define CONFIG_SYS_TEXT_BASE 0x81000100
62 make -j8 O=b/nyan-big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all
67 Select something from doc/chromium which matches your board, or create your
70 Note that the device tree node is required, even though it is not actually
71 used by U-Boot. This is because the Chromebook expects to pass it to the
72 kernel, and crashes if it is not present.
75 4. Build and sign an image
77 ./b/nyan-big/tools/mkimage -f doc/chromium/nyan-big.its u-boot-chromium.fit
79 vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
80 --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
81 --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
82 --bootloader dummy.txt --pack u-boot.kpart
87 DISK=/dev/sdc # Replace with your actual SD card device
88 sudo cgpt create $DISK
89 sudo cgpt add -b 34 -s 32768 -P 1 -S 1 -t kernel $DISK
90 sudo cgpt add -b 32802 -s 2000000 -t rootfs $DISK
91 sudo gdisk $DISK # Enter command 'w' to write a protective MBR to the disk
94 6. Write U-Boot to the SD card
96 sudo dd if=u-boot.kpart of=/dev/sdc1; sync
101 Reboot the device in dev mode. Make sure that you have USB booting enabled. To
102 do this, login as root (via Ctrl-Alt-forward_arrow) and type
103 'enable_dev_usb_boot'. You only need to do this once.
105 Reboot the device with the SD card inserted. Press Clrl-U at the developer
106 mode screen. It should show something like the following on the display:
108 U-Boot 2017.07-00637-g242eb42-dirty (May 22 2017 - 06:14:21 -0600)
110 Model: Acer Chromebook 13 CB5-311
111 Board: Google/NVIDIA Nyan-big, ID: 1
113 Net: No ethernet found.
114 Hit any key to stop autoboot: 0
115 Tegra124 (Nyan-big) #
120 On the serial console the word MMC is chopped at the start of the line:
122 C: sdhci@700b0000: 2, sdhci@700b0400: 1, sdhci@700b0600: 0
124 This is likely due to some problem with change-over of the serial driver
125 during relocation (or perhaps updating the clock setup in board_init()).
130 To check that you copied the u-boot.its file correctly, use these commands.
131 You should see that the data at 0x100 in u-boot-chromium.fit is the first few
134 hd u-boot-chromium.fit |head -20
136 00000100 b8 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 |................|
138 hd b/nyan-big/u-boot.bin |head
139 00000000 b8 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 |................|
142 The 'data' property of the FIT is set up to start at offset 0x100 bytes into
143 the file. The change to CONFIG_SYS_TEXT_BASE is also an offset of 0x100 bytes
144 from the load address. If this changes, you either need to modify U-Boot to be
145 fully relocatable, or expect it to hang.
151 The instruction are similar to those for Nyan with changes as noted below:
155 Open include/configs/rk3288_common.h
159 #define CONFIG_SYS_TEXT_BASE 0x00100000
163 #define CONFIG_SYS_TEXT_BASE 0x02000100
170 make -j8 O=b/chromebook_jerry CROSS_COMPILE=arm-linux-gnueabi- \
171 chromebook_jerry_defconfig all
176 4. Build and sign an image
178 ./b/chromebook_jerry/tools/mkimage -f doc/chromium/chromebook_jerry.its \
181 vbutil_kernel --arch arm --keyblock doc/chromium/devkeys/kernel.keyblock \
182 --signprivate doc/chromium/devkeys/kernel_data_key.vbprivk \
183 --version 1 --config dummy.txt --vmlinuz u-boot-chromium.fit \
184 --bootloader dummy.txt --pack u-boot.kpart
193 Reboot the device in dev mode. Make sure that you have USB booting enabled. To
194 do this, login as root (via Ctrl-Alt-forward_arrow) and type
195 'enable_dev_usb_boot'. You only need to do this once.
197 Reboot the device with the SD card inserted. Press Clrl-U at the developer
198 mode screen. It should show something like the following on the display:
200 U-Boot 2017.05-00649-g72acdbf-dirty (May 29 2017 - 14:57:05 -0600)
203 Net: Net Initialization Skipped
205 Hit any key to stop autoboot: 0
224 Used to make a backup of your firmware, or to replace it.
226 See: https://www.chromium.org/chromium-os/packages/cros-flashrom
232 Coreboot itself is not designed to actually boot an OS. Instead, a program
233 called Depthcharge is used. This originally came out of U-Boot and was then
234 heavily hacked and modified such that is is almost unrecognisable. It does
235 include a very small part of the U-Boot command-line interface but is not
236 usable as a general-purpose boot loader.
238 In addition, it has a very unusual design in that it does not do device init
239 itself, but instead relies on coreboot. This is similar to (in U-Boot) having
240 a SPI driver with an empty probe() method, relying on whatever was set up
241 beforehand. It can be quite hard to figure out between these two code bases
242 what settings are actually used. When chain-loading into U-Boot we must be
243 careful to reinit anything that U-Boot expects. If not, some peripherals (or
244 the whole machine) may not work. This makes the process of chainloading more
245 complicated than it could be on some platforms.
247 Finally, it supports only a subset of the U-Boot's FIT format. In particular
248 it uses a fixed address to load the FIT and does not support load/exec
249 addresses. This means that U-Boot must be able to boot from whatever
250 address Depthcharge happens to use (it is the CONFIG_KERNEL_START setting
251 in Depthcharge). In practice this means that the data in the kernel@1 FIT node
252 (see above) must start at the same address as U-Boot's CONFIG_SYS_TEXT_BASE.