程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

Rockchip RK3566 - 从零开始制作recovery系统

----------------------------------------------------------------------------------------------------------------------------

开发板 :Orange Pi 3B开发板
eMMC32GB
LPDDR42GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot2017.09
linux5.10
----------------------------------------------------------------------------------------------------------------------------

在《Rockchip RK3588 - 从零开始制作recovery系统 》中我们介绍了在NanoPC-T6开发板如何进行recovery.img镜像的制作,以及如何实现debian/ubuntu系统的在线升级功能。

本节我们将尝试Orange Pi 3B开发板进行recovery.img镜像的制作,并通过改造orangepi-build编译脚本,实现为Linux镜像扩展recovery分区,并写入recovery.img镜像的目的。

本篇博客测试使用的各个模块版本:

  • u-bootv2017.09-rk3588
  • kernelorange-pi-5.10-rk35xx;
  • Linux发行版的类型,jammy Ubuntu jammy 22.04 LTS
  • 最后编译得到的Linux镜像为Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img

本篇内容是在《Rockchip RK3566 - orangepi-build编译》基础上进行实验的,已经对Linux SDK源码进行如下改动;

  • 修改userpatches/config-default.conf文件IGNORE_UPDATES配置项关闭源码同步;
  • 修改configs/orangepi-3b-rk3566_defconfig保存环境变量到eMMC
  • 由于采用的内核版本为5.10,因此不需要对u-boot源码board/rockchip/evb_rk3568/evb_rk3568.c文件进行修改。

关于改动的细节,参考《Rockchip RK3566 - orangepi-build编译》。

一、recovery.img制作

recovery.img系统镜像由kernel + dtb + ramdisk三部分组成。

我们在/work/sambashare/rk3566下创建一个recovery目录,用于制作recovery.img

root@ubuntu:/work/sambashare/rk3566$ mkdir recovery

1.1 kernel

1.1.1 支持RAM块设备

如果我们需要使用ramdisk根文件系统,就需要配置RAM块设备驱动,否者不用配置这个。

ram disk顾名思义,内存磁盘。我们平常接触的一些存储介质,如:Nor FlashNand FlasheMMCufs、以及机械硬盘固态硬盘等,都是用来存储数据的,同理内存也是可以当成磁盘来存储数据的,唯一不同的就是ram是掉电不保存的,而前面提到的那些存储介质掉电都是保存数据的。

我们都知道,在linux中,上面介绍的Flash这些存储介质,都是需要有对应的驱动,注册成块设备。并向上层提供接口。如NorNand等都抽象成mtdblock块设备。

同理,linux中的ram disk意思就是拿出ram中的一部分大小,用对应的驱动注册层块设备,提供给上层调用。一般的ram disk注册成的块设备,在文件系统中设备节点体现为/dev/ramx

我们需要配置内核支持ramdisk

root@ubuntu:/work/sambashare/rk3566$ cd orangepi-build/kernel/orange-pi-5.10-rk35xx/
root@ubuntu:/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-6.6-rk35xx$ make menuconfig

配置:

General setup  ---> 
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

这里的意思是配置内核初始化时,去寻找initramfsinitrdinitrd就是我们的ramdisk文件系统,至于initramfs,是一个可以编译进内核的根文件映像。

Device Drivers  ---> 
     [*] Block devices  --->
          <*>   RAM block device support
          (1)     Default number of RAM disks
        (131072) Default RAM disk size (kbytes)    

勾选第一项RAM block device support,才会出来第二项和第三项的选项;

  • 第一项的意思是内核支持ram disk块设备驱动;
  • 第二项是注册的块设备数量,内核默认是1,内核启动后会有/dev/ram0块设备节点;
  • 第三项的意思是ram disk占得最大内存,这里我写的是128M,一般来说可以写的再小点。实际在使用/dev/ramx设备时,并不是一下子就占系统128MB内存,而是根据实际使用情况而分配的。

注意:这里配置的大小要超过我们制作的ramdisk文件系统的大小。

配置完成,会在.config生成如下配置:

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=131072

./build.sh构建内核的时候要想使得该配置生效,我们必须修改<SDK>/external/config/kernel/linux-rockchip-rk356x-legacy.config文件中的配置;

# 以下是默认配置
#CONFIG_BLK_DEV_RAM=1
#CONFIG_BLK_DEV_RAM_COUNT=1
#CONFIG_BLK_DEV_RAM_SIZE=4096

# 修改为
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=131072

注意:对于legacy版本,编译使用的内核配置文件为:<SDK>/external/config/kernel/linux-rockchip-rk356x-legacy.config

1.1.2 编译内核

运行build.sh脚本,输入如下命令:

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ rm -rf output/debs/linux-*.deb
root@ubuntu:/work/sambashare/rk3566/orangepi-build$ ./build.sh  BOARD=orangepi3b BRANCH=legacy BUILD_OPT=kernel KERNEL_CONFIGURE=no 

具体细节参考《Rockchip RK3566 - orangepi-build编译》编译kernel小节。

1.1.3 Image.gz

内核镜像我们采用Image.gz文件即可,位于arch/arm64/boot目录;

root@ubuntu:/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-5.10-rk35xx# ll arch/arm64/boot
drwxrwxr-x 33 root root     4096  8月  7 21:37 dts/
-rw-rw-r--  1 root root       79  8月  7 21:37 .gitignore
-rw-rw-r--  1 root root 35131904  8月  7 22:27 Image
-rw-rw-r--  1 root root      154  8月  7 22:27 .Image.cmd
-rw-rw-r--  1 root root 12010836  8月  7 22:27 Image.gz
-rw-rw-r--  1 root root      101  8月  7 22:27 .Image.gz.cmd
-rw-rw-r--  1 root root     1562  8月  7 21:37 install.sh
-rw-rw-r--  1 root root     1201  8月  7 21:37 Makefile

root@ubuntu:/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-5.10-rk35xx# cp arch/arm64/boot/Image.gz  /work/sambashare/rk3566/recovery

注意:如果没有该文件,我们找到 debian/tmp/boot/vmlinuz-5.10.160-rockchip-rk356x这个文件,然后使用gzip压缩得到Image.gz即可。

1.2 dtb

对于legacy版本:

  • v1.1开发板:编译使用的dts文件为:<SDK>/kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dts
  • v2.1开发板:编译使用的dts文件为:<SDK>/kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b-v2.dts

编译生成的rk3566-orangepi-3b.dtbrk3566-orangepi-3b-v2.dtb文件可以在<SDK>/kernel/orange-pi-5.10-rk35xx/arch/arm64/boot/dts/rockchip/得到;

/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-5.10-rk35xx$ ll arch/arm64/boot/dts/rockchip | grep rk3566-orangepi-3b
-rw-rw-r--  1 root root 166360  8月  7 22:27 rk3566-orangepi-3b.dtb
-rw-rw-r--  1 root root   2978  8月  7 22:27 .rk3566-orangepi-3b.dtb.cmd
-rw-rw-r--  1 root root    114  8月  7 22:27 .rk3566-orangepi-3b.dtb.d.dtc.tmp
-rw-rw-r--  1 root root   1606  8月  7 22:27 .rk3566-orangepi-3b.dtb.d.pre.tmp
-rw-rw-r--  1 root root 186785  8月  7 22:27 .rk3566-orangepi-3b.dtb.dts.tmp
-rw-rw-r--  1 root root  26250  8月  7 21:37 rk3566-orangepi-3b.dts
-rw-rw-r--  1 root root 166684  8月  7 22:27 rk3566-orangepi-3b-v2.dtb
-rw-rw-r--  1 root root   3026  8月  7 22:27 .rk3566-orangepi-3b-v2.dtb.cmd
-rw-rw-r--  1 root root    120  8月  7 22:27 .rk3566-orangepi-3b-v2.dtb.d.dtc.tmp
-rw-rw-r--  1 root root   1615  8月  7 22:27 .rk3566-orangepi-3b-v2.dtb.d.pre.tmp
-rw-rw-r--  1 root root 186169  8月  7 22:27 .rk3566-orangepi-3b-v2.dtb.dts.tmp
-rw-rw-r--  1 root root  25504  8月  7 21:37 rk3566-orangepi-3b-v2.dts

拷贝rk3566-orangepi-3b.dtbrk3566-orangepi-3b-v2.dtb

/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-5.10-rk35xx$ cp  arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dtb /work/sambashare/rk3566/recovery/
/work/sambashare/rk3566/orangepi-build/kernel/orange-pi-5.10-rk35xx$ cp  arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b-v2.dtb /work/sambashare/rk3566/recovery/

1.3 ramdisk

这里我们进行Buildroot根文件系统构建,具体参考以下博客;

相对于《Rockchip RK3588 - 从零开始制作recovery系统 》,这里我们简化了ramdisk的制作流程,更多细节还请参考《Rockchip RK3588 - 从零开始制作recovery系统 》。

1.3.1 源码下载

先把buildroot下载下来;

root@ubuntu:/work/sambashare/rk3566/recovery# wget https://buildroot.org/downloads/buildroot-2024.02.4.tar.gz
root@ubuntu:/work/sambashare/rk3566/recovery# tar -zvxf buildroot-2024.02.4.tar.gz
1.3.2 配置buildroot

这里我们就不过多介绍如何配置buildroot了,具体可以参考《Rockchip RK3588 - 从零开始制作recovery系统 》第二节。

1.3.2.1 rk356x_defconfig

配置完成得到针对rk356x系列SoC的配置文件./configs/rk356x_defconfig,内容如下:

BR2_aarch64=y
BR2_cortex_a55=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_TARGET_GENERIC_HOSTNAME="rk356x"
BR2_TARGET_GENERIC_ISSUE="Welcome to rk356x Buildroot"
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
BR2_ROOTFS_MERGED_USR=y
BR2_TARGET_GENERIC_ROOT_PASSWD=""
BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin"
BR2_ROOTFS_OVERLAY="../board/rockchip/common/base ../board/rockchip/rk356x/fs-overlay/"
BR2_ROOTFS_POST_BUILD_SCRIPT="../board/rockchip/common/post-build.sh"
BR2_PACKAGE_BZIP2=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
BR2_PACKAGE_INPUT_EVENT_DAEMON=y
BR2_PACKAGE_LIBDRM=y
BR2_PACKAGE_LIBPNG=y
BR2_PACKAGE_LIBCURL=y
BR2_PACKAGE_NETSTAT_NAT=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_RSYNC=y
BR2_PACKAGE_VSFTPD=y
BR2_PACKAGE_LOCKFILE_PROGS=y
BR2_PACKAGE_ANDROID_TOOLS=y
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_ROOTFS_CPIO_GZIP=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="96M"
BR2_TARGET_ROOTFS_SQUASHFS=y

如果需要配置图形化界面可以考虑配置(未做测试):

/work/sambashare/rk3566/recovery/board/rockchip/rk356x/fs-overlay/etc/profile.d/xdg.sh
/work/sambashare/rk3566/recovery/board/rockchip/rk356x/fs-overlay/etc/profile.d/weston.sh
/work/sambashare/rk3566/recovery/board/rockchip/rk356x/fs-overlay/etc/init.d/S99weston
/work/sambashare/rk3566/recovery/buildroot-2024.02.4/output/target/etc/xdg/weston/weston.ini

Target packages  --->   
	Graphic libraries and applications (graphic/text)  --->  
		[*] weston 
        # 选择默认compositor backend,支持drm、headless、wayland、X11等。compositor backend决定了compositor合成结果输出到哪里
		default compositor (drm)  --->
			(X) drm
        # 选择DRM设备作为compositor输出设备
		-*-   DRM compositor
		*** RDP compositor needs a toolchain w/ wchar, C++, X.org ***
        # 选择另一个Wayland作为输出设备,构成Wayland嵌套
		[*]   Wayland (nested) compositor
		*** X11 (nested) compositor needs X.org enabled ***
        *** XWayland support needs libepoxy and X.org enabled *** 
    	# 窗口管理工具配置
        [*]   desktop shell
        [*]   fullscreen shell
        [*]   ivi shell 
        [*]   kiosk shell 
        [*]   screenshare 
        [ ]   simple clients
        *** demo clients needs an OpenGL ES provider, an OpenEGL-capable Wayland backend and a toolchain w/ wchar,
        [ ] X.org X Window System  ----
        [ ] apitrace
 		*** vte needs an OpenGL or an OpenGL-EGL/wayland backend ***
 		-*- xkeyboard-config 
	System tools  --->   
		-*- seatd  ---> 
			[*]   builtin backend
		    -*-   seatd daemon 
1.3.2.2 fs-overlay

此外我们还需要将/work/sambashare/rk3588/recovery如下目录内容拷贝过来:

root@ubuntu:/work/sambashare/rk3566/recovery# cp -af /work/sambashare/rk3588/recovery/board .

我们需要创建board/rockchip/rk356xboard/rockchip/rk3588的副本;

root@ubuntu:/work/sambashare/rk3566/recovery$ cd board/rockchip/
root@ubuntu:/work/sambashare/rk3566/recovery/board/rockchip$ cp -af rk3588 rk356x
root@ubuntu:/work/sambashare/rk3566/recovery/board/rockchip$ ll
drwxr-xr-x 8 root root 4096  7月 26 00:06 common/
drwxr-xr-x 3 root root 4096  6月  9 12:58 rk356x/
drwxr-xr-x 3 root root 4096  6月  9 12:58 rk3588/

此外我们需要根据实际情况对board/rockchip/rk356x/fs-overlay目录下以下文件进行调整:

  • /etc/network/interfaces:只保留一个网络接口,接口名为eth0

  • /etc/init.d/rcS:如果内核版本是5.10,屏蔽加载网卡相关脚本;如果内核版本是6.6,修改加载网卡驱动脚本为:

    # 加载网卡驱动
    /sbin/depmod
    /sbin/modprobe dwmac_rk
    /sbin/modprobe motorcomm
    
  • /etc/profileHOSTNAME设置为orangepi

1.3.2.3 post-build.sh

需要修改board/rockchip/common/post-build.sh文件中复制网卡驱动到文件系统相关脚本;

# orangpi 3b使用
KERNEL_VERSION="5.10.160-rockchip-rk356x"   # 6.6.0-rc5-rockchip-rk356x

# NanpiPC T6使用
#KERNEL_VERSION="6.1.25"

