Skip to main content

本地OTA升级

一 开发板介绍

1 Halley6_X1600E_v2.0 开发板如下:

2022-09-26_16-51

2022-09-26_16-51_1

2 Halley6_X1600E_V2.0开发板硬件详细介绍

详细硬件介绍见:

doc/FAE文档/Halley6_X1600E_V2.0/Halley6开发套件硬件手册_V2.1.pdf

二 本地OTA 原理和介质介绍

1 OTA简介和实现方法

​ 君正本地OTA简单来说分为两个步骤。第一步:将需要更新的升级固件放到开发板上。 第二步:执行相应脚本,利用得到的OTA升级固件更新到自身的设备上,然后重启切换到更新好的系统上,从而完成OTA整个流程。君正基于Linux 系统,目前OTA 升级的策略是采用双系统备份。也就是一台设备上同时含有两套系统。每次只运行在其中一套系统上。其中共用一个uboot,有两份kernel和rootfs文件系统。这样不管OTA升级是否成功,都可以保证当前的系统是正常的。

2 OTA 存储介质

​ 君正OTA目前支持的存储介质包含两种:mtd 和 mmc两种。其中mtd包含:nand 和 nor。

三 ota 编译配置

1 uboot 添加支持 ota 功能

以Halley6_X1600E_V2.0开发板编译配置为例,编译出的uboot固件需要支持ota功能:

首先需要确定你当前的编译配置使用的是那个uboot的编译配置文件,通过如下方法可以确定。使用工具 tools/iconfigtool/IConfigToolApp$ ./IConfigTool ,选择主配置文件: build$ ls configs/x1600e_halley6_nand_factory_defconfig

2022-12-06_15-37

如上图,根据uboot相对路径和默认配置,可以确定uboot编译的配置文件为 bootloader/uboot-x2000/boards.cfgx1600e_base_halley6_xImage_sfc_nand,在文件 boards.cfg中搜索x1600e_base_halley6_xImage_sfc_nand。看是否含有SPL_OS_OTA_BOOT的标志。有这个标志表示uboot支持ota的功能,没有就手动加上这个标志。

x1600e_base_halley6_xImage_sfc_nand  mips        xburst x1600_base   ingenic    x1600       x1600_base:SPL_SFC_NAND,MTD_SFCNAND,SPL_OS_OTA_BOOT,SPL_PARAMS_FIXER,X1600E_DDR

2 spl添加wdt

修改uboot配置文件x1600_base.h,位于bootloader/uboot-x2000/include/configs目录下

添加两个宏 #define CONFIG_JZ_WATCHDOG #define CONFIG_OTA_WDT_TIMEOUT_MS (20 * 1000)

#ifndef __X1600_BASE_H__
#define __X1600_BASE_H__

#define CONFIG_ROOTFS_SQUASHFS
#define CONFIG_ROOTFS2_SQUASHFS
#define CONFIG_ARG_QUIET
#define CONFIG_SPL_SERIAL_SUPPORT


/* 添加以下 2个宏 */
#define CONFIG_JZ_WATCHDOG
#define CONFIG_OTA_WDT_TIMEOUT_MS (20 * 1000)


#include "x1600_base_common.h"

#endif /* __X1600_BASE_H__ */

3 添加wdt驱动

2024-12-11_17-08

2024-12-11_17-09

四 制作OTA升级固件

​ 以Halley6X1600E_V2.0开发板为例制作OTA升级固件。首先参考 `doc/FAE文档/Halley6_X1600E_V2.0/Halley6_X1600E_v2.0开发板快速上手说明文档.pdfdoc/FAE文档/Halley6X1600E_V2.0/Halley6_X1600E_v2.0开发板WIFI使用说明.pdf`,让板子先联上网络。而后重新配置ota相关配置,生成ota升级固件。

1 ota相关配置

使用工具 tools/iconfigtool/IConfigToolApp$ ./IConfigTool ,选择配置文件: build$ ls configs/x1600e_halley6_nand_factory_defconfig

配置如下:

2022-12-05_17-34

2024-12-11_17-11

选择 使用 wdt 来防止设备变砖 和 ota 使用本地单包升级,单包本地ota分包大小用于单次读取大小,越大内存开销越大,太小升级时间会很长。

2024-12-11_17-12

2 编译ota 升级包固件

先使用配置 build/configs/x1600e_halley6_nand_factory_defconfig 进行整体编译以后,然后进入build,执行如下指令:

build$ make ota_img
#注意: 在编译ota_img 之前必须得先保证编译好buildroot镜像文件与kernel镜像文件

在 "工程/build"目录下编译ota升级镜像,会在 "工程/build/output/ota" 目录下生成ota镜像文件:

kenny@kenny-MS-7B89:~/source/linux_new_code_source/build$ ls output/ota/ -lh
total 25M
#本地升级包,可以将该文件push到板子上进行本地升级
-rw-rw-r-- 1 kenny kenny 13M 1211 16:28 ota_img_packet

五 OTA 烧录工具配置

1 存储介质为NAND 的烧录工具配置

使用Halley6_X1600E_V2.0开发板 OTA 烧录为例,进行烧录工具的说明。配置如下:

