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

From Dejvino's Knowledge Base
Jump to navigation Jump to search
 
(21 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.
  
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.
+
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'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).
+
{{Info|1=
  
{{Todo|THIS!}}
+
'''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 11: 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 18: 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
 
# boot.img
 
# boot.img
 
# rootfs.img
 
# rootfs.img
 +
 +
{{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.
 +
 +
Therefore this is not a usable route and will not be discussed further.}}
  
 
== Setup ==
 
== 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: [https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/]
 +
 +
=== 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|1=
 +
 +
'''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]}}
 +
 
<pre>git clone https://gitlab.denx.de/u-boot/u-boot.git
 
<pre>git clone https://gitlab.denx.de/u-boot/u-boot.git
 
cd u-boot
 
cd u-boot
make orangepi-rk3399_defconfig</pre>
+
make orangepi-4-rk3399_defconfig</pre>
  
=== Option 1: Package the image with Rockchip miniloader ===
+
== Compilation ==
{{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.
+
=== Export cross compiler for AArch64 ===
 
+
Export cross compiler path for aarch64:
Therefore this is not a usable route.}}
 
See [https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/README.rockchip u-boot/.../README.rockchip] for instructions.
 
 
 
=== Option 2: Package the image with SPL ===
 
  
==== Export cross compiler for AArch64 ====
+
# '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'
  
(needed only when not running on the target device)
+
The usage is this: <code>CROSS_COMPILE=$CROSS_COMPILE</code> (needed only when not running on the target device)
  
 
==== Compile ATF ====
 
==== Compile ATF ====
Line 54: 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)
Line 60: Line 98:
 
</pre>
 
</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.}}
 
{{Todo|The internally provided cross-compile toolchain for cortex-m0 seems outdated (it wouldn't compile). Skipping for now.}}
Line 78: Line 116:
  
 
==== 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] ]]
{{Todo|Tested with OPi4 until here. Verify the rest.}}
 
  
 
<pre>
 
<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
 
      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
+
    (Get idbloader.img and u-boot.itb)
      if CONFIG_TPL_OF_CONTROL not enabled)
 
 
</pre>
 
</pre>
  
== Building ==
+
{{Todo|1=
<pre>make all</pre>
+
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 ===
  
== Booting from an SD card on RK3399 ==
+
==== Write tpl+spl at 64th sector ====
<pre class="mw-collapsed mw-collapsible">
+
<pre>
To write an image that boots from an SD card (assumed to be /dev/sdc):
+
  sudo dd if=idbloader.img of=/dev/sdc seek=64
 +
</pre>
  
Option 1: Package the image with Rockchip miniloader:
+
==== Write U-Boot proper at 16384 sector ====
 +
<pre>
 +
  sudo dd if=u-boot.itb of=/dev/sdc seek=16384
 +
  sync
 +
</pre>
  
  - Create idbloader.img
+
=== Booting ===
 
+
Put this microSD card into your board and reset it. You should see
    => 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
 
 
 
    => 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