首页 > 系统相关 >Rockchip RK3588 - Rockchip Linux Recovery升级

Rockchip RK3588 - Rockchip Linux Recovery升级

时间:2024-06-22 11:22:37浏览次数:15  
标签:Recovery rk3588 Rockchip Linux BR2 rockchip armsom config recovery

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

开发板 :ArmSoM-Sige7开发板
eMMC64GB
LPDDR48GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot2017.09
linux5.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框架有深入了解的话,你就很容易明白软件包recoveryRockchipBuildroot扩展的软件包,用来解决系统升级的问题。

有关如何在Buildroot系统自定义软件包可以参考:《Rockchip RK3588 - Rockchip Linux SDK Buildroot文件系统构建》。

2.1 inmk文件

在为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目录重新编译即可。

当然也可以只编译模块代码(rootfsrecovery),模块编译具体如下。

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升级测试

OTAOver-the-Air)即空间下载技术。 OTA升级是Android系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络,例如WIFI3G/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:设置将要升级的分区,不支持升级parameterloader分区;
  • --reboot:升级recovery完后,重启进入recovery模式。

参考文章

[1] Rockchip Linux updateEngine升级方案介绍

[2] Rockchip Linux Recovery升级开发指南

标签:Recovery,rk3588,Rockchip,Linux,BR2,rockchip,armsom,config,recovery
From: https://www.cnblogs.com/zyly/p/18251357

相关文章

  • 【Linux基础】基础环境配置
    设置APT源进入源文本设置:vim/etc/apt/sources.list配置源:#中科大debhttp://mirrors.ustc.edu.cn/kalikali-rollingmainnon-freecontribdeb-srchttp://mirrors.ustc.edu.cn/kalikali-rollingmainnon-freecontrib#阿里云debhttp://mirrors.aliyun.com/kali......
  • 解决Linux中出现Too many open files
    Too many open files  问题出现有两种情况:一种是在搜索的时候出现,多半是由于索引创建完毕之后被移动过,如果创建索引的时候不出现该错误,搜索的时候也一般是不会出现的。如果出现了,有两种处理办法,一种是修改合并因子和最小合并因子,并且使用IndexWriter.Optimize()  优化索引,......
  • Linux命令之vim指令——小白必备指南
    Vim编辑器的三种工作模式:命令模式(默认模式):复制,粘贴,剪切,切换到其他模式输入模式(编辑模式):a\\i\\o,针对每个字符进行编辑,删除末行模式(扩展模式):保存,退出,保存并退出,字符替换等光标方向移动操作类型剪切(删除)        删除当前光标处单个字符:x或者Del剪切当前行:dd  ......
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(三)-shell语法
    主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。文章目录前言一、shell二、shell语法1.运行方式2.注释3.变量4.默认变量 5.数组 总结前言主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。提示:以下是本篇......
  • Rocky Linux捣鼓记录(一):如何安装使用中文输入法
    linux的常见输入法方案有fcitx、ibus,fcitx类型的输入法我没找到合适方案,ibus提供了一个智能拼音中文输入法比较顺手,安装简单。我使用的系统版本为RockyLinux9.4,已经自带ibus中文输入法,从设置——keyboard中选择输入源,新增——汉语(中国)选择——中文(智能拼音)即可若系统中没有,......
  • Linux基础命令————浅显易懂的带你了解Linux
    首先,Xshell连接云服务器Linux的语法更接近PowerShellPowerShell和Window命令行都可以对Window操作系统进行操作,但是PowerShell语法更全一些。默认打开这个目录用哪个用户登录的计算机,最后就会到哪个目录下用ls指令可以查看目录下,有哪些文件Windows命令行由于没有这个......
  • linux笔记
    linux命令行重定向:标准输出>.>>ls>file_list.txt:在此示例中,ls执行命令并将结果写入名为的文件中file_list.txt。由于的输出ls被重定向到文件,因此显示屏上不会出现任何结果.ls>>file_list.txt:附加结果时,新结果将添加到文件末尾,从而使每次重复命令时文件......
  • Linux ─── 常见指令2
            总结:讲解linux的常见指令和linux的常识。  目录07.cp指令(重要):08mv指令(重要):09cat(正序显示文章内容)tac是倒序显示10.more指令(一般不用)11.less指令(重要)12.head指令13.tail指令14.时间相关的指令15.Cal指令(一般不用)16.find指令:(灰常重要)-name17.gre......
  • Linux系统编程基本程序框架
    -----仅作为学习笔记1、什么是Linux系统编程?Linux系统编程也叫Linux下的高级编程,是介于应用层和驱动层之间的。2、Linux系统编程的基本程序框架#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){//argc:表示的是命令行中参数的个数//......
  • 【Linux进程】Linux下的---七大进程状态(什么是进程状态?Linux下有哪些进程状态?)
    目录一、前言二、什么是进程状态?三、操作系统(OS)下的---进程状态......