概述
本文介绍如何在CB5654开发板上进行FOTA升级。
目前系统升级支持多个分区的差分升级和全量升级。
差分升级
通过差分算法将新的固件和老的固件进行差分,从而得到差异部分。只更新差异部分可以节省数据传输带宽的消耗和存储资源的占用,在硬件资源较为紧张的IoT设备中优势较为明显。但是在固件还原的过程中需要耗费更多的时间。
全量升级
全量升级即用新版本固件直接替换老固件的一种升级方式。需要占用较大的硬件存储资源和消耗更多的数据传输带宽,但是速度会比较快。
步骤
集成使用升级功能可分为以下4个部分:
分区配置
使用升级功能需要指定升级包的存储区域。
配置文件:在board
组件下的configs
目录下cb5654/configs/config.yaml
mtb_version: 4
chip: sc5654a # cb2201 / cb6501 / sc5654a
diff:
fota_version: 0
ram_buf: 50 #DEC KB ( max ram need)
flash_buf: 16 #DEC KB ( buffer size)
flash_sector: 4096 #DEC byte ( flash sector)
diff_mode: 010 #BIN
double_control: 1
flash:
base_address: 0x00000000
run_base_address: 0x02000000 # base address of Storage
sector: 4096 # Bytes
size: 8388608 # $(sector count) * sector
partitions:
# - { name: m0flash, address: 0x00000, size: 0x00070000 }
- { name: boot, address: 0x00070000, size: 0x010000, load_addr: 0x02780000 }
- { name: dsp, address: 0x00080000, load_addr: 0x02000000, size: 0x200000 }
- { name: bmtb, address: 0x00280000, size: 0x001000 }
- { name: imtb, address: 0x00281000, size: 0x002000 }
- { name: prim, address: 0x00283000, load_addr: 0x02200000, size: 0x200000, update: DIFF }
- { name: kv, address: 0x00483000, size: 0x004000 }
- { name: misc, address: 0x00487000, size: 0x200000 }
- { name: user, address: 0x00687000, size: 0x179000 }
字段解释
一级字段
字段 | 说明 |
---|---|
mtb_version | mtb格式版本号,默认1 |
chip | 芯片类型 |
diff | 用于差分相关的配置参数 |
flash | flash相关参数 |
partitions | 分区表相关参数 |
差分选项
diff | 是否必选 | 说明 |
---|---|---|
ram_buf | 是 | 差分还原时所需的ram空间,单位KB |
flash_buf | 是 | 差分还原时所需的flash空间,单位KB |
flash_sector | 是 | flash每个sector的尺寸,单位byte |
diff_mode | 是 | 差分模式,二进制字符串,一般使用10 模式 |
double_control | 否 | 差分还原是否使用双flash block备份 |
signature_type | 是 | 签名算法,当前支持RSA1024 |
digest_type | 是 | 摘要算法,当前支持SHA1 |
差分模式(diff_mode)
mode_value | verify(校验差分包) | auto_config(自动调整flash_buf大小) |
---|---|---|
00 | disable | disable |
01 | disable | enable |
10 | enable | disable |
11 | enable | enable |
partitions
字段 | 是否必选 | 说明 |
---|---|---|
name | 是 | 分区名字,最长8个字节 |
address | 是 | 分区起始地址 |
load_addr | 否 | 分区加载地址,如果没有此字段,则默认使用address 为加载地址 |
size | 是 | 分区大小,单位byte |
update | 否 | 分区升级类型[DIFF ,FULL ],默认值为DIFF ;类似boot 这种分区是不能升级的,因此不能填写此字段 |
verify | 否 | 是否要对分区进行签名 |
file | 否 | 指定分区对应的镜像文件名字,不填则表示文件名与分区名相同 |
分区名字
分区 | 说明 |
---|---|
boot | bootloader数据区 |
dsp | dsp数据区 |
bmtb | 分区表 |
imtb | 分区表,包含所有分区位置及安全信息 |
prim | 应用镜像 |
misc | 升级备份区 |
kv | KV数据区 |
user | 用户数据区 |
FOTA服务集成
具体方法请看 FOTA服务
固件生成
FOTA服务集成完毕之后,可直接进入到解决方案中(如solutions/pangu_demo,执行make命令)编译生成固件。
编译完毕之后会在genarated
目录下生成 images.zip 文件,即为固件压缩包。
FOTA升级
制作升级包,并且把升级包上传到服务器。 平头哥芯片开发社区只需要上传新老固件包即可,服务器会自动合成升级包并根据提示发布升级包。
平头哥芯片开发社区
需要把固件上传到平头哥芯片开发社区生成升级包,并选择合适的升级策略。
注册登陆平头哥芯片开发社区后,进入到
控制台
中在平头哥芯片开发社区上创建产品,在
控制台
->我的产品
->添加产品
,并填写标签名称以及勾选相关的CID
号在
我的产品
->编辑
->FOTA
页面选择添加固件在固件信息里填写版本名称以及版本号,还需要上传在工程目录下生成的
generated/images.zip
镜像包选择新添加的固件
fota
,点选发布
发布完成后下载发布后的镜像
用FlashProgrammer烧录该产品的许可证以及下载的镜像。
在右侧
标签列表
添加标签下载完成后复位开发板,在串口界面设置kv的
model
,device_id
,ota_url
信息,再次复位,可以看到串口打印---> kv set model sc5654 <--- kv set string success ----> kv set device_id [device_id] <--- kv set string success ---> kv set otaurl http://occ.t-head.cn/api/image/ota/pull <--- kv set string success
从log的版本号中可以看出,已经和occ上的版本号统一了,都是
1.10.1-20190820.119-R-sc5654
继续添加固件版本
fota
的1.0.1
,此版本可以与之前的版本相同或者不同,并发布版本
返回之前的界面后选择
升级策略
点击确定后再次复位,可以看到串口打印升级信息
fota下载成功软件自动复位重启后可以看到信息
从log中可以看出来,对应的版本号已经变成了最新的版本
1.11.1-20190820.1252-R-sc5654
至此,说明fota已经成功升级为对应的固件版本
自主服务器
- 用
product
工具(在yoc_sdk/tools/build
目录下)对images.zip
进行签名并写入版本号fota_test_v1.0
./product image images.zip -l -v 'fota_test_v1.0' -p
- 用
product
工具生成升级包,表示要升级到fota_test_v1.1
版本
./product diff -f images.zip images_new.zip -v "fota_test_v1.1"
会在当前目录生成fota.bin
的文件,此文件即为升级包。
如果出现以下提示,说明需要升级的分区镜像完全相同。可以添加-r
选项强制生成升级包。
all the images are same !
generate ota img failed !
- 将升级包上传至自主服务器
- 设备检测到新版本的升级包下载数据并重启
- 设备开始升级新固件,升级结束自动重启
操作流程
- 下载代码并选择OTA demo程序和开发板
- 登录云端账号创建产品,并获取许可证
- 编译生成不同版本固件,一个低版本,一个高版本
- 将低版本的固件烧录到对应的目标板子,运行demo程序
- 待设备上线后将高版本的固件上传到云端
- 云端推送固件,设备端接收固件,并做完整性校验
- 设备端完成固件接收,重启进入系统升级
- 系统升级完毕,设备重启,正常运行
注意事项
升级包的制作一定要做好版本管理,否则基础版本不对应会导致设备升级完成之后变成砖块