U-Boot on Orange Pi 4
U-Boot used on an Orange Pi 4 which sports an RK3399 processor.
This is the first step to getting the device booted and running any software. For the actual OS installation, see Linux on Orange Pi 4.
Note on native compilation: The officially expected compilation environment for most (if not all) of the tools mentioned is an x86_64 machine running Ubuntu (Bionic or Xenial) with a cross-compilation toolchain. I've tested that with a few tweaks these instructions for mainline repositories are usable also on the target device, i.e. ARMv8 machine (running Ubuntu Bionic to be precise).
TODO: Cleanup
Introduction
See U-Boot for general concepts and definitions.
U-Boot takes care of the initial booting. It is device (board) specific and so needs to be compiled specifically for Orange Pi 4 as it initializes the hardware, e.g. the RAM modules. Internally there are 3 (!) bootloaders which form a boot chain: TPL -> SPL -> U-Boot. To boot an actual operating system, U-Boot executes the OS's bootloader, which brings this to 4 (!!) bootloaders in total. Crazy, right?
Note on orangepi-rk3399: Though there is an orangepi-rk3399 board available, this is NOT the same as Orange Pi 4. It does have the same processor, but the device tree is different. Notably there is difference in RAM: DDR3 vs LPDDR4.
See ARM Trusted Firmware for ATF / trust related terminology.
Boot Sequence
Rockchip-specific booting is described here: [3]
- Loader 1:
- option 1: miniloader
- option 2: SPL/TPL
- Loader 2:
- option 1: uboot.img
- option 2: u-boot.itb
- trust.img
- boot.img
- rootfs.img
(!) Option 1 (recommended by Rockchip) uses closed source tools and binaries.
rkbin/tools are pre-built x86 binaries and are therefore not usable on the target device. The source code is not available for audit or compilation on a different architecture.
Therefore this is not a usable route.
Setup
Base Build Tools
Arch Linux
- dtc (device tree compiler)
- bc (basic calculator)
TODO: Not complete
Ubuntu
TODO: Not complete
Cross-compilation
This is needed only if you're not compiling on the Orange Pi 4 (or other ARMv8 device).
- Binaries for aarch64-linux-gnu: [4]
U-Boot Sources
TODO: orangepi-4-rk3399 doesn't exist in mainline as of 2020-03-25, apply this patch from Armbian: [5]
git clone https://gitlab.denx.de/u-boot/u-boot.git cd u-boot make orangepi-4-rk3399_defconfig
Compilation
Export cross compiler for AArch64
Export cross compiler path for aarch64:
- 'wget' the toolchain binaries (see above)
- 'unxz' the archive
- prepare 'CROSS_COMPILE'
- 'cd gcc-linaro-.../bin'
- 'CROSS_COMPILE_AARCH64=`pwd`'
- 'CROSS_COMPILE=$CROSS_COMPILE_AARCH64'
The usage is this: CROSS_COMPILE=$CROSS_COMPILE (needed only when not running on the target device)
Compile ATF
=> git clone https://github.com/ARM-software/arm-trusted-firmware.git => cd arm-trusted-firmware (export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-) => make realclean => make CROSS_COMPILE=$CROSS_COMPILE PLAT=rk3399 (export bl31.elf) => export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
Compile PMU M0 firmware (optional)
TODO: The internally provided cross-compile toolchain for cortex-m0 seems outdated (it wouldn't compile). Skipping for now.
This is optional for most of the rk3399 boards and required only for Puma board.
=> git clone git://git.theobroma-systems.com/rk3399-cortex-m0.git
=> cd rk3399-cortex-m0
(export cross compiler path for Cortex-M0 PMU)
=> make CROSS_COMPILE=arm-cortex_m0-eabi-
(export rk3399m0.bin)
=> export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin
Compile U-Boot
=> cd /path/to/u-boot
=> make orangepi-4-rk3399_defconfig
=> make CROSS_COMPILE=$CROSS_COMPILE
(Get idbloader.img and u-boot.itb)
TODO: The default CONFIG_TARGET_CHROMEBOOK_BOB=y fails to compile. Selecting CONFIG_TARGET_EVG_RK3399=y fixes this and the board successfully loads the bootloader command prompt.
Booting from an SD card
Flashing
Write tpl+spl at 64th sector
sudo dd if=idbloader.img of=/dev/sdc seek=64
Write U-Boot proper at 16384 sector
sudo dd if=u-boot.itb of=/dev/sdc seek=16384 sync
Booting
Put this microSD card into your board and reset it. You should see something like:
U-Boot TPL 2020.04-rc3-00171-g0aadc0786e-dirty (Mar 27 2020 - 00:08:45) Channel 0: LPDDR4, 50MHz BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB Channel 1: LPDDR4, 50MHz BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB 256B stride 256B stride lpddr4_set_rate: change freq to 400000000 mhz 0, 1 lpddr4_set_rate: change freq to 800000000 mhz 1, 0 Trying to boot from BOOTROM Returning to boot ROM... U-Boot SPL 2020.04-rc3-00171-g0aadc0786e-dirty (Mar 27 2020 - 00:08:45 +0100) Trying to boot from MMC1 U-Boot 2020.04-rc3-00171-g0aadc0786e-dirty (Mar 27 2020 - 00:08:45 +0100) Model: OrangePi 4 AI board DRAM: 3.9 GiB PMIC: RK808 MMC: dwmmc@fe320000: 1, sdhci@fe330000: 0 Loading Environment from MMC... *** Warning - bad CRC, using default environment In: serial@ff1a0000 Out: serial@ff1a0000 Err: serial@ff1a0000 Model: OrangePi 4 AI board Net: eth0: ethernet@fe300000 Hit any key to stop autoboot: 0 =>
Related
External Links
- Main resource: gitlab.denx.de/.../README.rockchip
- Rockchip ATF wiki: [6]
- ATF repository: [7]