# 复制网卡驱动到文件系统
if ls "${SDK_DIR}/lib/modules/$KERNEL_VERSION"/*.ko >/dev/null 2>&1; then
    # 复制网卡驱动
    mkdir -p $TARGET_DIR/lib/modules/$KERNEL_VERSION
    cp -a $SDK_DIR/lib/modules/$KERNEL_VERSION/*.ko $TARGET_DIR/lib/modules/$KERNEL_VERSION
fi

此外post-build.sh文件中配置的文件系统挂载信息可以根据实际情况修改;

SOC=RK3566

if [[ $SOC = 'RK3588' ]];then
        # 分区挂载信息,recovery可执行程序使用
        if ! grep -q "/dev/sda1" "$TARGET_DIR/etc/fstab"; then
                echo "/dev/sda1       /mnt/udisk      auto    defaults        0 2" >> $TARGET_DIR/etc/fstab
        fi

        if ! grep -q "/dev/mmcblk1p1" "$TARGET_DIR/etc/fstab"; then
                echo "/dev/mmcblk1p1  /mnt/sdcard     auto    defaults        0 2" >> $TARGET_DIR/etc/fstab
        fi

        if ! grep -q "PARTLABEL" "$TARGET_DIR/etc/fstab"; then
                echo "PARTLABEL=oem   /oem    ext4    defaults        0 2" >> $TARGET_DIR/etc/fstab
                echo "PARTLABEL=userdata   /userdata    ext4    defaults        0 2" >> $TARGET_DIR/etc/fstab
        fi
elif [[ $SOC = 'RK3566' ]];then
        if ! grep -q "oem" "$TARGET_DIR/etc/inittab"; then
        	echo "::sysinit:/bin/mount -t ext4 -r /dev/block/by-name/image1 /oem" >>  $TARGET_DIR/etc/inittab
        	echo "::sysinit:/bin/mount -t ext4 /dev/block/by-name/image2 /userdata" >>  $TARGET_DIR/etc/inittab
        fi
fi

/etc/fstab 文件用于定义文件系统的挂载点和挂载选项。每一行描述一个文件系统,包括其设备、挂载点、文件系统类型和挂载选项。文件格式如下:

<文件系统> <挂载点> <类型> <选项> <转储> <检查>

其中:

  • 文件系统:指定要挂载的设备或文件系统的标识符。这可以是设备路径(如 /dev/sda1)、UUID(如 UUID=1234-5678)或标签(如 LABEL=opi_image1PARTLABEL=image1)等,可以通过lsblk -o NAME,PARTLABEL,PARTUUID,LABEL命令查看;
    • 设备节点全路径;
    • UUID:指的是文件系统的唯一标识码,它是在创建文件系统时自动生成的,保证了在任何系统中的唯一性;
    • LABEL:指的是文件系统的标签,这是在创建文件系统时设置的一个名字,方便人们记忆和使用;
    • PARTLABEL:分区的标签,这是在使用gpt分区表的情况下的一个额外标识,可以用来代替传统的hdXsdXmmcblkX设备名;
  • 挂载点:设备在文件系统中挂载的位置,即它将在文件系统中显示的位置。例如,/mnt/data
  • 类型:文件系统的类型,如 ext4xfsntfs 等;
  • 选项:挂载选项,以逗号分隔的列表。例如,defaultsro(只读)、rw(读写)、noatime 等。常见选项包括:
    • defaults:使用默认选项;
    • ro:只读挂载;
    • rw:读写挂载;
    • noatime:不更新文件访问时间;
    • nodiratime:不更新目录访问时间;
    • auto:系统启动时自动挂载;
    • noauto:系统启动时不自动挂载;
  • 转储:用于 dump 工具的备份操作。设置为 0 表示不进行备份,设置为 1 表示进行备份。
  • 检查:fsck 工具启动时检查文件系统的顺序。根文件系统通常设置为 1,其他文件系统通常设置为 2,不检查的设置为 0

对于RK3566我们挂载的时候没有采用配置PARTLABEL/LABEL/UUID的挂载方式,主要是使用PARTLABEL/LABEL/UUID挂载方式在测试时均出现了错误;

PARTLABEL=image1   /oem    ext4    ro,defaults        0 2
LABEL=opi_image2   /userdata    ext4    defaults        0 2

# 内核启动中的错误信息
mount: mounting PARTLABEL=image1 on /oem failed: No such file or directory
mount: mounting LABEL=opi_image2 on /userdata failed: No such file or directory

因此我们通过修改/etc/inittab文件,在启动udev::sysinit:/etc/init.d/rcS触发)守护进程之后,采用mount去挂载;

这里我们使用了/dev/mmcblkXpN设备节点的别名,这个是通过udev规则文件/usr/lib/udev/rules.d/61-partition-init.rules实现的;

/dev/block/by-name/image1   /oem    ext4    ro,defaults        0 2
/dev/block/by-name/image2   /userdata    ext4    defaults        0 2
1.3.3 安装网卡驱动

注意如果你的内核版本是6.6,需要执行当前步骤,如果使用的5.10版本直接跳过即可。

Orange Pi 3B开发板搭载10/100/1000Mbps以太网,板载PHY芯片型号为YT8531C,其驱动Motorcomm PHYs(位于drivers/net/phy/motorcomm.c)是以模块方式加载。

因此我们需要将PHY驱动拷贝到lib/modules/6.6.0-rc5-rockchip-rk356x目录。在宿主机执行如下命令:

root@ubuntu:/work/sambashare/rk3566/recovery$ mkdir -p lib/modules/6.6.0-rc5-rockchip-rk356x
root@ubuntu:/work/sambashare/rk3566/rootfs$ cp /work/sambashare/rk3566/orangepi-build/output/debs/test/lib/modules/6.6.0-rc5-rockchip-rk356x/kernel/drivers/net/phy/motorcomm.ko lib/modules/6.6.0-rc5-rockchip-rk356x

此外还需要拷贝以太网控制器驱动;

cd /work/sambashare/rk3566/orangepi-build/output/debs/test/lib/modules/6.6.0-rc5-rockchip-rk356x/kernel/drivers/net/ethernet/stmicro/stmmac/
cp dwmac-rk.ko /work/sambashare/rk3566/recovery/lib/modules/6.6.0-rc5-rockchip-rk356x
cp stmmac.ko /work/sambashare/rk3566/recovery/lib/modules/6.6.0-rc5-rockchip-rk356x
cp stmmac-platform.ko /work/sambashare/rk3566/recovery/lib/modules/6.6.0-rc5-rockchip-rk356x

cd /work/sambashare/rk3566/orangepi-build/output/debs/test/lib/modules/6.6.0-rc5-rockchip-rk356x
cp ./kernel/drivers/net/pcs/pcs_xpcs.ko /work/sambashare/rk3566/recovery/lib/modules/6.6.0-rc5-rockchip-rk356x

这几个驱动的依赖依赖关系如下,Used by 字段的值告诉你有多少个其他模块依赖于当前显示的模块;

Module                  Size  Used by
motorcomm              24576  1
dwmac_rk               28672  0
dw_hdmi_cec            12288  0
stmmac_platform        24576  1 dwmac_rk
stmmac                241664  3 stmmac_platform,dwmac_rk
pcs_xpcs               24576  1 stmmac

开发板版使用的WiFi模组,型号为AP6356,基于Boardcom(博通)的WiFi芯片。这里我们就不移植无线网卡驱动了,如果需要移植的话,还需要拷贝:

  • brcmfmac_wcc.ko
  • brcmfmac.ko
  • brcmutil.ko
  • cfg80211.ko
  • 固件brcm/brcmfmac43456-sdio.rockchip,rk3566-orangepi-3b.bin

具体可以参考《Rockchip RK3399 - WiFi AP6356驱动》。

1.3.4 编译buildroot

配置好buildroot后,如需编译buildroot,运行如下命令即可:

root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4# make rk356x_defconfig
root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4# sudo make -j8

编译过程成需要保证能够连接github,编译大概需要2个小时,耐心等待。

如果修改了配置,我们需要先进行清理,再重新编译;

root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4# sudo make clean
root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4# sudo make -j8

如果我们修改了配置执行sudo make savedefconfig会将配置自动写回./configs/rk356x_defconfig文件。

需要注意的是:如果执行了make clean会清理output目录下的所有文件,再次编译又会花费2个小时。如果是fs-overlay以及post-build.sh文件的调整我们可以直接执行make -j8编译,然后查看output/target目录下修改的文件是不是我们调整的,如果不是可以直接删除/修改对应文件,然后执行make -j8即可。

1.3.5 编译输出

编译完成后,在编译输出目录 output 会生成子目录;

root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4# ll output
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.init
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.jpeg
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.linux
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.menus
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.openssl
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.paths
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.skeleton
-rw-r--r--  1 root root   82  8月  3 23:32 .br2-external.in.toolchains
-rw-r--r--  1 root root  169  8月  3 23:32 .br2-external.mk
drwxr-xr-x 85 root root 4096  8月  4 01:19 build/
drwxr-xr-x 10 root      root      4096  8月  4 00:36 host/
drwxr-xr-x  2 root      root      4096  8月  4 01:20 images/
lrwxrwxrwx  1 root      root       100  8月  4 01:20 staging -> /work/sambashare/rk3566/recovery/buildroot-2024.02.4/output/host/aarch64-buildroot-linux-gnu/sysroot/
drwxr-xr-x 17 root      root      4096  8月  4 01:19 target/

查看编译生成的根文件系统镜像;

root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4$ ll output/images/
-rw-r--r-- 1 root      root       33731584  8月  4 01:19 rootfs.cpio
-rw-r--r-- 1 root      root       11959629  8月  4 01:19 rootfs.cpio.gz
-rw-r--r-- 1 root      root      100663296  8月  4 01:20 rootfs.ext2
lrwxrwxrwx 1 root      root             11  8月  4 01:20 rootfs.ext4 -> rootfs.ext2
-rw-r--r-- 1 root      root       11948032  8月  4 01:20 rootfs.squashfs
-rw-r--r-- 1 root      root       34611200  8月  4 01:20 rootfs.tar

如果想查看文件系统中包含的文件内容,可以直接查看:

root@ubuntu:/work/sambashare/rk3566/recovery/buildroot-2024.02.4$ ll output/target

更多细节参考《Rockchip RK3588 - 从零开始制作recovery系统 》。

1.3.6 mk-ramdisk.sh

这里我们整理一个脚本mk-ramdisk.sh用于制作ramdisk.gz镜像;

root@ubuntu:/work/sambashare/rk3566/recovery# vim mk-ramdisk.sh
#!/bin/bash
[[ -n DEBUG ]] && set -x

# 获取当前工作路径
WORK_DIR=$(dirname "$(realpath "$BASH_SOURCE")")

# buildroot编译输出目录
BUILDROOT_DIR="$WORK_DIR/buildroot-2024.02.4"
BUILDROOT_OUTPUT_DIR="$BUILDROOT_DIR/output"

if [[ ! -d $BUILDROOT_DIR ]];then
	echo "请先下载buildroot源码,并编译"
	exit 1
fi

if [[ ! -d $BUILDROOT_OUTPUT_DIR ]];then
	echo "请先编译buildroot源码"
	exit 1
fi

cp $BUILDROOT_OUTPUT_DIR/images/rootfs.ext2 .
gzip -v9 rootfs.ext2
mv rootfs.ext2.gz ramdisk.gz

1.4 构建recovery.img

1.4.1 boot4recovery.its

由于recovery.imgFIT uImage镜像格式,因此我们首先需要创建boot4recovery.its文件。

在制作FIT uImage时我们需要考虑一个问题,我们要同时适配v1.1v2.1的板子,对于启用设备树(Device Tree,DT)的平台来说,通过在引导时提供与所需配置匹配的设备树blob,可以轻松地实现这一点。更多细节可以参考《U-Boot FDT Overlay FIT usage》。

View Code
/*
 * Copyright (C) 2021 Rockchip Electronics Co., Ltd
 *
 * SPDX-License-Identifier: GPL-2.0
 */

/dts-v1/;
/ {
    description = "U-Boot FIT source file for arm";

    images {
        fdt1 {
           description = "Flattened Device Tree blob v1";
            data = /incbin/("@KERNEL_DTB@");
            type = "flat_dt";
            arch = "arm64";
            compression = "none";
            load = <0x08300000>;

            hash {
                algo = "sha256";
            };
        };

        fdt2 {
            description = "Flattened Device Tree blob v2";
            data = /incbin/("@KERNEL_DTB_V2@");
            type = "flat_dt";
            arch = "arm64";
            compression = "none";
            load = <0x08300000>;

            hash {
                algo = "sha256";
            };
        };

        kernel {
            description = "Vanilla Linux kernel";
            data = /incbin/("@KERNEL_IMG@");
            type = "kernel";
            arch = "arm64";
            os = "linux";
            compression = "gzip";
            entry = <0xffffff02>;
            load = <0xffffff02>;

            hash {
                algo = "sha256";
            };
        };

        ramdisk {
                description = "Ramdisk for project-x";
                data = /incbin/("@RAMDISK_IMG@");
                type = "ramdisk";
                arch = "arm64";
                os = "linux";
                compression = "gzip";
                load = <0xffffff03>;
                hash {
                        algo = "sha256";
                };
        };
    };

    configurations {
        default = "conf1";

        conf1 {
            rollback-index = <0x00>;
            description = "Boot Linux kernel with FDT blob v1";
            fdt = "fdt1";
            kernel = "kernel";
            ramdisk = "ramdisk";

        };

        conf2 {
            rollback-index = <0x00>;
            description = "Boot Linux kernel with FDT blob v2";
            fdt = "fdt2";
            kernel = "kernel";
            ramdisk = "ramdisk";

        };
    };
};

如果我们在its文件中设置的loadentry地址满足(addr & 0xffffff00) == 0xffffff00,那么特点子镜像节点,比如fdtkernelramdiskloadentry都会在boot_fit启动的时候将其替换成环境变量中指定的地址。其中:

  • kernel load/entry地址会被替换成0x00280000,该值来自环境变量kernel_addr_r
  • ramdisk load地址会被替换成0x0a200000,该值来自环境变量ramdisk_addr_r
  • fdt load地址会被替换成0x08300000,该值来自环境变量fdt_addr_r

但是这里我们为了适配v1.1v2.1的板子,设备树镜像节点我们有两个,分别是fdt1fdt2,并且节点名称也不是fdt,因此这里我们直接将load配置成了境变量fdt_addr_r的值。

注意这里我们配置了两个设备树节点,在boot fit启动的时候,我们会根据fdtfile环境来选择一个设备树使用。

具体可以参考《Rockchip RK3399 - 移植linux 5.2.8boot_fit启动方式介绍。

1.4.2 mk-fitimage.sh

我们需要根据its文件中的描述来打包镜像生成itb文件(FIT uImage),新建mk-fitimage.sh

#!/bin/bash
[[ -n $DEBUG ]] && set -x

# FIT uImage镜像:recovery.img
TARGET_IMG="recovery.img"
# its文件: boot4recovery.its
ITS="boot4recovery.its"
# 内核镜像:Image.gz
KERNEL_IMG="linux-5.10/Image.gz"
# ramsidk根文件系统:ramdisk.gz
RAMDISK_IMG="ramdisk.gz"
# 内核设备树:rk3566-orangepi-3b.dtb
KERNEL_DTB="linux-5.10/rk3566-orangepi-3b.dtb"
KERNEL_DTB_V2="linux-5.10/rk3566-orangepi-3b-v2.dtb"

# 判断its文件存在
if [ ! -f "$ITS" ]; then
        echo "$ITS not exists!"
        exit 1
fi

rm -rf $RAMDISK_IMG
# 判断ramdisk文件存在
if [ ! -f "$RAMDISK_IMG" ]; then
        # 获取当前工作路径
        WORK_DIR=$(dirname "$(realpath "$BASH_SOURCE")")

        # buildroot编译输出目录
        BUILDROOT_DIR="$WORK_DIR/buildroot-2024.02.4"
        BUILDROOT_OUTPUT_DIR="$BUILDROOT_DIR/output"

        if [[ ! -d $BUILDROOT_DIR ]];then
                echo "请先下载buildroot源码,并编译"
                exit 1
        fi

        if [[ ! -d $BUILDROOT_OUTPUT_DIR ]];then
                echo "请先编译buildroot源码"
                exit 1
        fi

        cp $BUILDROOT_OUTPUT_DIR/images/rootfs.ext2 .
        gzip -v9 rootfs.ext2
        mv rootfs.ext2.gz ramdisk.gz
fi

# 生成临时文件,复制its到临时文件
TMP_ITS=$(mktemp)
cp "$ITS" "$TMP_ITS"

# 使用sed命令替换一个临时文件$TMP_ITS中的占位符, 比如替换@KERNEL_DTB@->rk3566-orangepi-3b.dtb
sed -i -e "s~@KERNEL_DTB@~$(realpath -q "$KERNEL_DTB")~" \
        -e "s~@KERNEL_DTB_V2@~$(realpath -q "$KERNEL_DTB_V2")~" \
        -e "s~@KERNEL_IMG@~$(realpath -q "$KERNEL_IMG")~" \
        -e "s~@RAMDISK_IMG@~$(realpath -q "$RAMDISK_IMG")~" "$TMP_ITS"

# 使用mkimage工具编译,这里一定要指定-E参数
mkimage -f "$TMP_ITS"  -E -p 0x800 "$TARGET_IMG"

# 删除临时文件
rm -f "$TMP_ITS"

cp $TARGET_IMG ../orangepi-build/output/

此外这里我们直接将/work/sambashare/rk3566/orangepi-build/u-boot/v2017.09-rk3588/tools/mkimagemkimage工具拷贝过来;

rooot@ubuntu:/work/sambashare/rk3566/recovery$ cp /work/sambashare/rk3566/orangepi-build/u-boot/v2017.09-rk3588/tools/mkimage .
1.4.3 生成recovery.img

然后在命令行使用mk-fitimage.sh脚本编译即可:

root@ubuntu:/work/sambashare/rk3566/recovery$ ./mk-fitimage.sh
rootfs.ext2:     87.9% -- replaced with rootfs.ext2.gz
FIT description: U-Boot FIT source file for arm
Created:         Sat Aug 10 14:09:01 2024
 Image 0 (fdt1)
  Description:  Flattened Device Tree blob v1
  Created:      Sat Aug 10 14:09:01 2024
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    166360 Bytes = 162.46 KiB = 0.16 MiB
  Architecture: AArch64
  Load Address: 0x08300000
  Hash algo:    sha256
  Hash value:   1ea819e4474229a279c774c14a38a4459449218ced0d658f9bda64c9c6a91a25
 Image 1 (fdt2)
  Description:  Flattened Device Tree blob v2
  Created:      Sat Aug 10 14:09:01 2024
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    166684 Bytes = 162.78 KiB = 0.16 MiB
  Architecture: AArch64
  Load Address: 0x08300000
  Hash algo:    sha256
  Hash value:   7d535a4cd3e3e027838841be2358fe25b89c68eebc146ce8a53c41411de89204
 Image 2 (kernel)
  Description:  Vanilla Linux kernel
  Created:      Sat Aug 10 14:09:01 2024
  Type:         Kernel Image
  Compression:  gzip compressed
  Data Size:    12010836 Bytes = 11729.33 KiB = 11.45 MiB
  Architecture: AArch64
  OS:           Linux
  Load Address: 0xffffff02
  Entry Point:  0xffffff02
  Hash algo:    sha256
  Hash value:   c6649ab96e10f46cbedc1c8776541c82af3228bd6bbb6c34c2adc24f92a4001e
 Image 3 (ramdisk)
  Description:  Ramdisk for project-x
  Created:      Sat Aug 10 14:09:01 2024
  Type:         RAMDisk Image
  Compression:  gzip compressed
  Data Size:    12192756 Bytes = 11906.99 KiB = 11.63 MiB
  Architecture: AArch64
  OS:           Linux
  Load Address: 0xffffff03
  Entry Point:  unavailable
  Hash algo:    sha256
  Hash value:   10831ea83cd231d2b677dd1d81fe834b183ca62d39e1feebe18780624110d5fd
 Default Configuration: 'conf1'
 Configuration 0 (conf1)
  Description:  Boot Linux kernel with FDT blob v1
  Kernel:       kernel
  Init Ramdisk: ramdisk
  FDT:          fdt1
 Configuration 1 (conf2)
  Description:  Boot Linux kernel with FDT blob v2
  Kernel:       kernel
  Init Ramdisk: ramdisk
  FDT:          fdt2

编译完成后我们查看recovery.img镜像大小:

root@ubuntu:/work/sambashare/rk3566/recovery$ ll
drwxr-xr-x  3 root root     4096  7月 23 21:38 board/
-rw-r--r--  1 root root     1919  8月 10 14:08 boot4recovery.its
drwxr-xr-x 19 root root     4096  8月  3 23:32 buildroot-2024.02.4/
-rwxr-xr-x  1 root root    48167  8月  6 23:58 debootstrap.sh*
drwxr-xr-x  3 root root     4096  8月  4 08:45 lib/
drwxr-xr-x  2 root root     4096  8月  7 22:40 linux-5.10/
drwxr-xr-x  2 root root     4096  8月  7 00:11 linux-6.6/
-rwxr-xr-x  1 root root     1746  8月  9 01:04 mk-fitimage.sh*
-rwxr-xr-x  1 root root   206888  8月  4 13:30 mkimage*
-rwxr-xr-x  1 root root      516  8月  4 08:53 mk-ramdisk.sh*
-rw-r--r--  1 root root 12192756  8月 10 14:08 ramdisk.gz
-rw-r--r--  1 root root 24538684  8月 10 14:09 recovery.img

root@ubuntu:/work/sambashare/rk3566/recovery# ll linux-5.10/
-rw-r--r-- 1 root root 31119872  8月  7 01:34 Image
-rw-r--r-- 1 root root 12010836  8月  7 22:40 Image.gz
-rwxr-xr-x 1 root root   166360  8月  7 22:39 rk3566-orangepi-3b.dtb*
-rw-r--r-- 1 root root   166684  8月  7 22:39 rk3566-orangepi-3b-v2.dtb

制作完recovery.img我们需要将其拷贝到<SDK>/output目录下,在Linux SDK编译生成Linux镜像时需要用到该文件;

root@ubuntu:/work/sambashare/rk3566/recovery$ cp recovery.img /work/sambashare/rk3566/orangepi-build/output/

二、修改u-boot

如果我们想在系统启动的时候进入recovery系统应该如何做呢?在回答这个问题之前,我们需要了解u-boot默认的启动命令。

注意:在《Rockchip RK3566 - orangepi-build编译》我们已经编译了Linux镜像并烧录到开发板了,Linux发行版类型为debian

