OTA固件

OTA介绍

2.0 OTA提供的升级方案统一了固件升级和表盘传输,使用统一的升级协议,可以升级固件,ota_manager本身,表盘传输,自定义传输等等。基于芯片的flash类型不同,OTA固件的模式略有不同。

NOR FLASH

NOR FLASH ota manager

alt text

排布如上,有一个单独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,但是手表正常功能也不再可以使用。

alt text

下载完成后重启的执行顺序 boot loader->ota manager ram run

通过在sram运行ota manager,把备份区的image,解压到原始区域,完成升级后再重启开机,完成升级。

NAND FLASH

alt text

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

alt text 下载内容如果需要备份到flash 选择store backup content on flash的同时,还需要配置flash map excel中dfu_download_buffer区域为0.7倍HCPU大小 alt text

NOR FLASH RAMRUN

必须要将备份区域选择到flash,修改方式和内容同NOR FLASH alt text

NAND FLASH With MPI5

alt text

NAND FLASH Without MPI5

alt text

升级包制作

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文件夹 alt text

  • 差分包制作,生成的zip包就是基础版本到升级版本的资源包 alt text alt text

OTA 升级包制作示例 (以 SF32LB523 NOR 方案为例)

  1. 确认需要升级的分区 (如 APP , PIC , FONT , ROOT 等), 一般在资源 (对应 PIC 分区) 保持不变的情况下只打包升级 APP 即快包升级

  2. 根据不同分区配置 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服务,如有需要,需要自行适配。