Commit c9af6673e8799dbc32b1654c152c1bf9c2454b72
1 parent
13bdce8f8c
Exists in
smarc_8mq_lf_v2020.04
and in
17 other branches
README: Add instructions for chain-loading U-Boot
Most Chromebooks support chain-loading U-Boot but instructions are somewhat scattered. Add a README to hold this information within the U-Boot tree. Also add the standard developer keys to simplify the instructions, since they are small. For now this only supports nyan-big. Signed-off-by: Simon Glass <sjg@chromium.org>
Showing 3 changed files with 182 additions and 0 deletions Side-by-side Diff
doc/README.chromium
1 | +Running U-Boot from coreboot on Chromebooks | |
2 | +=========================================== | |
3 | + | |
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. | |
7 | + | |
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. | |
12 | + | |
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. | |
15 | + | |
16 | + | |
17 | +For all of these the standard U-Boot build instructions apply. For example on | |
18 | +ARM: | |
19 | + | |
20 | + sudo apt install gcc-arm-linux-gnueabi | |
21 | + mkdir b | |
22 | + make O=b/nyan_big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all | |
23 | + | |
24 | +You can obtain the vbutil_kernel utility here: | |
25 | + | |
26 | + https://drive.google.com/open?id=0B7WYZbZ9zd-3dHlVVXo4VXE2T0U | |
27 | + | |
28 | + | |
29 | +Snow (Samsung ARM Chromebook) | |
30 | +----------------------------- | |
31 | + | |
32 | +See here: | |
33 | + | |
34 | +https://www.chromium.org/chromium-os/firmware-porting-guide/using-nv-u-boot-on-the-samsung-arm-chromebook | |
35 | + | |
36 | + | |
37 | +Nyan-big | |
38 | +-------- | |
39 | + | |
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 | |
45 | + | |
46 | +1. Patch U-Boot | |
47 | + | |
48 | +Open include/configs/tegra124-common.h | |
49 | + | |
50 | +Change: | |
51 | + | |
52 | +#define CONFIG_SYS_TEXT_BASE 0x80110000 | |
53 | + | |
54 | +to: | |
55 | + | |
56 | +#define CONFIG_SYS_TEXT_BASE 0x81000100 | |
57 | + | |
58 | + | |
59 | +2. Build U-Boot | |
60 | + | |
61 | + mkdir b | |
62 | + make -j8 O=b/nyan-big CROSS_COMPILE=arm-linux-gnueabi- nyan-big_defconfig all | |
63 | + | |
64 | + | |
65 | +3. Select a .its file | |
66 | + | |
67 | +Select something from doc/chromium which matches your board, or create your | |
68 | +own. | |
69 | + | |
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. | |
73 | + | |
74 | + | |
75 | +4. Build and sign an image | |
76 | + | |
77 | + ./b/nyan-big/tools/mkimage -f doc/chromium/nyan-big.its u-boot-chromium.fit | |
78 | + echo test >dummy.txt | |
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 | |
83 | + | |
84 | + | |
85 | +5. Prepare an SD card | |
86 | + | |
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 | |
92 | + | |
93 | + | |
94 | +6. Write U-Boot to the SD card | |
95 | + | |
96 | + sudo dd if=u-boot.kpart of=/dev/sdc1; sync | |
97 | + | |
98 | + | |
99 | +7. Start it up | |
100 | + | |
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. | |
104 | + | |
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: | |
107 | + | |
108 | + U-Boot 2017.07-00637-g242eb42-dirty (May 22 2017 - 06:14:21 -0600) | |
109 | + | |
110 | + Model: Acer Chromebook 13 CB5-311 | |
111 | + Board: Google/NVIDIA Nyan-big, ID: 1 | |
112 | + | |
113 | + Net: No ethernet found. | |
114 | + Hit any key to stop autoboot: 0 | |
115 | + Tegra124 (Nyan-big) # | |
116 | + | |
117 | + | |
118 | +8. Known problems | |
119 | + | |
120 | +On the serial console the word MMC is chopped at the start of the line: | |
121 | + | |
122 | +C: sdhci@700b0000: 2, sdhci@700b0400: 1, sdhci@700b0600: 0 | |
123 | + | |
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()). | |
126 | + | |
127 | + | |
128 | +9. Notes | |
129 | + | |
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 | |
132 | +bytes of U-Boot: | |
133 | + | |
134 | + hd u-boot-chromium.fit |head -20 | |
135 | + ... | |
136 | + 00000100 b8 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5 |................| | |
137 | + | |
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 |................| | |
140 | + | |
141 | + | |
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. | |
146 | + | |
147 | + | |
148 | +Other notes | |
149 | +=========== | |
150 | + | |
151 | +flashrom | |
152 | +-------- | |
153 | + | |
154 | + Used to make a backup of your firmware, or to replace it. | |
155 | + | |
156 | + See: https://www.chromium.org/chromium-os/packages/cros-flashrom | |
157 | + | |
158 | + | |
159 | +coreboot | |
160 | +-------- | |
161 | + | |
162 | +Coreboot itself is not designed to actually boot an OS. Instead, a program | |
163 | +called Depthcharge is used. This originally came out of U-Boot and was then | |
164 | +heavily hacked and modified such that is is almost unrecognisable. It does | |
165 | +include a very small part of the U-Boot command-line interface but is not | |
166 | +usable as a general-purpose boot loader. | |
167 | + | |
168 | +In addition, it has a very unusual design in that it does not do device init | |
169 | +itself, but instead relies on coreboot. This is similar to (in U-Boot) having | |
170 | +a SPI driver with an empty probe() method, relying on whatever was set up | |
171 | +beforehand. It can be quite hard to figure out between these two code bases | |
172 | +what settings are actually used. When chain-loading into U-Boot we must be | |
173 | +careful to reinit anything that U-Boot expects. If not, some peripherals (or | |
174 | +the whole machine) may not work. This makes the process of chainloading more | |
175 | +complicated than it could be on some platforms. | |
176 | + | |
177 | +Finally, it supports only a subset of the U-Boot's FIT format. In particular | |
178 | +it uses a fixed address to load the FIT and does not support load/exec | |
179 | +addresses. This means that U-Boot must be able to boot from whatever | |
180 | +address Depthcharge happens to use (it is the CONFIG_KERNEL_START setting | |
181 | +in Depthcharge). In practice this means that the data in the kernel@1 FIT node | |
182 | +(see above) must start at the same address as U-Boot's CONFIG_SYS_TEXT_BASE. |
doc/chromium/devkeys/kernel.keyblock
No preview for this file type
doc/chromium/devkeys/kernel_data_key.vbprivk
No preview for this file type