2.1 启动命令

我们重启开发板,在启动过程中按下CTRL+C进入uboot命令行模式;

U-Boot 2017.09-orangepi (Aug 04 2024 - 09:35:49 +0800)

Model: Orange Pi 3B
PreSerial: 2, raw, 0xfe660000
DRAM:  2 GiB
Sysmem: init
Relocation Offset: 7d232000
Relocation fdt: 7b9f60d0 - 7b9fecc8
CR: M/C/I
Hotkey: ctrl+m
dwmmc@fe2b0000: 0, dwmmc@fe2c0000: 2, sdhci@fe310000: 1
Bootdev(atags): mmc 0
MMC0: Legacy, 52Mhz
PartType: EFI
DM: v1
boot mode: None
I2c0 speed: 100000Hz
vsel-gpios- not found! Error: -2
vdd_cpu init 900000 uV
PMIC:  RK8090 (on=0x02, off=0x00)
vdd_logic init 900000 uV
vdd_gpu init 900000 uV
vdd_npu init 900000 uV
io-domain: OK
Failed to get scmi clk dev
dmc_fsp failed, ret=-19
*** Warning - bad CRC, using default environment

Model: Orange Pi 3B
CLK: (sync kernel. arm: enter 816000 KHz, init 816000 KHz, kernel 0N/A)
  apll 816000 KHz
  dpll 528000 KHz
  gpll 1188000 KHz
  cpll 1000000 KHz
  npll 1200000 KHz
  vpll 24000 KHz
  hpll 24000 KHz
  ppll 200000 KHz
  armclk 816000 KHz
  aclk_bus 150000 KHz
  pclk_bus 100000 KHz
  aclk_top_high 300000 KHz
  aclk_top_low 200000 KHz
  hclk_top 150000 KHz
  pclk_top 100000 KHz
  aclk_perimid 300000 KHz
  hclk_perimid 150000 KHz
  pclk_pmu 100000 KHz
Net:   eth1: ethernet@fe010000
Hit key to stop autoboot('CTRL+C'):  0
=>

查看内核启动命令;

=> printenv bootcmd
bootcmd=run distro_bootcmd;boot_android ${devtype} ${devnum};boot_fit;bootrkp;
=> printenv boot_targets
boot_targets=mmc0 mmc1 nvme mtd2 mtd1 mtd0 usb0 pxe dhcp

首先执行的就是distro_bootcmd启动方式,这种启动方式会依次遍历设备mmc0mmc1、....,然后探测内核镜像,并启动内核,Linux SDK编译出来的镜像就是采用的这种启动方式。

如果我们期望根据GPIO来控制是否进入recovery系统,我们首先应该执行boot_fit启动命令,因为recovery.imgFIT uImage

在《Rockchip RK3588 - uboot引导方式介绍》中我们介绍过,boot_fiteMMCboot/recovery分区加载FIT uImage镜像文件(通常由kernel + dtb + ramdisk组成)到内存,然后启动内核 。

由于我们制作的Linux镜像并没有boot分区,此处我们需要修改源码通过检测GPIO3_D3来实现在高电平时进入recovery系统;具体逻辑如下:

  • 检测到GPIO3_D3高电平,设置update_mode环境变量为recovery
  • 如果检测到update_mode环境变量为update或者recovery进入recovery系统,否则使用distro_bootcmd命令正常进入normal系统。

2.2 修改u-boot源码

接着我们需要对u-boot源码进行一些调整。

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ cd u-boot/v2017.09-rk3588/
2.2.1 修改启动命令

定位到include/configs/rockchip-common.h文件,修改默认启动命令,将如下内容:

#define RKIMG_BOOTCOMMAND                       \
        "run distro_bootcmd;"                   \
        "boot_android ${devtype} ${devnum};"    \
        "boot_fit;"                             \
        "bootrkp;"

修改为:

#define RKIMG_BOOTCOMMAND                       \
        "boot_fit;"                             \
        "run distro_bootcmd;"                   \
        "boot_android ${devtype} ${devnum};"    \
        "bootrkp;"
2.2.2 源码修改
2.2.2.1 pin接口介绍

Orange Pi 3B开发板40 pin接口引脚的顺序请参考下图;

Orange Pi 3B开发板40 pin接口引脚的功能如下表所示:

40pin接口中总共有28GPIO口,所有GPIO口的电压都是3.3v

这里我们选择GPIO3_D3作为系统进入recovery系统的控制引脚,通过万用表可以检测到该引脚默认为0V,因此我们可以设置当检测引脚为高电平时,进入recovery系统。

2.2.2.2 修改rockchip_get_boot_mode

定位到arch/arm/mach-rockchip/boot_mode.c文件,修改rockchip_get_boot_mode函数;

#include <asm/gpio.h>

#define OFFSET_TO_BIT(bit)     (1UL << (bit))

#define REG_L(R)       (R##_l)
#define REG_H(R)       (R##_h)
#define READ_REG(REG)  ((readl(REG_L(REG)) & 0xFFFF) | \
                       ((readl(REG_H(REG)) & 0xFFFF) << 16))
#define WRITE_REG(REG, VAL)    \
{\
       writel(((VAL) & 0xFFFF) | 0xFFFF0000, REG_L(REG)); \
       writel((((VAL) & 0xFFFF0000) >> 16) | 0xFFFF0000, REG_H(REG));\
}
#define CLRBITS_LE32(REG, MASK)        WRITE_REG(REG, READ_REG(REG) & ~(MASK))
#define SETBITS_LE32(REG, MASK)        WRITE_REG(REG, READ_REG(REG) | (MASK))

int rockchip_get_boot_mode(void)
{
		int value;
        static int count = 0;
        count++;
    	......
            
#define GPIO3_BASE      0xfe760000
    	// GPIO控制器寄存器的基地址
        struct rockchip_gpio_regs *regs = (void *)GPIO3_BASE;

    	// 清除swport_ddr寄存器的第27位 用于配置GPIO3_D3引脚为输入方向
        CLRBITS_LE32(&regs->swport_ddr, OFFSET_TO_BIT(27));
        // 读取ext_port寄存器的值,并检查其第27位是否被设置为1 用于检查GPIO3_D3引脚是不是高电平
        value = readl(&regs->ext_port) & OFFSET_TO_BIT(27) ? 1 : 0;
        if(value) {
                // 设置update_mode环境变量为recovery
                env_set("update_mode", "recovery");
            
                // 这个函数会执行两次,第二次进来将更改保存环境变量(第一次进来就保存会有异常)
                if(count == 2) {
                    run_command("saveenv", 0);
                }
        }
                        
        // 获取update_mode环境变量的值
        char *update_mode = env_get("update_mode");
        if (update_mode == NULL) {
                printf("Environment variable 'update_mode' is not set.\n");
        } else if (strcmp(update_mode, "update") == 0) {
                printf("Environment variable 'update_mode' is set to 'update'.\n");
                printf("boot mode: recovery.\n");
                return BOOT_MODE_RECOVERY;
        } else if (strcmp(update_mode, "recovery") == 0) {
                printf("Environment variable 'update_mode' is set to 'recovery'.\n");
                printf("boot mode: recovery.\n");
                return BOOT_MODE_RECOVERY;
        } else if (strcmp(update_mode, "normal") == 0) {
                printf("Environment variable 'update_mode' is set to 'normal'.\n");
        } else {
                printf("Environment variable 'update_mode' is set to an unexpected value: '%s'.\n", update_mode);
        }  
    	......
}

实现检测到GPIO3_D3高电平,设置update_mode环境变量为recovery,如果检测到update_mode环境变量为update或者recovery进入recovery系统,否则进入normal系统。

3.2.3 关闭CONFIG_OPTEE_CLIENT

这里为啥要关闭CONFIG_OPTEE_CLIENT,主要是因为采用boot_fit启动时出现了如下错误;

INFO:    Preloader serial: 2
NOTICE:  BL31: v2.3():v2.3-152-g4e725b15f:cl
NOTICE:  BL31: Built : 10:51:13, Jul 15 2021
INFO:    GICv3 without legacy support detected.
INFO:    ARM GICv3 driver initialized in EL3
INFO:    pmu v1 is valid
INFO:    dfs DDR fsp_param[0].freq_mhz= 1056MHz
INFO:    dfs DDR fsp_param[1].freq_mhz= 324MHz
INFO:    dfs DDR fsp_param[2].freq_mhz= 528MHz
INFO:    dfs DDR fsp_param[3].freq_mhz= 780MHz
INFO:    Using opteed sec cpu_context!
INFO:    boot cpu mask: 0
INFO:    BL31: Initializing runtime services
WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
ERROR:   Error initializing runtime service opteed_fast
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0xa00000
INFO:    SPSR = 0x3c9

U-Boot 2017.09-orangepi (Jul 27 2024 - 23:26:07 +0800)
......
Failed to get scmi clk dev
dmc_fsp failed, ret=-19
......
## Booting FIT Image
boot mode: recovery (env)
at 0x7a080940 with size 0x017746f4
Fdt Ramdisk skip relocation
## Loading kernel from FIT Image at 7a080940 ...
   Using 'conf' configuration
optee check api revision fail: -1.0
optee api revision is too low
### ERROR ### Please RESET the board ###

这里出现了optee版本不兼容错误,更多细节可以参考这篇文章《OrangePi-3B 折腾笔记 —— 构建 U-Boot》。这里我们直接关闭CONFIG_OPTEE_CLIENT

u-boot编译使用的板载defconfig配置文件为:<SDK>/u-boot/v2017.09-rk3588/configs/orangepi-3b-rk3566_defconfig

因此修改文件配置项:

# CONFIG_OPTEE_CLIENT=y
# CONFIG_OPTEE_V2=y
# CONFIG_OPTEE_CLIENT is not set
2.2.4 修改fit_image_pre_process

修改cmd/bootfit.c文件do_boot_fit函数;

static int do_boot_fit(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
        // char fit_addr[12];   
        char fit_addr[32];
    	.......
        snprintf(fit_addr, sizeof(fit_addr), "0x%lx", (ulong)fit);
        // 获取fdtfile环境变量的值
        char *fdtfile = env_get("fdtfile");
        // 根据条件附加不同的字符串
        if (strcmp(fdtfile, "rockchip/rk3566-orangepi-3b.dtb") == 0) {
                snprintf(fit_addr + strlen(fit_addr), strlen("#conf1") + 1, "#conf1");
        } else {
            snprintf(fit_addr + strlen(fit_addr), strlen("#conf2") + 1, "#conf2");
        }
    	......
}

这里我们会根据fdtfile环境来决定使用FIT uImage中哪一个配置节点;

  • 如果fdtfilerockchip/rk3566-orangepi-3b.dtb,我们就使用conf1配置;
  • 如果fdtfilerockchip/rk3566-orangepi-3b-v2.dtb,我们就使用conf2配置。

2.3 编译u-boot