2024-12-11_18-03_1

2024-12-11_18-03

六 OTA 升级的流程

调用ota升级脚本,ota的升级脚本在 "/etc/ota_bin/" 目录下,ota的配置在文件 "/etc/ota_info" 中,ota_info的内容如下:

ota_version=0     #表示设备端当前的版本号
ota_site=http://194.169.3.230/ota/board_test #表示ota升级的服务器地址

ota_info 配置文件是由前面 "make ota_img" 的命令所生成的:

ota的升级脚本文件:

# ls /etc/ota_bin/ -l
-rwxrwxr-x 1 root root 14147 Dec 11 2024 local_ota_update.sh
-rwxrwxr-x 1 root root 15416 Dec 11 2024 local_ota_update_use_single_packet.sh
-rwxrwxr-x 1 root root 8313 Dec 11 2024 main_os_info_check.sh
-rwxrwxr-x 1 root root 13825 Dec 11 2024 network_main_os_update_recovery.sh
-rwxrwxr-x 1 root root 14378 Dec 11 2024 network_ota_update.sh
-rwxrwxr-x 1 root root 14014 Dec 11 2024 network_recovery_update_main_os.sh
-rwxrwxr-x 1 root root 418 Dec 11 2024 ota_clear_flag.sh
-rwxrwxr-x 1 root root 2596 Dec 11 2024 ota_img_data_provider.sh
-rw-rw-r-- 1 root root 4161 Dec 11 2024 ota_local_method.sh
-rwxrwxr-x 1 root root 1077 Dec 11 2024 ota_update_kernel.sh
-rwxrwxr-x 1 root root 1077 Dec 11 2024 ota_update_rootfs_squashfs.sh
-rwxrwxr-x 1 root root 1053 Dec 11 2024 ota_update_rtos_bin.sh
-rw-rw-r-- 1 root root 6794 Dec 11 2024 ota_utils.sh
-rw-rw-r-- 1 root root 727 Dec 11 2024 recovery_version_utils.sh
build$ adb push output/ota/ota_img_packet /usr/data/
adb shell
#路径需要全路径,不能相对路径
sh /etc/ota_bin/local_ota_update_use_single_packet.sh /usr/data/ota_img_packet

升级最后的结果见下:

# cat /proc/cmdline   //升级前的
console=ttyS2,3000000n8 quiet mem=64M@0x0 init=/linuxrc flashtype=nand root=/dev/mtdblock_bbt_ro2 rootfstype=squashfs ro

# cat /etc/ota_info //升级前的版本号
ota_version=0
ota_site=http://192.168.43.52/ota/board_test
#


