----------------------------------------------------------------------------------------------------------------------------
开发板 :ArmSoM-Sige7
开发板
eMMC
:64GB
LPDDR4
:8GB
显示屏 :15.6
英寸HDMI
接口显示屏
u-boot
:2017.09
linux
:5.10
----------------------------------------------------------------------------------------------------------------------------
如果对Rockchip Linux SDK
不了解的前提下,请先阅读以下两篇文章:
一、Recovery
模式
1.1 简介
Rockchip Linux
平台支持两种启动方案,Recovery
模式和Linux A/B
模式:
Recovery
模式,设备上有一个单独的分区(recovery
)用于升级操作;Linux A/B
模式,设备上有两套固件,可切换使用。
这两种启动模式各有优缺点,用户根据需求选择使用。本篇博客主要针对Recovery
模式进行深入剖析。
1.1.1 Recovery
模式概述
Recovery
模式是在设备上多一个Recovery
分区,该分区由kernel + dtb + ramdisk
组成,主要用于升级操作。
u-boot
会根据misc
分区存放的字段来判断将要引导的系统是Normal
系统还是Recovery
系统。
由于系统的独立性,所以Recovery
模式能保证升级的完整性,即升级过程被中断,如异常掉电,升级仍然能继续执行。
优点:
- 能保证升级的完整性;
缺点:
- 系统多了一个分区,该分区仅用于升级;
- 升级过程必须重启进入
recovery
模式,不能在Normal
系统直接进行升级;
1.1.2 升级方式
Rockchip Linux
平台有两套升级方案代码;
升级方案 | 升级方案代码路径 | 是否支持Recovery启动模式升级 | 是否支持A/B启动模式升级 | 简介 |
---|---|---|---|---|
updateEngine | external/recovery/update_engine external/recovery |
支持 | 支持 | RV1126/RV1109平台使用 |
rkupdate | external/rkupdate | 支持 | 不支持 | 其它平台使用 |
updateEngine
源码:主要生成recovery
二进制bin
程序,recovery
模式下的关键程序;
rkupdate
源码:主要生成rkupdate
二进制bin
程序,解析update.img
固件中各个分区数据,并执行对各分区执行升级的关键程序,该程序被recovery
二进制bin
程序内部调用。
1.2 配置recovery
准备工作:请参考《Rockchip RK3588 - Rockchip Linux SDK
编译》下载SDK
。
1.2.1 设置环境变量
进入buildroot
目录,执行如下命令:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot$ source envsetup.sh
选择一个平台的recovery
配置,这里选择rockchip_rk3588_recovery
,文件rockchip_rk3588_recovery_defconfig
位于buildroot/configs
目录下,内容如下:
#include "base/base.config"
#include "base/recovery.config" // 位于./buildroot/configs/rockchip/base/recovery.config
#include "chips/rk3588_aarch64.config"
执行结果如下:
Top of tree: /work/sambashare/rk3588/armsom/armsom-rk3588-bsp
Pick a board:
.......
57. rockchip_rk3588_recovery
Which would you like? [1]: 57
make: 进入目录“/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot”
GEN /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/Makefile
/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/build/parse_defconfig.sh /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_recovery_defconfig /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/.config.in
Parsing defconfig: /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_recovery_defconfig
Using configs/rockchip/base/kernel.config as base #基准配置
Merging configs/rockchip/fs/e2fs.config
Merging configs/rockchip/base/common.config
Merging configs/rockchip/base/base.config
Merging configs/rockchip/base/kernel.config
Merging configs/rockchip/fs/e2fs.config
Merging configs/rockchip/base/common.config
Merging configs/rockchip/fs/vfat.config
Merging configs/rockchip/base/recovery.config #recovery配置
Merging configs/rockchip/chips/rk3588.config
Value of BR2_ROOTFS_OVERLAY is redefined by configs/rockchip/chips/rk3588.config:
Previous value: BR2_ROOTFS_OVERLAY="board/rockchip/common/base"
Modify value: BR2_ROOTFS_OVERLAY+="board/rockchip/rk3588/fs-overlay/"
New value: BR2_ROOTFS_OVERLAY="board/rockchip/common/base board/rockchip/rk3588/fs-overlay/"
Merging configs/rockchip/chips/rk3588_aarch64.config
Merging /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_recovery_defconfig
#
# merged configuration written to /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/.config.in (needs make)
#
BR2_DEFCONFIG='' KCONFIG_AUTOCONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/build/buildroot-config/auto.conf KCONFIG_AUTOHEADER=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/build/buildroot-config/autoconf.h KCONFIG_TRISTATE=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/build/buildroot-config/tristate.config BR2_CONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/.config HOST_GCC_VERSION="9" BASE_DIR=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery SKIP_LEGACY= CUSTOM_KERNEL_VERSION="5.10" BR2_DEFCONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_recovery_defconfig /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/build/buildroot-config/conf --defconfig=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/.config.in Config.in
#
# configuration written to /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588_recovery/.config
#
make: 离开目录“/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot”
生成.config
配置文件,位于output/rockchip_rk3588_recovery
目录。
1.2.2 功能配置
进行recovery
配置:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot$ make menuconfig
配置如下选项:
Target packages --->
Hardware Platforms --->
[*] Rockchip Platform --->
Rockchip BSP packages --->
[*] Rockchip recovery for linux # BR2_PACKAGE_RECOVERY
[ ] No UI for recovery # BR2_PACKAGE_RECOVERY_NO_UI
[ ] Linux AB bool control # BR2_PACKAGE_RECOVERY_BOOTCONTROL
Linux A/B bringup features. (successful_boot) --->
(X) successful_boot # BR2_PACKAGE_RECOVERY_SUCCESSFUL_BOOT
( ) retry time # BR2_PACKAGE_RECOVERY_RETRY
choice the update bin of recovery. (updateEngine) --->
() rkupdate # BR2_PACKAGE_RECOVERY_USE_RKUPDATE,如果选中自动选中recovery bin
(*) updateEngine # BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE、如果选中自动选中updateEngine bin
[*] recovery bin # BR2_PACKAGE_RECOVERY_RECOVERYBIN
-*- updateEngine bin # BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN
[ ] Enable static # BR2_PACKAGE_RECOVERY_STATIC
注意:配置源码位于package/rockchip/recovery/Config.in
。
最终生成配置文件output/rockchip_rk3588_recovery/.config
,包含配置项:
BR2_PACKAGE_RECOVERY=y #开启升级相关功能
# BR2_PACKAGE_RECOVERY_NO_UI is not set #打开UI
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y #使用新升级程序,不配置则默认使用原有升级流程
BR2_PACKAGE_RECOVERY_RECOVERYBIN=y #开启recovery bin 文件
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
我们需要将以上这些配置追加到configs/rockchip/base/recovery.config
文件中(注意:BR2_PACKAGE_RECOVERY
默认已经配置)。
1.3 配置rootfs
1.3.1 设置环境变量
进入buildroot
目录,执行如下命令:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot$ source envsetup.sh
选择一个平台的rootf
配置,这里选择rockchip_rk3588
,文件rockchip_rk3588_defconfig
位于buildroot/configs
目录下,内容如下:
#include "base/base.config"
#include "chips/rk3588_aarch64.config"
#include "font/chinese.config"
#include "fs/exfat.config"
#include "fs/ntfs.config"
#include "fs/vfat.config"
#include "gpu/gpu.config"
#include "multimedia/audio.config"
#include "multimedia/camera.config"
#include "multimedia/gst/audio.config"
#include "multimedia/gst/camera.config"
#include "multimedia/gst/rtsp.config"
#include "multimedia/gst/video.config"
#include "multimedia/mpp.config"
#include "wifibt/bt.config"
#include "wifibt/wireless.config"
#include "benchmark.config"
#include "chromium.config"
#include "debug.config"
#include "npu2.config"
#include "powermanager.config"
#include "test.config"
#include "weston.config"
执行结果如下:
Top of tree: /work/sambashare/rk3588/armsom/armsom-rk3588-bsp
Pick a board:
......
54. rockchip_rk3588
55. rockchip_rk3588_base
56. rockchip_rk3588_ramboot
57. rockchip_rk3588_recovery
Which would you like? [1]: 54
make: 进入目录“/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot”
GEN /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/Makefile
/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/build/parse_defconfig.sh /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_defconfig /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/.config.in
Parsing defconfig: /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_defconfig
Using configs/rockchip/base/kernel.config as base
Merging configs/rockchip/fs/e2fs.config
Merging configs/rockchip/base/common.config
Merging configs/rockchip/base/base.config
Merging configs/rockchip/chips/rk3588.config
Value of BR2_ROOTFS_OVERLAY is redefined by configs/rockchip/chips/rk3588.config:
Previous value: BR2_ROOTFS_OVERLAY="board/rockchip/common/base"
Modify value: BR2_ROOTFS_OVERLAY+="board/rockchip/rk3588/fs-overlay/"
New value: BR2_ROOTFS_OVERLAY="board/rockchip/common/base board/rockchip/rk3588/fs-overlay/"
Merging configs/rockchip/chips/rk3588_aarch64.config
Merging configs/rockchip/font/font.config
Merging configs/rockchip/font/chinese.config
Merging configs/rockchip/fs/exfat.config
Merging configs/rockchip/fs/ntfs.config
Merging configs/rockchip/fs/vfat.config
Merging configs/rockchip/gpu/gpu.config
Merging configs/rockchip/multimedia/audio.config
Merging configs/rockchip/multimedia/camera.config
Merging configs/rockchip/multimedia/gst/audio.config
Merging configs/rockchip/multimedia/gst/camera.config
Merging configs/rockchip/multimedia/gst/rtsp.config
Merging configs/rockchip/multimedia/gst/video.config
Merging configs/rockchip/multimedia/mpp.config
Merging configs/rockchip/wifibt/bt.config
Merging configs/rockchip/wifibt/network.config
Merging configs/rockchip/wifibt/wireless.config
Merging configs/rockchip/benchmark.config
Merging configs/rockchip/chromium.config
Merging configs/rockchip/debug.config
Merging configs/rockchip/npu2.config
Merging configs/rockchip/powermanager.config
Merging configs/rockchip/test.config
Merging configs/rockchip/weston.config
Merging /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_defconfig
#
# merged configuration written to /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/.config.in (needs make)
#
BR2_DEFCONFIG='' KCONFIG_AUTOCONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/build/buildroot-config/auto.conf KCONFIG_AUTOHEADER=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/build/buildroot-config/autoconf.h KCONFIG_TRISTATE=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/build/buildroot-config/tristate.config BR2_CONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/.config HOST_GCC_VERSION="9" BASE_DIR=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588 SKIP_LEGACY= CUSTOM_KERNEL_VERSION="5.10" BR2_DEFCONFIG=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/configs/rockchip_rk3588_defconfig /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/build/buildroot-config/conf --defconfig=/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/.config.in Config.in
#
# configuration written to /work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot/output/rockchip_rk3588/.config
#
make: 离开目录“/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot”
生成.config
配置文件,位于buildroot/output/rockchip_rk3588
目录。
1.3.2 功能配置
进行recovery
配置:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot$ make menuconfig
配置如下选项:
Target packages --->
Hardware Platforms --->
[*] Rockchip Platform --->
Rockchip BSP packages --->
[*] Rockchip recovery for linux # BR2_PACKAGE_RECOVERY
[ ] No UI for recovery # BR2_PACKAGE_RECOVERY_NO_UI=N
choice the update bin of recovery. (rkupdate) --->
() rkupdate # BR2_PACKAGE_RECOVERY_USE_RKUPDATE,如果选中,自动选中recovery bin
(*) updateEngine # BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE、如果选中,自动选中updateEngine bin
[ ] recovery bin # BR2_PACKAGE_RECOVERY_RECOVERYBIN
-*- updateEngine bin # BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN
注意:配置源码位于buildroot/package/rockchip/recovery/Config.in
。
最终生成配置文件buildroot/output/rockchip_rk3588/.config
,包含配置项:
BR2_PACKAGE_RECOVERY=y #开启升级相关功能
# BR2_PACKAGE_RECOVERY_NO_UI is not set #打开UI
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y #使用新升级程序,不配置则默认使用原有升级流程
# BR2_PACKAGE_RECOVERY_RECOVERYBIN is not set #开启recovery bin 文件
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
我们需要将该以上配置追加到buildroot/configs/rockchip/chips/rk3588.config
文件中。
二、Recovery
源码分析
接下来我们来看研究《配置recovery
》小节中我们添加了这些配置项究竟实现了什么功能;
BR2_PACKAGE_RECOVERY=y #开启升级相关功能
# BR2_PACKAGE_RECOVERY_NO_UI is not set #打开UI
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y #使用新升级程序,不配置则默认使用原有升级流程
BR2_PACKAGE_RECOVERY_RECOVERYBIN=y #开启recovery bin 文件
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y #编译新升级程序
假如你对Buildroot
框架有深入了解的话,你就很容易明白软件包recovery
是Rockchip
为Buildroot
扩展的软件包,用来解决系统升级的问题。
有关如何在Buildroot
系统自定义软件包可以参考:《Rockchip RK3588 - Rockchip Linux SDK Buildroot
文件系统构建》。
2.1 in
和mk
文件
在为Buildroot
自定义软件包时,在软件包目录下通常为引入.in
和.mk
文件;
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp/buildroot$ ll package/rockchip/recovery/
-rw-r--r-- 1 root root 1596 6月 9 12:58 Config.in
-rw-r--r-- 1 root root 81 6月 9 12:58 recovery.hash
-rw-r--r-- 1 root root 2400 6月 9 12:58 recovery.mk
-rwxr-xr-x 1 root root 273 6月 9 12:58 S40recovery*
2.1.1 Config.in
我们首先从Config.in
文件入手,该文件实际上就是定义make menuconfig
支持的配置选项;
config BR2_PACKAGE_RECOVERY
bool "Rockchip recovery for linux"
depends on BR2_TOOLCHAIN_HAS_THREADS # libpthread-stubs 此配置项依赖于BR2_TOOLCHAIN_HAS_THREADS(其开启的情况下才可用)
select BR2_PACKAGE_LIBDRM # 如果启动,自动选择启用以下列出的其他软件包和库
select BR2_PACKAGE_LIBPNG
select BR2_PACKAGE_LIBPTHREAD_STUBS
select BR2_PACKAGE_LIBZ
select BR2_PACKAGE_DOSFSTOOLS
select BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT
select BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT
select BR2_PACKAGE_E2FSPROGS
select BR2_PACKAGE_E2FSPROGS_RESIZE2FS
select BR2_PACKAGE_LIBCURL
select BR2_PACKAGE_OPENSSL
select BR2_PACKAGE_BZIP2
help
Rockchip recovery for linux.
if BR2_PACKAGE_RECOVERY
config BR2_PACKAGE_RECOVERY_NO_UI # 不开启UI
bool "No UI for recovery"
help
No UI for recovery
config BR2_PACKAGE_RECOVERY_BOOTCONTROL # Linux A/B模式
bool "Linux AB bool control"
choice # 接下来的配置项将是一个选择项,用户可以从其中选择一个选项
default BR2_PACKAGE_RECOVERY_SUCCESSFUL_BOOT # 默认选项
prompt "Linux A/B bringup features."
config BR2_PACKAGE_RECOVERY_SUCCESSFUL_BOOT
bool "successful_boot" # 直至成功启动
config BR2_PACKAGE_RECOVERY_RETRY # 重试次数
bool "retry time"
endchoice
choice # 升级方式选择
default BR2_PACKAGE_RECOVERY_USE_RKUPDATE # 默认使用rkupdate
prompt "choice the update bin of recovery."
config BR2_PACKAGE_RECOVERY_USE_RKUPDATE # rkupdate升级方式
bool "rkupdate"
select BR2_PACKAGE_RECOVERY_RECOVERYBIN
config BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE # updateEngine升级方式
bool "updateEngine"
select BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN # 默认选择
endchoice
config BR2_PACKAGE_RECOVERY_RECOVERYBIN
bool "recovery bin"
config BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN
bool "updateEngine bin"
config BR2_PACKAGE_RECOVERY_STATIC
bool "Enable static"
default y if BR2_STATIC_LIBS
select BR2_PACKAGE_LIBCURL_STATIC
select BR2_PACKAGE_LIBDRM_STATIC
select BR2_PACKAGE_LIBPNG_STATIC
endif
比如我们勾选了updateEngine
,由于选中该配置项的同时,会默认选中updateEngine bin
配置项;
因此在生成的output/rockchip_rk3588_recovery/.config
配置文件会配置:
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y
2.1.2 recovery.mk
buildroot
编译recovery
所需要的设置recovery.mk
,包括源码位置、安装目录、权限设置等。
################################################################################
#
# Rockchip Recovery For Linux
#
################################################################################
RECOVERY_VERSION = develop
RECOVERY_SITE = $(TOPDIR)/../external/recovery
RECOVERY_SITE_METHOD = local
RECOVERY_LICENSE = ROCKCHIP
RECOVERY_LICENSE_FILES = NOTICE
RECOVERY_CFLAGS = $(TARGET_CFLAGS) -I. \
-fPIC \
-lpthread \
-lcurl \
-lssl \
-lcrypto \
-lbz2
RECOVERY_MAKE_ENV = $(TARGET_MAKE_ENV)
RECOVERY_DEPENDENCIES += libpthread-stubs util-linux libcurl openssl
ifeq ($(BR2_PACKAGE_RECOVERY_NO_UI),y)
RECOVERY_MAKE_ENV += RecoveryNoUi=true
else
RECOVERY_CFLAGS += -lpng -ldrm -lz -lm -I$(STAGING_DIR)/usr/include/libdrm
RECOVERY_DEPENDENCIES += libpng libdrm libzlib
endif
# For static link with libcurl
ifeq ($(BR2_PACKAGE_RTMPDUMP)$(BR2_PACKAGE_RECOVERY_STATIC),yy)
RECOVERY_CFLAGS += -lrtmp
RECOVERY_DEPENDENCIES += rtmpdump
endif
ifeq ($(BR2_PACKAGE_RECOVERY_USE_RKUPDATE),y)
RECOVERY_CFLAGS += -DUSE_RKUPDATE=ON
endif
ifeq ($(BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE),y)
RECOVERY_CFLAGS += -DUSE_UPDATEENGINE=ON
endif
ifeq ($(BR2_PACKAGE_RECOVERY_SUCCESSFUL_BOOT),y)
RECOVERY_CFLAGS += -DSUCCESSFUL_BOOT=ON
endif
ifeq ($(BR2_PACKAGE_RECOVERY_RETRY),y)
RECOVERY_CFLAGS += -DRETRY_BOOT=ON
endif
ifeq ($(BR2_PACKAGE_RECOVERY_STATIC),y)
RECOVERY_CFLAGS += -static
endif
define RECOVERY_BUILD_CMDS
$(RECOVERY_MAKE_ENV) $(MAKE) -C $(@D) \
CC="$(TARGET_CC)" CFLAGS="$(RECOVERY_CFLAGS)"
endef
ifeq ($(BR2_PACKAGE_RECOVERY_RECOVERYBIN),y)
define RECOVERYBIN_INSTALL_TARGET
$(INSTALL) -D -m 755 $(@D)/recovery $(TARGET_DIR)/usr/bin/
mkdir -p $(TARGET_DIR)/res/images
cp $(@D)/res/images/* $(TARGET_DIR)/res/images/
endef
define RECOVERY_INSTALL_INIT_SYSV
$(INSTALL) -D -m 755 $(RECOVERY_PKGDIR)/S40recovery \
$(TARGET_DIR)/etc/init.d/S40recovery
endef
endif
ifeq ($(BR2_PACKAGE_RECOVERY_BOOTCONTROL), y)
define BOOTCONTROLBIN_INSTALL_TARGET
$(INSTALL) -D -m 755 $(@D)/update_engine/S99_bootcontrol \
$(TARGET_DIR)/etc/init.d/
endef
endif
ifeq ($(BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN),y)
define UPDATEENGINEBIN_INSTALL_TARGET
$(INSTALL) -D -m 755 $(@D)/updateEngine $(TARGET_DIR)/usr/bin/
endef
endif
define RECOVERY_INSTALL_TARGET_CMDS
$(RECOVERYBIN_INSTALL_TARGET)
$(UPDATEENGINEBIN_INSTALL_TARGET)
$(BOOTCONTROLBIN_INSTALL_TARGET)
endef
$(eval $(generic-package))
三、编译和烧录
3.1 编译
我们可以采用一键全自动编译:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp# ./build.sh all
注意:如果出现编译失败等问题,直接移除buildroot/output
目录重新编译即可。
当然也可以只编译模块代码(rootfs
,recovery
),模块编译具体如下。
3.1.1 buildroot
编译
这里我们使用buildroot
系统,在系统根目录下执行如下命令重新编译rootfs.img
:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp#./build.sh buildroot
编译后在buildroot/output/rockchip_rk3588/images
下生成不同格式的镜像, 默认使用rootfs.ext4
格式。同时更新rockdev
目录下rootfs.img
。
3.1.2 recovery
编译
在系统根目录下执行如下命令重新编译recovery.img
:
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp#./build.sh recovery
编译后在buildroot/output/rockchip_rk3588_recovery/images/
目录下生成recovery.img
,同时更新rockdev
目录下recovery.img
。
3.1.3 打包分区镜像
执行以下命令更新output/firmware/
下各个分区镜像;
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp$ ./build.sh firmware
如果recovery.img
文件不存在,创建recovery.img
链接文件指向buildroot/output/rockchip_rk3588_recovery/images/recovery.img
。
如果rootfs.img
文件不存在,创建recovery.img
链接文件指向buildroot/output/rockchip_rk3588/images/rootfs.ext2
。
3.1.4 打包统一固件
执行如下命令重新生成统一固件;
root@ubuntu:/work/sambashare/rk3588/armsom/armsom-rk3588-bsp$ ./build.sh updateimg
四、OTA
升级测试
OTA
(Over-the-Air
)即空间下载技术。 OTA
升级是Android
系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络,例如WIFI
、3G/4G/5G
自动下载OTA
升级包、自动升级,也支持通过下载OTA
升级包到SD
卡/U
盘升级,OTA
的升级包非常的小,一般几MB
到十几MB
。
本文主要介绍了使用OTA
技术升级时,本地升级程序recovery
执行升级的流程及技术细节,以便用户在开发过程中了解升级的过程及注意事项。
4.1 升级
升级支持网络下载和本地升级,且可指定要升级的分区,在normal
系统运行如下命令:
网络升级:
# updateEngine --misc=update --image_url=固件地址 --partition=0x3FFC00 --
version_url=版本文件地址 --savepath=/userdata/update.img --reboot
updateEngine --image_url=http://172.16.21.110:8080/recovery/update.img \
--misc=update --savepath=/userdata/update.img --reboot &
本地升级:
updateEngine --image_url=/userdata/update.img --misc=update \
--savepath=/userdata/update.img --reboot &
升级流程:
- 固件版本比较(
--version_url
); - 下载固件(
--image_url
),并保存到本地(--savepath
); - 升级
recovery
分区; - 重启(
--reboot
); - 进入
recovery
模式,升级指定的分区(--partition
); - 升级成功,重启进入
normal
系统。
可缺省参数:
--version_url
:远程地址或本地地址,没有设置该参数,则不会进行版本比较;--savepath
:固件保存地址,缺省时为/tmp/update.img
,建议传入/userdata/update.img
;--partition
:设置将要升级的分区,不支持升级parameter
和loader
分区;--reboot
:升级recovery
完后,重启进入recovery
模式。
参考文章
[1] Rockchip Linux updateEngine
升级方案介绍
[2] Rockchip Linux Recovery
升级开发指南