OTA
本文中OTA(Over The Air)是指通过蓝牙的传输,对RTL87x2G系列的Flash运行的image和data进行空中升级的技术。
OTA方案
根据 flash布局 排布的不同,分成两种OTA方案: 支持Bank切换 和 不支持Bank切换 。无论是否支持Bank切换,boot patch image都是独立的双bank,作用相同,互为备份区。例如当前boot patch运行在bank0,OTA升级只能升级bank1,升级完成后重启会选择版本号高的bank运行(版本号相同则运行在bank0)。
选择 不支持Bank切换 的OTA方案,OTA TMP区被用作OTA备份区,用于存储备份固件,并最终由BootLoader拷贝激活。而如果选择 支持Bank切换 的OTA方案,OTA Bank0和OTA Bank1将作为彼此的备份固件存储区。在固件更新期间,这两个存储区可以相互切换使用,从而确保在固件更新失败时能够回滚到之前的备份固件,保证系统的稳定性和安全性。
不支持Bank切换 方案和 支持Bank切换 方案Flash布局有以下不同。
OTA Bank1区不分配容量。
OTA TMP区需要分配,且大小必须不小于OTA Bank0最大的image大小。 故 不支持Bank切换 方案相对节约flash空间,OTA传输完成,重启boot程序会将OTA TMP区数据搬到OTA Bank 0指定image区域,再重启生效,所以相对增加了OTA升级完成的重启时间。
在 不支持Bank切换 方案中还支持组合image升级,该功能默认打开。当使用组合image升级时,在将image数据写到OTA TMP区时,会去计算OTA TMP区剩余空间能否放得下下一个需要写入的image文件,如果可以放下则继续将下一个image文件写入OTA TMP区,当放不下时则触发重启,将OTA TMP区数据搬到OTA Bank0区域,激活后再进行下一个image的升级。组合升级的优点在于减少重启次数加快传输速率。
优点:存在备份bank,可以动态调整bank内各个image的大小
缺点:flash空间利用率低
维护:需要维护两个bank对应地址的image,Realtek默认发布的image只支持运行在bank0,如果需要运行在bank1,需要联系Realtek获取
优点:flash空间利用率更高
缺点:各个image不能同时升级,存在新旧搭配的情况;OTA完成后激活image会增加那一次开机时间,image越大时间越长
维护:只需要使用Bank0 image
OTA工具使用
工具
Flash Map Generate Tool
生成 flash_map.h
、flash map.ini
和 OTA Header file
。请参考 Flash Map Generate Tool 。
备注
flash_map.h
需要放到工程上级目录下参与编译,生成APP image。flash map.ini
为 MP Pack Tool 和 MP Tool 的输入文件,要保证image和设置的所有输出地址一致。
MP Pack Tool
打包OTA文件。请参考 MP Pack Tool 。
APP Data Tool
APP Data文件通过SDK中生成脚本生成,具体请参考SDK中《APP Data Tool Quick Start Guide》:rtl87x2g_sdk_xxxx\tools\AppData
。
User Data Tool
User Data文件通过SDK中生成脚本: rtl87x2g_sdk_xxxx\tools\UserData
生成。
支持Bank切换
Flash布局
请参考 支持Bank切换方案Flash布局示例 。
打包工具使用步骤
使用Flash Map Generate Tool生成
flash map.ini
、flash_map.h
、Bank0 OTA Header file
和Bank1 OTA Header file
。选择Flash Size。
选择 Enable bank switch。
设置两级flash layout。
点击 Confirm 完成flash layout设置。
修改OTA Header file版本。
点击 Confirm 生成
flash_map.h
,flash map.ini
,Bank0 OTA Header file
和Bank1 OTA Header file
。
备注
打包用的OTA Header版本号要比原来运行的高,这样OTA升级完新bank才能正常生效。
将
flash map.ini
文件拷贝到工程文件上级目录下,编译链接生成app_MP_sdk#####+version+ MD5.bin
的文件供打包使用。备注
切换bank的方案需要编译OTA Bank0和OTA Bank1的APP image。Realtek发布的SDK中,demo APP工程默认编译的是OTA Bank0的app image。编译OTA Bank1的app image需要将工程文件上级目录下mem_config.h中的#define APP_BANK修改为1,具体代码如下。
/** @brief set app bank to support OTA: 1 is ota bank1, 0 is ota bank0 */ #define APP_BANK 1
获取OTA Bank1的System Patch,BT Stack Patch和BT host image。
备注
SDK中发布的System Patch,BT Stack Patch和BT Host Image默认运行在OTA Bank0,如果选用切换bank方案,请咨询Realtek对应发布运行在OTA Bank1的system patch,stack patch和BT Host Image。
生成打包文件,默认在软件同目录下生成
ImgPacketFile-xxxxxx.bin
,此文件为升级用的打包文件。选择 ForOTA 选项。
加载生成的
flash map.ini
。根据设置的flash map加载所有OTA Bank0和Bank1 image。
点击 Confirm 生成打包文件。
备注
Bank0 OTA Header file和Bank1 OTA Header file都需要打包。(与不切换Bank模式不同)
Flash布局中定义的内容都需要进行打包,缺一不可。
建议Bank0和Bank1一起打包。
不支持Bank切换
Flash布局
请参考 不支持Bank切换方案Flash布局示例 。
打包工具使用步骤
使用Flash Map Generate Tool生成
flash map.ini
、flash_map.h
和Bank0 OTA Header file
。选择Flash Size。
选择 Disable bank switch。
设置两级flash layout。
点击 Confirm 完成flash layout设置。
修改OTA Header file版本。
点击 Confirm 生成
flash_map.h
、flash map.ini
和Bank0 OTA Header file
。
备注
此处生成的
flash map.ini
需要和MP阶段使用的flash map.ini
保持一致。将
flash_map.h
拷贝到工程文件上级目录下,编译链接生成app_MP_sdk#####+ version+MD5.bin
的文件供打包使用。不切换bank的方式只需要编译OTA Bank0的image,配置见工程文件上级目录下的mem_config.h
中的#define APP_BANK,具体代码如下。
/* @brief set app bank to support OTA: 1 is ota bank1, 0 is ota bank0 */ #define APP_BANK 0
打开MP Pack Tool,加载第一步生成的
flash map.ini
,并load相应image文件。选择 ForOTA 选项。
加载生成的
flash map.ini
。根据设置的flash map加载所有OTA Bank0 image。
点击 Confirm 生成打包文件。
备注
Bank0 OTA Header file在不切换Bank方案时不允许打包。(与切换Bank的模式不同)。
如果只需要更新Patch Image或者APP Image,可只打包其中一个。
User Data升级
Flash布局
下面以1M byte的flash为例,介绍User Data升级。Flash布局示例如下。
flash总大小为1MB的示例布局 |
大小(字节) |
起始地址 |
---|---|---|
Reserved |
4K |
0x04000000 |
OEM Header |
4K |
0x04001000 |
Bank0 Boot Patch |
32K |
0x04002000 |
Bank1 Boot Patch |
32K |
0x0400A000 |
OTA Bank0 |
612K |
0x04012000 |
|
4K |
0x04012000 |
|
32K |
0x04013000 |
|
60K |
0x0401B000 |
|
212K |
0x0402A000 |
|
192K |
0x0405F000 |
|
4K |
0x0408F000 |
|
0K |
0x04090000 |
|
0K |
0x04090000 |
|
0K |
0x04090000 |
|
0K |
0x04090000 |
|
0K |
0x04090000 |
|
0K |
0x04090000 |
OTA Bank1(等于0) |
0K |
0x04090000 |
Bank0 Secure APP code |
0K |
0x04090000 |
Bank0 Secure APP Data |
0K |
0x04090000 |
Bank1 Secure APP code |
0K |
0x04090000 |
Bank1 Secure APP Data |
0K |
0x04090000 |
OTA Temp |
212K |
0x04090000 |
FTL |
16K |
0x040C5000 |
user data1 |
16K |
0x040C9000 |
user data2 |
16K |
0x040CD000 |
user data3 |
16K |
0x040D1000 |
user data4 |
16K |
0x040D5000 |
user data5 |
16K |
0x040D9000 |
user data6 |
16K |
0x040DD000 |
user data7 |
16K |
0x040E1000 |
user data8 |
16K |
0x040E5000 |
APP Defined Section |
4K |
0x040E9000 |
打包工具使用步骤
使用 Flash Map Generate Tool 生成
flash map.ini
、flash_map.h
和Bank0 OTA Header file
。备注
此处生成的
flash map.ini
需要和 MP 阶段使用的flash map.ini
保持一致。使用
rtl87x2g_sdk_xxxx\tools\UserData
中的脚本生成可支持打包的User Data文件。打开MP Pack Tool,加载第一步生成的
flash map.ini
,并load相应image文件。选择 ForOTA 选项。
加载生成的
flash map.ini
。根据设置的flash map加载User data image。
点击 Confirm 生成打包文件。
备注
如果只需要更新某一个User Data,可只打包其中一个。
允许将User Data和其他image一起打包升级。
OTA协议
OTA根据传输协议不同分为静默升级和普通升级。
- 静默升级升级image的过程中,设备的原来功能可以正常使用,升级完成后,只需很短的重启时间,程序自动切换到新的功能。
- 普通升级OTA功能稳定,但升级过程需要将设备切换到DFU mode,设备原有的功能无法使用,需要等待升级完成。
两种升级都会使用到OTA Service和DFU Service。OTA Service用于获取设备信息或进入DFU mode,DFU Service用于执行升级过程。
OTA Service
OTA Service的uuid及Characteristics如下。
{0x12, 0xA2, 0x4D, 0x2E, 0xFE, 0x14, 0x48, 0x8e, 0x93, 0xD2, 0x17, 0x3C, 0xFF, 0xD0, 0x00, 0x00}
Characteristic Name |
Require- ment |
UUID |
Properties |
Format |
Value |
Instruction |
---|---|---|---|---|---|---|
OTA CMD |
M |
0xFFD1 |
Write Without Response |
Uint8 |
1 |
允许设备进入DFU mode的控制端点 |
Device Mac |
M |
0xFFD2 |
Read |
Uint8*6 |
XX:XX:XX:XX:XX:XX |
读取设备的BDA用以和DFU mode中的扫描BDA进行比较 |
Device Info |
M |
0xFFF1 |
Read |
读取设备的固件基本信息 |
||
Protocol Type |
M |
0xFFF3 |
Read |
Uint16 |
0xNNNN |
读取请求以获取OTA协议信息 |
Image Version |
M |
0xFFE0~FFE1 |
Read |
(Uint32+Uint16)*21+2 |
Byte0: bank num
Byte1: image num Byte2~Byte3: image ID 1 Byte4~Byte7: image version 1 Byte8~Byte9: image ID 2 Byte10~Byte13: image version 2 …… |
该特性用来读取设备的image版本,具体说明见如下备注 |
Image Section Size |
M |
0xFFE4~FFE5 |
Read |
(Uint32+Uint16)*21+1 |
Byte0: image num Byte1~Byte2: image ID 1 Byte3~Byte6: image max size 1 Byte7~Byte8: image ID 2 Byte9~Byte12: image max size 2 …… |
此特性是读取请求以获得固件的最大大小 |
Byte |
Value |
|
---|---|---|
Byte0 |
ic_type |
|
Byte1 |
spec version |
|
Byte2 |
Bit0: buffer check |
0: not support buffer check 1: support buffer check |
Bit1: AES |
0: AES not enable 1: AES enable |
|
Bit2: encryption mode |
0: Encrypt First 16bytes 1: Encrypt 16*N bytes |
|
Bit3 |
0: Update one Image at a time 1: Update Multi Image at a time |
|
Byte3 |
Reserved |
|
Byte4~5 |
OTA Temp Buffer Size(uint 4K) |
|
Byte6 |
active OTA bank num |
0: not support dual bank 1: dual bank, bank0 is active bank 2: dual bank, bank1 is active bank |
Byte7 |
active Boot Patch bank num |
0: not support dual bank 1: dual bank, bank0 is active bank 2: dual bank, bank1 is active bank |
Byte8 |
active Secure APP bank num |
0: not support dual bank 1: dual bank, bank0 is active bank 2: dual bank, bank1 is active bank |
Byte9~10 |
crtl header offset |
The offset of the ctrl header in the image header |
DFU Service
DFU Service的uuid和Characteristics如下。
{0x12, 0xA2, 0x4D, 0x2E, 0xFE, 0x14, 0x48, 0x8e, 0x93, 0xD2, 0x17, 0x3C, 0x87, 0x62, 0x00, 0x00}
Data Characteristic:接受image的数据通道,属性write no response。
Control Point Characteristic:接受控制指令的通道,属性write/notification。
DFU Service支持的所有control point如下表。
Opcode value |
Procedure |
Requirement |
Properties |
Parameter Description |
Applicable Response Value(s) |
Response Parameter |
---|---|---|---|---|---|---|
0x01 |
Start DFU |
M |
Write |
crc16(UINT16) ic_type(UINT8) secure_version(UINT8) ctrl_flag.value(UINT16) image_id(UINT16) payload_len(UINT32) |
ARV |
None |
0x02 |
Receive FW image |
M |
Write |
image_id(UINT16) nImageLength(UINT32) |
ARV |
None |
0x03 |
Validate FW |
M |
Write |
image_id(UINT16) is_the_last_image(UINT8) |
ARV |
None |
0x04 |
Activate Image and Reset |
M |
Write |
enter DFU mode directly after reset(UINT8) |
ARV |
None |
0x05 |
Reset System |
M |
Write |
None |
None |
None |
0x06 |
Report Received Image Information |
M |
Write |
image_id(UINT16) |
ARV |
origin_image_version(UINT32) cur_offset(UINT32) |
0x07 |
Connection parameter update |
M |
Write |
connIntervalMin(UINT16) connIntervalMax(UINT16) connLatency(UINT16) supervisionTimeout(UINT16) |
ARV |
None |
0x09 |
Buffer check enable |
M |
Write |
image_id(UINT16) |
ARV |
Max buffer size(UINT16) Mtu size(UINT16) |
0x0A |
Buffer check size & CRC |
M |
Write |
mBufferSize(UINT16) mCRC(UINT16) |
ARV |
Next send offset(UINT32) |
0x0B |
IC type |
O |
Write |
None |
ARV |
ic_type(UINT8) |
0x0D |
Get image ver |
M |
Write |
bank_num(UINT8) |
ARV |
bank_num(UINT8) image_num(UINT8) image_id1(UINT16) image_version1(UINT16) … |
0x0F |
Check sha256 value |
O |
Write |
image_num(UINT16) image_id(UINT16) sha256 value(UINT16) |
ARV |
image_id(UINT16) check ret(UINT8) |
0x12 |
Report image number |
M |
Write |
image id(UINT16) current image number(UINT8) total image number(UINT8) |
ARV |
None |
备注
在收到image control header后,如果开启AES加密需要解密后再解析,会将not_ready临时写成1再写入flash中。
在数据传输时,如果支持AES加密,每16 byte都进行加密,接收端收到数据后,需要先对其解密。最后小于16 byte的部分没有加密发送。当收满buffer check size后,再写入flash。
OTA流程
OTA蓝牙传输流程
BeeController: 发起升级的设备
BeeTarget: 正在接受升级的设备
OTA激活流程
不支持Bank切换 方案
组合升级,在将image数据写到OTA TMP区时,会去计算OTA TMP区剩余空间能否放得下下一个需要写入的image文件,如果可以放下则继续将下一个image文件写入OTA TMP区,当放不下时则再将OTA TMP区数据搬到OTA Bank0区域,重启拷贝激活生效之后,再升级其他文件。
非组合升级,当打包待升级文件中包含Patch、APP或者APP DATA,需要一个文件升级验证成功,重启拷贝激活生效之后,再升级下一个文件。
- 支持Bank切换 方案当打包待升级文件中包含OTA Header file、Patch、APP或者APP DATA,需要一个文件传输验证成功,再传输验证下一个文件。等所有文件都传输验证成功后,才能进行重启,否则本次升级无效。原因是切换Bank方案,需要Bank区所有文件都一起生效,才能正常运行。