固件端

FAQ1 OTA标志位怎么置,才能重启后进入OTA模式?

  1. NOR 方案

// 获取全局变量
dfu_ctrl_ext_v3_env_t *env = dfu_ctrl_ext_v3_get_env();
// 设置为升级状态
env->prog.state = DFU_CTRL_PREPARE_START;
// 任务类型设置为DFU
env->prog.type = DFU_TYPE_DFU
// 存储状态到NV
dfu_ctrl_ext_v3_update_prog_info(env);
// 重启
drv_reboot();
  1. NAND/NOR RAMRUN 方案

ota_ser_res_status(OTA_RES_STATUS_OVERWRITE);
drv_reboot();

FAQ2 资源/数据异常导致开机死机、无限重启的解决方案

  1. 问题背景 资源加载失败、代码 BUG 等异常,会导致设备开机即死机、无限重启,最终造成设备变砖,需针对性增加容错策略规避该问题。

  2. 解决方案(防砖 + 防误触) 核心策略:基于开机异常重启次数阈值,自动触发 OTA 自救,同时规避产线操作导致的误触发,完整逻辑如下:

  1. 开机标记:设备上电启动时,立即在 NV 区置位「开机未完成」标志位;

  2. 正常清除:设备成功加载至主界面(功能、界面均正常)后,立即清除该标志位;

  3. 阈值触发:累计检测到「开机未完成」标志位达 5 次及以上 时,自动触发 OTA 模式(阈值可根据产线需求调整,建议≥5 次);

  4. 产线防护:高阈值设计可有效避免「产线焊电池、频繁断电上电」导致的误进入 OTA 模式问题。



FAQ4 支持断点续传的OTA软件升级过程中出现重启,重启之后无法进行升级

TBD.


FAQ5 修改flash分区后,怎么OTA

TBD.


NAND方案修改分区后,怎么OTA?

TBD.


NOR RAMRUN方案修改分区后,怎么OTA?

TBD.


FAQ6 OTA固件时系统状态是什么样

  • NOR OTA会重启进入OTA manager, 这个模式会一直运行, 直到ota完成。

  • NAND OTA会在主代码(hcpu)中进入一个特殊界面,此界面用的资源和字体都是内置编译到主代码。外置的资源不能使用, BT, 文件系统(sys分区除外),kvdb(dfu相关除外)等都不无法使用。

  • NOR RAMRUN OTA会在主代码(hcpu)中进入一个特殊界面,此界面用的资源和字体都是内置编译到主代码。外置的资源不能使用, BT, 文件系统(sys分区除外),kvdb(dfu相关除外)等都不无法使用, 接收完成后会重启进入OTA MANAGER进行hcpu解压安装处理。


FAQ7 怎么新增一个OTA类型?

  1. ota_fs_proc.c中调用OTA_REGISTER函数注册新的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)

  1. ota_window.c中的app_ota_pre_copy_handler函数中增加copy前的预处理和app_ota_post_copy_handler函数中增加copy完成后处理


FAQ8 OTA续传规则是怎么样的?

OTA续传需要满足以下:

  • OTA类型注册时支持OTA_FLAG_RESUME标识

  • OTA续传包和上一次包相同且类型相同

  • 未发生重启行为

  • 续传的信息符合协议要求


FAQ9 OTA应用后怎么指定运行的应用?

修改ota_window.cota_get_run_app函数返回的应用名即可指定ota完成后运行的应用。
默认逻辑如下:

  • OTA 应用包完成会运行新增应用

  • OTA 表盘包完成会运行新表盘

  • OTA 其他包会运行app_get_reg_main_app函数返回的应用


FAQ10 如何指定某些应用/界面不能进行OTA升级?

调用固件提供的 ota_set_ui_invalid(uint8_t invalid) 函数,即可实现指定场景的 OTA 禁用,接口入参规则:

  • invalid ≠ 0:标记当前应用 / 界面禁止触发 OTA 升级;

  • invalid = 0:标记当前应用 / 界面允许触发 OTA 升级。
    调用时机:在目标应用 / 界面的初始化和反初始化函数中执行该接口,即可生效; 默认禁用场景:固件原生已默认禁用以下场景的 OTA,无需重复配置:

  1. ✔ 开机向导 APP 运行期间;

  2. ✔ 设备关机流程执行期间


FAQ11 container工程ota后只有一个app了

container工程如果ota了应用包,会删除原有应用,只保留ota后的应用。


FAQ12 如何实现背景图/gif传输?

采用自定义传输通道(类型3)实现,适配背景图、背景gif等资源文件OTA下发,步骤如下:

  1. 手机端处理:使用配套eZIP工具,将背景图/背景GIF进行压缩处理。

  2. 压缩是保证ZIP包内的文件夹子路径与固件端实际使用的路径完全一致, 比如主菜单背景gif的使用路径是/images/dynamic_bg/xxx.gif,则ZIP包解压后的子路径也需要是/images/dynamic_bg/xxx.gif

  3. 通过自定义OTA类型3通道下发ZIP包,固件端会将文件保存到指定路径。


FAQ13 OTA资源失败后传输的资源是怎么处理的?

  • 传输阶段失败后,已经接收的资源会保留,用以下次续传

  • 传输完成安装阶段失败,已经接收的文件会全部删除

  • 重启后会删除所有已经接收的文件