U-Boot on Orange Pi 4

From Dejvino's Knowledge Base
Revision as of 09:30, 26 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 PAGE!

TODO: OrangePi RK3399 is different from Orange Pi 4

Tasks:

  • prepare orangepi 4 DTS based on ./arch/arm/dts/rk3399-orangepi.dts
    • copy from BSP Linux?
  • use the new DTS throughout this page

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

Build Packages

Arch Linux

  • dtc (device tree compiler)
  • bc (basic calculator)

TODO: Not complete

Ubuntu

TODO: Not complete

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

  1. 'wget' the toolchain binaries (see above)
  2. 'unxz' the archive
  3. prepare 'CROSS_COMPILE'
    • 'cd gcc-linaro-.../bin'
    • 'CROSS_COMPILE_AARCH64=`pwd`'
    • 'CROSS_COMPILE=$CROSS_COMPILE_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

TODO: orangepi-rk3399_defconfig is close but not the right board!

Needed: LPDD4 RAM
 CONFIG_RAM_RK3399_LPDDR4=y

Failed boot log:
U-Boot TPL 2020.04-rc3-00171-g0aadc0786e (Mar 26 2020 - 08:05:33)
sdram_init: DDR3 - 666MHz failed!
rk3399_dmc_init DRAM init failed -22
Missing DTB
     => cd /path/to/u-boot
     => make orangepi-rk3399_defconfig
     => make

     (Get idbloader.img and u-boot.itb)

Booting from an SD card

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

Flashing with TPL

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