Commit c9af6673e8799dbc32b1654c152c1bf9c2454b72

Authored by Simon Glass
1 parent 13bdce8f8c

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

  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