Difference between revisions of "U-Boot on Orange Pi 4"

From Dejvino's Knowledge Base
Jump to navigation Jump to search
(Created page with "U-Boot used on an Orange Pi 4. {{Todo|THIS!}} == Booting from an SD card on RK3399 == <pre> To write an image that boots from an SD card (assumed to be /dev/sdc): O...")
 
 
(38 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[U-Boot]] used on an [[Orange Pi 4]].
+
[[U-Boot]] used on an [[Orange Pi 4]] which sports an [[RK3399]] processor.
  
{{Todo|THIS!}}
+
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]].
  
== Booting from an SD card on RK3399 ==
+
{{Info|1=
<pre>
+
 
To write an image that boots from an SD card (assumed to be /dev/sdc):
+
'''Instructions Status'''
 +
 
 +
* Compilation on '''x86_64''': ''OK''
 +
** Tried and tested.
 +
* Compilation on '''ARMv8''': ''Partially tested''.
 +
** Should work with minor tweaks.
 +
** {{Todo|Finish testing and extend the instructions.}}
 +
}}
 +
 
 +
== Introduction ==
 +
[[File:Rockchip bootflow20181122.jpg|thumb|right|Rockchip boot flow. Source: [http://opensource.rock-chips.com/wiki_File:Rockchip_bootflow20181122.jpg]]]
 +
 
 +
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.
  
Option 1: Package the image with Rockchip miniloader:
+
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?
  
  - Create idbloader.img
+
See [[ARM Trusted Firmware]] for ATF / trust related terminology.
  
    => cd /path/to/u-boot
+
=== Boot Sequence ===
    => ./tools/mkimage  -n rk3399 -T rksd -d /path/to/rkbin/bin/rk33/rk3399_ddr_800MHz_v1.20.bin idbloader.img
+
Rockchip-specific booting is described here: [http://opensource.rock-chips.com/wiki_Boot_option]
    => cat /path/to/rkbin/bin/rk33/rk3399_miniloader_v1.19.bin >> idbloader.img
 
  
  - Write idbloader.img at 64 sector
+
# Loader 1:
 +
#* <span style="color: gray">option 1: miniloader</span>
 +
#* option 2: SPL/TPL
 +
# Loader 2:
 +
#* <span style="color: gray">option 1: uboot.img</span>
 +
#* option 2: u-boot.itb
 +
# trust.img
 +
# boot.img
 +
# rootfs.img
  
    => sudo dd if=idbloader.img of=/dev/sdc seek=64
+
{{Warning|Option 1 (recommended by [[Rockchip]]) uses closed source tools and binaries!
  
  - Write trust.img at 24576
+
[https://github.com/rockchip-linux/rkbin.git 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.
  
    => sudo dd if=trust.img of=/dev/sdc seek=24576
+
Therefore this is not a usable route and will not be discussed further.}}
  
  - Write uboot.img at 16384 sector
+
== Setup ==
 +
=== Base Build Tools ===
 +
==== Arch Linux ====
 +
* dtc (device tree compiler)
 +
* bc (basic calculator)
 +
{{Todo|Not complete. Add packages needed bases on testing on an x86_64 computer.}}
  
    => sudo dd if=uboot.img of=/dev/sdc seek=16384
+
==== Ubuntu ====
    => sync
+
{{Todo|Not complete. Add packages needed based on testing on Orange Pi 4.}}
  
Put this SD (or micro-SD) card into your board and reset it. You should see
+
=== Cross-compilation ===
something like:
+
This is needed only if you're not compiling on the [[Orange Pi 4]] (or other ARMv8 device).
  
DDR Version 1.20 20190314
+
* Binaries for aarch64-linux-gnu: [https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/]
In
 
Channel 0: DDR3, 933MHz
 
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
 
no stride
 
ch 0 ddrconfig = 0x101, ddrsize = 0x20
 
pmugrf_os_reg[2] = 0x10006281, stride = 0x17
 
OUT
 
Boot1: 2019-03-14, version: 1.19
 
CPUId = 0x0
 
ChipType = 0x10, 239
 
mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000
 
mmc: ERROR: Card did not respond to voltage select!
 
emmc reinit
 
mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000
 
mmc: ERROR: Card did not respond to voltage select!
 
emmc reinit
 
mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000
 
mmc: ERROR: Card did not respond to voltage select!
 
SdmmcInit=2 1
 
mmc0:cmd5,20
 
SdmmcInit=0 0
 
BootCapSize=0
 
UserCapSize=60543MB
 
FwPartOffset=2000 , 0
 
StorageInit ok = 45266
 
SecureMode = 0
 
SecureInit read PBA: 0x4
 
SecureInit read PBA: 0x404
 
SecureInit read PBA: 0x804
 
SecureInit read PBA: 0xc04
 
SecureInit read PBA: 0x1004
 
SecureInit read PBA: 0x1404
 
SecureInit read PBA: 0x1804
 
SecureInit read PBA: 0x1c04
 
SecureInit ret = 0, SecureMode = 0
 
atags_set_bootdev: ret:(0)
 
GPT 0x3380ec0 signature is wrong
 
recovery gpt...
 
GPT 0x3380ec0 signature is wrong
 
recovery gpt fail!
 
LoadTrust Addr:0x4000
 
No find bl30.bin
 
Load uboot, ReadLba = 2000
 
hdr 0000000003380880 + 0x0:0x88,0x41,0x3e,0x97,0xe6,0x61,0x54,0x23,0xe9,0x5a,0xd1,0x2b,0xdc,0x2f,0xf9,0x35,
 
  
Load OK, addr=0x200000, size=0x9c9c0
+
=== U-Boot Sources ===
RunBL31 0x10000
 
NOTICE:  BL31: v1.3(debug):370ab80
 
NOTICE:  BL31: Built : 09:23:41, Mar  4 2019
 
NOTICE:  BL31: Rockchip release version: v1.1
 
INFO:    GICv3 with legacy support detected. ARM GICV3 driver initialized in EL3
 
INFO:    Using opteed sec cpu_context!
 
INFO:    boot cpu mask: 0
 
INFO:    plat_rockchip_pmu_init(1181): pd status 3e
 
INFO:    BL31: Initializing runtime services
 
INFO:    BL31: Initializing BL32
 
INF [0x0] TEE-CORE:init_primary_helper:337: Initializing (1.1.0-195-g8f090d20 #6 Fri Dec  7 06:11:20 UTC 2018 aarch64)
 
  
INF [0x0] TEE-CORE:init_primary_helper:338: Release version: 1.2
+
'''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.
  
INF [0x0] TEE-CORE:init_teecore:83: teecore inits done
+
{{Todo|1=
INFO:    BL31: Preparing for EL3 exit to normal world
 
INFO:    Entry point address = 0x200000
 
INFO:    SPSR = 0x3c9
 
  
 +
'''orangepi-4-rk3399''' doesn't exist in mainline as of 2020-03-25, [[Applying a git patch|apply this patch]] from [[Armbian]] to add the board definition: [https://github.com/armbian/build/blob/master/patch/u-boot/u-boot-rk3399/add-board-orangepi-4.patch]}}
  
U-Boot 2019.04-rc4-00136-gfd121f9641-dirty (Apr 16 2019 - 14:02:47 +0530)
+
<pre>git clone https://gitlab.denx.de/u-boot/u-boot.git
 +
cd u-boot
 +
make orangepi-4-rk3399_defconfig</pre>
  
Model: FriendlyARM NanoPi NEO4
+
== Compilation ==
DRAM:  1022 MiB
 
MMC:  dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0
 
Loading Environment from MMC... *** Warning - bad CRC, using default environment
 
  
In:    serial@ff1a0000
+
=== Export cross compiler for AArch64 ===
Out:  serial@ff1a0000
+
Export cross compiler path for aarch64:
Err:  serial@ff1a0000
 
Model: FriendlyARM NanoPi NEO4
 
Net:  eth0: ethernet@fe300000
 
Hit any key to stop autoboot:  0
 
=>
 
  
Option 2: Package the image with SPL:
+
# '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'
  
  - Prefix rk3399 header to SPL image
+
The usage is this: <code>CROSS_COMPILE=$CROSS_COMPILE</code> (needed only when not running on the target device)
  
    => cd /path/to/u-boot
+
==== Compile ATF ====
    => ./tools/mkimage -n rk3399 -T rksd -d spl/u-boot-spl-dtb.bin out
+
<pre>
 +
=> git clone https://github.com/ARM-software/arm-trusted-firmware.git
 +
=> cd arm-trusted-firmware
  
  - Write prefixed SPL at 64th sector
+
(export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-)
 +
=> make realclean
 +
=> make CROSS_COMPILE=$CROSS_COMPILE PLAT=rk3399
  
    => sudo dd if=out of=/dev/sdc seek=64
+
(export bl31.elf)
 +
=> export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
 +
</pre>
  
  - Write U-Boot proper at 16384 sector
+
==== Compile PMU M0 firmware (optional) ====
  
    => sudo dd if=u-boot.itb of=/dev/sdc seek=16384
+
{{Todo|The internally provided cross-compile toolchain for cortex-m0 seems outdated (it wouldn't compile). Skipping for now.}}
    => sync
 
  
Put this SD (or micro-SD) card into your board and reset it. You should see
+
<pre>
something like:
+
    This is optional for most of the rk3399 boards and required only for Puma board.
  
U-Boot SPL board init
+
    => git clone git://git.theobroma-systems.com/rk3399-cortex-m0.git
Trying to boot from MMC1
+
    => cd rk3399-cortex-m0
  
 +
    (export cross compiler path for Cortex-M0 PMU)
 +
    => make CROSS_COMPILE=arm-cortex_m0-eabi-
  
U-Boot 2019.01-00004-g14db5ee998 (Mar 11 2019 - 13:18:41 +0530)
+
    (export rk3399m0.bin)
 +
    => export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin
 +
</pre>
  
Model: Orange Pi RK3399 Board
+
==== Compile U-Boot ====
DRAM: 2 GiB
+
[[File:U-boot dependencies digraph.png|thumb|right|U-Boot Makefile build dependencies [https://kb.d5o.eu/index.php/U-boot_dependencies_digraph_source] ]]
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
 
=>
 
  
Option 3: Package the image with TPL:
+
<pre>
 +
    => cd /path/to/u-boot
 +
    => make orangepi-4-rk3399_defconfig
 +
    => make CROSS_COMPILE=$CROSS_COMPILE
  
  - Write tpl+spl at 64th sector
+
    (Get idbloader.img and u-boot.itb)
 +
</pre>
  
    => sudo dd if=idbloader.img of=/dev/sdc seek=64
+
{{Todo|1=
 +
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.
 +
}}
  
  - Write U-Boot proper at 16384 sector
+
== Booting from an SD card ==
 +
=== Flashing ===
  
    => sudo dd if=u-boot.itb of=/dev/sdc seek=16384
+
==== Write tpl+spl at 64th sector ====
    => sync
+
<pre>
 +
  sudo dd if=idbloader.img of=/dev/sdc seek=64
 +
</pre>
  
Put this SD (or micro-SD) card into your board and reset it. You should see
+
==== Write U-Boot proper at 16384 sector ====
 +
<pre>
 +
  sudo dd if=u-boot.itb of=/dev/sdc seek=16384
 +
  sync
 +
</pre>
 +
 
 +
=== Booting ===
 +
Put this microSD card into your board and reset it. You should see
 
something like:
 
something like:
 
+
<pre class="mw-collapsed mw-collapsible">
U-Boot TPL board init
+
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
 
Trying to boot from BOOTROM
 
Returning to boot ROM...
 
Returning to boot ROM...
  
U-Boot SPL board init
+
U-Boot SPL 2020.04-rc3-00171-g0aadc0786e-dirty (Mar 27 2020 - 00:08:45 +0100)
 
Trying to boot from MMC1
 
Trying to boot from MMC1
  
  
U-Boot 2019.07-rc1-00241-g5b3244767a (May 08 2019 - 10:51:06 +0530)
+
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
  
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
 
In:    serial@ff1a0000
 
Out:  serial@ff1a0000
 
Out:  serial@ff1a0000
 
Err:  serial@ff1a0000
 
Err:  serial@ff1a0000
Model: Orange Pi RK3399 Board
+
Model: OrangePi 4 AI board
 
Net:  eth0: ethernet@fe300000
 
Net:  eth0: ethernet@fe300000
Hit any key to stop autoboot:  0
+
Hit any key to stop autoboot:  0  
=>
+
=>  
 +
</pre>
 +
 
 +
== Related ==
 +
* ATF = [[ARM Trusted Firmware]]
 +
* [[U-Boot on Orange Pi 4 - logs]]
  
</pre>
+
== External Links ==
Source: [https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/README.rockchip README.rockchip]
+
* Main resource: [https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/README.rockchip gitlab.denx.de/.../README.rockchip]
 +
* Rockchip ATF wiki: [http://opensource.rock-chips.com/wiki_Atf]
 +
** ATF repository: [https://github.com/ARM-software/arm-trusted-firmware.git]

Latest revision as of 18:11, 28 March 2020

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.

[i] Instructions Status

  • Compilation on x86_64: OK
    • Tried and tested.
  • Compilation on ARMv8: Partially tested.
    • Should work with minor tweaks.
    • TODO: Finish testing and extend the instructions.

Introduction

Rockchip boot flow. Source: [1]

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?

See ARM Trusted Firmware for ATF / trust related terminology.

Boot Sequence

Rockchip-specific booting is described here: [3]

  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

(!) 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 and will not be discussed further.

Setup

Base Build Tools

Arch Linux

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

TODO: Not complete. Add packages needed bases on testing on an x86_64 computer.

Ubuntu

TODO: Not complete. Add packages needed based on testing on Orange Pi 4.

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

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.

TODO: orangepi-4-rk3399 doesn't exist in mainline as of 2020-03-25, apply this patch from Armbian to add the board definition: [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:

  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'

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

U-Boot Makefile build dependencies [2]
     => 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