运行build.sh脚本,输入如下命令:

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ rm -rf output/debs/u-boot/*
root@ubuntu:/work/sambashare/rk3566/orangepi-build$ ./build.sh  BOARD=orangepi3b BRANCH=current BUILD_OPT=u-boot

当然也可以执行如下命令编译:

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ cd u-boot/v2017.09-rk3588
root@ubuntu:/work/sambashare/rk3566/orangepi-build/u-boot/v2017.09-rk3588$ make BL31=/work/sambashare/rk3566/orangepi-build/external/cache/sources/rkbin-tools/rk35/rk3568_bl31_v1.44.elf spl/u-boot-spl.bin u-boot.dtb u-boot.itb -j4 CROSS_COMPILE=aarch64-linux-gnu-

具体细节参考《Rockchip RK3566 - orangepi-build编译》编译u-boot小节。

2.4 烧录u-boot

这里介绍的是u-boot命令行中如何烧录u-boot,首先要将烧录的文件拷贝到tftp服务器:

root@ubuntu:/work/sambashare/rk3566/orangepi-build/u-boot/v2017.09-rk3588$ cp idbloader.img /work/tftpboot/
root@ubuntu:/work/sambashare/rk3566/orangepi-build/u-boot/v2017.09-rk3588$ cp u-boot.itb /work/tftpboot/

开发板进入u-boot命令行,首先设置ipserverip

setenv ipaddr 192.168.0.100
setenv serverip 192.168.0.200
setenv netmask 255.255.255.0
setenv gatewayip 192.168.0.1
saveenv

设置当前mmc启动设备,我这里是SD卡;

=> mmc list
dwmmc@fe2b0000: 0 (SD)
dwmmc@fe2c0000: 2
sdhci@fe310000: 1

=> mmc dev 0

烧写u-boot.itb

tftp 0x10000000 u-boot.itb
mmc erase 0x4000 0x2000
mmc write 0x10000000 0x4000 0x2000

烧写idbloader.img

tftp 0x10000000 idbloader.img
mmc erase 0x40 0x1000
mmc write 0x10000000 0x40 0x1000
reboot

然后重启u-boot

三、烧录recovery.img

3.1 系统分区调整

由于编译的Linux镜像Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img默认只有bootfsrootfs分区。

这个我们需要扩展分区:

  • recovery分区:存放我们制作的recovery.img,大小128MB
  • image1分区:存放出厂设定的Linux镜像,大小为4GB,避免出现问题无法还原;
  • image2分区:存放升级版本的Linux镜像,大小为4GB
3.1.1 prepare_partitions

我们修改scripts/debootstrap.sh脚本prepare_partitions函数。

(1) 在# Check if we need root partition之前追加;

# 新增recovery分区,不要定义成local变量,因为create_image函数也会使用到
recoverypart=$((next++))
RECOVERYSIZE=128

image1part=$((next++))
IMAGE1SIZE=4096

image2part=$((next++))
IMAGE2SIZE=4096

(2) 修改imagesize变量:

# local imagesize=$(($rootfs_size + $OFFSET + $BOOTSIZE + $UEFISIZE + $EXTRA_ROOTFS_MIB_SIZE)) # MiB
local imagesize=$(($rootfs_size + $OFFSET + $RECOVERYSIZE + $IMAGE1SIZE + $IMAGE2SIZE + $BOOTSIZE + $UEFISIZE + $EXTRA_ROOTFS_MIB_SIZE)) # MiB

需要注意的是按照这个计算出来的imagesize会有十几GB,而dd命令创建的Linux镜像大小为:

local sdsize=$(bc -l <<< "scale=0; ((($imagesize * 1.30) / 1 + 0) / 4 + 1) * 4")

因此我们最终制作出来的Linux镜像也是有十几G的。

(3) 在第一个if [[ -n "$rootpart" ]]; then之前追加;

if [[ -n "$recoverypart" ]]; then
		# gpt: Linux filesystem
		[[ "$IMAGE_PARTITION_TABLE" == "gpt" ]] &&
				local type="b2f2dcbb-03c4-472f-b79c-942895cec1a9"
		if [[ -n "$recoverypart" ]]; then
				echo "$recoverypart : name=\"recovery\", start=${next}MiB, size=${RECOVERYSIZE}MiB, type=${type}"
				local next=$(($next + $RECOVERYSIZE))
		else
				# no `size` argument mean "as much as possible"
				echo "$recoverypart : name=\"recovery\", start=${next}MiB, type=${type}"
		fi
fi

if [[ -n "$image1part" ]]; then
		# gpt: Linux filesystem
		[[ "$IMAGE_PARTITION_TABLE" == "gpt" ]] &&
				local type="69d9dd18-36be-4631-9ebb-78f05fe3217f"
		if [[ -n "$image1part" ]]; then
				echo "$image1part : name=\"image1\", start=${next}MiB, size=${IMAGE1SIZE}MiB, type=${type}"
				local next=$(($next + $IMAGE1SIZE))
		else
				# no `size` argument mean "as much as possible"
				echo "$image1part : name=\"image1\", start=${next}MiB, type=${type}"
		fi
fi

if [[ -n "$image2part" ]]; then
		# gpt: Linux filesystem
		[[ "$IMAGE_PARTITION_TABLE" == "gpt" ]] &&
				local type="a2092b92-af29-4760-8e68-7a201922573b"
		if [[ -n "$image2part" ]]; then
				echo "$image2part : name=\"image2\", start=${next}MiB, size=${IMAGE2SIZE}MiB, type=${type}"
				local next=$(($next + $IMAGE2SIZE))
		else
				# no `size` argument mean "as much as possible"
				echo "$image2part : name=\"image2\", start=${next}MiB, type=${type}"
		fi
fi

这里新增了recovery分区,位于bootfs分区后,大小为128MB

这里新增了image1分区,位于recovery分区后,大小为4096MB

这里新增了image2分区,位于image1分区后,大小为4096MB

(4) 在第二个if [[ -n "$rootpart" ]]; then之前追加;

if [[ -n $image1part ]]; then
		# /dev/loop18p3
		local image1device="${LOOP}p${image1part}"
		check_loop_device "$image1device"
		display_alert "Creating rootfs" "ext4 on $image1device"
		mkfs.ext4 -L opi_image1  $image1device >> "${DEST}"/${LOG_SUBPATH}/install.log 2>&1
		tune2fs -o journal_data_writeback $image1device > /dev/null
		mkdir -p  $MOUNT/userdata
		mount $image1device $MOUNT/userdata
		# 将镜像文件拷贝到image1分区
		if [[ -f $DEST/image1.img ]]; then
				  cp $DEST/image1.img $MOUNT/userdata
		else
				 display_alert "image1.img not found, please copy image1.img to" " <SDK>/output" wrn
		fi
		umount $MOUNT/userdata
fi

if [[ -n $image2part ]]; then	
		# /dev/loop18p4
		local image2device="${LOOP}p${image2part}"	
		check_loop_device "$image2device"
		display_alert "Creating rootfs" "ext4 on $image2device"
		# 格式化文件系统
		mkfs.ext4 -L opi_image2  $image2device >> "${DEST}"/${LOG_SUBPATH}/install.log 2>&1
		tune2fs -o journal_data_writeback $image2device > /dev/null
		local rootfs="UUID=$(blkid -s UUID -o value $image2device)"
		echo "$rootfs /userdata ext4 defaults,noatime,commit=600,errors=remount-ro 0 1" >> $SDCARD/etc/fstab
fi

这里我们从<SDK>/output目录下获取image1.img,因此需要将出厂的Linux镜像放到放到该目录下注意大小不能超过分区大小。

3.1.2 create_image

我们修改scripts/debootstrap.sh脚本create_image函数。

write_uboot $LOOP之后追加如下脚本;

if [[ -f $DEST/recovery.img ]]; then
	check_loop_device "${LOOP}p${recoverypart}"
	dd if=$DEST/recovery.img of=${LOOP}p${recoverypart}  bs=1M status=none > /dev/null 2>&1;
else
	exit_with_error "recovery.img not found, please copy recovery.img to" " <SDK>/output"
fi

这里我们从<SDK>/output目录下获取recovery.img,并将其烧录到linux镜像的recovery分区中;

因此,制作完recovery.img我们需要将其拷贝到<SDK>/output目录下。

这里我们将修改后的scripts/debootstrap.sh脚本拷贝到recovery作为备份;

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ cp scripts/debootstrap.sh  ../recovery/

3.2 编译Linux镜像

运行build.sh脚本,直接输入如下命令:

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ ./build.sh BOARD=orangepi3b BRANCH=legacy BUILD_OPT=image RELEASE=jammy BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img

注意:

  • kernel版本,这里我们选择legacy
  • Linux发行版的类型,这里我们选择jammy Ubuntu jammy 22.04 LTS

如果我们没有对u-bootkernel源码进行修改,我可以修改<SDK>/userpatches/config-default.conf

# CLEAN_LEVEL="debs,oldcache" 
CLEAN_LEVEL="oldcache"  

这样就不会每次编译的是否都重新编译u-bootkernel。但是如果我们修改了u-bootkernel就必须重新编译,即配置:

CLEAN_LEVEL="debs,oldcache" 

具体细节参考《Rockchip RK3566 - orangepi-build编译》编译Linux镜像小节。

(1) 注意如果编译中出现如下错误:

E: Failed to fetch http://repo.huaweicloud.com/ubuntu-ports/pool/universe/c/can-utils/can-utils_2020.11.0-1_arm64.deb  Could not resolve 'repo.huaweicloud.com

构建Linux发行版默认使用的软件源是华为源,我们可以尝试添加其它下载源,即修改script/configuration.sh文件中,添加UBUNTU_MIRRORDEBIAN_MIRRORDEBIAN_SECURTY

if [[ $DOWNLOAD_MIRROR == "china" ]] ; then

        if [[ ${CHINA_DOWNLOAD_MIRROR} == tsinghua ]]; then
                DEBIAN_MIRROR='mirrors.tuna.tsinghua.edu.cn/debian'
                DEBIAN_SECURTY='mirrors.tuna.tsinghua.edu.cn/debian-security'
                UBUNTU_MIRROR='mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/'
        fi

        if [[ ${CHINA_DOWNLOAD_MIRROR} == huawei ]]; then
                DEBIAN_MIRROR='repo.huaweicloud.com/debian'
                DEBIAN_SECURTY='repo.huaweicloud.com/debian-security'
                UBUNTU_MIRROR='repo.huaweicloud.com/ubuntu-ports/'
        fi

        RASPI_MIRROR='mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/'
fi

也可以修改<SDK>/userpatches/config-default.conf配置默认下载源为清华源,具体如下:

CHINA_DOWNLOAD_MIRROR="tsinghua"

(2) 如果编译过程中卡在如下这一步,这是由于DNS(域名系统)解析器的配置有问题;

[ .... ] Installing [ orangepi-zsh_1.0.6_all.deb ]

我们可以进入<SDK>/.tmp目录,执行如下命令;

root@ubuntu:/work/sambashare/rk3566/orangepi-build/.tmp# chroot rootfs-0e052233-5d80-4191-a320-ac2f716e482f/

chroot 命令用于更改当前进程的根目录,使其在新的根目录中运行,它常用于创建隔离的环境或进行系统恢复。

修改网络DNS配置文件:

root@ubuntu:/# vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

然后我们在重启网络:

root@ubuntu:/# /etc/init.d/networking restart

执行更新操作:

root@ubuntu:/# sudo apt-get update
Hit:1 http://repo.huaweicloud.com/ubuntu-ports jammy InRelease
Hit:2 http://repo.huaweicloud.com/ubuntu-ports jammy-security InRelease
Hit:3 http://repo.huaweicloud.com/ubuntu-ports jammy-updates InRelease
Hit:4 http://repo.huaweicloud.com/ubuntu-ports jammy-backports InRelease
3.2.1 编译日志

编译输出日志位于<SDK>/output/debug/install.log<SDK>/output/debug/output.log等文件中,由于内容过多,就不贴出来了。

这里我们看一下控制台输出的日志:

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ ./build.sh BOARD=orangepi3b BRANCH=legacy BUILD_OPT=image RELEASE=jammy BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img
[ o.k. ] Using config file [ /work/sambashare/rk3566/orangepi-build/userpatches/config-example.conf ]
[ o.k. ] Command line: setting BOARD to [ orangepi3b ]
[ o.k. ] Command line: setting BRANCH to [ legacy ]
[ o.k. ] Command line: setting BUILD_OPT to [ image ]
[ o.k. ] Command line: setting RELEASE to [ jammy ]
[ o.k. ] Command line: setting BUILD_MINIMAL to [ no ]
[ o.k. ] Command line: setting BUILD_DESKTOP to [ no ]
[ o.k. ] Command line: setting KERNEL_CONFIGURE to [ no ]
[ o.k. ] Command line: setting COMPRESS_OUTPUTIMAGE to [ sha,gpg,img ]
[ .... ] Extension being added [ rkbin-tools :: added by ./build.sh:305 -> scripts/main.sh:386 -> scripts/configuration.sh:151 -> external/config/sources/families/rockchip-rk356x.conf:1 -> external/config/sources/families/include/rockchip64_common.inc:5 -> scripts/extensions.sh:0 ]
[ o.k. ] Extension manager [ processed 3 Extension Methods calls and 3 Extension Method implementations ]
[ o.k. ] Preparing [ host ]
[ o.k. ] Build host OS release [ jammy ]
[ .... ] Installing build dependencies
[ o.k. ] Syncing clock [ cn.pool.ntp.org ]
[ o.k. ] Checking for external GCC compilers
[ o.k. ] Building deb [ orangepi-plymouth-theme ]
[ o.k. ] Starting rootfs and image building process for [ legacy orangepi3b jammy null null no ]
[ o.k. ] Extracting jammy-cli-arm64.d4c...0ea.tar.lz4 [ 0 days old ]
[ .... ] jammy-cli-arm64.d4c...0ea.tar.lz4:  470MiB [ 127MiB/s] [======================================================================================>] 100%
[ o.k. ] Applying distribution specific tweaks for [ jammy ]
[ o.k. ] Applying common tweaks
[ .... ] Cleaning [ package lists ]
[ .... ] Updating [ package lists ]
[ .... ] Temporarily disabling [ initramfs-tools hook for kernel ]
[ .... ] Installing PACKAGE_LIST_FAMILY packages [ ethtool can-utils ]
E: Failed to fetch http://repo.huaweicloud.com/ubuntu-ports/pool/universe/c/can-utils/can-utils_2020.11.0-1_arm64.deb  Could not resolve 'repo.huaweicloud.com'
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
[ .... ] Removing PACKAGE_LIST_FAMILY_REMOVE packages [ mpv ]
[ .... ] Installing [ linux-u-boot-legacy-orangepi3b_1.0.6_arm64.deb ]
[ .... ] Installing [ linux-image-legacy-rockchip-rk356x_1.0.6_arm64.deb ]
[ .... ] Installing [ linux-dtb-legacy-rockchip-rk356x_1.0.6_arm64.deb ]
[ .... ] Installing [ orangepi-bsp-cli-orangepi3b_1.0.6_arm64.deb ]
[ .... ] Installing [ orangepi-firmware_1.0.6_all.deb ]
[ .... ] Installing [ orangepi-config_1.0.6_all.deb ]
[ .... ] Installing [ orangepi-zsh_1.0.6_all.deb ]
[ .... ] Installing [ wiringpi_2.53.deb ]
cp: cannot stat '/work/sambashare/rk3566/orangepi-build/external/cache/sources/wiringOP/next': No such file or directory
cp: cannot stat '/work/sambashare/rk3566/orangepi-build/external/cache/sources/wiringOP-Python/next': No such file or directory
[ o.k. ] Enabling serial console [ ttyFIQ0 ]
[ o.k. ] Building kernel splash logo [ jammy ]
[ .... ] Installing extras-buildpkgs [  hostapd htop mmc-utils ]
[ o.k. ] Calling image customization script [ customize-image.sh ]
[ o.k. ] No longer needed packages [ purge ]
[ o.k. ] Unmounting [ /work/sambashare/rk3566/orangepi-build/.tmp/rootfs-0e052233-5d80-4191-a320-ac2f716e482f ]
[ o.k. ] Preparing image file for rootfs [ orangepi3b jammy ]
[ o.k. ] Current rootfs size [ 1647 MiB ]
[ o.k. ] Creating blank image for rootfs [ 14328 MiB ]
[ .... ] dd: 14.0GiB [ 129MiB/s] [=====================================================================================================================>] 100%
[ o.k. ] Creating partitions [ /boot: fat root: ext4 ]
[ .... ] Creating rootfs [ ext4 on /dev/loop6p3 ]
[ warn ] image1.img not found, please copy image1.img to [  <SDK>/output ]
umount: /work/sambashare/rk3566/orangepi-build/.tmp/mount-0e052233-5d80-4191-a320-ac2f716e482f/userdata: not mounted.
[ .... ] Creating rootfs [ ext4 on /dev/loop6p4 ]
[ .... ] Creating rootfs [ ext4 on /dev/loop6p5 ]
[ .... ] Creating /boot [ fat on /dev/loop6p1 ]
[ .... ] Copying files to [ / ]
[ .... ] Copying files to [ /boot ]
[ .... ] Updating initramfs... [ update-initramfs -uv -k 5.10.160-rockchip-rk356x ]
[ o.k. ] Updated initramfs. [ for details see: /work/sambashare/rk3566/orangepi-build/output/debug/install.log ]
[ .... ] Re-enabling [ initramfs-tools hook for kernel ]
[ o.k. ] Unmounting [ /work/sambashare/rk3566/orangepi-build/.tmp/mount-0e052233-5d80-4191-a320-ac2f716e482f/ ]
[ o.k. ] Free SD cache [ 19% ]
[ o.k. ] Mount point [ 35% ]
[ o.k. ] Writing U-boot bootloader [ /dev/loop6 ]
[ o.k. ] SHA256 calculating [ Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img ]
[ o.k. ] Done building [ /work/sambashare/rk3566/orangepi-build/output/images/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img ]
[ o.k. ] Runtime [ 28 min ]
[ o.k. ] Repeat Build Options [ sudo ./build.sh  BOARD=orangepi3b BRANCH=legacy BUILD_OPT=image RELEASE=jammy BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img  ]
3.2.2 编译输出

编译生成的Linux镜像的存放在<SDK>/output/images/目录下;

root@ubuntu:/work/sambashare/rk3566/orangepi-build$ ll output/images/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160/
-rw-rw-r-- 1 root root 15023996928  8月 10 22:16 Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img
-rw-rw-r-- 1 root root         121  8月 10 22:17 Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img.sha

需要注意这里的镜像文件有将近15G,因此烧录所使用的SD卡容量要大于这个,推荐使用32G

3.2.3 查看分区

这里我们查看Linux镜像的分区表;

root@ubuntu:/work/sambashare/rk3566/orangepi-build/output/images/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160$ sfdisk -J ./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img
{
   "partitiontable": {
      "label": "gpt",
      "id": "B918CCE8-8D8E-B341-BB4E-56A44BFA0BD3",
      "device": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img",
      "unit": "sectors",
      "firstlba": 2048,
      "lastlba": 29343710,
      "sectorsize": 512,
      "partitions": [
         {
            "node": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img1",
            "start": 61440,
            "size": 2097152,
            "type": "BC13C2FF-59E6-4262-A352-B275FD6F7172",
            "uuid": "54981FDA-FE39-4948-9321-FC280D58F3DA",
            "name": "bootfs"
         },{
            "node": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img2",
            "start": 2158592,
            "size": 262144,
            "type": "B2F2DCBB-03C4-472F-B79C-942895CEC1A9",
            "uuid": "D1887BC1-BB33-6347-9FAA-367884F48050",
            "name": "recovery"
         },{
            "node": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img3",
            "start": 2420736,
            "size": 8388608,
            "type": "69D9DD18-36BE-4631-9EBB-78F05FE3217F",
            "uuid": "5B8344CA-2A0F-2146-B254-126F35FE5B91",
            "name": "image1"
         },{
            "node": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img4",
            "start": 10809344,
            "size": 8388608,
            "type": "A2092B92-AF29-4760-8E68-7A201922573B",
            "uuid": "F9189EB4-1BD6-404A-8D4A-BC6E8B4620E6",
            "name": "image2"
         },{
            "node": "./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img5",
            "start": 19197952,
            "size": 10145759,
            "type": "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
            "uuid": "AD889D66-0F10-3849-9A64-44581E7FFF0C",
            "name": "rootfs"
         }
      ]
   }
}

可以看到有5个分区:

  • bootfs分区:扇区61440~2158591,大小为1GB,启动引导分区;
  • recovery分区:扇区2158592~2420735,大小为128MBrecovery分区;
  • image1分区:扇区2420736~10809343,大小为4GBimage1分区;
  • image2分区:扇区10809344~19197951,大小为4GBimage2分区;
  • rootfs分区:扇区19197952~29343711,大小为4.7GB,根文件系统分区。

这里我们来查看recovery分区开始的256个字节内容:

root@ubuntu:/work/sambashare/rk3566/orangepi-build/output/images/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160$ xxd -b -e -s $((2158592*512)) -l 0x100 ./Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img
41e00000: edfe0dd0 6c060000 38000000 e0050000  .......l...8....
41e00010: 28000000 11000000 10000000 00000000  ...(............
41e00020: 8c000000 a8050000 00000000 00000000  ................
41e00030: 00000000 00000000 01000000 00000000  ................
41e00040: 03000000 04000000 64000000 9e4fb766  ...........df.O.
41e00050: 03000000 1f000000 00000000 6f422d55  ............U-Bo
41e00060: 4620746f 73205449 6372756f 69662065  ot FIT source fi
41e00070: 6620656c 6120726f 00006d72 01000000  le for arm......
41e00080: 67616d69 00007365 01000000 31746466  images......fdt1
41e00090: 00000000 03000000 04000000 82000000  ................
41e000a0: d8890200 03000000 04000000 74000000  ...............t
41e000b0: 00080000 03000000 1e000000 00000000  ................
41e000c0: 74616c46 656e6574 65442064 65636976  Flattened Device
41e000d0: 65725420 6c622065 7620626f 00000031   Tree blob v1...
41e000e0: 03000000 08000000 11000000 74616c66  ............flat
41e000f0: 0074645f 03000000 06000000 16000000  _dt.............

接着我们去查看recovery.img原文件的前256个字节内容;

root@ubuntu:/work/sambashare/rk3566/orangepi-build/output$ xxd -b -e -l 0x100  recovery.img
00000000: edfe0dd0 6c060000 38000000 e0050000  .......l...8....
00000010: 28000000 11000000 10000000 00000000  ...(............
00000020: 8c000000 a8050000 00000000 00000000  ................
00000030: 00000000 00000000 01000000 00000000  ................
00000040: 03000000 04000000 64000000 9e4fb766  ...........df.O.
00000050: 03000000 1f000000 00000000 6f422d55  ............U-Bo
00000060: 4620746f 73205449 6372756f 69662065  ot FIT source fi
00000070: 6620656c 6120726f 00006d72 01000000  le for arm......
00000080: 67616d69 00007365 01000000 31746466  images......fdt1
00000090: 00000000 03000000 04000000 82000000  ................
000000a0: d8890200 03000000 04000000 74000000  ...............t
000000b0: 00080000 03000000 1e000000 00000000  ................
000000c0: 74616c46 656e6574 65442064 65636976  Flattened Device
000000d0: 65725420 6c622065 7620626f 00000031   Tree blob v1...
000000e0: 03000000 08000000 11000000 74616c66  ............flat
000000f0: 0074645f 03000000 06000000 16000000  _dt.............

可以发现内容是一样的,说明recovery.img镜像成功烧录到了Linux镜像。

3.3 制作SD启动卡

我们将SD卡插入PC上,在虚拟机ubuntu中运行demsg查看新接入的设备;

[15204.229360] usb 2-1: new high-speed USB device number 4 using ehci-pci
[15204.501054] usb 2-1: New USB device found, idVendor=14cd, idProduct=1212, bcdDevice= 1.00
[15204.501064] usb 2-1: New USB device strings: Mfr=1, Product=3, SerialNumber=2
[15204.501066] usb 2-1: Product: Mass Storage Device
[15204.501068] usb 2-1: Manufacturer: Generic
[15204.501069] usb 2-1: SerialNumber: 121220160204
[15204.503028] usb-storage 2-1:1.0: USB Mass Storage device detected
[15204.504343] scsi host33: usb-storage 2-1:1.0
[15205.513730] scsi 33:0:0:0: Direct-Access     Mass     Storage Device   1.00 PQ: 0 ANSI: 0 CCS
[15205.514126] sd 33:0:0:0: Attached scsi generic sg2 type 0
[15205.793890] sd 33:0:0:0: [sdb] 62333952 512-byte logical blocks: (31.9 GB/29.7 GiB)
[15205.796859] sd 33:0:0:0: [sdb] Write Protect is off
[15205.796863] sd 33:0:0:0: [sdb] Mode Sense: 03 00 00 00
[15205.799262] sd 33:0:0:0: [sdb] No Caching mode page found
[15205.799267] sd 33:0:0:0: [sdb] Assuming drive cache: write through
[15205.865667]  sdb: sdb1 sdb2 sdb3 sdb4 sdb5 sdb6 sdb7 sdb8 sdb9
[15205.867294] sd 33:0:0:0: [sdb] Attached SCSI removable disk

可以看到SD卡对应的设备节点为/dev/sdb,对应9个分区,这个是因为我之前烧录的RK3588安卓镜像;

root@ubuntu:~$ ls /dev/sdb*
/dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4  /dev/sdb5  /dev/sdb6  /dev/sdb7  /dev/sdb8  /dev/sdb9

开始制作SD启动卡:

root@ubuntu:~$ cd /work/sambashare/rk3566/orangepi-build
root@ubuntu:/work/sambashare/rk3566/orangepi-build$ dd if=output/images/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160/Orangepi3b_1.0.6_ubuntu_jammy_server_linux5.10.160.img of=/dev/sdb bs=32M status=progress
root@ubuntu:/work/sambashare/rk3566/orangepi-build$ sync

制作过程大概花费了30分钟。

四、系统测试

4.1 normal系统测试

SD卡插入到开发板,并使用准备好的USB转串口适配器和连接线,连接开发板,给开发板上电,开发板上电会直接进入normal系统。

我们首先查看系统信息;

orangepi@orangepi3b:~$ cat /etc/os-release
PRETTY_NAME="Orange Pi 1.0.6 Jammy"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
orangepi@orangepi3b:~$ uname -a
Linux orangepi3b 5.10.160-rockchip-rk356x #1.0.6 SMP Wed Aug 7 22:27:33 CST 2024 aarch64 aarch64 aarch64 GNU/Linux
4.1.1 查看块设备

查看eMMC块设备文件:

orangepi@orangepi3b:~$ ls /dev/mmc* -l
brw-rw---- 1 root disk 179,   0 Aug  6 16:28 /dev/mmcblk0
brw-rw---- 1 root disk 179,  32 Aug  6 16:28 /dev/mmcblk0boot0
brw-rw---- 1 root disk 179,  64 Aug  6 16:28 /dev/mmcblk0boot1
brw-rw---- 1 root disk 179,   1 Aug  6 16:28 /dev/mmcblk0p1
brw-rw---- 1 root disk 179,   2 Aug  6 16:28 /dev/mmcblk0p2
crw------- 1 root root 242,   0 Aug  6 16:28 /dev/mmcblk0rpmb
brw-rw---- 1 root disk 179,  96 Aug  6 16:28 /dev/mmcblk1
brw-rw---- 1 root disk 179,  97 Aug  6 16:28 /dev/mmcblk1p1
brw-rw---- 1 root disk 179,  98 Aug  6 16:28 /dev/mmcblk1p2
brw-rw---- 1 root disk 179,  99 Aug  6 16:28 /dev/mmcblk1p3
brw-rw---- 1 root disk 179, 100 Aug  6 16:28 /dev/mmcblk1p4
brw-rw---- 1 root disk 179, 101 Aug  6 16:28 /dev/mmcblk1p5

/dev/mmcblk0eMMC设备,/dev/mmcblk1SD设备。可以看到/dev/mmcblk1设备划分了5个分区,分区设备依次为;

  • /dev/mmcblk1p1bootfs分区;
  • /dev/mmcblk1p2recovery分区;
  • /dev/mmcblk1p3image1分区;
  • /dev/mmcblk1p4image2分区;
  • /dev/mmcblk1p5rootfs分区。
4.1.2 查看磁盘空间

这里我们可以通过df -hT查看磁盘空间信息;

orangepi@orangepi3b:~$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
tmpfs          tmpfs  198M  5.5M  193M   3% /run
/dev/mmcblk1p5 ext4   4.7G  1.6G  3.0G  35% /
tmpfs          tmpfs  990M     0  990M   0% /dev/shm
tmpfs          tmpfs  5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs  990M  4.0K  990M   1% /tmp
/dev/mmcblk1p4 ext4   3.9G   24K  3.7G   1% /userdata
/dev/mmcblk1p1 vfat  1022M  127M  896M  13% /boot
/dev/zram1     ext4    47M  1.6M   42M   4% /var/log
tmpfs          tmpfs  198M     0  198M   0% /run/user/1000

其中:

  • /dev/mmcblk1p1这个vfat类型的文件系统挂载到了目录/boot
  • /dev/mmcblk1p4这个ext4类型的文件系统挂载到了/userdata
  • /dev/mmcblk1p5这个ext4类型的文件系统挂载到了根目录/

为什么这里看到的/dev/mmcblk1p5大小只有4.7G呢?我们SD卡是29.7 GiB,除了/dev/mmcblk1p~5这三个分区外,不是应该有一些空余?这主要是因为我们制作的rootfs分区镜像就是那么大,剩余的SD空间并未使用。

orangepi@orangepi3b:~$ fdisk -l /dev/mmcblk1
GPT PMBR size mismatch (29343743 != 62333951) will be corrected by write.
The backup GPT table is not on the end of the device.
Disk /dev/mmcblk1: 29.72 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B918CCE8-8D8E-B341-BB4E-56A44BFA0BD3

Device            Start      End  Sectors  Size Type
/dev/mmcblk1p1    61440  2158591  2097152    1G Linux extended boot
/dev/mmcblk1p2  2158592  2420735   262144  128M unknown
/dev/mmcblk1p3  2420736 10809343  8388608    4G unknown
/dev/mmcblk1p4 10809344 19197951  8388608    4G unknown
/dev/mmcblk1p5 19197952 29343710 10145759  4.8G Linux filesystem

orangepi@orangepi3b:~$ parted
.......
Model: SD SD32G (sd/mmc)
Disk /dev/mmcblk1: 31.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name      Flags
 1      31.5MB  1105MB  1074MB  fat32        bootfs    bls_boot
 2      1105MB  1239MB  134MB                recovery
 3      1239MB  5534MB  4295MB  ext4         image1
 4      5534MB  9829MB  4295MB  ext4         image2
 5      9829MB  15.0GB  5195MB  ext4         rootfs
 .......
4.1.3 使用fdisk扩展分区

/dev/mmcblk1p1分区是bootfs分区,千万不要动。/dev/mmcblk1p5分区时rootfs分区,我们主要扩容的目标,大致逻辑时删除p5分区,然后重新加一个p5分区;

注意:操作之前先切换root/orangepi账号。

# 1. fdisk /dev/mmcblk1  , 这里主要看你fdisk -l 的输出
root@orangepi3b:~# fdisk /dev/mmcblk1

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

# 2. 输入p,查看当前分区
Command (m for help): p

# 3. d, 删除p5分区
Command (m for help): d
Partition number (1-5, default 5): 5

Partition 5 has been deleted.

# 4. 输入n ,新建p5分区  默认
Command (m for help): n
Partition number (5-128, default 5): 

# 输入p5起始分区地址  默认
First sector (34-62333918, default 19197952): 

# 输入p3结束分区地地址 不输入直接回车就好,它会把剩下的内存都分配
Last sector, +/-sectors or +/-size{K,M,G,T,P} (19197952-62333918, default 62333918):

Created a new partition 5 of type 'Linux filesystem' and of size 20.6 GiB.
Partition #5 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n

# 5. 保存退出
Command (m for help): w
The partition table has been altered.
Syncing disks.

接着重启系统:

root@orangepi3b:~# reboot

注意:如果我们不想每次烧录Linux镜像之后都要通过fdisk调整p5分区,可以尝试修改scripts/debootstrap.sh设置rootfs分区为剩余eMMC磁盘的大小,比如:

#echo "$rootpart : name=\"rootfs\", start=${next}MiB, type=${type}"
echo "$rootpart : name=\"rootfs\", start=${next}MiB, size=20480MiB, type=${type}"

这种写法我并没有做测试,可能不会

最后我们可以通过resize2fs指令进行扩容:

root@orangepi3b:~# resize2fs /dev/mmcblk1p5
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mmcblk1p5 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mmcblk1p5 is now 5391995 (4k) blocks long.

再次查看磁盘容量大小:

root@orangepi3b:~# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
tmpfs          tmpfs  198M  5.5M  193M   3% /run
/dev/mmcblk1p5 ext4    21G  1.6G   19G   8% /
tmpfs          tmpfs  990M     0  990M   0% /dev/shm
tmpfs          tmpfs  5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs  990M  4.0K  990M   1% /tmp
/dev/mmcblk1p4 ext4   3.9G   24K  3.7G   1% /userdata
/dev/mmcblk1p1 vfat  1022M  127M  896M  13% /boot
/dev/zram1     ext4    47M  2.1M   42M   5% /var/log
tmpfs          tmpfs  198M     0  198M   0% /run/user/1000
4.1.4 GPIO控制

wiringOP可以用来对GPIO进行控制,wiringOP目前主要适配了设置GPIO口输入输出,设置GPIO口输出高低电平以及设置上下拉电阻的功能,像硬件PWM这样的功能是用不了的。

具体参考:《安装wiringOP的方法》,其中包含了40pin接口GPIOI2CUARTSPIPWM测试;

root@orangepi3b:~# gpio readall
 +------+-----+----------+--------+---+   PI3B   +---+--------+----------+-----+------+
 | GPIO | wPi |   Name   |  Mode  | V | Physical | V |  Mode  | Name     | wPi | GPIO |
 +------+-----+----------+--------+---+----++----+---+--------+----------+-----+------+
 |      |     |     3.3V |        |   |  1 || 2  |   |        | 5V       |     |      |
 |  140 |   0 |    SDA.2 |     IN | 1 |  3 || 4  |   |        | 5V       |     |      |
 |  141 |   1 |    SCL.2 |     IN | 1 |  5 || 6  |   |        | GND      |     |      |
 |  147 |   2 |    PWM15 |     IN | 0 |  7 || 8  | 1 | ALT1   | RXD.2    | 3   | 25   |
 |      |     |      GND |        |   |  9 || 10 | 1 | ALT1   | TXD.2    | 4   | 24   |
 |  118 |   5 | GPIO3_C6 |     IN | 0 | 11 || 12 | 0 | IN     | GPIO3_C7 | 6   | 119  |
 |  128 |   7 | GPIO4_A0 |     IN | 0 | 13 || 14 |   |        | GND      |     |      |
 |  130 |   8 |    TXD.7 |     IN | 0 | 15 || 16 | 0 | IN     | RXD.7    | 9   | 131  |
 |      |     |     3.3V |        |   | 17 || 18 | 0 | IN     | GPIO4_A1 | 10  | 129  |
 |  138 |  11 | SPI3_TXD |     IN | 0 | 19 || 20 |   |        | GND      |     |      |
 |  136 |  12 | SPI3_RXD |     IN | 0 | 21 || 22 | 0 | IN     | TXD.9    | 13  | 132  |
 |  139 |  14 | SPI3_CLK |     IN | 0 | 23 || 24 | 0 | IN     | SPI3_CS1 | 15  | 134  |
 |      |     |      GND |        |   | 25 || 26 | 0 | IN     | GPIO4_A7 | 16  | 135  |
 |   32 |  17 |    SDA.3 |     IN | 1 | 27 || 28 | 1 | IN     | SCL.3    | 18  | 33   |
 |  133 |  19 |    RXD.9 |     IN | 0 | 29 || 30 |   |        | GND      |     |      |
 |  124 |  20 | GPIO3_D4 |     IN | 0 | 31 || 32 | 0 | IN     | PWM11    | 21  | 144  |
 |  127 |  22 | GPIO3_D7 |     IN | 0 | 33 || 34 |   |        | GND      |     |      |
 |  120 |  23 | GPIO3_D0 |     IN | 0 | 35 || 36 | 0 | IN     | GPIO3_D5 | 24  | 125  |
 |  123 |  25 | GPIO3_D3 |     IN | 0 | 37 || 38 | 0 | IN     | GPIO3_D2 | 26  | 122  |
 |      |     |      GND |        |   | 39 || 40 | 0 | IN     | GPIO3_D1 | 27  | 121  |
 +------+-----+----------+--------+---+----++----+---+--------+----------+-----+------+
 | GPIO | wPi |   Name   |  Mode  | V | Physical | V |  Mode  | Name     | wPi | GPIO |
 +------+-----+----------+--------+---+   PI3B   +---+--------+----------+-----+------+

4.2 进入recovery系统

SD卡插入到开发板,并使用准备好的USB转串口适配器和连接线,连接开发板。

进入recovery系统有多种方式,这里我们就介绍其中的两种;

  • 修改环境变量;
  • 调整GPIO输入电平;
4.2.1 修改环境变量

我们给开发板上电,在启动过程中按下CTRL+C进入uboot命令行模式;

View Code
U-Boot 2017.09-orangepi (Aug 11 2024 - 23:09:55 +0800)

Model: Orange Pi 3B
PreSerial: 2, raw, 0xfe660000
DRAM:  2 GiB
Sysmem: init
Relocation Offset: 7d23c000
Relocation fdt: 7b9f6030 - 7b9fecb8
CR: M/C/I
Hotkey: ctrl+c
dwmmc@fe2b0000: 0, dwmmc@fe2c0000: 2, sdhci@fe310000: 1
Bootdev(atags): mmc 0
MMC0: Legacy, 52Mhz
PartType: EFI
DM: v1
Environment variable 'update_mode' is not set.
boot mode: normal
I2c0 speed: 100000Hz
vsel-gpios- not found! Error: -2
vdd_cpu init 900000 uV
PMIC:  RK8090 (on=0x40, off=0x00)
vdd_logic init 900000 uV
vdd_gpu init 900000 uV
vdd_npu init 900000 uV
io-domain: OK
Failed to get scmi clk dev
dmc_fsp failed, ret=-19
Model: Orange Pi 3B
## Error: Can't overwrite "ethaddr"
## Error inserting "ethaddr" variable, errno=1
## Error: Can't overwrite "eth1addr"
## Error inserting "eth1addr" variable, errno=1
Environment variable 'update_mode' is set to 'normal'.
CLK: (sync kernel. arm: enter 816000 KHz, init 816000 KHz, kernel 0N/A)
  apll 816000 KHz
  dpll 528000 KHz
  gpll 1188000 KHz
  cpll 1000000 KHz
  npll 1200000 KHz
  vpll 24000 KHz
  hpll 24000 KHz
  ppll 200000 KHz
  armclk 816000 KHz
  aclk_bus 150000 KHz
  pclk_bus 100000 KHz
  aclk_top_high 300000 KHz
  aclk_top_low 200000 KHz
  hclk_top 150000 KHz
  pclk_top 100000 KHz
  aclk_perimid 300000 KHz
  hclk_perimid 150000 KHz
  pclk_pmu 100000 KHz
Net:   eth1: ethernet@fe010000
Hit key to stop autoboot('CTRL+C'):  0
=>
4.2.1.1 mmc命令

查看分区:

=> mmc info
Device: dwmmc@fe2b0000
Manufacturer ID: 3
OEM: 5344
Name: SD32G
Timing Interface: Legacy
Tran Speed: 52000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 29.7 GiB # 当前设备是我的SD卡
Bus Width: 4-bit
Erase Group Size: 512 Bytes
=> mmc part

Partition Map for MMC device 0  --   Partition Type: EFI

Part    Start LBA       End LBA         Name
        Attributes
        Type GUID
        Partition GUID
  1     0x0000f000      0x0020efff      "bootfs"
        attrs:  0x0000000000000000
        type:   bc13c2ff-59e6-4262-a352-b275fd6f7172
        guid:   fd33c25c-498c-aa40-86c9-9d208eab6605
  2     0x0020f000      0x0024efff      "recovery"
        attrs:  0x0000000000000000
        type:   b2f2dcbb-03c4-472f-b79c-942895cec1a9
        guid:   4135519f-aec4-f240-8c9c-1ad00fe709a5
  3     0x0024f000      0x00a4efff      "image1"
        attrs:  0x0000000000000000
        type:   69d9dd18-36be-4631-9ebb-78f05fe3217f
        guid:   b7f8981f-406c-6041-9205-f6159392df9f
  4     0x00a4f000      0x0124efff      "image2"
        attrs:  0x0000000000000000
        type:   a2092b92-af29-4760-8e68-7a201922573b
        guid:   0765cd8a-6ea5-d744-a80c-fec92944cbfe
  5     0x0124f000      0x01cddfde      "rootfs"
        attrs:  0x0000000000000000
        type:   0fc63daf-8483-4772-8e79-3d69d8477de4
        guid:   fa74633f-611f-a643-92a9-c0e3708c9e7f

可以看到三个分区:

  • bootfs分区:扇区范围0x0000f000~0x0020efff,即61440~2158591,大小为1GB,启动引导分区;
  • recovery分区:扇区范围0x0020f000~0x0024efff,即2158592~2420735,大小为128MBrecovery分区;
  • recovery分区:扇区范围0x0024f000~0x00a4efff,即2420736~10809343,大小为4GBimage1分区;
  • recovery分区:扇区范围0x00a4f000~0x0124efff,即10809344~19197951,大小为4GBimage2分区;
  • rootfs分区:扇区范围0x0124f000~0x01cddfde,即19197952~30269406,大小为5.2GB,根文件系统分区。
4.2.1.2 setenv命令

设置环境变量:

=> printenv reboot_mode
## Error: "reboot_mode" not defined
=> setenv reboot_mode recovery
=> saveenv
Saving Environment to MMC...
Writing to MMC(0)... done
=> boot

这样启动就会自动进入recovery系统。

如果要进入normal系统,设置环境变量:

=> setenv reboot_mode normal
=> saveenv
Saving Environment to MMC...
Writing to MMC(0)... done
=> boot
4.2.1.3 启动日志

完整启动日志如下:

View Code
## Booting FIT Image at 0x7a076b80#conf2 with size 0x0177e5dc
Environment variable 'update_mode' is set to 'normal'.
boot mode: recovery (env)
Fdt Ramdisk skip relocation
## Loading kernel from FIT Image at 7a076b80 ...
   Using 'conf2' configuration
## Verified-boot: 0
   Trying 'kernel' kernel subimage
     Description:  Vanilla Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x7a0c8874
     Data Size:    12010836 Bytes = 11.5 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x00280000
     Entry Point:  0x00280000
     Hash algo:    sha256
     Hash value:   c6649ab96e10f46cbedc1c8776541c82af3228bd6bbb6c34c2adc24f92a4001e
   Verifying Hash Integrity ... sha256+ OK
## Loading ramdisk from FIT Image at 7a076b80 ...
   Using 'conf2' configuration
   Trying 'ramdisk' ramdisk subimage
     Description:  Ramdisk for project-x
     Type:         RAMDisk Image
     Compression:  gzip compressed
     Data Start:   0x7ac3cdc8
     Data Size:    12288397 Bytes = 11.7 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x0a200000
     Entry Point:  unavailable
     Hash algo:    sha256
     Hash value:   98bd7d51b9276a9c4a383904ede1bb8689c64aa75c7a943d49c87f7f5dbaafc4
   Verifying Hash Integrity ... sha256+ OK
Error: inflate() returned -5
ramdisk: decompress error, ret=-1
   Loading ramdisk from 0x7ac3cdc8 to 0x0a200000
## Loading fdt from FIT Image at 7a076b80 ...
   Using 'conf2' configuration
   Trying 'fdt2' fdt subimage
     Description:  Flattened Device Tree blob v2
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x7a09fd58
     Data Size:    166684 Bytes = 162.8 KiB
     Architecture: AArch64
     Load Address: 0x08300000
     Hash algo:    sha256
     Hash value:   7d535a4cd3e3e027838841be2358fe25b89c68eebc146ce8a53c41411de89204
   Verifying Hash Integrity ... sha256+ OK
   Using fdt from load-in fdt
   Loading fdt from 0x7a09fd58 to 0x08300000
   Booting using the fdt blob at 0x08300000
   Uncompressing GZIP Kernel Image from 0x7a0c8874 to 0x00280000 ... with 02181200 bytes OK
   kernel loaded at 0x00280000, end = 0x02401200
  'reserved-memory' ramoops@110000: addr=110000 size=f0000
   Using Device Tree in place at 0000000008300000, end 000000000832bb1b
Adding bank: 0x00200000 - 0x80000000 (size: 0x7fe00000)
== DO RELOCATE == Kernel from 0x00280000 to 0x00200000
Total: 180833.251 ms

Starting kernel ...

[  180.851048] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[  180.851088] Linux version 5.10.160-rockchip-rk356x (root@ubuntu) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025, GNU ld (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 2.33.1.20191209) #1.0.6 SMP Wed Aug 7 22:27:33 CST 2024
[  180.865443] Machine model: Rockchip RK3566 OPi 3B
[  180.865524] earlycon: uart8250 at MMIO32 0x00000000fe660000 (options '')
[  180.869849] printk: bootconsole [uart8250] enabled
[  180.873151] efi: UEFI not found.
[  180.877249] OF: fdt: Reserved memory: failed to reserve memory for node 'drm-logo@00000000': base 0x0000000000000000, size 0 MiB
[  180.878380] OF: fdt: Reserved memory: failed to reserve memory for node 'drm-cubic-lut@00000000': base 0x0000000000000000, size 0 MiB
[  180.953823] Zone ranges:
[  180.954090]   DMA      [mem 0x0000000000200000-0x000000007fffffff]
[  180.954697]   DMA32    empty
[  180.954982]   Normal   empty
[  180.955266] Movable zone start for each node
[  180.955679] Early memory node ranges
[  180.956028]   node   0: [mem 0x0000000000200000-0x000000007fffffff]
[  180.956639] Initmem setup node 0 [mem 0x0000000000200000-0x000000007fffffff]
[  180.972736] cma: Reserved 128 MiB at 0x0000000075800000
[  180.973373] psci: probing for conduit method from DT.
[  180.973876] psci: PSCIv1.1 detected in firmware.
[  180.974324] psci: Using standard PSCI v0.2 function IDs
[  180.974834] psci: MIGRATE_INFO_TYPE not supported.
[  180.975302] psci: SMC Calling Convention v1.2
[  180.976253] percpu: Embedded 32 pages/cpu s93608 r8192 d29272 u131072
[  180.977083] Detected VIPT I-cache on CPU0
[  180.977540] CPU features: detected: GIC system register CPU interface
[  180.978164] CPU features: detected: Virtualization Host Extensions
[  180.978772] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[  180.979458] alternatives: patching kernel code
[  180.980425] Built 1 zonelists, mobility grouping on.  Total pages: 515592
[  180.981091] Kernel command line: storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal  earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0
[  180.983479] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[  180.984570] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[  180.985320] mem auto-init: stack:off, heap alloc:off, heap free:off
[  181.029811] Memory: 1875564K/2095104K available (17024K kernel code, 3524K rwdata, 6576K rodata, 7040K init, 646K bss, 88468K reserved, 131072K cma-reserved)
[  181.031385] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[  181.032070] ftrace: allocating 65103 entries in 255 pages
[  181.198539] ftrace: allocated 255 pages with 8 groups
[  181.199070]
[  181.199223] **********************************************************
[  181.199852] **   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **
[  181.200481] **                                                      **
[  181.201108] ** trace_printk() being used. Allocating extra memory.  **
[  181.201735] **                                                      **
[  181.202363] ** This means that this is a DEBUG kernel and it is     **
[  181.202990] ** unsafe for production use.                           **
[  181.203618] **                                                      **
[  181.204245] ** If you see this message and you are not debugging    **
[  181.204872] ** the kernel, report this immediately to your vendor!  **
[  181.205499] **                                                      **
[  181.206126] **   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **
[  181.206754] **********************************************************
[  181.208616] rcu: Hierarchical RCU implementation.
[  181.209080] rcu:     RCU event tracing is enabled.
[  181.209522] rcu:     RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
[  181.210153]  Rude variant of Tasks RCU enabled.
[  181.210591]  Tracing variant of Tasks RCU enabled.
[  181.211056] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.
[  181.211785] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[  181.221104] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[  181.224571] GICv3: GIC: Using split EOI/Deactivate mode
[  181.225092] GICv3: 320 SPIs implemented
[  181.225466] GICv3: 0 Extended SPIs implemented
[  181.225954] GICv3: Distributor has no Range Selector support
[  181.226512] GICv3: 16 PPIs implemented
[  181.226919] GICv3: CPU0: found redistributor 0 region 0:0x00000000fd460000
[  181.227816] ITS [mem 0xfd440000-0xfd45ffff]
[  181.228329] ITS@0x00000000fd440000: allocated 8192 Devices @2b50000 (indirect, esz 8, psz 64K, shr 0)
[  181.229272] ITS@0x00000000fd440000: allocated 32768 Interrupt Collections @2b60000 (flat, esz 2, psz 64K, shr 0)
[  181.230259] ITS: using cache flushing for cmd queue
[  181.231335] GICv3: using LPI property table @0x0000000002b70000
[  181.232085] GIC: using cache flushing for LPI property table
[  181.232644] GICv3: CPU0: using allocated LPI pending table @0x0000000002b80000
[  181.281696] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[  181.282304] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[  181.283349] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[  181.286035] Console: colour dummy device 80x25
[  181.286517] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=80000)
[  181.287514] pid_max: default: 32768 minimum: 301
[  181.288128] LSM: Security Framework initializing
[  181.288671] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[  181.289432] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[  181.293682] rcu: Hierarchical SRCU implementation.
[  181.295528] Platform MSI: interrupt-controller@fd440000 domain created
[  181.296907] PCI/MSI: /interrupt-controller@fd400000/interrupt-controller@fd440000 domain created
[  181.298280] EFI services will not be available.
[  181.299424] smp: Bringing up secondary CPUs ...
[  181.301963] Detected VIPT I-cache on CPU1
[  181.302025] GICv3: CPU1: found redistributor 100 region 0:0x00000000fd480000
[  181.302063] GICv3: CPU1: using allocated LPI pending table @0x0000000002b90000
[  181.302143] CPU1: Booted secondary processor 0x0000000100 [0x412fd050]
[  181.304659] Detected VIPT I-cache on CPU2
[  181.304722] GICv3: CPU2: found redistributor 200 region 0:0x00000000fd4a0000
[  181.304759] GICv3: CPU2: using allocated LPI pending table @0x0000000002ba0000
[  181.304838] CPU2: Booted secondary processor 0x0000000200 [0x412fd050]
[  181.307317] Detected VIPT I-cache on CPU3
[  181.307378] GICv3: CPU3: found redistributor 300 region 0:0x00000000fd4c0000
[  181.307416] GICv3: CPU3: using allocated LPI pending table @0x0000000002bb0000
[  181.307496] CPU3: Booted secondary processor 0x0000000300 [0x412fd050]
[  181.307810] smp: Brought up 1 node, 4 CPUs
[  181.315414] SMP: Total of 4 processors activated.
[  181.315873] CPU features: detected: Privileged Access Never
[  181.316412] CPU features: detected: User Access Override
[  181.316927] CPU features: detected: 32-bit EL0 Support
[  181.317449] CPU features: detected: Common not Private translations
[  181.318057] CPU features: detected: RAS Extension Support
[  181.318579] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
[  181.319406] CPU features: detected: CRC32 instructions
[  181.319903] CPU features: detected: Speculative Store Bypassing Safe (SSBS)
[  181.320576] CPU features: detected: 32-bit EL1 Support
[  181.321097] CPU features: detected: RCpc load-acquire (LDAPR)
[  181.321811] CPU: All CPU(s) started at EL2
[  181.324503] devtmpfs: initialized
[  181.368428] Registered cp15_barrier emulation handler
[  181.368946] Registered setend emulation handler
[  181.369398] KASLR disabled due to lack of seed
[  181.370134] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
[  181.371093] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[  181.378603] pinctrl core: initialized pinctrl subsystem
[  181.380190] DMI not present or invalid.
[  181.381305] NET: Registered protocol family 16
[  181.385148] DMA: preallocated 256 KiB GFP_KERNEL pool for atomic allocations
[  181.386173] DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[  181.387057] audit: initializing netlink subsys (disabled)
[  181.387968] audit: type=2000 audit(0.099:1): state=initialized audit_enabled=0 res=1
[  181.391936] Registered FIQ tty driver
[  181.393035] thermal_sys: Registered thermal governor 'fair_share'
[  181.393044] thermal_sys: Registered thermal governor 'step_wise'
[  181.393637] thermal_sys: Registered thermal governor 'user_space'
[  181.394219] thermal_sys: Registered thermal governor 'power_allocator'
[  181.395385] thermal thermal_zone1: power_allocator: sustainable_power will be estimated
[  181.396898] cpuidle: using governor menu
[  181.397725] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[  181.398669] ASID allocator initialised with 65536 entries
[  181.402758] ramoops: dmesg-0 0x20000@0x0000000000110000
[  181.403302] ramoops: console 0x80000@0x0000000000130000
[  181.403847] ramoops: pmsg    0x50000@0x00000000001b0000
[  181.405116] printk: console [ramoops-1] enabled
[  181.405596] pstore: Registered ramoops as persistent store backend
[  181.406200] ramoops: using 0xf0000@0x110000, ecc: 0
[  181.485043] rockchip-gpio fdd60000.gpio0: probed /pinctrl/gpio0@fdd60000
[  181.486777] rockchip-gpio fe740000.gpio1: probed /pinctrl/gpio1@fe740000
[  181.488377] rockchip-gpio fe750000.gpio2: probed /pinctrl/gpio2@fe750000
[  181.490005] rockchip-gpio fe760000.gpio3: probed /pinctrl/gpio3@fe760000
[  181.491689] rockchip-gpio fe770000.gpio4: probed /pinctrl/gpio4@fe770000
[  181.492616] rockchip-pinctrl pinctrl: probed pinctrl
[  181.533834] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[  181.534505] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[  181.535157] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[  181.535808] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[  181.602960] raid6: neonx8   gen()  1358 MB/s
[  181.659830] raid6: neonx8   xor()  1079 MB/s
[  181.716729] raid6: neonx4   gen()  1405 MB/s
[  181.773615] raid6: neonx4   xor()  1070 MB/s
[  181.830497] raid6: neonx2   gen()  1270 MB/s
[  181.887399] raid6: neonx2   xor()   972 MB/s
[  181.944298] raid6: neonx1   gen()  1037 MB/s
[  182.001174] raid6: neonx1   xor()   798 MB/s
[  182.058074] raid6: int64x8  gen()   368 MB/s
[  182.114979] raid6: int64x8  xor()   223 MB/s
[  182.171857] raid6: int64x4  gen()   381 MB/s
[  182.228773] raid6: int64x4  xor()   242 MB/s
[  182.285640] raid6: int64x2  gen()   901 MB/s
[  182.342528] raid6: int64x2  xor()   495 MB/s
[  182.399427] raid6: int64x1  gen()   640 MB/s
[  182.456325] raid6: int64x1  xor()   341 MB/s
[  182.456746] raid6: using algorithm neonx4 gen() 1405 MB/s
[  182.457288] raid6: .... xor() 1070 MB/s, rmw enabled
[  182.457773] raid6: using neon recovery algorithm
[  182.460198] fiq_debugger fiq_debugger.0: IRQ fiq not found
[  182.460804] fiq_debugger fiq_debugger.0: IRQ wakeup not found
[  182.461377] fiq_debugger_probe: could not install nmi irq handler
[ [  182.462119] printk: console [ttyFIQ0] enabled
 182.462119] printk: console [ttyFIQ0] enabled
[  182.462947] printk: bootconsole [uart8250] disabled
[  182.462947] printk: bootconsole [uart8250] disabled
[  182.464073] Registered fiq debugger ttyFIQ0
[  182.465515] vcc_5v: supplied by vcc12v_dcin
[  182.466918] vcc3v3_pcie: supplied by vcc12v_dcin
[  182.467628] vcc3v3_sys: supplied by vbus
[  182.468255] vcc5v0_sys: supplied by vbus
[  182.468884] vcc5v0_usb: supplied by vbus
[  182.470268] vcc_sd: supplied by vcc3v3_sys
[  182.473626] iommu: Default domain type: Translated
[  182.480346] SCSI subsystem initialized
[  182.480779] usbcore: registered new interface driver usbfs
[  182.480870] usbcore: registered new interface driver hub
[  182.480983] usbcore: registered new device driver usb
[  182.481209] mc: Linux media interface: v0.10
[  182.481272] videodev: Linux video capture interface: v2.00
[  182.481442] pps_core: LinuxPPS API ver. 1 registered
[  182.481461] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[  182.481499] PTP clock support registered
[  182.482710] arm-scmi firmware:scmi: SCMI Notifications - Core Enabled.
[  182.482814] arm-scmi firmware:scmi: SCMI Protocol v2.0 'rockchip:' Firmware version 0x0
[  182.486362] Advanced Linux Sound Architecture Driver Initialized.
[  182.487231] Bluetooth: Core ver 2.22
[  182.487313] NET: Registered protocol family 31
[  182.487332] Bluetooth: HCI device and connection manager initialized
[  182.487356] Bluetooth: HCI socket layer initialized
[  182.487377] Bluetooth: L2CAP socket layer initialized
[  182.487417] Bluetooth: SCO socket layer initialized
[  182.487471] NetLabel: Initializing
[  182.487487] NetLabel:  domain hash size = 128
[  182.487500] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[  182.487669] NetLabel:  unlabeled traffic allowed by default
[  182.488463] rockchip-cpuinfo cpuinfo: SoC            : 35663000
[  182.488486] rockchip-cpuinfo cpuinfo: Serial         : a7bdaecf0520d630
[  182.489784] clocksource: Switched to clocksource arch_sys_counter
[  183.508208] VFS: Disk quotas dquot_6.6.0
[  183.508359] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[  183.526887] NET: Registered protocol family 2
[  183.527208] IP idents hash table entries: 32768 (order: 6, 262144 bytes, linear)
[  183.529954] tcp_listen_portaddr_hash hash table entries: 1024 (order: 3, 40960 bytes, linear)
[  183.530065] TCP established hash table entries: 16384 (order: 5, 131072 bytes, linear)
[  183.530225] TCP bind hash table entries: 16384 (order: 7, 524288 bytes, linear)
[  183.530714] TCP: Hash tables configured (established 16384 bind 16384)
[  183.531049] MPTCP token hash table entries: 2048 (order: 4, 98304 bytes, linear)
[  183.531200] UDP hash table entries: 1024 (order: 4, 98304 bytes, linear)
[  183.531330] UDP-Lite hash table entries: 1024 (order: 4, 98304 bytes, linear)
[  183.531716] NET: Registered protocol family 1
[  183.532721] RPC: Registered named UNIX socket transport module.
[  183.532742] RPC: Registered udp transport module.
[  183.532756] RPC: Registered tcp transport module.
[  183.532768] RPC: Registered tcp NFSv4.1 backchannel transport module.
[  183.534488] PCI: CLS 0 bytes, default 64
[  183.535576] Trying to unpack rootfs image as initramfs...
[  183.536085] rootfs image is not initramfs (no cpio magic); looks like an initrd
[  183.582962] Freeing initrd memory: 12000K
[  183.586416] rockchip-thermal fe710000.tsadc: tsadc is probed successfully!
[  183.588297] hw perfevents: enabled with armv8_cortex_a55 PMU driver, 7 counters available
[  183.589899] kvm [1]: IPA Size Limit: 40 bits
[  183.589959] kvm [1]: GICv3: no GICV resource entry
[  183.589977] kvm [1]: disabling GICv2 emulation
[  183.589991] kvm [1]: GIC system register CPU interface enabled
[  183.590258] kvm [1]: vgic interrupt IRQ9
[  183.590636] kvm [1]: VHE mode initialized successfully
[  183.598619] Initialise system trusted keyrings
[  183.599013] workingset: timestamp_bits=46 max_order=19 bucket_order=0
[  183.611087] NFS: Registering the id_resolver key type
[  183.611177] Key type id_resolver registered
[  183.611195] Key type id_legacy registered
[  183.611354] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[  183.611375] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[  183.611389] Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
[  183.612381] ntfs: driver 2.1.32 [Flags: R/W].
[  183.667743] NET: Registered protocol family 38
[  183.667807] xor: measuring software checksum speed
[  183.674023]    8regs           :  1613 MB/sec
[  183.678855]    32regs          :  2062 MB/sec
[  183.685019]    arm64_neon      :  1617 MB/sec
[  183.685054] xor: using function: 32regs (2062 MB/sec)
[  183.685082] Key type asymmetric registered
[  183.685098] Asymmetric key parser 'x509' registered
[  183.685203] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 242)
[  183.685504] io scheduler mq-deadline registered
[  183.685538] io scheduler kyber registered
[  183.706959] rk-pcie 3c0000000.pcie: invalid prsnt-gpios property in node
[  183.707626] pwm-backlight backlight: supply power not found, using dummy regulator
[  183.708163] rk-pcie 3c0000000.pcie: IRQ msi not found
[  183.708192] rk-pcie 3c0000000.pcie: use outband MSI support
[  183.708209] rk-pcie 3c0000000.pcie: Missing *config* reg space
[  183.708246] rk-pcie 3c0000000.pcie: host bridge /pcie@fe260000 ranges:
[  183.708313] rk-pcie 3c0000000.pcie:      err 0x00f4000000..0x00f40fffff -> 0x00f4000000
[  183.708356] rk-pcie 3c0000000.pcie:       IO 0x00f4100000..0x00f41fffff -> 0x00f4100000
[  183.708401] rk-pcie 3c0000000.pcie:      MEM 0x00f4200000..0x00f5ffffff -> 0x00f4200000
[  183.708432] rk-pcie 3c0000000.pcie:      MEM 0x0300000000..0x033fffffff -> 0x0300000000
[  183.708507] rk-pcie 3c0000000.pcie: Missing *config* reg space
[  183.708569] rk-pcie 3c0000000.pcie: invalid resource
[  183.708650] iep: Module initialized.
[  183.708790] mpp_service mpp-srv: 57be1fd9c author: yml 2024-07-01 RK3588: NPU: Update to 0.9.6 version
[  183.708811] mpp_service mpp-srv: probe start
[  183.712604] mpp_vdpu2 fdea0400.vdpu: Adding to iommu group 1
[  183.712933] mpp_vdpu2 fdea0400.vdpu: probe device
[  183.713901] mpp_vdpu2 fdea0400.vdpu: probing finish
[  183.714761] mpp_vepu2 fdee0000.vepu: Adding to iommu group 3
[  183.715095] mpp_vepu2 fdee0000.vepu: probing start
[  183.715932] mpp_vepu2 fdee0000.vepu: probing finish
[  183.716876] mpp-iep2 fdef0000.iep: Adding to iommu group 4
[  183.717207] mpp-iep2 fdef0000.iep: probe device
[  183.717706] mpp-iep2 fdef0000.iep: allocate roi buffer failed
[  183.718119] mpp-iep2 fdef0000.iep: probing finish
[  183.718896] mpp_jpgdec fded0000.jpegd: Adding to iommu group 2
[  183.719216] mpp_jpgdec fded0000.jpegd: probe device
[  183.720162] mpp_jpgdec fded0000.jpegd: probing finish
[  183.722422] mpp_service mpp-srv: probe success
[  183.731660] dma-pl330 fe530000.dmac: Loaded driver for PL330 DMAC-241330
[  183.731721] dma-pl330 fe530000.dmac:         DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[  183.735882] dma-pl330 fe550000.dmac: Loaded driver for PL330 DMAC-241330
[  183.735938] dma-pl330 fe550000.dmac:         DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[  183.736767] rockchip-pvtm fde00000.pvtm: pvtm@0 probed
[  183.737071] rockchip-pvtm fde80000.pvtm: pvtm@1 probed
[  183.737313] rockchip-pvtm fde90000.pvtm: pvtm@2 probed
[  183.738506] rockchip-system-monitor rockchip-system-monitor: system monitor probe
[  183.739732] arm-scmi firmware:scmi: Failed. SCMI protocol 22 not active.
[  183.740222] Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled
[  183.741936] fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 64, base_baud = 1500000) is a 16550A
[  183.745954] random: crng init done
[  183.747331] rockchip-vop2 fe040000.vop: Adding to iommu group 7
[  183.759891] rockchip-vop2 fe040000.vop: [drm:vop2_bind] vp0 assign plane mask: 0x3f, primary plane phy id: 4
[  183.759959] rockchip-vop2 fe040000.vop: [drm:vop2_bind] vp1 assign plane mask: 0x0, primary plane phy id: -1
[  183.759983] rockchip-vop2 fe040000.vop: [drm:vop2_bind] vp2 assign plane mask: 0x0, primary plane phy id: -1
[  183.760280] rockchip-vop2 fe040000.vop: [drm:vop2_bind] Cluster0-win0 as cursor plane for vp0
[  183.760421] [drm] failed to init overlay plane Cluster0-win1
[  183.760584] rockchip-drm display-subsystem: bound fe040000.vop (ops 0xffffffc0091e8478)
[  183.761092] dwhdmi-rockchip fe0a0000.hdmi: Detected HDMI TX controller v2.11a with HDCP (DWC HDMI 2.0 TX PHY)
[  183.762103] dwhdmi-rockchip fe0a0000.hdmi: registered DesignWare HDMI I2C bus driver
[  183.762470] dwhdmi-rockchip fe0a0000.hdmi: IRQ index 1 not found
[  183.763309] rockchip-drm display-subsystem: bound fe0a0000.hdmi (ops 0xffffffc0091f6710)
[  183.763829] rockchip-drm display-subsystem: failed to parse loader memory
[  183.914325] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  183.939832] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  183.966497] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  183.993162] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.019829] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.033324] dwhdmi-rockchip fe0a0000.hdmi: failed to get edid
[  184.046498] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.073163] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.099827] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.126493] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.153164] rk-pcie 3c0000000.pcie: PCIe Linking... LTSSM is 0x3
[  184.302072] dwhdmi-rockchip fe0a0000.hdmi: failed to get edid
[  184.314398] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1280x720p60, type: 11(if:800, flag:0x0) for vp0 dclk: 74250000
[  184.447875] Console: switching to colour frame buffer device 160x45
[  184.464642] rockchip-drm display-subsystem: [drm] fb0: rockchipdrmfb frame buffer device
[  184.466124] [drm] Initialized rockchip 3.0.0 20140818 for display-subsystem on minor 0
[  184.473240] panel-simple edp-panel: supply power not found, using dummy regulator
[  184.473812] panel-simple edp-panel: failed to find backlight: -517
[  184.477757] input: hdmi_cec_key as /devices/platform/fe0a0000.hdmi/dw-hdmi-cec.1.auto/input/input0
[  184.479481] cacheinfo: Unable to detect cache hierarchy for CPU 0
[  184.480823] brd: module loaded
[  184.492017] loop: module loaded
[  184.492876] zram: Added device: zram0
[  184.493446] lkdtm: No crash points registered, enable through debugfs
[  184.501606] spi-nor spi4.0: XM25QU128C (16384 Kbytes) read_data x4
[  184.508530] rk_gmac-dwmac fe010000.ethernet: IRQ eth_lpi not found
[  184.509088] rk_gmac-dwmac fe010000.ethernet: no regulator found
[  184.509112] rk_gmac-dwmac fe010000.ethernet: clock input or output? (input).
[  184.509131] rk_gmac-dwmac fe010000.ethernet: TX delay(0x30).
[  184.509148] rk_gmac-dwmac fe010000.ethernet: RX delay(0x10).
[  184.509175] rk_gmac-dwmac fe010000.ethernet: integrated PHY? (no).
[  184.509258] rk_gmac-dwmac fe010000.ethernet: clock input from PHY
[  184.509532] rk_gmac-dwmac fe010000.ethernet: init for RGMII
[  184.510006] rk_gmac-dwmac fe010000.ethernet: User ID: 0x30, Synopsys ID: 0x51
[  184.510033] rk_gmac-dwmac fe010000.ethernet:         DWMAC4/5
[  184.510054] rk_gmac-dwmac fe010000.ethernet: DMA HW capability register supported
[  184.510070] rk_gmac-dwmac fe010000.ethernet: RX Checksum Offload Engine supported
[  184.510084] rk_gmac-dwmac fe010000.ethernet: TX Checksum insertion supported
[  184.510098] rk_gmac-dwmac fe010000.ethernet: Wake-Up On Lan supported
[  184.510213] rk_gmac-dwmac fe010000.ethernet: TSO supported
[  184.510232] rk_gmac-dwmac fe010000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[  184.510253] rk_gmac-dwmac fe010000.ethernet: rk_get_eth_addr: use serial to generate eth mac address: 00:00:a4:b7:bd:fe
[  184.510269] rk_gmac-dwmac fe010000.ethernet: rk_get_eth_addr: mac address: 00:00:a4:b7:bd:fe
[  184.510283] rk_gmac-dwmac fe010000.ethernet: device MAC address 00:00:a4:b7:bd:fe
[  184.510298] rk_gmac-dwmac fe010000.ethernet: TSO feature enabled
[  184.510314] rk_gmac-dwmac fe010000.ethernet: Using 32 bits DMA width
[  184.778417] usbcore: registered new interface driver rndis_wlan
[  184.778557] usbcore: registered new interface driver asix
[  184.778653] usbcore: registered new interface driver cdc_ether
[  184.778735] usbcore: registered new interface driver rndis_host
[  184.778829] usbcore: registered new interface driver cdc_ncm
[  184.796251] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[  184.796337] ehci-pci: EHCI PCI platform driver
[  184.796497] ehci-platform: EHCI generic platform driver
[  184.797199] phy phy-fe8b0000.usb2-phy.3: illegal mode
[  184.799284] ehci-platform fd800000.usb: EHCI Host Controller
[  184.799354] ehci-platform fd800000.usb: new USB bus registered, assigned bus number 1
[  184.799564] ehci-platform fd800000.usb: irq 19, io mem 0xfd800000
[  184.809840] ehci-platform fd800000.usb: USB 2.0 started, EHCI 1.00
[  184.810332] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.10
[  184.810357] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.810373] usb usb1: Product: EHCI Host Controller
[  184.810388] usb usb1: Manufacturer: Linux 5.10.160-rockchip-rk356x ehci_hcd
[  184.810402] usb usb1: SerialNumber: fd800000.usb
[  184.811323] hub 1-0:1.0: USB hub found
[  184.811422] hub 1-0:1.0: 1 port detected
[  184.814729] ehci-platform fd880000.usb: EHCI Host Controller
[  184.814847] ehci-platform fd880000.usb: new USB bus registered, assigned bus number 2
[  184.815045] ehci-platform fd880000.usb: irq 21, io mem 0xfd880000
[  184.826504] ehci-platform fd880000.usb: USB 2.0 started, EHCI 1.00
[  184.827015] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.10
[  184.827039] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.827055] usb usb2: Product: EHCI Host Controller
[  184.827070] usb usb2: Manufacturer: Linux 5.10.160-rockchip-rk356x ehci_hcd
[  184.827083] usb usb2: SerialNumber: fd880000.usb
[  184.827870] hub 2-0:1.0: USB hub found
[  184.827961] hub 2-0:1.0: 1 port detected
[  184.829215] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[  184.829262] ohci-platform: OHCI generic platform driver
[  184.829818] phy phy-fe8b0000.usb2-phy.3: illegal mode
[  184.829843] ohci-platform fd840000.usb: Generic Platform OHCI controller
[  184.829883] ohci-platform fd840000.usb: new USB bus registered, assigned bus number 3
[  184.830098] ohci-platform fd840000.usb: irq 20, io mem 0xfd840000
[  184.890924] usb usb3: New USB device found, idVendor=1d6b, idProduct=0001, bcdDevice= 5.10
[  184.890968] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.890987] usb usb3: Product: Generic Platform OHCI controller
[  184.891002] usb usb3: Manufacturer: Linux 5.10.160-rockchip-rk356x ohci_hcd
[  184.891016] usb usb3: SerialNumber: fd840000.usb
[  184.891880] hub 3-0:1.0: USB hub found
[  184.891968] hub 3-0:1.0: 1 port detected
[  184.893028] ohci-platform fd8c0000.usb: Generic Platform OHCI controller
[  184.893081] ohci-platform fd8c0000.usb: new USB bus registered, assigned bus number 4
[  184.893314] ohci-platform fd8c0000.usb: irq 22, io mem 0xfd8c0000
[  184.954194] usb usb4: New USB device found, idVendor=1d6b, idProduct=0001, bcdDevice= 5.10
[  184.954237] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.954255] usb usb4: Product: Generic Platform OHCI controller
[  184.954271] usb usb4: Manufacturer: Linux 5.10.160-rockchip-rk356x ohci_hcd
[  184.954285] usb usb4: SerialNumber: fd8c0000.usb
[  184.955086] hub 4-0:1.0: USB hub found
[  184.955176] hub 4-0:1.0: 1 port detected
[  184.957380] xhci-hcd xhci-hcd.4.auto: xHCI Host Controller
[  184.957432] xhci-hcd xhci-hcd.4.auto: new USB bus registered, assigned bus number 5
[  184.957662] xhci-hcd xhci-hcd.4.auto: hcc params 0x0220fe64 hci version 0x110 quirks 0x0000200002010010
[  184.957771] xhci-hcd xhci-hcd.4.auto: irq 79, io mem 0xfd000000
[  184.958422] usb usb5: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.10
[  184.958446] usb usb5: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.958462] usb usb5: Product: xHCI Host Controller
[  184.958477] usb usb5: Manufacturer: Linux 5.10.160-rockchip-rk356x xhci-hcd
[  184.958492] usb usb5: SerialNumber: xhci-hcd.4.auto
[  184.959323] hub 5-0:1.0: USB hub found
[  184.959428] hub 5-0:1.0: 1 port detected
[  184.960118] xhci-hcd xhci-hcd.4.auto: xHCI Host Controller
[  184.960155] xhci-hcd xhci-hcd.4.auto: new USB bus registered, assigned bus number 6
[  184.960189] xhci-hcd xhci-hcd.4.auto: Host supports USB 3.0 SuperSpeed
[  184.960363] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM.
[  184.960674] usb usb6: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.10
[  184.960697] usb usb6: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[  184.960715] usb usb6: Product: xHCI Host Controller
[  184.960730] usb usb6: Manufacturer: Linux 5.10.160-rockchip-rk356x xhci-hcd
[  184.960744] usb usb6: SerialNumber: xhci-hcd.4.auto
[  184.961594] hub 6-0:1.0: USB hub found
[  184.961692] hub 6-0:1.0: 1 port detected
[  184.962577] usbcore: registered new interface driver cdc_acm
[  184.962596] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[  184.963059] usbcore: registered new interface driver uas
[  184.963368] usbcore: registered new interface driver usb-storage
[  184.965389] usbcore: registered new interface driver xpad
[  184.965718] usbcore: registered new interface driver usbtouchscreen
[  184.966822] i2c /dev entries driver
[  184.970054] fan53555-regulator 0-0040: FAN53555 Option[8] Rev[1] Detected!
[  184.973239] vdd_cpu: supplied by vcc5v0_sys
[  184.982828] rk808 0-0020: chip id: 0x8090
[  184.982931] rk808 0-0020: No cache defaults, reading back from HW
[  185.006811] rk808 0-0020: source: on=0x40, off=0x00
[  185.006864] rk808 0-0020: support dcdc3 fb mode:-22, 1
[  185.006886] rk808 0-0020: support pmic reset mode:0,0
[  185.014936] rk808-regulator rk808-regulator: there is no dvs0 gpio
[  185.015027] rk808-regulator rk808-regulator: there is no dvs1 gpio
[  185.015569] vdd_logic: supplied by vcc3v3_sys
[  185.017097] vdd_gpu: supplied by vcc3v3_sys
[  185.018087] vcc_ddr: supplied by vcc3v3_sys
[  185.019105] vdd_npu: supplied by vcc3v3_sys
[  185.020568] vcc_1v8: supplied by vcc3v3_sys
[  185.021539] vdda0v9_image: supplied by vcc3v3_sys
[  185.023439] vdda_0v9: supplied by vcc3v3_sys
[  185.024964] vdda0v9_pmu: supplied by vcc3v3_sys
[  185.026471] vccio_acodec: Bringing 3300000uV into 3000000-3000000uV
[  185.026941] vccio_acodec: supplied by vcc3v3_sys
[  185.028826] vccio_sd: supplied by vcc3v3_sys
[  185.030379] vcc3v3_pmu: supplied by vcc3v3_sys
[  185.032340] vcca_1v8: supplied by vcc3v3_sys
[  185.033851] vcca1v8_pmu: supplied by vcc3v3_sys
[  185.035424] vcca1v8_image: supplied by vcc3v3_sys
[  185.037390] vcc_3v3: supplied by vcc3v3_sys
[  185.038740] vcc3v3_sd: supplied by vcc3v3_sys
[  185.039629] rk817-battery: Failed to locate of_node [id: -1]
[  185.039944] rk817-battery rk817-battery: Failed to find matching dt id
[  185.040152] rk817-charger: Failed to locate of_node [id: -1]
[  185.040349] rk817-charger rk817-charger: Failed to find matching dt id
[  185.044111] input: rk805 pwrkey as /devices/platform/fdd40000.i2c/i2c-0/0-0020/rk805-pwrkey/input/input1
[  185.052158] rockchip-mipi-csi2-hw fdfb0000.mipi-csi2-hw: enter mipi csi2 hw probe!
[  185.052484] rockchip-mipi-csi2-hw fdfb0000.mipi-csi2-hw: probe success, v4l2_dev:mipi-csi2-hw!
[  185.056232] usbcore: registered new interface driver uvcvideo
[  185.056276] USB Video Class driver (1.1.1)
[  185.060540] usbcore: registered new interface driver btusb
[  185.061312] cpu cpu0: bin=0
[  185.061417] cpu cpu0: leakage=22
[  185.061489] cpu cpu0: pvtm = 89740, from nvmem
[  185.061523] cpu cpu0: pvtm-volt-sel=2
[  185.061621] cpu cpu0: soc version=0, speed=2
[  185.064229] cpu cpu0: avs=0
[  185.064816] cpu cpu0: EM: created perf domain
[  185.064955] cpu cpu0: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0
[  185.073048] sdhci: Secure Digital Host Controller Interface driver
[  185.073122] sdhci: Copyright(c) Pierre Ossman
[  185.073133] Synopsys Designware Multimedia Card Interface Driver
[  185.074484] sdhci-pltfm: SDHCI platform and OF driver helper
[  185.075072] dwmmc_rockchip fe2c0000.dwmmc: No normal pinctrl state
[  185.075091] dwmmc_rockchip fe2c0000.dwmmc: No idle pinctrl state
[  185.075140] dwmmc_rockchip fe2b0000.dwmmc: No normal pinctrl state
[  185.075155] dwmmc_rockchip fe2b0000.dwmmc: No idle pinctrl state
[  185.075236] dwmmc_rockchip fe2c0000.dwmmc: IDMAC supports 32-bit address mode.
[  185.075275] dwmmc_rockchip fe2b0000.dwmmc: IDMAC supports 32-bit address mode.
[  185.075279] dwmmc_rockchip fe2c0000.dwmmc: Using internal DMA controller.
[  185.075289] dwmmc_rockchip fe2c0000.dwmmc: Version ID is 270a
[  185.075318] dwmmc_rockchip fe2b0000.dwmmc: Using internal DMA controller.
[  185.075333] dwmmc_rockchip fe2b0000.dwmmc: Version ID is 270a
[  185.075359] dwmmc_rockchip fe2c0000.dwmmc: DW MMC controller at irq 53,32 bit host data width,256 deep fifo
[  185.075378] dwmmc_rockchip fe2b0000.dwmmc: DW MMC controller at irq 52,32 bit host data width,256 deep fifo
[  185.076076] dwmmc_rockchip fe2c0000.dwmmc: allocated mmc-pwrseq
[  185.076095] mmc_host mmc2: card is non-removable.
[  185.077721] ledtrig-cpu: registered to indicate activity on CPUs
[  185.077779] arm-scmi firmware:scmi: Failed. SCMI protocol 17 not active.
[  185.077869] SMCCC: SOC_ID: ARCH_FEATURES(ARCH_SOC_ID) returned error: fffffffffffffffd
[  185.078969] cryptodev: driver 1.12 loaded.
[  185.079036] hid: raw HID events driver (C) Jiri Kosina
[  185.079448] usbcore: registered new interface driver usbhid
[  185.079461] usbhid: USB HID core driver
[  185.079791] ashmem: initialized
[  185.080416] rockchip,bus bus-npu: bin=0
[  185.080437] rockchip,bus bus-npu: Failed to get leakage
[  185.080504] rockchip,bus bus-npu: pvtm = 89740, from nvmem
[  185.080523] rockchip,bus bus-npu: pvtm-volt-sel=1
[  185.080878] rockchip,bus bus-npu: avs=0
[  185.089179] usbcore: registered new interface driver snd-usb-audio
[  185.089495] mmc_host mmc1: Bus speed (slot 0) = 375000Hz (slot req 400000Hz, actual 375000HZ div = 0)
[  185.091707] rk817-codec rk817-codec: DMA mask not set
[  185.099640] rk-multicodecs rk809-sound: Failed to get ADC channel
[  185.099931] rk-multicodecs rk809-sound: ASoC: Property 'rockchip,audio-routing' does not exist or its length is not even
[  185.099950] rk-multicodecs rk809-sound: Audio routing invalid/unspecified
[  185.101299] rk817-codec rk817-codec: rk817_probe: chip_name:0x80, chip_ver:0x95
[  185.109077] mmc0: SDHCI controller on fe310000.sdhci [fe310000.sdhci] using ADMA
[  185.110938] input: rockchip-rk809 Headset as /devices/platform/rk809-sound/sound/card0/input2
[  185.112058] Initializing XFRM netlink socket
[  185.112112] NET: Registered protocol family 17
[  185.112447] [BT_RFKILL]: Enter rfkill_rk_init
[  185.112459] [WLAN_RFKILL]: Enter rfkill_wlan_init
[  185.112929] [WLAN_RFKILL]: Enter rfkill_wlan_probe
[  185.112978] [WLAN_RFKILL]: wlan_platdata_parse_dt: wifi_chip_type = ap6256
[  185.112988] [WLAN_RFKILL]: wlan_platdata_parse_dt: enable wifi power control.
[  185.112996] [WLAN_RFKILL]: wlan_platdata_parse_dt: wifi power controled by gpio.
[  185.113038] [WLAN_RFKILL]: wlan_platdata_parse_dt: WIFI,host_wake_irq = 30, flags = 0.
[  185.113052] [WLAN_RFKILL]: wlan_platdata_parse_dt: The ref_wifi_clk not found !
[  185.113060] [WLAN_RFKILL]: rfkill_wlan_probe: init gpio
[  185.113069] [WLAN_RFKILL]: rfkill_set_wifi_bt_power: 1
[  185.113077] [WLAN_RFKILL]: Exit rfkill_wlan_probe
[  185.114549] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: uart_rts_gpios = 77.
[  185.114588] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,reset_gpio = 79.
[  185.114607] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,wake_gpio = 81.
[  185.114625] [BT_RFKILL]: bluetooth_platdata_parse_dt: get property: BT,wake_host_irq = 80.
[  185.114734] [BT_RFKILL]: Request irq for bt wakeup host
[  185.114887] [BT_RFKILL]: ** disable irq
[  185.115092] [BT_RFKILL]: bt_default device registered.
[  185.115318] Key type dns_resolver registered
[  185.117101] registered taskstats version 1
[  185.117129] Loading compiled-in X.509 certificates
[  185.118282] Btrfs loaded, crc32c=crc32c-generic
[  185.118516] pstore: Using crash dump compression: deflate
[  185.119905] rga: rga2, irq = 30, match scheduler
[  185.120543] rga: rga2 hardware loaded successfully, hw_version:3.2.63318.
[  185.120581] rga: rga2 probe successfully
[  185.120999] rga_iommu: IOMMU binding successfully, default mapping core[0x4]
[  185.121272] rga: Module initialized. v1.3.0
[  185.121287]
[  185.121295] ********************************************************************
[  185.121302] **     NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE           **
[  185.121309] **                                                                **
[  185.121316] **  WRITEABLE clk DebugFS SUPPORT HAS BEEN ENABLED IN THIS KERNEL **
[  185.121322] **                                                                **
[  185.121328] ** This means that this kernel is built to expose clk operations  **
[  185.121334] ** such as parent or rate setting, enabling, disabling, etc.      **
[  185.121340] ** to userspace, which may compromise security on your system.    **
[  185.121346] **                                                                **
[  185.121352] ** If you see this message and you are not debugging the          **
[  185.121358] ** kernel, report this immediately to your vendor!                **
[  185.121363] **                                                                **
[  185.121369] **     NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE           **
[  185.121375] ********************************************************************
[  185.175809] mmc0: Host Software Queue enabled
[  185.175854] mmc0: new HS200 MMC card at address 0001
[  185.176541] mmc_host mmc1: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)
[  185.176554] mmcblk0: mmc0:0001 A3A551 28.9 GiB
[  185.176844] mmcblk0boot0: mmc0:0001 A3A551 partition 1 4.00 MiB
[  185.177114] mmcblk0boot1: mmc0:0001 A3A551 partition 2 4.00 MiB
[  185.177376] mmcblk0rpmb: mmc0:0001 A3A551 partition 3 16.0 MiB, chardev (237:0)
[  185.177841] dwmmc_rockchip fe2b0000.dwmmc: All phases bad!
[  185.177865] mmc1: tuning execution failed: -5
[  185.177883] mmc1: error -5 whilst initialising SD card
[  185.180399]  mmcblk0: p1 p2
[  185.192323] mmc_host mmc1: Bus speed (slot 0) = 375000Hz (slot req 375000Hz, actual 375000HZ div = 0)
[  185.226603] vendor storage:20190527 ret = 0
[  185.282661] mmc_host mmc1: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)
[  185.287281] dwmmc_rockchip fe2b0000.dwmmc: All phases bad!
[  185.287373] mmc1: tuning execution failed: -5
[  185.293889] mmc_host mmc2: Bus speed (slot 0) = 375000Hz (slot req 400000Hz, actual 375000HZ div = 0)
[  185.303539] mmc_host mmc1: Bus speed (slot 0) = 375000Hz (slot req 375000Hz, actual 375000HZ div = 0)
[  185.308309] rockchip-iodomain fdc20000.syscon:io-domains: pmuio1(3300000 uV) supplied by vcc3v3_pmu
[  185.308710] rockchip-iodomain fdc20000.syscon:io-domains: pmuio2(3300000 uV) supplied by vcc3v3_pmu
[  185.309361] rockchip-iodomain fdc20000.syscon:io-domains: vccio1(3300000 uV) supplied by vcc_3v3
[  185.310018] rockchip-iodomain fdc20000.syscon:io-domains: vccio2(1800000 uV) supplied by vcc_1v8
[  185.310558] rockchip-iodomain fdc20000.syscon:io-domains: vccio3(3300000 uV) supplied by vccio_sd
[  185.310888] rockchip-iodomain fdc20000.syscon:io-domains: vccio4(1800000 uV) supplied by vcc_1v8
[  185.311826] rockchip-iodomain fdc20000.syscon:io-domains: vccio5(1800000 uV) supplied by vccio_phy
[  185.312211] rockchip-iodomain fdc20000.syscon:io-domains: vccio6(3300000 uV) supplied by vcc_3v3
[  185.312559] rockchip-iodomain fdc20000.syscon:io-domains: vccio7(3300000 uV) supplied by vcc_3v3
[  185.314867] mpp_rkvenc fdf40000.rkvenc: Adding to iommu group 5
[  185.315248] mpp_rkvenc fdf40000.rkvenc: probing start
[  185.316161] mpp_rkvenc fdf40000.rkvenc: bin=0
[  185.316213] mpp_rkvenc fdf40000.rkvenc: Failed to get leakage
[  185.316298] mpp_rkvenc fdf40000.rkvenc: pvtm = 89740, from nvmem
[  185.316329] mpp_rkvenc fdf40000.rkvenc: pvtm-volt-sel=1
[  185.316780] mpp_rkvenc fdf40000.rkvenc: avs=0
[  185.317007] mpp_rkvenc fdf40000.rkvenc: failed to find power_model node
[  185.317029] mpp_rkvenc fdf40000.rkvenc: failed to initialize power model
[  185.317045] mpp_rkvenc fdf40000.rkvenc: failed to get dynamic-coefficient
[  185.318207] mpp_rkvenc fdf40000.rkvenc: probing finish
[  185.318926] mpp_rkvdec2 fdf80200.rkvdec: Adding to iommu group 6
[  185.319347] mpp_rkvdec2 fdf80200.rkvdec: rkvdec, probing start
[  185.320018] mpp_rkvdec2 fdf80200.rkvdec: shared_niu_a is not found!
[  185.320041] rkvdec2_init:1022: No niu aclk reset resource define
[  185.320062] mpp_rkvdec2 fdf80200.rkvdec: shared_niu_h is not found!
[  185.320076] rkvdec2_init:1025: No niu hclk reset resource define
[  185.320547] mpp_rkvdec2 fdf80200.rkvdec: bin=0
[  185.320718] mpp_rkvdec2 fdf80200.rkvdec: leakage=41
[  185.320749] mpp_rkvdec2 fdf80200.rkvdec: leakage-volt-sel=0
[  185.320816] mpp_rkvdec2 fdf80200.rkvdec: pvtm = 89740, from nvmem
[  185.320844] mpp_rkvdec2 fdf80200.rkvdec: pvtm-volt-sel=1
[  185.321266] mpp_rkvdec2 fdf80200.rkvdec: avs=0
[  185.321512] mpp_rkvdec2 fdf80200.rkvdec: failed to find power_model node
[  185.321535] mpp_rkvdec2 fdf80200.rkvdec: failed to initialize power model
[  185.321551] mpp_rkvdec2 fdf80200.rkvdec: failed to get dynamic-coefficient
[  185.321787] mpp_rkvdec2 fdf80200.rkvdec: sram_start 0x00000000fdcc0000
[  185.321808] mpp_rkvdec2 fdf80200.rkvdec: rcb_iova 0x0000000010000000
[  185.321823] mpp_rkvdec2 fdf80200.rkvdec: sram_size 45056
[  185.321837] mpp_rkvdec2 fdf80200.rkvdec: rcb_size 65536
[  185.321855] mpp_rkvdec2 fdf80200.rkvdec: min_width 512
[  185.321954] mpp_rkvdec2 fdf80200.rkvdec: link mode probe finish
[  185.322097] mpp_rkvdec2 fdf80200.rkvdec: probing finish
[  185.323413] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.323962] mali fde60000.gpu: Kernel DDK version g18p0-01eac0
[  185.325148] mali fde60000.gpu: bin=0
[  185.325162] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.325233] mali fde60000.gpu: leakage=6
[  185.325287] mali fde60000.gpu: pvtm = 89740, from nvmem
[  185.325315] mali fde60000.gpu: pvtm-volt-sel=2
[  185.325336] mali fde60000.gpu: soc version=0, speed=2
[  185.325380] panel-simple edp-panel: failed to find backlight: -517
[  185.326311] mali fde60000.gpu: avs=0
[  185.326355] W : [File] : drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_rk.c; [Line] : 143; [Func] : kbase_platform_rk_init(); power-off-delay-ms not available.
[  185.327020] mali fde60000.gpu: GPU identified as 0x2 arch 7.4.0 r1p0 status 0
[  185.327138] mali fde60000.gpu: No priority control manager is configured
[  185.327632] mali fde60000.gpu: No memory group manager is configured
[  185.329521] mali fde60000.gpu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0
[  185.330578] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.331726] mali fde60000.gpu: Probed as mali0
[  185.332002] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.332209] panel-simple edp-panel: failed to find backlight: -517
[  185.333259] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.334557] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.334779] panel-simple edp-panel: failed to find backlight: -517
[  185.335819] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.337106] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.337335] panel-simple edp-panel: failed to find backlight: -517
[  185.338662] WCN: marlin_init entry!
[  185.339850] mmc2: queuing unknown CIS tuple 0x80 (2 bytes)
[  185.340615] RKNPU fde40000.npu: Adding to iommu group 0
[  185.341073] RKNPU fde40000.npu: RKNPU: rknpu iommu is enabled, using iommu mode
[  185.341413] RKNPU fde40000.npu: can't request region for resource [mem 0xfde40000-0xfde4ffff]
[  185.341553] mmc2: queuing unknown CIS tuple 0x80 (3 bytes)
[  185.341907] [drm] Initialized rknpu 0.9.6 20240322 for fde40000.npu on minor 1
[  185.342619] RKNPU fde40000.npu: bin=0
[  185.342690] RKNPU fde40000.npu: leakage=3
[  185.342729] RKNPU fde40000.npu: pvtm = 89740, from nvmem
[  185.342747] RKNPU fde40000.npu: pvtm-volt-sel=2
[  185.342762] RKNPU fde40000.npu: soc version=0, speed=2
[  185.343241] mmc2: queuing unknown CIS tuple 0x80 (3 bytes)
[  185.343499] RKNPU fde40000.npu: avs=0
[  185.343705] RKNPU fde40000.npu: l=0 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0
[  185.344196] RKNPU fde40000.npu: failed to find power_model node
[  185.344207] RKNPU fde40000.npu: RKNPU: failed to initialize power model
[  185.344215] RKNPU fde40000.npu: RKNPU: failed to get dynamic-coefficient
[  185.345350] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[  185.345358] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.346336] mmc2: queuing unknown CIS tuple 0x80 (7 bytes)
[  185.346388] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.346632] panel-simple edp-panel: failed to find backlight: -517
[  185.347429] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[  185.348268] rockchip-pm rockchip-suspend: not set pwm-regulator-config
[  185.348740] rockchip-suspend not set sleep-mode-config for mem-lite
[  185.348748] rockchip-suspend not set wakeup-config for mem-lite
[  185.348756] rockchip-suspend not set sleep-mode-config for mem-ultra
[  185.348763] rockchip-suspend not set wakeup-config for mem-ultra
[  185.349415] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.349741] I : [File] : drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c; [Line] : 406; [Func] : mali_module_init(); svn_rev_string_from_arm of this mali_ko is '', rk_ko_ver is '5', built at '21:43:19', on 'Aug  7 2024'.
[  185.350024] mmc2: queuing unknown CIS tuple 0x81 (9 bytes)
[  185.350381] Mali:
[  185.350384] Mali device driver loaded
[  185.350401] ALSA device list:
[  185.350410]   #0: rockchip-rk809
[  185.350416]   #1: rockchip,hdmi
[  185.350518] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.350661] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[  185.350669] panel-simple edp-panel: failed to find backlight: -517
[  185.350679] cfg80211: failed to load regulatory.db
[  185.351172] RAMDISK: gzip image found at block 0
[  185.365273] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
[  185.365369] mmc1: new high speed SDHC card at address aaaa
[  185.366335] mmcblk1: mmc1:aaaa SD32G 29.7 GiB
[  185.373499]  mmcblk1: p1 p2 p3 p4 p5
[  185.375724] pwm-backlight backlight: supply power not found, using dummy regulator
[  185.376833] panel-simple edp-panel: supply power not found, using dummy regulator
[  185.377025] panel-simple edp-panel: failed to find backlight: -517
[  185.408036] mmc_host mmc2: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)
[  185.414537] dwmmc_rockchip fe2c0000.dwmmc: Successfully tuned phase to 231
[  185.418058] mmc2: new ultra high speed SDR104 SDIO card at address 0001
[  185.911358] using deprecated initrd support, will be removed in 2021.
[  186.279493] EXT4-fs (ram0): mounted filesystem with ordered data mode. Opts: (null)
[  186.279586] VFS: Mounted root (ext4 filesystem) on device 1:0.
[  186.295008] EXT4-fs (ram0): re-mounted. Opts: (null)
Saving 256 bits of creditable seed for next boot
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Populating /dev using udev: [  186.493056] udevd[218]: starting version 3.2.14
[  186.503836] udevd[219]: starting eudev-3.2.14
[  186.599837] rk-pcie 3c0000000.pcie: PCIe Link Fail
[  186.599884] rk-pcie 3c0000000.pcie: failed to initialize host
done
Starting network: [  187.290672] rk_gmac-dwmac fe010000.ethernet eth0: PHY [stmmac-1:00] driver [YT8531 Gigabit Ethernet] (irq=POLL)
[  187.298339] dwmac4: Master AXI performs any burst length
[  187.298541] rk_gmac-dwmac fe010000.ethernet eth0: No Safety Features support found
[  187.298625] rk_gmac-dwmac fe010000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[  187.299538] rk_gmac-dwmac fe010000.ethernet eth0: registered PTP clock
[  187.301955] rk_gmac-dwmac fe010000.ethernet eth0: configuring for phy/rgmii link mode
udhcpc: started, v1.36.1
udhcpc: broadcasting discover
[  189.323811] rk_gmac-dwmac fe010000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
udhcpc: no lease, forking to background
OK
ssh-keygen: generating new host keys: RSA
ECDSA ED25519
Starting sshd: OK
Starting vsftpd: OK
Starting input-event-daemon: done
[  194.136820] EXT4-fs (mmcblk1p3): mounted filesystem with writeback data mode. Opts: (null)
[  194.147790] EXT4-fs (mmcblk1p4): mounted filesystem with writeback data mode. Opts: (null)

Welcome to rk356x Buildroot
rk356x login: root
[root@orangepi:/root]#

账号密码:root

4.2.2 GPIO高电平

我们将GPIO3_D3引脚连接到40 pin1号引脚,即3.3V电源,此时给开发板上电,会直接进入recovery系统。

其中串口在u-boot阶段会输出如下信息:

......
## Booting FIT Image at 0x7a0769c0#conf2 with size 0x0177e5dc 
Environment variable 'update_mode' is set to 'recovery'.
boot mode: recovery.
Fdt Ramdisk skip relocation
## Loading kernel from FIT Image at 7a0769c0 ...
   Using 'conf2' configuration
## Verified-boot: 0
   Trying 'kernel' kernel subimage
     Description:  Vanilla Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x7a0c86b4
     Data Size:    12010836 Bytes = 11.5 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x00280000
     Entry Point:  0x00280000
     Hash algo:    sha256
     Hash value:   c6649ab96e10f46cbedc1c8776541c82af3228bd6bbb6c34c2adc24f92a4001e
   Verifying Hash Integrity ... sha256+ OK
......

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示