本文档描述 EC618
系列模块各种固件的升级包格式和生成方法
- 原始binpkg - 模块的原始固件,必然是
binpkg后缀
- 原始差分包 - 使用移芯的FOTA工具, 通过2个binpkg文件生成差分包, 后缀为
.par
- 合宙标准AT固件 - 除QAT外, 支持合宙标准AT指令的固件
- QAT固件 - 仅支持QAT指令的固件
- CSDK固件 - 本代码库(luatos-soc-2022)编译出的
非LuatOS
固件 - LuatOS固件 - 本代码库(luatos-soc-2022)编译出的
LuatOS
固件 - 差分升级 - 指底层CP/AP固件升级, 如果是
LuatOS
固件, 会包含脚本区数据 - 整包升级 - 用于特定CSDK固件, 包含完整CP/AP数据, 不依赖老版本, 不需要生成差分包
实际存在4种具体的差分包格式, 分别是:
- 原始差分包 - 适用于
QAT固件
/CSDK固件(非整包升级)
- 合宙AT差分包 - 适用于
合宙标准AT固件
- CSDK整包升级包 - 适用于
CSDK固件(整包升级)
- LuatOS差分升级包 - 适用于
LuatOS固件
适合于QAT固件
/ CSDK固件(非整包升级)
- 准备2个binpkg文件, 假设为
old.binpkg
和new.binpkg
- 使用移芯FOTA工具, 生成
.par
文件, 假设为diff.par
- 不添加任何前后数据, 原样下发给设备使用
适合于合宙标准AT固件
, 例如 AT/LPAT/LSAT/AUAT
- 使用
原始差分包
的生成方法, 先生成diff.par
文件 - 获取
diff.par
文件大小, 假设为diff_size
- 生成文件头部数据, python形式的伪代码见下
- 将上述数据附加到
diff.par
文件头部, 生成合宙AT格式的差分包
head = struct.pack(">bIbI", 0x7E, 0x01, 0x7D, diff_size)
适合于CSDK固件(整包升级)
, 这里仅描述大概的过程, 具体细节请参考dtools中的代码
- 准备binpkg文件, 假设为
new.binpkg
, 不需要旧版本的binpkg文件 - 使用
fcelf
解开binpkg, 得到cp.bin
,ap.bin
,imagedata.json
- 使用
soc_tools.exe
, 将cp.bin
压缩为cp.zip
,实际为lzma
格式, 分片大小256k - 使用
soc_tools.exe
, 将ap.bin
压缩为ap.zip
,实际为lzma
格式, 分片大小256k - 将
cp.zip
和ap.zip
前后相连的方式, 合并为total.zip
- 准备一个0字节的空文件, 假设为
dummy.bin
- 执行
soc_tools.exe
, 将total.zip
和dummy.bin
合成最终的升级包
具体实现代码请查阅 tools\dtools
目录下的代码
适合于LuatOS固件
, 主要:
- 不同的版本中, 底层可能是一致的, 即binpkg文件, 只是脚本区数据不同
- 仅脚本区不一致, 也需要生成升级包
- soc文件一般是7z格式或zip格式, 推荐用7za工具或者py7za库解开, 均能自动识别
生成步骤
- 首先解开新老soc文件,得到binpkg
- 对比新老binpkg文件, 若不相同, 生成
原始差分包
, 得到diff.par
- 如果binpkg相同, 创建一个空的
diff.par
, 大小为0 - 执行
soc_tools.exe
, 将script.bin
压缩为script.zip
, 实际为lzma
格式 - 执行
soc_tools.exe
, 将diff.par
和script.zip
合成最终的升级包
具体实现代码请查阅 tools\dtools
目录下的代码
对应EC618的升级包, 主要难点在于CSDK是差分升级还是整包升级
这里提供几个思路, 仅供参考
- 方案A. 对应
CSDK
固件, 在编译固件时, 额外打包一个包含info.json的升级包文件, 通过fota
表进行描述 - 方案B, 创建iot项目时, 添加字段, 要求客户选择具体的类型
附info.json中fota表的片段, 其中的core_type
标识了差分diff
或整包full
, 示例源于ec718库
"fota" : {
"magic_num" : "eac37218",
"block_len" : "40000",
"core_type" : "diff",
"ap_type" : "diff",
"cp_type" : "diff",
"full_addr" : "002BD000",
"fota_len" : "69000"
}