upgrade
upgrade模块提供固件升级(FOTA)功能,支持升级包的写入、读取、校验和执行。该模块包含升级模块初始化、升级包数据读写、升级流程控制、升级状态查询及升级结果获取等接口,支持同步和异步写入方式,并提供升级进度通知和自定义校验功能。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| uapi_upg_init | 初始化升级模块 |
| uapi_upg_start | 开始本地升级 |
| uapi_upg_register_progress_callback | 注册升级进度通知回调函数 |
| uapi_upg_get_result | 获取升级结果 |
| uapi_upg_get_status | 获取升级状态 |
| uapi_upg_prepare | 准备本地存储器以存放升级包 |
| uapi_upg_reset_upgrade_flag | 重置升级标记 |
| uapi_upg_write_package_async | 异步写入升级包数据到本地存储器 |
| uapi_upg_write_package_sync | 同步写入升级包数据到本地存储器 |
| uapi_upg_read_package | 从本地存储器读取升级包数据 |
| uapi_upg_get_storage_size | 获取可存放升级包的空间大小 |
| uapi_upg_request_upgrade | 申请开始进行本地升级 |
| uapi_upg_verify_file_head | 校验升级包头结构 |
| uapi_upg_verify_file_image | 校验升级包中的升级镜像 |
| uapi_upg_verify_file | 校验整个升级包 |
| uapi_upg_register_user_defined_verify_func | 注册用户自定义字段的校验函数 |
Functions
uapi_upg_init
函数声明
头文件清单
功能说明
- 初始化升级模块,注册升级模块所需的内存分配、释放及串口输出函数
- 必须在其他升级接口调用之前完成初始化,否则其他接口返回 ERRCODE_UPG_NOT_INIT
- 重复调用初始化将返回 ERRCODE_UPG_ALREADY_INIT
前置条件
- 升级模块尚未初始化(未调用过 uapi_upg_init)
- func_list 指针不为 NULL 时,其 malloc 和 free 成员必须为有效函数指针
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| func_list | const upg_func_t * | 升级模块使用的注册函数列表 | NULL 或指向有效的 upg_func_t 结构体 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 初始化成功 |
| ERRCODE_UPG_ALREADY_INIT(0x80003041) | 模块已初始化 | 重复调用初始化 |
uapi_upg_start
函数声明
头文件清单
功能说明
- 开始执行本地升级流程,读取升级包头并校验整包后逐个处理升级镜像
- 该函数阻塞等待执行完返回,升级过程中会根据升级包内容进行全镜像、压缩或差分升级
- 若升级区不存在有效升级包(标记不合法),则直接返回 ERRCODE_UPG_NOT_NEED_TO_UPDATE
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- 升级区已存在有效的升级包(head_magic 和 head_end_magic 合法,complete_flag 非0)
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 升级流程完成 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_NOT_NEED_TO_UPDATE(0x80003047) | 无需升级 | 升级区不存在有效升级包 |
| Other | 其他错误码 | 升级校验失败或镜像更新失败 |
uapi_upg_register_progress_callback
函数声明
头文件清单
功能说明
- 注册升级进度通知回调函数,在升级过程中每完成一定比例时通过回调通知上层
- 配置关闭时调用该接口将返回 ERRCODE_UPG_NOT_SUPPORTED
前置条件
- 依赖关系:该回调函数依赖于配置项 UPG_CFG_PROCESS_NOTIFY_SUPPORT 为 YES 时生效
- 升级模块已通过 uapi_upg_init() 初始化完成
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| func | uapi_upg_progress_cb | 进度通知的回调函数 | NULL 或有效的回调函数指针 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 回调注册成功 |
| ERRCODE_UPG_NOT_SUPPORTED(0x80003046) | 不支持 | UPG_CFG_PROCESS_NOTIFY_SUPPORT 未开启 |
uapi_upg_get_result
函数声明
头文件清单
功能说明
- 获取升级结果,包括升级成功或失败的具体原因
- 若固件升级成功但NV升级未完成或失败,返回NV升级结果;否则返回固件升级结果
- last_image_index 输出为 UINT32_MAX,表示不跟踪具体镜像序号
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- result 和 last_image_index 指针不为 NULL
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| result | upg_result_t * | 升级结果枚举值,参考 upg_result_t |
| last_image_index | uint32_t * | 最后一个处理的升级镜像的序号(当前固定输出 UINT32_MAX) |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 成功获取升级结果 |
| ERRCODE_UPG_NULL_POINTER(0x80003045) | 空指针 | result 或 last_image_index 为 NULL |
uapi_upg_get_status
函数声明
头文件清单
功能说明
- 获取当前升级状态,返回升级成功、失败、进行中或非升级状态
- 该状态在模块初始化时从Flash升级标记区读取并缓存
- 返回值为 upg_status_t 枚举类型,参考 upg_status_t
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成,否则返回 UPG_STATUS_NONE
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| UPG_STATUS_SUCC(0) | 升级成功 | 固件升级且NV升级均成功 |
| UPG_STATUS_FAIL(1) | 升级失败 | 升级结果为失败 |
| UPG_STATUS_UPDATING(2) | 正在进行升级 | 升级流程进行中 |
| UPG_STATUS_NONE(3) | 非升级状态 | 未处于升级流程或模块未初始化 |
uapi_upg_prepare
函数声明
头文件清单
功能说明
- 准备本地存储器以存放升级包,包括擦除FOTA分区及初始化升级标记区
- 该函数阻塞等待执行完返回
- 当升级包长度超过可用存储空间时返回 ERRCODE_UPG_INVALID_PARAMETER
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- prepare_info 不为 NULL 且 package_len 不为0
- 升级包大小不超过 uapi_upg_get_storage_size() 返回的可用空间
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| prepare_info | upg_prepare_info_t * | 准备信息的指针 | 非 NULL,package_len > 0 且不超过可用存储空间 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 准备工作完成 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_INVALID_PARAMETER(0x80003042) | 参数无效 | prepare_info 为 NULL 或 package_len 为0或超限 |
uapi_upg_reset_upgrade_flag
函数声明
头文件清单
功能说明
- 重置升级标记,擦除升级标记区并重新初始化 head_before_offset、Head_magic 和 package_length
- 该函数阻塞等待执行完返回
- 重置后可重新写入升级包并启动新的升级流程
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 升级标记重置成功 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
uapi_upg_write_package_async
函数声明
errcode_t uapi_upg_write_package_async(uint32_t offset, const uint8_t *buff, uint16_t len, uapi_upg_write_done_cb callback)
头文件清单
功能说明
- 将升级包数据异步写入本地存储器,写入完成后通过回调函数通知
- 当前回调函数被调用且返回写成功才能继续写下一个数据包,在此之前禁止再次调用该接口写下一个数据包
- 写入偏移必须顺序递增,不支持随机偏移写入
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- 已通过 uapi_upg_prepare() 完成存储区准备工作
- 上一次异步写入回调已返回成功
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| offset | uint32_t | 相对升级包开头的偏移 | 0 ~ 存储空间最大值 |
| buff | const uint8_t * | 存放升级包数据的buffer | 非 NULL |
| len | uint16_t | 升级包数据buffer的长度 | 1 ~ 65535 |
| callback | uapi_upg_write_done_cb | 写入完成的回调函数 | NULL 或有效的回调函数指针 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 数据写入成功 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_NULL_POINTER(0x80003045) | 空指针 | buff 为 NULL |
| ERRCODE_UPG_INVALID_BUFF_LEN(0x80003055) | buffer长度无效 | len 为0 |
| ERRCODE_UPG_NOT_PREPARED(0x80003054) | 存储区未准备 | 未调用 uapi_upg_prepare() |
uapi_upg_write_package_sync
函数声明
头文件清单
功能说明
- 将升级包数据同步写入本地存储器,函数写入完成后返回
- 写入偏移必须顺序递增,不支持随机偏移写入
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- 已通过 uapi_upg_prepare() 完成存储区准备工作
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| offset | uint32_t | 相对升级包开头的偏移 | 0 ~ 存储空间最大值 |
| buff | const uint8_t * | 存放升级包数据的buffer | 非 NULL |
| len | uint16_t | 升级包数据buffer的长度 | 1 ~ 65535 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 数据写入成功 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_NULL_POINTER(0x80003045) | 空指针 | buff 为 NULL |
| ERRCODE_UPG_INVALID_BUFF_LEN(0x80003055) | buffer长度无效 | len 为0 |
| ERRCODE_UPG_NOT_PREPARED(0x80003054) | 存储区未准备 | 未调用 uapi_upg_prepare() |
uapi_upg_read_package
函数声明
头文件清单
功能说明
- 从本地存储器读取升级包数据到指定buffer
- 读取偏移和长度由调用者指定
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- buff 指向的内存空间已分配,大小不小于 len
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| offset | uint32_t | 相对升级包开头的偏移 | 0 ~ 存储空间最大值 |
| len | uint32_t | 升级包数据的长度 | 1 ~ 4294967295 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| buff | uint8_t * | 读取到的升级包数据 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 数据读取成功 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_NULL_POINTER(0x80003045) | 空指针 | buff 为 NULL |
| ERRCODE_UPG_INVALID_BUFF_LEN(0x80003055) | buffer长度无效 | len 为0 |
uapi_upg_get_storage_size
函数声明
头文件清单
功能说明
- 获取本地存储空间可存放升级包的最大空间大小
- 返回0表示获取失败或模块未初始化
- 用于在调用 uapi_upg_prepare() 之前判断升级包是否超出存储空间限制
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成,否则返回0
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 获取失败 | 模块未初始化或获取存储空间信息失败 |
| Others | 空间大小 | 可用存储空间大小(单位:字节) |
uapi_upg_request_upgrade
函数声明
头文件清单
功能说明
- 申请开始进行本地升级,读取升级包头并获取固件数量后写入升级标记
- 若配置 UPG_CFG_VERIFICATION_SUPPORT 和 UPG_CFG_SUPPORT_VERIFICATION_IN_REQUEST 均为 YES,则在申请流程中执行整包校验
- reset 为 true 时,升级申请流程完成后系统将重启
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- 升级包已写入本地存储器
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| reset | bool | 申请流程结束后是否重启系统 | true / false |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 升级申请成功 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| Other | 其他错误码 | 升级包校验失败或标记写入失败 |
uapi_upg_verify_file_head
函数声明
头文件清单
功能说明
- 校验升级包头结构,依次执行Key Area签名校验、FOTA Info区签名校验及自定义字段校验
- 若注册了用户自定义字段校验函数,则在签名校验通过后调用自定义校验函数
前置条件
- 依赖关系:签名校验依赖于配置项 UPG_CFG_SIGNATURE_VERIFICATION_ENABLED 控制是否执行
- 升级模块已通过 uapi_upg_init() 初始化完成
- pkg_header 指向有效的升级包头结构
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| pkg_header | const upg_package_header_t * | 指向升级包头结构的指针 | 非 NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 包头校验通过 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| ERRCODE_UPG_VERIFICATION_KEY_ERROR(0x80003063) | 校验密钥错误 | 根公钥获取失败 |
| Other | 其他错误码 | 签名校验失败或自定义字段校验失败 |
uapi_upg_verify_file_image
函数声明
errcode_t uapi_upg_verify_file_image(const upg_image_header_t *img_header, const uint8_t *hash, uint32_t hash_len, bool verify_old)
头文件清单
功能说明
- 校验升级包中的升级镜像,包括镜像头HASH校验和新镜像数据校验
- verify_old 适用于差分升级场景,用于判断当前使用的旧镜像与做差分镜像时的旧镜像是否一致
前置条件
- 依赖关系:差分校验依赖于配置项 UPG_CFG_DIFF_UPGRADE_SUPPORT
- 升级模块已通过 uapi_upg_init() 初始化完成
- img_header 指向有效的镜像头结构,hash 指向有效的哈希值
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| img_header | const upg_image_header_t * | 指向升级镜像头结构的指针 | 非 NULL |
| hash | const uint8_t * | 升级镜像的HASH值 | 非 NULL,长度为 hash_len |
| hash_len | uint32_t | HASH的长度(单位:字节) | 32(SHA_256_LENGTH) |
| verify_old | bool | 是否校验旧镜像 | true / false |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 镜像校验通过 |
| ERRCODE_FAIL(0xFFFFFFFF) | 执行失败 | header_magic 不匹配或HASH校验失败 |
uapi_upg_verify_file
函数声明
头文件清单
功能说明
- 校验整个升级包,依次执行包头校验、Hash Table校验及所有镜像的逐个校验
- 内部调用 uapi_upg_verify_file_head 完成包头校验,再遍历每个镜像调用 uapi_upg_verify_file_image
- 若支持防回滚,还会校验镜像版本号是否满足防回滚要求
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
- pkg_header 指向有效的升级包头结构
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| pkg_header | const upg_package_header_t * | 指向升级包头结构的指针 | 非 NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 整包校验通过 |
| ERRCODE_UPG_NOT_INIT(0x80003040) | 模块未初始化 | 升级模块未初始化 |
| Other | 其他错误码 | 包头校验、Hash Table校验或镜像校验失败 |
uapi_upg_register_user_defined_verify_func
函数声明
头文件清单
功能说明
- 注册用户自定义字段的校验函数,注册后调用 uapi_upg_verify_file_head 和 uapi_upg_verify_file 时校验函数会被调用
- param 为传递给校验函数的注册参数
- 无返回值,该接口始终执行成功
前置条件
- 升级模块已通过 uapi_upg_init() 初始化完成
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| func | uapi_upg_user_defined_check | 用于校验用户自定义字段的校验函数 | NULL 或有效的回调函数指针 |
| param | uintptr_t | 注册参数 | 0 ~ UINTPTR_MAX |
Type definitions
uapi_upg_write_done_cb
调用时机
- 异步写入升级包数据完成后被调用,result参数指示写入操作结果
使用说明
- 作为 uapi_upg_write_package_async 接口的 callback 参数使用
uapi_upg_progress_cb
调用时机
- 升级过程中每完成一定比例时被调用,percent参数指示当前升级进度百分比
使用说明
- 作为 uapi_upg_register_progress_callback 接口的 func 参数使用
uapi_upg_user_defined_check
typedef errcode_t (*uapi_upg_user_defined_check)(uint8_t *user_info, uint32_t info_len, uintptr_t param);
调用时机
- 调用 uapi_upg_verify_file_head 和 uapi_upg_verify_file 校验包头签名通过后被调用,用于校验用户自定义字段
使用说明
- 作为 uapi_upg_register_user_defined_verify_func 接口的 func 参数使用
upg_func_malloc
调用时机
- 升级模块需要动态分配内存时被调用
使用说明
- 作为 upg_func_t 结构体的 malloc 成员使用
upg_func_free
调用时机
- 升级模块需要释放已分配内存时被调用
使用说明
- 作为 upg_func_t 结构体的 free 成员使用
upg_func_serial_putc
调用时机
- 升级模块需要通过串口输出字符时被调用
使用说明
- 作为 upg_func_t 结构体的 serial_putc 成员使用
Enumerations
upg_result_t
typedef enum upg_result {
UPG_RESULT_UPDATE_SUCCESS,
UPG_RESULT_VERIFY_HEAD_FAILED,
UPG_RESULT_VERIFY_HASH_TABLE_FAILED,
UPG_RESULT_VERIFY_IMAGE_FAILED,
UPG_RESULT_VERIFY_OLD_IMAGE_FAILED,
UPG_RESULT_DECOMPRESS_IMAGE_FAILED,
UPG_RESULT_DECRYPT_IMAGE_FAILED,
UPG_RESULT_RECRYPT_IMAGE_FAILED,
UPG_RESULT_DIFF_IMAGE_FAILED,
UPG_RESULT_UPDATE_IMAGE_FAILED,
UPG_RESULT_PROCESS_NV_FAILED,
UPG_RESULT_VERIFY_VERSION_FAILED,
UPG_RESULT_IMAGE_ID_FAILED,
UPG_RESULT_RETRY_ALL_FAILED,
UPG_RESULT_MAX,
} upg_result_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| UPG_RESULT_UPDATE_SUCCESS | 0 | 升级成功 |
| UPG_RESULT_VERIFY_HEAD_FAILED | 1 | 校验升级包头失败 |
| UPG_RESULT_VERIFY_HASH_TABLE_FAILED | 2 | 校验Hash Table失败 |
| UPG_RESULT_VERIFY_IMAGE_FAILED | 3 | 校验镜像失败 |
| UPG_RESULT_VERIFY_OLD_IMAGE_FAILED | 4 | 校验旧镜像失败 |
| UPG_RESULT_DECOMPRESS_IMAGE_FAILED | 5 | 解压缩失败 |
| UPG_RESULT_DECRYPT_IMAGE_FAILED | 6 | 解密失败 |
| UPG_RESULT_RECRYPT_IMAGE_FAILED | 7 | 重加密失败 |
| UPG_RESULT_DIFF_IMAGE_FAILED | 8 | 差分恢复失败 |
| UPG_RESULT_UPDATE_IMAGE_FAILED | 9 | 更新镜像到Flash失败 |
| UPG_RESULT_PROCESS_NV_FAILED | 10 | 处理NV镜像失败 |
| UPG_RESULT_VERIFY_VERSION_FAILED | 11 | 防回滚校验失败 |
| UPG_RESULT_IMAGE_ID_FAILED | 12 | 镜像ID校验失败 |
| UPG_RESULT_RETRY_ALL_FAILED | 13 | 所有升级尝试均失败 |
| UPG_RESULT_MAX | 14 | 升级结果最大值 |
upg_status_t
typedef enum upg_status {
UPG_STATUS_SUCC,
UPG_STATUS_FAIL,
UPG_STATUS_UPDATING,
UPG_STATUS_NONE
} upg_status_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| UPG_STATUS_SUCC | 0 | 升级成功 |
| UPG_STATUS_FAIL | 1 | 升级失败 |
| UPG_STATUS_UPDATING | 2 | 正在进行升级 |
| UPG_STATUS_NONE | 3 | 非升级状态 |
Structures
upg_key_area_data_t
typedef struct upg_key_area_data {
uint32_t image_id;
uint32_t struct_version;
uint32_t struct_length;
uint32_t signature_length;
uint32_t key_owner_id;
uint32_t key_id;
uint32_t key_alg;
uint32_t ecc_curve_type;
uint32_t key_length;
uint32_t fota_key_version_ext;
uint32_t mask_fota_key_version_ext;
uint32_t msid_ext;
uint32_t mask_msid_ext;
uint32_t maintenance_mode;
uint8_t die_id[DIE_ID_LEN];
uint32_t fota_info_addr;
uint8_t reserved[KEY_AREA_RESERVED_LEN];
uint8_t fota_external_public_key[PUBLIC_KEY_LEN];
uint8_t sig_fota_key_area[SIG_LEN];
} upg_key_area_data_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| image_id | uint32_t | FOTA key区域的标识 |
| struct_version | uint32_t | FOTA key区域结构版本 |
| struct_length | uint32_t | 结构长度 |
| signature_length | uint32_t | 签名长度 |
| key_owner_id | uint32_t | FOTA二级公钥的所有者ID |
| key_id | uint32_t | FOTA二级公共密钥的密钥ID |
| key_alg | uint32_t | 二级公钥算法 |
| ecc_curve_type | uint32_t | ecc曲线类型 |
| key_length | uint32_t | FOTA二级公共密钥的长度 |
| fota_key_version_ext | uint32_t | FOTA二级公共密钥的版本 |
| mask_fota_key_version_ext | uint32_t | FOTA密钥版本扩展的掩码 |
| msid_ext | uint32_t | 细分市场ID |
| mask_msid_ext | uint32_t | MSID掩码 |
| maintenance_mode | uint32_t | 维护模式 |
| die_id | uint8_t[16] | 芯片组芯片ID,在启用维护模式时有效 |
| fota_info_addr | uint32_t | FOTA info区域的偏移地址 |
| reserved | uint8_t[52] | 为字节对齐而保留的字段 |
| fota_external_public_key | uint8_t[64] | FOTA二级公钥 |
| sig_fota_key_area | uint8_t[64] | FOTA key区域签名 |
upg_fota_info_data_t
typedef struct upg_fota_info_data {
uint32_t image_id;
uint32_t struct_version;
uint32_t struct_length;
uint32_t signature_length;
uint32_t fota_version_ext;
uint32_t mask_fota_version_ext;
uint32_t msid_ext;
uint32_t mask_msid_ext;
uint32_t image_hash_table_addr;
uint32_t image_hash_table_length;
uint8_t image_hash_table_hash[SHA_256_LENGTH];
uint32_t image_num;
uint32_t hardware_id;
uint8_t user_defined[INFO_AREA_USER_LEN];
uint8_t sign_fota_info[SIG_LEN];
} upg_fota_info_data_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| image_id | uint32_t | FOTA信息区标识 |
| struct_version | uint32_t | FOTA信息区域结构版本 |
| struct_length | uint32_t | 结构长度 |
| signature_length | uint32_t | 签名长度 |
| fota_version_ext | uint32_t | FOTA信息区的版本 |
| mask_fota_version_ext | uint32_t | FOTA二级公共密钥的版本 |
| msid_ext | uint32_t | 细分市场ID |
| mask_msid_ext | uint32_t | MSID掩码 |
| image_hash_table_addr | uint32_t | FOTA包中镜像哈希表的地址 |
| image_hash_table_length | uint32_t | 镜像哈希表的长度 |
| image_hash_table_hash | uint8_t[32] | 镜像哈希表的哈希 |
| image_num | uint32_t | FOTA镜像的总数 |
| hardware_id | uint32_t | 硬件ID |
| user_defined | uint8_t[112] | 预留字节供用户自定义使用 |
| sign_fota_info | uint8_t[64] | FOTA信息签名 |
upg_image_hash_node_t
typedef struct upg_image_hash_node {
uint32_t image_id;
uint32_t image_addr;
uint32_t image_length;
uint8_t image_hash[SHA_256_LENGTH];
} upg_image_hash_node_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| image_id | uint32_t | 镜像的标识 |
| image_addr | uint32_t | 镜像头偏移量 |
| image_length | uint32_t | 镜像长度 |
| image_hash | uint8_t[32] | 镜像头的哈希 |
upg_package_header_t
typedef struct upg_package_header {
upg_key_area_data_t key_area;
upg_fota_info_data_t info_area;
} upg_package_header_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| key_area | upg_key_area_data_t | 升级密钥区域数据 |
| info_area | upg_fota_info_data_t | FOTA info区数据 |
upg_image_header_t
typedef struct upg_image_header {
uint32_t header_magic;
uint32_t image_id;
uint32_t image_offset;
uint32_t image_len;
uint8_t image_hash[SHA_256_LENGTH];
uint32_t old_image_len;
uint8_t old_image_hash[SHA_256_LENGTH];
uint32_t new_image_len;
uint32_t version_ext;
uint32_t version_mask;
uint32_t decompress_flag;
uint32_t re_enc_flag;
uint32_t root_key_type;
uint8_t enc_pk_l1[PROTECT_KEY_LEN];
uint8_t enc_pk_l2[PROTECT_KEY_LEN];
uint8_t iv[IV_LEN];
uint8_t padding[4];
} upg_image_header_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| header_magic | uint32_t | 镜像头魔术字 |
| image_id | uint32_t | 镜像的标识 |
| image_offset | uint32_t | 要更新的镜像数据的偏移地址 |
| image_len | uint32_t | 更新的镜像数据的长度(实际数据长度,不包括填充字段) |
| image_hash | uint8_t[32] | 更新镜像数据的哈希 |
| old_image_len | uint32_t | 旧镜像长度 |
| old_image_hash | uint8_t[32] | 旧镜像的哈希值 |
| new_image_len | uint32_t | 新镜像长度 |
| version_ext | uint32_t | 新镜像版本 |
| version_mask | uint32_t | 版本掩码 |
| decompress_flag | uint32_t | 解压标志 |
| re_enc_flag | uint32_t | 重新加密标志 |
| root_key_type | uint32_t | 用于加密镜像的密钥 |
| enc_pk_l1 | uint8_t[16] | 用于解密更新镜像的一级加密保护密钥 |
| enc_pk_l2 | uint8_t[16] | 用于解密更新镜像的二级加密保护密钥 |
| iv | uint8_t[16] | 用于解密升级镜像的IV |
| padding | uint8_t[4] | 保留字段,以保证整个结构16字节对齐 |
upg_func_t
typedef struct upg_func {
upg_func_malloc malloc;
upg_func_free free;
upg_func_serial_putc serial_putc;
} upg_func_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| malloc | upg_func_malloc | 升级使用内存分配函数(必选函数) |
| free | upg_func_free | 升级释放内存函数(必选函数) |
| serial_putc | upg_func_serial_putc | upg串口输出函数(可选函数) |
upg_prepare_info_t
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| package_len | uint32_t | 升级包的大小 |
Macros
SHA_256_LENGTH
哈希长度
DIE_ID_LEN
芯片ID长度
PROTECT_KEY_LEN
加密秘钥长度
IV_LEN
IV长度
SSB_IMAGE_ID
SSB镜像ID
SELITEOS_IMAGE_ID
SELITEOS镜像ID
ROOT_PUBLIC_KEY_ID
根公钥ID
OEM_ROOT_PUBLIC_KEY_ID
客户根公钥ID
RECOVERY_IMAGE_ID
Recovery镜像ID
APPLICATION_IMAGE_ID
Application镜像ID
BT_IMAGE_ID
BT镜像ID
DSP_MAIN_IMAGE_ID
DSP主镜像ID
DSP_OVERLAY_IMAGE_ID
DSP覆盖镜像ID
KEY_AREA_RESERVED_LEN
key区保留字段长度
INFO_AREA_USER_LEN
info区用户字段长度
SIG_LEN
签名字段长度
PUBLIC_KEY_LEN
FOTA二级公钥长度