OTA固件
OTA介绍
2.0 OTA提供的升级方案统一了固件升级和表盘传输,使用统一的升级协议,可以升级固件,ota_manager本身,表盘传输,自定义传输等等。基于芯片的flash类型不同,OTA固件的模式略有不同。
NOR FLASH
NOR FLASH ota manager
排布如上,有一个单独ota manager程序。
每次开机都会从boot loader->ota manager->hcpu
执行。
平时程序运行在hcpu,需要升级时,重启进入到ota manager。
此时执行顺序如下:
boot loader->ota manager
在ota manager中,通过BLE和手机交互,下载文件覆盖HCPU,RES等分区。下载完成后,再重启运行HCPU程序。
NOR FLASH ota manger ram run
每次开机都会从从boot loader-> hcpu执行 在HCPU中下载升级资源,需要预留下载空间。 压缩的HCPU image下载到备份区,其他资源诸如RES,FONT等,直接进行覆盖。 所以下载阶段,如果下载到了覆盖的bin,手表虽然运行在HCPU BIN,但是手表正常功能也不再可以使用。
下载完成后重启的执行顺序
boot loader->ota manager ram run
通过在sram运行ota manager,把备份区的image,解压到原始区域,完成升级后再重启开机,完成升级。
NAND FLASH
Nand flash不再使用ota manager,有两个hcpu bin,每次升级的时候,如果当前运行在HCPU1,则下载升级HCPU image到HCPU2,反之亦然。其他image同样采用覆盖的方式,下载时正常功能将不再可用。
下载完成后,重启到boot loader时,跳转到另一个HCPU,升级完成。 额外的是,对于使用文件系统的bin,除了可以完整下载覆盖之外,也可以使用差分包进行差分升级。
开机顺序
Boot loader->hcpu1
or
Boor loader->hcpu2
With MPI5
当芯片配置有mpi5时,需要在nand上配置download buffer,用于升级mpi5,因为这些部分与蓝牙有关,不能直接覆盖。
Without MPI5
TBD。
工程配置
以下配置均是HCPU的配置
NOR FLASH
下载内容如果需要备份到flash
选择store backup content on flash的同时,还需要配置flash map excel中dfu_download_buffer区域为0.7倍HCPU大小
NOR FLASH RAMRUN
必须要将备份区域选择到flash,修改方式和内容同NOR FLASH
NAND FLASH With MPI5
NAND FLASH Without MPI5
升级包制作
Image bin制作
NOR FLASH
imgtool.exe gen_dfu --img_para app 0 0 --key=s01 --sigkey=sig --dfu_id=1 --hw_ver=51 --sdk_ver=7001 --fw_ver=1001001 --com_type=0
NAND FLASH
imgtool.exe gen_dfu --img_para app 0 0 --key=s01 --sigkey=sig --dfu_id=1 --hw_ver=51 --sdk_ver=7001 --fw_ver=1001001 --com_type=0 --bksize=2048
–img_para: App是制作的bin的文件名,比如当前制作的是app.bin,可以同时制作多个bin 如–img_para app 0 0 lcpu 0 1 第一个数代表是否使用压缩,如果压缩就填16,只有nor flash ota可以使用压缩,且需要配置备份空间。 第二个数代表image id,每一个image bin都由此ID区分,参照dfu_protocol.h中OTA_EXT_V3定义下的dfu_img_id_t。 –dfu_id,nor flash ota升级ota manager时,填2,其余填1,升级ota manager只能单独制作ota_manager.bin,不能和其他bin混合升级。
Nand flash 差分升级资源包制作
编译基础版本,保存fat_img文件夹,如果升级工程和基础版本不是同一工程,需要copy到其他路径或者重命名,避免编译升级版本覆盖
编译升级版本,保存fat_img文件夹
差分包制作,生成的zip包就是基础版本到升级版本的资源包
OTA 升级包制作示例 (以 SF32LB523
NOR 方案为例)
确认需要升级的分区 (如
APP
,PIC
,FONT
,ROOT
等), 一般在资源 (对应PIC
分区) 保持不变的情况下只打包升级APP
即快包升级根据不同分区配置 OTA 升级包打包脚本, 参见示例
52x_pack_ota_app.bat
(打包升级APP
) 以及52x_pack_ota_all.bat
(打包升级所有分区), 关键指令为调用imgtoolv37.exe
程序对各分区进行封装打包, 打包 OTA 升级包所需程序及 Sig 文件及在 Solution 中的获取位置参见如下
sdk\tools\secureboot\imgtoolv37.exe
sdk\tools\secureboot\sifli02\s01.bin
sdk\tools\secureboot\sifli02\sig_hash.bin
sdk\tools\secureboot\sifli02\sig_pri.pem
rem === 52x_pack_ota_app.bat ===
@echo off
cd /d "%~dp0"
set tool_dir=ota_tool
set ota_dir=ota
set root_path=output
set project_name=mod
set verno=1.0
set param1=%~1
set param2=%~2
if "%param1%"=="" (
echo Input param1 - project_name is NULL
)else (
set project_name=%param1%
)
if "%param2%"=="" (
echo Input param2 - verno is NULL
)else (
set verno=%param2%
)
echo project name is "%project_name%"
echo version number is "%verno%"
set str_date=%date:~0,4%%date:~5,2%%date:~8,2%
set str_time=%time:~0,2%%time:~3,2%
set str_time=%str_time: =0%
set packet_name=%project_name%_%verno%_%str_date%_%str_time%
set packet_path=%root_path%\%ota_dir%
set ota_zip=%root_path%\%packet_name%.zip
set cmd=imgtoolv37.exe gen_dfu --img_para app 0 0 --key=s01 --sigkey=sig --dfu_id=1 --hw_ver=51 --sdk_ver=7001 --fw_ver=1001001 --com_type=0
echo %str_date%
echo %str_time%
if exist %root_path% (
rd %root_path% /s/q
)
md %root_path%
md %packet_path%
for %%s in (*.*) do (
if %%~xs==.bat (
echo %%s
) else (
if %%s==7za.exe (
echo %%s
) else if %%s==ER_IROM1.bin (
echo %%s
) else if %%s==ER_IROM2.bin (
echo %%s
) else if %%s==ER_IROM3.bin (
echo %%s
) else if %%s==root.bin (
echo %%s
) else (
del %%s
)
)
)
copy %tool_dir%\imgtoolv37.exe
copy %tool_dir%\*.bin
copy %tool_dir%\*.pem
copy ER_IROM1.bin app.bin
start /wait "" %cmd%
copy ctrl_packet.bin %packet_path%\
copy outapp.bin %packet_path%\
cd %root_path%
start /wait "" ..\7za.exe a %packet_name%.zip %ota_dir%
@pause
rem === 52x_pack_ota_all.bat ===
@echo off
cd /d "%~dp0"
set tool_dir=ota_tool
set ota_dir=ota
set root_path=output
set project_name=mod
set verno=1.0
set param1=%~1
set param2=%~2
if "%param1%"=="" (
echo Input param1 - project_name is NULL
)else (
set project_name=%param1%
)
if "%param2%"=="" (
echo Input param2 - verno is NULL
)else (
set verno=%param2%
)
echo project name is "%project_name%"
echo version number is "%verno%"
set str_date=%date:~0,4%%date:~5,2%%date:~8,2%
set str_time=%time:~0,2%%time:~3,2%
set str_time=%str_time: =0%
set packet_name=%project_name%_%verno%_%str_date%_%str_time%
set packet_path=%root_path%\%ota_dir%
set ota_zip=%root_path%\%packet_name%.zip
set cmd=imgtoolv37.exe gen_dfu --img_para app 0 0 res 0 3 font 0 4 root 0 5 --key=s01 --sigkey=sig --dfu_id=1 --hw_ver=51 --sdk_ver=7001 --fw_ver=1001001 --com_type=0
echo %str_date%
echo %str_time%
if exist %root_path% (
rd %root_path% /s/q
)
md %root_path%
md %packet_path%
for %%s in (*.*) do (
if %%~xs==.bat (
echo %%s
) else (
if %%s==7za.exe (
echo %%s
) else if %%s==ER_IROM1.bin (
echo %%s
) else if %%s==ER_IROM2.bin (
echo %%s
) else if %%s==ER_IROM3.bin (
echo %%s
) else if %%s==root.bin (
echo %%s
) else (
del %%s
)
)
)
copy %tool_dir%\imgtoolv37.exe
copy %tool_dir%\*.bin
copy %tool_dir%\*.pem
copy ER_IROM1.bin app.bin
copy ER_IROM2.bin res.bin
copy ER_IROM3.bin font.bin
start /wait "" %cmd%
copy ctrl_packet.bin %packet_path%\
copy outapp.bin %packet_path%\
copy outres.bin %packet_path%\
copy outfont.bin %packet_path%\
copy outroot.bin %packet_path%\
cd %root_path%
start /wait "" ..\7za.exe a %packet_name%.zip %ota_dir%
@pause
新增OTA
注册接口
固件新增OTA类型通过如下接口注册:
/*
*id:
* ota类型的标识, 需要和手机端保持一致。
* 添加类型在"ota_custom_config.h"的OTA_DFU_CUSTOM_START_IND后添加枚举值。
*flag:
* 可以位或方式传入参数,见ota_flag_t。
* OTA_FLAG_REINSTALL: 支持重安装,目前只有NAND ota差分资源支持重安装处理,其余都不支持。
* OTA_FLAG_RESUME: 支持续传,目前基于文件系统存储都支持续传,重启/传输其他ota包时不会续传。
* OTA_FLAG_SEP_DIR:传输的文件放到由手机和固件协商解析的子目录,只有SF_TOOL传输使用。
* OTA_FLAG_BACKGROUND:支持后台传输,建议只有升级较小的文件时使用后台传输功能。
*dst:
* 固件端指定存放路径,如音乐,SF_TOOL,背景传输等手机不知道路径,需要固件指定存放路径。
*backup:
* 备份路径,基于文件系统传输都会设置备份路径,可以避免覆盖模式传输失败对原有包的影响。
* NAND 差分资源特殊处理,dst和backup不会生效
*msg_handler:
* OTA协议消息处理回调函数
*
*/
OTA_REGISTER(id, flag, dst, backup, msg_handler)
透传
基于文件系统类型可以复用ota_fs_proc.c,没有特殊需求,能够覆盖绝大部分传输。
非文件系统类型,如接收数据写到内存/串口等,需要用户自行实现msg_handler的处理。
安装
img bin的安装由sdk完成,此处描述是基于文件系统的安装处理(ota_window.c)。
基于文件系统的传输都是备份模式传输,所以需要有pre_copy,copy,post_copy处理。
pre_copy中主要是清除原有的包和数据,如删除旧的表盘包和内存数据节点等,用户根据新增类型情况处理。
copy处理提供了统一的接口进行从备份区到目的区的搬移,用户不用关心。
post_copy中主要是搬移成功后的安装流程处理,用户根据新增类型情况处理。
常见问题
BLE下载时,需要尽量停止手表和手机其他的BLE交互。
2.NOR FLASH OTA方案中,运行到ota manager时,使用的是ota工程默认的广播和GATT服务,如有需要,需要自行适配。