U-Boot on Orange Pi 4

From Dejvino's Knowledge Base
Revision as of 07:34, 25 March 2020 by Dejvino (talk | contribs)
Jump to navigation Jump to search

U-Boot used on an Orange Pi 4 which sports an RK3399 processor.

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 are usable also on the target device, i.e. ARMv8 machine (running Ubuntu Bionic to be precise).

TODO: THIS!

Introduction

Rockchip boot flow. Source: [1]

See U-Boot for general concepts and definitions.

See ARM Trusted Firmware for ATF / trust related terminology.

Boot Sequence

Rockchip-specific booting is described here: [2]

  1. Loader 1:
    • option 1: miniloader
    • option 2: SPL/TPL
  2. Loader 2:
    • option 1: uboot.img
    • option 2: u-boot.itb
  3. trust.img
  4. boot.img
  5. rootfs.img

Setup

Crosstool

  • Binaries for aarch64-linux-gnu: [3]

U-Boot Setup

git clone https://gitlab.denx.de/u-boot/u-boot.git
cd u-boot
make orangepi-rk3399_defconfig

Option 1: Package the image with Rockchip miniloader

(!) 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.

See u-boot/.../README.rockchip for instructions.

Option 2: Package the image with SPL

Export cross compiler for AArch64

Export cross compiler path for aarch64

(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=aarch64-linux-gnu- PLAT=rk3399

	(export bl31.elf)
	=> export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf

Compile PMU M0 firmware

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-rk3399_defconfig
     => make

     (Get spl/u-boot-spl-dtb.bin, u-boot.itb images and some boards would get
      spl/u-boot-spl.bin since it doesn't enable CONFIG_SPL_OF_CONTROL

      If TPL enabled on the target, get tpl/u-boot-tpl-dtb.bin or tpl/u-boot-tpl.bin
      if CONFIG_TPL_OF_CONTROL not enabled)

Booting from an SD card

TODO: Tested with OPi4 until here. Verify the rest.

Flashing with SPL

To write an image that boots from an SD card (assumed to be /dev/sdc):

Prefix rk3399 header to SPL image

    => cd /path/to/u-boot
    => ./tools/mkimage -n rk3399 -T rksd -d spl/u-boot-spl-dtb.bin out

Write prefixed SPL at 64th sector

    => sudo dd if=out 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 SPL board init
Trying to boot from MMC1


U-Boot 2019.01-00004-g14db5ee998 (Mar 11 2019 - 13:18:41 +0530)

Model: Orange Pi RK3399 Board
DRAM:  2 GiB
MMC:   dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0
Loading Environment from MMC... OK
In:    serial@ff1a0000
Out:   serial@ff1a0000
Err:   serial@ff1a0000
Model: Orange Pi RK3399 Board
Net:   eth0: ethernet@fe300000
Hit any key to stop autoboot:  0
=>

Flashing with TPL

TODO: Looks like this is the right option

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 board init
Trying to boot from BOOTROM
Returning to boot ROM...

U-Boot SPL board init
Trying to boot from MMC1


U-Boot 2019.07-rc1-00241-g5b3244767a (May 08 2019 - 10:51:06 +0530)

Model: Orange Pi RK3399 Board
DRAM:  2 GiB
MMC:   dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0
Loading Environment from MMC... OK
In:    serial@ff1a0000
Out:   serial@ff1a0000
Err:   serial@ff1a0000
Model: Orange Pi RK3399 Board
Net:   eth0: ethernet@fe300000
Hit any key to stop autoboot:  0
=>

Related

External Links