Rockchip RK3566 - 从零开始制作recovery系统
----------------------------------------------------------------------------------------------------------------------------
开发板 :Orange Pi 3B
开发板
eMMC
:32GB
LPDDR4
:2GB
显示屏 :15.6
英寸HDMI
接口显示屏
u-boot
:2017.09
linux
:5.10
----------------------------------------------------------------------------------------------------------------------------
在《Rockchip RK3588
- 从零开始制作recovery
系统 》中我们介绍了在NanoPC-T6
开发板如何进行recovery.img
镜像的制作,以及如何实现debian/ubuntu
系统的在线升级功能。
本节我们将尝试Orange Pi 3B
开发板进行recovery.img
镜像的制作,并通过改造orangepi-build
编译脚本,实现为Linux
镜像扩展recovery
分区,并写入recovery.img
镜像的目的。
本篇博客测试使用的各个模块版本:
u-boot
:v2017.09-rk3588
;kernel
:orange-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 Flash
、Nand Flash
、eMMC
、ufs
、以及机械硬盘固态硬盘等,都是用来存储数据的,同理内存也是可以当成磁盘来存储数据的,唯一不同的就是ram
是掉电不保存的,而前面提到的那些存储介质掉电都是保存数据的。
我们都知道,在linux
中,上面介绍的Flash
这些存储介质,都是需要有对应的驱动,注册成块设备。并向上层提供接口。如Nor
、Nand
等都抽象成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
这里的意思是配置内核初始化时,去寻找initramfs
和initrd
,initrd
就是我们的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.dtb
、rk3566-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.dtb
、rk3566-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 - Rockchip Linux SDK Buildroot
文件系统构建》; - 《
Buildroot
根文件系统构建》; - 《
Rockchip RK3588
- 从零开始制作recovery
系统 》;
相对于《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/rk356x
为board/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/profile
:HOSTNAME
设置为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_image1
、PARTLABEL=image1
)等,可以通过lsblk -o NAME,PARTLABEL,PARTUUID,LABEL
命令查看;- 设备节点全路径;
UUID
:指的是文件系统的唯一标识码,它是在创建文件系统时自动生成的,保证了在任何系统中的唯一性;LABEL
:指的是文件系统的标签,这是在创建文件系统时设置的一个名字,方便人们记忆和使用;PARTLABEL
:分区的标签,这是在使用gpt
分区表的情况下的一个额外标识,可以用来代替传统的hdX
或sdX
、mmcblkX
设备名;
- 挂载点:设备在文件系统中挂载的位置,即它将在文件系统中显示的位置。例如,
/mnt/data
; - 类型:文件系统的类型,如
ext4
、xfs
、ntfs
等; - 选项:挂载选项,以逗号分隔的列表。例如,
defaults
、ro
(只读)、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.img
是FIT uImage
镜像格式,因此我们首先需要创建boot4recovery.its
文件。
在制作FIT uImage
时我们需要考虑一个问题,我们要同时适配v1.1
和v2.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
文件中设置的load
、entry
地址满足(addr & 0xffffff00) == 0xffffff00
,那么特点子镜像节点,比如fdt
、kernel
、ramdisk
的load
和entry
都会在boot_fit
启动的时候将其替换成环境变量中指定的地址。其中:
kernel load/entry
地址会被替换成0x00280000
,该值来自环境变量kernel_addr_r
;ramdisk load
地址会被替换成0x0a200000
,该值来自环境变量ramdisk_addr_r
;fdt load
地址会被替换成0x08300000
,该值来自环境变量fdt_addr_r
;
但是这里我们为了适配v1.1
和v2.1
的板子,设备树镜像节点我们有两个,分别是fdt1
、fdt2
,并且节点名称也不是fdt
,因此这里我们直接将load
配置成了境变量fdt_addr_r
的值。
注意这里我们配置了两个设备树节点,在boot fit
启动的时候,我们会根据fdtfile
环境来选择一个设备树使用。
具体可以参考《Rockchip RK3399
- 移植linux 5.2.8
》boot_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/mkimage
中mkimage
工具拷贝过来;
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
启动方式,这种启动方式会依次遍历设备mmc0
、mmc1
、....,然后探测内核镜像,并启动内核,Linux SDK
编译出来的镜像就是采用的这种启动方式。
如果我们期望根据GPIO
来控制是否进入recovery
系统,我们首先应该执行boot_fit
启动命令,因为recovery.img
为FIT uImage
。
在《Rockchip RK3588 - uboot
引导方式介绍》中我们介绍过,boot_fit
从eMMC
中boot/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
接口中总共有28
个GPIO
口,所有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(®s->swport_ddr, OFFSET_TO_BIT(27));
// 读取ext_port寄存器的值,并检查其第27位是否被设置为1 用于检查GPIO3_D3引脚是不是高电平
value = readl(®s->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
中哪一个配置节点;
- 如果
fdtfile
为rockchip/rk3566-orangepi-3b.dtb
,我们就使用conf1
配置; - 如果
fdtfile
为rockchip/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
命令行,首先设置ip
、serverip
;
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
默认只有bootfs
、rootfs
分区。
这个我们需要扩展分区:
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-boot
、kernel
源码进行修改,我可以修改<SDK>/userpatches/config-default.conf
:
# CLEAN_LEVEL="debs,oldcache"
CLEAN_LEVEL="oldcache"
这样就不会每次编译的是否都重新编译u-boot
、kernel
。但是如果我们修改了u-boot
、kernel
就必须重新编译,即配置:
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_MIRROR
、DEBIAN_MIRROR
、DEBIAN_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
,大小为128MB
,recovery
分区;image1
分区:扇区2420736~10809343
,大小为4GB
,image1
分区;image2
分区:扇区10809344~19197951
,大小为4GB
,image2
分区;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/mmcblk0
是eMMC
设备,/dev/mmcblk1
是SD
设备。可以看到/dev/mmcblk1
设备划分了5个分区,分区设备依次为;
/dev/mmcblk1p1
:bootfs
分区;/dev/mmcblk1p2
:recovery
分区;/dev/mmcblk1p3
:image1
分区;/dev/mmcblk1p4
:image2
分区;/dev/mmcblk1p5
:rootfs
分区。
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
接口GPIO
、I2C
、UART
、SPI
和PWM
测试;
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
,大小为128MB
,recovery
分区;recovery
分区:扇区范围0x0024f000
~0x00a4efff
,即2420736~10809343
,大小为4GB
,image1
分区;recovery
分区:扇区范围0x00a4f000
~0x0124efff
,即10809344~19197951
,大小为4GB
,image2
分区;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 pin
的1
号引脚,即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-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
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-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了