# /etc/ota_bin/local_ota_update_use_single_packet.sh /usr/data/ota_img_packet
1+0 records in
1+0 records out
ota_kernel 1
ota_kernel_name xImage
ota_kernel_size 3932224
ota_kernel_md5 1df8e732aeb5f7903b722aa4abd9ac98
ota_kernel_crc 1788599374
ota_rootfs 1
ota_rootfs_name rootfs.squashfs
ota_rootfs_size 8966144
ota_rootfs_md5 1fbdab18c01b08ce49d13a3fa1eb7d42
ota_rootfs_crc 1832110812
ota_rtos 0
ota_rtos_name
ota_rtos_size
ota_rtos_md5
ota_rtos_crc
bs_size 131072
ota_img_packet_md5 de0442f27caf4bf463907ccd8ee0403c
check_img 1
98+1 records in
98+1 records out
ECC failed: 0
ECC corrected: 0
Number of bad blocks: 0
Number of bbt blocks: 0
Block size 131072, page size 2048, OOB size 64
Dumping data starting at 0x00000000 and ending at 0x00000100...
ECC failed: 0
ECC corrected: 0
Number of bad blocks: 0
Number of bbt blocks: 0
Block size 131072, page size 2048, OOB size 64
Dumping data starting at 0x00000000 and ending at 0x00000100...
we are going to ota update
ota: started
start update kernel
Erasing 128 Kibyte @ 1e0000 -- 46 % complete flash_erase: Skipping bad block at 00200000
Erasing 128 Kibyte @ 3e0000 -- 100 % complete
Writing data to block 0 at offset 0x0
Writing data to block 1 at offset 0x20000
Writing data to block 2 at offset 0x40000
Writing data to block 3 at offset 0x60000
Writing data to block 4 at offset 0x80000
Writing data to block 5 at offset 0xa0000
Writing data to block 6 at offset 0xc0000
Writing data to block 7 at offset 0xe0000
Writing data to block 8 at offset 0x100000
Writing data to block 9 at offset 0x120000
Writing data to block 10 at offset 0x140000
Writing data to block 11 at offset 0x160000
Writing data to block 12 at offset 0x180000
Writing data to block 13 at offset 0x1a0000
Writing data to block 14 at offset 0x1c0000
Writing data to block 15 at offset 0x1e0000
Writing data to block 16 at offset 0x200000
Bad block at 200000, 1 block(s) will be skipped
Writing data to block 17 at offset 0x220000
Writing data to block 18 at offset 0x240000
Writing data to block 19 at offset 0x260000
Writing data to block 20 at offset 0x280000
Writing data to block 21 at offset 0x2a0000
Writing data to block 22 at offset 0x2c0000
Writing data to block 23 at offset 0x2e0000
Writing data to block 24 at offset 0x300000
Writing data to block 25 at offset 0x320000
Writing data to block 26 at offset 0x340000
Writing data to block 27 at offset 0x360000
Writing data to block 28 at offset 0x380000
Writing data to block 29 at offset 0x3a0000
Writing data to block 30 at offset 0x3c0000
Writing data to block 31 at offset 0x3e0000
131008+0 records in
131008+0 records out
xImage read ok, now quit
kernel update done
start update rootfs
Erasing 128 Kibyte @ bc0000 -- 73 % complete flash_erase: Skipping bad block at 00be0000
Erasing 128 Kibyte @ d80000 -- 84 % complete flash_erase: Skipping bad block at 00da0000
Erasing 128 Kibyte @ fe0000 -- 100 % complete
Writing data to block 0 at offset 0x0
Writing data to block 1 at offset 0x20000
Writing data to block 2 at offset 0x40000
Writing data to block 3 at offset 0x60000
Writing data to block 4 at offset 0x80000
Writing data to block 5 at offset 0xa0000
Writing data to block 6 at offset 0xc0000
Writing data to block 7 at offset 0xe0000
Writing data to block 8 at offset 0x100000
Writing data to block 9 at offset 0x120000
Writing data to block 10 at offset 0x140000
Writing data to block 11 at offset 0x160000
Writing data to block 12 at offset 0x180000
Writing data to block 13 at offset 0x1a0000
Writing data to block 14 at offset 0x1c0000
Writing data to block 15 at offset 0x1e0000
Writing data to block 16 at offset 0x200000
Writing data to block 17 at offset 0x220000
Writing data to block 18 at offset 0x240000
Writing data to block 19 at offset 0x260000
Writing data to block 20 at offset 0x280000
Writing data to block 21 at offset 0x2a0000
Writing data to block 22 at offset 0x2c0000
Writing data to block 23 at offset 0x2e0000
Writing data to block 24 at offset 0x300000
Writing data to block 25 at offset 0x320000
Writing data to block 26 at offset 0x340000
Writing data to block 27 at offset 0x360000
Writing data to block 28 at offset 0x380000
Writing data to block 29 at offset 0x3a0000
Writing data to block 30 at offset 0x3c0000
Writing data to block 31 at offset 0x3e0000
Writing data to block 32 at offset 0x400000
Writing data to block 33 at offset 0x420000
Writing data to block 34 at offset 0x440000
Writing data to block 35 at offset 0x460000
Writing data to block 36 at offset 0x480000
Writing data to block 37 at offset 0x4a0000
Writing data to block 38 at offset 0x4c0000
Writing data to block 39 at offset 0x4e0000
Writing data to block 40 at offset 0x500000
Writing data to block 41 at offset 0x520000
Writing data to block 42 at offset 0x540000
Writing data to block 43 at offset 0x560000
Writing data to block 44 at offset 0x580000
Writing data to block 45 at offset 0x5a0000
Writing data to block 46 at offset 0x5c0000
Writing data to block 47 at offset 0x5e0000
Writing data to block 48 at offset 0x600000
Writing data to block 49 at offset 0x620000
Writing data to block 50 at offset 0x640000
Writing data to block 51 at offset 0x660000
Writing data to block 52 at offset 0x680000
Writing data to block 53 at offset 0x6a0000
Writing data to block 54 at offset 0x6c0000
Writing data to block 55 at offset 0x6e0000
Writing data to block 56 at offset 0x700000
Writing data to block 57 at offset 0x720000
Writing data to block 58 at offset 0x740000
Writing data to block 59 at offset 0x760000
Writing data to block 60 at offset 0x780000
Writing data to block 61 at offset 0x7a0000
Writing data to block 62 at offset 0x7c0000
Writing data to block 63 at offset 0x7e0000
Writing data to block 64 at offset 0x800000
Writing data to block 65 at offset 0x820000
Writing data to block 66 at offset 0x840000
Writing data to block 67 at offset 0x860000
Writing data to block 68 at offset 0x880000
rootfs.squashfs read ok, now quit
rootfs update done
ECC failed: 0
ECC corrected: 0
Number of bad blocks: 0
Number of bbt blocks: 0
Block size 131072, page size 2048, OOB size 64
Dumping data starting at 0x00000000 and ending at 0x00000100...
Erasing 128 Kibyte @ 0 -- 100 % complete
Writing data to block 0 at offset 0x0
ota update ok
ota: stoped success
######
reboot

重启系统以后

adb shell

# cat /proc/cmdline //升级后的
console=ttyS2,3000000n8 quiet mem=64M@0x0 init=/linuxrc flashtype=nand root=/dev/mtdblock_bbt_ro4 rootfstype=squashfs ro

# cat /etc/ota_info //升级后的版本号
ota_version=100
ota_site=http://192.168.43.52/ota/board_test
#