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

From Dejvino's Knowledge Base
Jump to navigation Jump to search
 
(26 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
[[U-Boot]] used on an [[Orange Pi 4]] which sports an [[RK3399]] processor.
 
[[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]].
 +
 
 +
{{Info|1=
 +
 
 +
'''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 ==
 
== Introduction ==
Line 7: Line 18:
  
 
See [[U-Boot]] for general concepts and definitions.
 
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.
 
See [[ARM Trusted Firmware]] for ATF / trust related terminology.
Line 14: Line 29:
  
 
# Loader 1:
 
# Loader 1:
#* option 1: miniloader
+
#* <span style="color: gray">option 1: miniloader</span>
 
#* option 2: SPL/TPL
 
#* option 2: SPL/TPL
 
# Loader 2:
 
# Loader 2:
#* option 1: uboot.img
+
#* <span style="color: gray">option 1: uboot.img</span>
 
#* option 2: u-boot.itb
 
#* option 2: u-boot.itb
 
# trust.img
 
# trust.img
Line 23: Line 38:
 
# rootfs.img
 
# rootfs.img
  
{{Warning|Option 1 (recommended by [[Rockchip]]) uses closed source tools and binaries.
+
{{Warning|Option 1 (recommended by [[Rockchip]]) uses closed source tools and binaries!
  
 
[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.
 
[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.
  
Therefore this is not a usable route.}}
+
Therefore this is not a usable route and will not be discussed further.}}
  
 
== Setup ==
 
== Setup ==
<pre>git clone https://gitlab.denx.de/u-boot/u-boot.git
+
=== Base Build Tools ===
cd u-boot
+
==== Arch Linux ====
make orangepi-rk3399_defconfig</pre>
+
* dtc (device tree compiler)
 +
* bc (basic calculator)
 +
{{Todo|Not complete. Add packages needed bases on testing on an x86_64 computer.}}
  
=== Option 1: Package the image with Rockchip miniloader ===
+
==== Ubuntu ====
<pre class="mw-collapsible mw-collapsed">
+
{{Todo|Not complete. Add packages needed based on testing on Orange Pi 4.}}
  - Compile U-Boot
 
  
    => cd /path/to/u-boot
+
=== Cross-compilation ===
    => make orangepi-rk3399_defconfig
+
This is needed only if you're not compiling on the [[Orange Pi 4]] (or other ARMv8 device).
    => make
 
  
  - Get the rkbin
+
* Binaries for aarch64-linux-gnu: [https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/]
  
    => git clone https://github.com/rockchip-linux/rkbin.git
+
=== U-Boot Sources ===
  
  - Create trust.img
+
'''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.
  
    => cd /path/to/rkbin
+
{{Todo|1=
    => ./tools/trust_merger RKTRUST/RK3399TRUST.ini
 
  
  - Create uboot.img
+
'''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]}}
  
    => cd /path/to/rkbin
+
<pre>git clone https://gitlab.denx.de/u-boot/u-boot.git
    => ./tools/loaderimage --pack --uboot /path/to/u-boot/u-boot-dtb.bin uboot.img
+
cd u-boot
 +
make orangepi-4-rk3399_defconfig</pre>
  
    (Get trust.img and uboot.img)
+
== Compilation ==
</pre>
 
  
=== Option 2: Package the image with SPL ===
+
=== Export cross compiler for AArch64 ===
 +
Export cross compiler path for aarch64:
  
<pre>
+
# 'wget' the toolchain binaries (see above)
  - Export cross compiler path for aarch64
+
# 'unxz' the archive
 +
# prepare 'CROSS_COMPILE'
 +
#* 'cd gcc-linaro-.../bin'
 +
#* 'CROSS_COMPILE_AARCH64=`pwd`'
 +
#* 'CROSS_COMPILE=$CROSS_COMPILE_AARCH64'
  
  - Compile ATF
+
The usage is this: <code>CROSS_COMPILE=$CROSS_COMPILE</code> (needed only when not running on the target device)
  
 +
==== Compile ATF ====
 +
<pre>
 
=> git clone https://github.com/ARM-software/arm-trusted-firmware.git
 
=> git clone https://github.com/ARM-software/arm-trusted-firmware.git
 
=> cd arm-trusted-firmware
 
=> cd arm-trusted-firmware
Line 71: Line 92:
 
(export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-)
 
(export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-)
 
=> make realclean
 
=> make realclean
=> make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399
+
=> make CROSS_COMPILE=$CROSS_COMPILE PLAT=rk3399
  
 
(export bl31.elf)
 
(export bl31.elf)
 
=> export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
 
=> export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
 +
</pre>
  
  - Compile PMU M0 firmware
+
==== Compile PMU M0 firmware (optional) ====
  
 +
{{Todo|The internally provided cross-compile toolchain for cortex-m0 seems outdated (it wouldn't compile). Skipping for now.}}
 +
 +
<pre>
 
     This is optional for most of the rk3399 boards and required only for Puma board.
 
     This is optional for most of the rk3399 boards and required only for Puma board.
  
Line 88: Line 113:
 
     (export rk3399m0.bin)
 
     (export rk3399m0.bin)
 
     => export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin
 
     => export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin
 +
</pre>
  
  - Compile U-Boot
+
==== Compile U-Boot ====
 +
[[File:U-boot dependencies digraph.png|thumb|right|U-Boot Makefile build dependencies [https://kb.d5o.eu/index.php/U-boot_dependencies_digraph_source] ]]
  
 +
<pre>
 
     => cd /path/to/u-boot
 
     => cd /path/to/u-boot
     => make orangepi-rk3399_defconfig
+
     => make orangepi-4-rk3399_defconfig
     => make
+
     => make CROSS_COMPILE=$CROSS_COMPILE
  
     (Get spl/u-boot-spl-dtb.bin, u-boot.itb images and some boards would get
+
     (Get idbloader.img and u-boot.itb)
      spl/u-boot-spl.bin since it doesn't enable CONFIG_SPL_OF_CONTROL
+
</pre>
  
      If TPL enabled on the target, get tpl/u-boot-tpl-dtb.bin or tpl/u-boot-tpl.bin
+
{{Todo|1=
      if CONFIG_TPL_OF_CONTROL not enabled)
+
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.
</pre> Source: [https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/README.rockchip README.rockchip]
+
}}
  
== Building ==
+
== Booting from an SD card ==
<pre>make all</pre>
+
=== Flashing ===
  
 +
==== Write tpl+spl at 64th sector ====
 +
<pre>
 +
  sudo dd if=idbloader.img of=/dev/sdc seek=64
 +
</pre>
  
== Booting from an SD card on RK3399 ==
+
==== Write U-Boot proper at 16384 sector ====
 
<pre>
 
<pre>
To write an image that boots from an SD card (assumed to be /dev/sdc):
+
   sudo dd if=u-boot.itb of=/dev/sdc seek=16384
 
+
   sync
Option 1: Package the image with Rockchip miniloader:
+
</pre>
 
 
   - Create idbloader.img
 
 
 
    => cd /path/to/u-boot
 
    => ./tools/mkimage  -n rk3399 -T rksd -d /path/to/rkbin/bin/rk33/rk3399_ddr_800MHz_v1.20.bin idbloader.img
 
    => cat /path/to/rkbin/bin/rk33/rk3399_miniloader_v1.19.bin >> idbloader.img
 
 
 
  - Write idbloader.img at 64 sector
 
 
 
    => sudo dd if=idbloader.img of=/dev/sdc seek=64
 
 
 
   - Write trust.img at 24576
 
 
 
    => sudo dd if=trust.img of=/dev/sdc seek=24576
 
  
  - Write uboot.img at 16384 sector
+
=== Booting ===
 
+
Put this microSD card into your board and reset it. You should see
    => sudo dd if=uboot.img of=/dev/sdc seek=16384
 
    => sync
 
 
 
Put this SD (or micro-SD) card into your board and reset it. You should see
 
 
something like:
 
something like:
 
+
<pre class="mw-collapsed mw-collapsible">
DDR Version 1.20 20190314
+
U-Boot TPL 2020.04-rc3-00171-g0aadc0786e-dirty (Mar 27 2020 - 00:08:45)
In
+
Channel 0: LPDDR4, 50MHz
Channel 0: DDR3, 933MHz
+
BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB
+
Channel 1: LPDDR4, 50MHz
no stride
+
BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
ch 0 ddrconfig = 0x101, ddrsize = 0x20
+
256B stride
pmugrf_os_reg[2] = 0x10006281, stride = 0x17
+
256B stride
OUT
+
lpddr4_set_rate: change freq to 400000000 mhz 0, 1
Boot1: 2019-03-14, version: 1.19
+
lpddr4_set_rate: change freq to 800000000 mhz 1, 0
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
 
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
 
 
 
INF [0x0] TEE-CORE:init_teecore:83: teecore inits done
 
INFO:    BL31: Preparing for EL3 exit to normal world
 
INFO:    Entry point address = 0x200000
 
INFO:    SPSR = 0x3c9
 
 
 
 
 
U-Boot 2019.04-rc4-00136-gfd121f9641-dirty (Apr 16 2019 - 14:02:47 +0530)
 
 
 
Model: FriendlyARM NanoPi NEO4
 
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
 
Out:  serial@ff1a0000
 
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:
 
 
 
  - 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
 
 
 
Put this SD (or micro-SD) 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
 
=>
 
 
 
Option 3: Package the image 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
 
 
 
Put this SD (or micro-SD) card into your board and reset it. You should see
 
something like:
 
 
 
U-Boot TPL board init
 
 
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>
 
</pre>
Source: [https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/README.rockchip README.rockchip]
 
  
 
== Related ==
 
== Related ==
 
* ATF = [[ARM Trusted Firmware]]
 
* ATF = [[ARM Trusted Firmware]]
 +
* [[U-Boot on Orange Pi 4 - logs]]
  
 
== External Links ==
 
== External Links ==

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