123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- U-Boot for UniPhier SoC family
- ==============================
- Recommended toolchains
- ----------------------
- The UniPhier platform is well tested with Linaro toolchains.
- You can download pre-built toolchains from:
- http://www.linaro.org/downloads/
- Compile the source
- ------------------
- The source can be configured and built with the following commands:
- $ make <defconfig>
- $ make CROSS_COMPILE=<toolchain-prefix> DEVICE_TREE=<device-tree>
- The recommended <toolchain-prefix> is `arm-linux-gnueabihf-` for 32bit SoCs,
- `aarch64-linux-gnu-` for 64bit SoCs, but you may wish to change it to use your
- favorite compiler.
- The following tables show <defconfig> and <device-tree> for each board.
- 32bit SoC boards:
- Board | <defconfig> | <device-tree>
- ---------------|-----------------------------|------------------------------
- LD4 reference | uniphier_ld4_sld8_defconfig | uniphier-ld4-ref (default)
- sld8 reference | uniphier_ld4_sld8_defconfig | uniphier-sld8-def
- Pro4 reference | uniphier_v7_defconfig | uniphier-pro4-ref
- Pro4 Ace | uniphier_v7_defconfig | uniphier-pro4-ace
- Pro4 Sanji | uniphier_v7_defconfig | uniphier-pro4-sanji
- Pro5 4KBOX | uniphier_v7_defconfig | uniphier-pro5-4kbox
- PXs2 Gentil | uniphier_v7_defconfig | uniphier-pxs2-gentil
- PXs2 Vodka | uniphier_v7_defconfig | uniphier-pxs2-vodka (default)
- LD6b reference | uniphier_v7_defconfig | uniphier-ld6b-ref
- 64bit SoC boards:
- Board | <defconfig> | <device-tree>
- ---------------|-----------------------|----------------------------
- LD11 reference | uniphier_v8_defconfig | uniphier-ld11-ref
- LD11 Global | uniphier_v8_defconfig | uniphier-ld11-global
- LD20 reference | uniphier_v8_defconfig | uniphier-ld20-ref (default)
- LD20 Global | uniphier_v8_defconfig | uniphier-ld20-global
- PXs3 reference | uniphier_v8_defconfig | uniphier-pxs3-ref
- For example, to compile the source for PXs2 Vodka board, run the following:
- $ make uniphier_v7_defconfig
- $ make CROSS_COMPILE=arm-linux-gnueabihf- DEVICE_TREE=uniphier-pxs2-vodka
- The device tree marked as (default) can be omitted. `uniphier-pxs2-vodka` is
- the default device tree for the configuration `uniphier_v7_defconfig`, so the
- following gives the same result.
- $ make uniphier_v7_defconfig
- $ make CROSS_COMPILE=arm-linux-gnueabihf-
- Booting 32bit SoC boards
- ------------------------
- The build command will generate the following:
- - u-boot.bin
- - spl/u-boot.bin
- U-Boot can boot UniPhier 32bit SoC boards by itself. Flash the generated images
- to the storage device (NAND or eMMC) on your board.
- - spl/u-boot-spl.bin at the offset address 0x00000000
- - u-boot.bin at the offset address 0x00020000
- The `u-boot-with-spl.bin` is the concatenation of the two (with appropriate
- padding), so you can also do:
- - u-boot-with-spl.bin at the offset address 0x00000000
- If a TFTP server is available, the images can be easily updated.
- Just copy the u-boot-spl.bin and u-boot.bin to the TFTP public directory,
- and run the following command at the U-Boot command line:
- To update the images in NAND:
- => run nandupdate
- To update the images in eMMC:
- => run emmcupdate
- Booting 64bit SoC boards
- ------------------------
- The build command will generate the following:
- - u-boot.bin
- However, U-Boot is not the first stage loader for UniPhier 64bit SoC boards.
- U-Boot serves as a non-secure boot loader loaded by [ARM Trusted Firmware],
- so you need to provide the `u-boot.bin` to the build command of ARM Trusted
- Firmware.
- [ARM Trusted Firmware]: https://github.com/ARM-software/arm-trusted-firmware
- Verified Boot
- -------------
- U-Boot supports an image verification method called "Verified Boot".
- This is a brief tutorial to utilize this feature for the UniPhier platform.
- You will find details documents in the doc/uImage.FIT directory.
- Here, we take LD20 reference board for example, but it should work for any
- other boards including 32 bit SoCs.
- 1. Generate key to sign with
- $ mkdir keys
- $ openssl genpkey -algorithm RSA -out keys/dev.key \
- -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
- $ openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
- Two files "dev.key" and "dev.crt" will be created. The base name is arbitrary,
- but need to match to the "key-name-hint" property described below.
- 2. Describe FIT source
- You need to write an FIT (Flattened Image Tree) source file to describe the
- structure of the image container.
- The following is an example for a simple usecase:
- ---------------------------------------->8----------------------------------------
- /dts-v1/;
- / {
- description = "Kernel, DTB and Ramdisk for UniPhier LD20 Reference Board";
- #address-cells = <1>;
- images {
- kernel {
- description = "linux";
- data = /incbin/("PATH/TO/YOUR/LINUX/DIR/arch/arm64/boot/Image.gz");
- type = "kernel";
- arch = "arm64";
- os = "linux";
- compression = "gzip";
- load = <0x82080000>;
- entry = <0x82080000>;
- hash-1 {
- algo = "sha256";
- };
- };
- fdt-1 {
- description = "fdt";
- data = /incbin/("PATH/TO/YOUR/LINUX/DIR/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dtb");
- type = "flat_dt";
- arch = "arm64";
- compression = "none";
- hash-1 {
- algo = "sha256";
- };
- };
- ramdisk {
- description = "ramdisk";
- data = /incbin/("PATH/TO/YOUR/ROOTFS/DIR/rootfs.cpio");
- type = "ramdisk";
- arch = "arm64";
- os = "linux";
- compression = "none";
- hash-1 {
- algo = "sha256";
- };
- };
- };
- configurations {
- default = "config-1";
- config-1 {
- description = "Configuration0";
- kernel = "kernel";
- fdt = "fdt-1";
- ramdisk = "ramdisk";
- signature-1 {
- algo = "sha256,rsa2048";
- key-name-hint = "dev";
- sign-images = "kernel", "fdt", "ramdisk";
- };
- };
- };
- };
- ---------------------------------------->8----------------------------------------
- You need to change the three '/incbin/' lines, depending on the location of
- your kernel image, device tree blob, and init ramdisk. The "load" and "entry"
- properties also need to be adjusted if you want to change the physical placement
- of the kernel.
- The "key-name-hint" must specify the key name you have created in the step 1.
- The FIT file name is arbitrary. Let's say you saved it into "fit.its".
- 3. Compile U-Boot with FIT and signature enabled
- To use the Verified Boot, you need to enable the following two options:
- CONFIG_FIT
- CONFIG_FIT_SIGNATURE
- They are disabled by default for UniPhier defconfig files. So, you need to
- tweak the configuration from "make menuconfig" or friends.
- $ make uniphier_v8_defconfig
- $ make menuconfig
- [ enable CONFIG_FIT and CONFIG_FIT_SIGNATURE ]
- $ make CROSS_COMPILE=aarch64-linux-gnu-
- 4. Build the image tree blob
- After building U-Boot, you will see tools/mkimage. With this tool, you can
- create an image tree blob as follows:
- $ tools/mkimage -f fit.its -k keys -K dts/dt.dtb -r -F fitImage
- The -k option must specify the key directory you have created in step 1.
- A file "fitImage" will be created. This includes kernel, DTB, Init-ramdisk,
- hash data for each of the three, and signature data.
- The public key needed for the run-time verification is stored in "dts/dt.dtb".
- 5. Compile U-Boot again
- Since the "dt.dtb" has been updated in step 4, you need to re-compile the
- U-Boot.
- $ make CROSS_COMPILE=aarch64-linux-gnu-
- The re-compiled "u-boot.bin" is appended with DTB that contains the public key.
- 6. Flash the image
- Flash the "fitImage" to a storage device (NAND, eMMC, or whatever) on your
- board.
- Please note the "u-boot.bin" must be signed, and verified by someone when it is
- loaded. For ARMv8 SoCs, the "someone" is generally ARM Trusted Firmware BL2.
- ARM Trusted Firmware supports an image authentication mechanism called Trusted
- Board Boot (TBB). The verification process must be chained from the moment of
- the system reset. If the Chain of Trust has a breakage somewhere, the verified
- boot process is entirely pointless.
- 7. Boot verified kernel
- Load the fitImage to memory and run the following from the U-Boot command line.
- > bootm <addr>
- Here, <addr> is the base address of the fitImage.
- If it is successful, you will see messages like follows:
- ---------------------------------------->8----------------------------------------
- ## Loading kernel from FIT Image at 84100000 ...
- Using 'config-1' configuration
- Verifying Hash Integrity ... sha256,rsa2048:dev+ OK
- Trying 'kernel' kernel subimage
- Description: linux
- Created: 2017-10-20 14:32:29 UTC
- Type: Kernel Image
- Compression: gzip compressed
- Data Start: 0x841000c8
- Data Size: 6957818 Bytes = 6.6 MiB
- Architecture: AArch64
- OS: Linux
- Load Address: 0x82080000
- Entry Point: 0x82080000
- Hash algo: sha256
- Hash value: 82a37b7f11ae55f4e07aa25bf77e4067cb9dc1014d52d6cd4d588f92eee3aaad
- Verifying Hash Integrity ... sha256+ OK
- ## Loading ramdisk from FIT Image at 84100000 ...
- Using 'config-1' configuration
- Trying 'ramdisk' ramdisk subimage
- Description: ramdisk
- Created: 2017-10-20 14:32:29 UTC
- Type: RAMDisk Image
- Compression: uncompressed
- Data Start: 0x847a5cc0
- Data Size: 5264365 Bytes = 5 MiB
- Architecture: AArch64
- OS: Linux
- Load Address: unavailable
- Entry Point: unavailable
- Hash algo: sha256
- Hash value: 44980a2874154a2e31ed59222c9f8ea968867637f35c81e4107a984de7014deb
- Verifying Hash Integrity ... sha256+ OK
- ## Loading fdt from FIT Image at 84100000 ...
- Using 'config-1' configuration
- Trying 'fdt-1' fdt subimage
- Description: fdt
- Created: 2017-10-20 14:32:29 UTC
- Type: Flat Device Tree
- Compression: uncompressed
- Data Start: 0x847a2cb0
- Data Size: 12111 Bytes = 11.8 KiB
- Architecture: AArch64
- Hash algo: sha256
- Hash value: c517099db537f6d325e6be46b25c871a41331ad5af0283883fd29d40bfc14e1d
- Verifying Hash Integrity ... sha256+ OK
- Booting using the fdt blob at 0x847a2cb0
- Uncompressing Kernel Image ... OK
- reserving fdt memory region: addr=80000000 size=2000000
- Loading Device Tree to 000000009fffa000, end 000000009fffff4e ... OK
- Starting kernel ...
- ---------------------------------------->8----------------------------------------
- Please pay attention to the lines that start with "Verifying Hash Integrity".
- "Verifying Hash Integrity ... sha256,rsa2048:dev+ OK" means the signature check
- passed.
- "Verifying Hash Integrity ... sha256+ OK" (3 times) means the hash check passed
- for kernel, DTB, and Init ramdisk.
- If they are not displayed, the Verified Boot is not working.
- UniPhier specific commands
- --------------------------
- - pinmon (enabled by CONFIG_CMD_PINMON)
- shows the boot mode pins that has been latched at the power-on reset
- - ddrphy (enabled by CONFIG_CMD_DDRPHY_DUMP)
- shows the DDR PHY parameters set by the PHY training
- - ddrmphy (enabled by CONFIG_CMD_DDRMPHY_DUMP)
- shows the DDR Multi PHY parameters set by the PHY training
- Supported devices
- -----------------
- - UART (on-chip)
- - NAND
- - SD/eMMC
- - USB 2.0 (EHCI)
- - USB 3.0 (xHCI)
- - GPIO
- - LAN (on-board SMSC9118)
- - I2C
- - EEPROM (connected to the on-board I2C bus)
- - Support card (SRAM, NOR flash, some peripherals)
- Micro Support Card
- ------------------
- The recommended bit switch settings are as follows:
- SW2 OFF(1)/ON(0) Description
- ------------------------------------------
- bit 1 <---- BKSZ[0]
- bit 2 ----> BKSZ[1]
- bit 3 <---- SoC Bus Width 16/32
- bit 4 <---- SERIAL_SEL[0]
- bit 5 ----> SERIAL_SEL[1]
- bit 6 ----> BOOTSWAP_EN
- bit 7 <---- CS1/CS5
- bit 8 <---- SOC_SERIAL_DISABLE
- SW8 OFF(1)/ON(0) Description
- ------------------------------------------
- bit 1 <---- CS1_SPLIT
- bit 2 <---- CASE9_ON
- bit 3 <---- CASE10_ON
- bit 4 Don't Care Reserve
- bit 5 Don't Care Reserve
- bit 6 Don't Care Reserve
- bit 7 ----> BURST_EN
- bit 8 ----> FLASHBUS32_16
- The BKSZ[1:0] specifies the address range of memory slot and peripherals
- as follows:
- BKSZ Description RAM slot Peripherals
- --------------------------------------------------------------------
- 0b00 15MB RAM / 1MB Peri 00000000-00efffff 00f00000-00ffffff
- 0b01 31MB RAM / 1MB Peri 00000000-01efffff 01f00000-01ffffff
- 0b10 64MB RAM / 1MB Peri 00000000-03efffff 03f00000-03ffffff
- 0b11 127MB RAM / 1MB Peri 00000000-07efffff 07f00000-07ffffff
- Set BSKZ[1:0] to 0b01 for U-Boot.
- This mode is the most handy because EA[24] is always supported by the save pin
- mode of the system bus. On the other hand, EA[25] is not supported for some
- newer SoCs. Even if it is, EA[25] is not connected on most of the boards.
- --
- Masahiro Yamada <yamada.masahiro@socionext.com>
- Oct. 2017
|