OTA
本文中OTA(Over The Air)是指通过蓝牙的传输,对RTL87x2G系列的Flash运行的image和data进行空中升级的技术。
Flash布局和OTA方案
Flash布局
RTL87x2G的flash布局,由Reserved,OEM Header(即config file的存储空间),Bank0 Boot Patch,Bank1 Boot Patch,OTA Bank 0,OTA Bank 1,Secure APP(optional),OTA TMP,FTL和APP Defined Section组成。访问flash的起始地址为0x04000000(flash前4K为Reserverd区域)。Flash空间分布和功能说明 如下。
Memory Segment |
Starting Address |
Size(Bytes) |
Functions |
是否支持OTA升级 |
---|---|---|---|---|
OEM Config |
0x04010000 |
0x1000 |
配置信息存储区域,包括蓝牙地址,AES Key ,和用户可修改的Flash布局等内容。 |
否 |
Bank0 Boot Patch |
可变 (由Efuse决定) |
可变 (由Efuse决定) |
Flash boot loader。 Bank0 Boot patch和Bank1 Boot patch作用相同,互为备份区。 |
是 |
Bank1 Boot Patch |
可变 (由Efuse决定) |
可变 (由Efuse决定) |
Flash boot loader |
是 |
OTA Bank0 |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
OTA Bank0主要用于存储设备的固件和运行时数据。具体的功能参考OTA Bank Flash布局。 选择不切换bank的OTA方案,OTA TMP区被用作OTA备份区,用于存储备份固件,并最终由BootLoader拷贝激活。而如果选择切换bank的OTA方案,OTA Bank0和OTA Bank1将作为彼此的备份固件存储区。在固件更新期间,这两个存储区可以相互切换使用,从而确保在固件更新失败时能够回滚到之前的备份固件,保证系统的稳定性和安全性。 |
是 |
OTA Bank1 |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
对于切换bank的OTA方案,如果OTA Bank0是运行区,那么OTA Bank1将作为备份区。反之,如果OTA Bank1是运行区,OTA Bank0将作为备份区。 |
是 |
Bank0 Secure APP |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
当开启TrustZone时,Secure APP(安全应用程序)可以在TrustZone环境中运行,确保敏感数据和操作得到安全保护。在这种情况下,Bank0 Secure APP和Bank1 Secure APP的作用是相同的,互为备份区。 |
是 |
Bank1 Secure APP |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
和Bank0 Secure APP作用相同,互为备份区。 |
是 |
OTA TMP |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
使用不切换bank的OTA方式下,作为OTA备份区使用,大小必须不小于OTA Bank0最大的image大小。 |
是 |
FTL |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
该区域空间支持以逻辑地址访问flash。 |
否 |
APP Defined Section |
可变 (OEM Config定义) |
可变 (OEM Config定义) |
Flash剩余未划分区域,用户可以自由使用,但默认不支持OTA升级。 |
否 |
OTA Bank内部的布局和说明如下。
Memory Segment |
Starting Address |
Size(Bytes) |
Functions |
是否支持OTA升级 |
---|---|---|---|---|
OTA Header |
由OEM Config定义决定 |
4KB |
存储OTA Header的版本信息,Bank中存在image的起始地址和大小 |
是(支持Bank切换) 否(不支持Bank切换) |
System Patch |
由OTA Header定义决定 |
Variable |
对non-secure rom中系统的优化和扩展代码 |
是 |
BT Stack Patch |
由OTA Header定义决定 |
Variable |
蓝牙controller协议栈优化和扩展代码 |
是 |
BT Host |
由OTA Header定义决定 |
Variable |
实现HCI及以上蓝牙协议栈部分代码 |
是 |
App |
由OTA Header定义决定 |
Variable |
开发方案的运行代码 |
是 |
App Config File |
由OTA Header定义决定 |
Variable |
App Config信息 |
是 |
App Data1 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
App Data2 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
App Data3 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
App Data4 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
App Data5 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
App Data6 |
由OTA Header定义决定 |
Variable |
开发方案中使用的数据区 |
是 |
OTA方案
根据flash布局排布的不同,分成两种OTA方案:支持Bank切换和不支持Bank切换。无论是否支持Bank 切换,boot patch image都是独立的双bank,作用相同,互为备份区。例如当前boot patch运行在bank0,OTA升级只能升级bank1,升级完成后重启会选择版本号高的bank运行(版本号相同则运行在bank0)。
Bank切换方案需要两个完全相同的OTA bank互为备份。该方案的优点是升级完成重启后,程序直接跳转到新的Bank运行,OTA升级切换流程非常快。缺点是增加了比较多的flash开销,所以一般情况下选择Bank切换方案时,flash size要比较大一点。
不支持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区域。组合升级的优点在于减少重启次数加快传输速率。
优点:存在备份bank,可以动态调整bank内各个image的大小
缺点:flash空间利用率低
维护:需要维护两个bank对应地址的image,Realtek默认发布的image只支持运行在bank0,如果需要运行在bank1,需要联系Realtek获取
优点:flash空间利用率更高
缺点:各个image不能同时升级,存在新旧搭配的情况;OTA完成后激活image会增加那一次开机时间,image越大时间越长
维护:只需要使用Bank0 image
Image格式
所有可支持升级的Image都是由一个1280 Bytes大小的Image header和不定长的payload部分组成。Image header会包含image类型、大小、版本号、哈希值和签名信息等。其中OTA Header file和其他image中的header部分略有差异,下文分别说明。
OTA Header File格式
OTA Header File由Flashmap Generate Tool生成,其中OTA Header File中的header各字段定义如下。
OTA Header中header部分与OTA相关的各字段的作用如下。
Fields |
Length(Bytes) |
Functions |
---|---|---|
image_signature |
384 |
OTA Header的签名 |
image_hash |
32 |
OTA Header的哈希校验 |
ctrl_header |
12 |
OTA Header的控制信息 |
ver_val |
4 |
OTA Header的版本信息 |
image_info |
252 |
OTA bank内image的起始地址和大小 |
其他Image格式
其他Image格式image header中各字段定义下。
其中与OTA相关的字段表示的含义如下。
Fields |
Length(Bytes) |
Functions |
---|---|---|
image_signature |
384 |
Image的签名 |
image_hash |
32 |
Image的哈希校验 |
ctrl_header |
12 |
Image Header的控制信息 |
ver_val |
4 |
Image Header的版本信息 |
Image Header中ctrl_header格式如下。
typedef struct _IMG_CTRL_HEADER_FORMAT { uint16_t crc16; uint8_t ic_type; uint8_t secure_version; union { uint16_t value; struct { uint16_t xip: 1; // payload is executed on flash uint16_t enc: 1; // all the payload is encrypted uint16_t load_when_boot: 1; // load image when boot uint16_t enc_load: 1; // encrypt load part or not uint16_t enc_key_select: 3; // referenced to ENC_KEY_SELECT uint16_t not_ready: 1; //for copy image in ota uint16_t not_obsolete: 1; //for copy image in ota uint16_t integrity_check_en_in_boot: 1; // enable image integrity check in boot flow uint16_t compressed_not_ready: 1; uint16_t compressed_not_obsolete: 1; uint16_t rsvd: 1; uint16_t image_type: 3; /*for app 000b: normal image, 001b:compressed image, other for more types for patch in temp bank consist of 001b: patch+fsbl, 010b: patch+app, 011b: patch+fsbl+app*/ }; } ctrl_flag; uint16_t image_id; uint32_t payload_len; } T_IMG_CTRL_HEADER_FORMAT;
ic_type表示IC type,RTL87x2G IC type值为15。
secure_version表示启动安全检查image的版本。
image_id标识不同的image的类型枚举如下,其中SCCD,OCCD不能OTA升级。
typedef enum { IMG_SCCD = 0x379D, IMG_OCCD = 0x379E, IMG_BOOTPATCH = 0x379F, /*!< KM4 boot patch */ IMG_DFU_FIRST = IMG_BOOTPATCH, IMG_OTA = 0x37A0, /*!< OTA header */ IMG_SECUREMCUAPP = 0x37A2, /*!< KM4 secure app */ IMG_SECUREMCUAPPDATA = 0x37A3, /*!< KM4 secure app data */ IMG_BT_STACKPATCH = 0x37A6, /*!< BT stack patch */ IMG_BANK_FIRST = IMG_BT_STACKPATCH, IMG_MCUPATCH = 0x37A7, /*!< KM4 non-secure rom patch */ IMG_UPPERSTACK = 0x37A8, /*!< KM4 non-secure Upperstack */ IMG_MCUAPP = 0x37A9, /*!< KM4 non-secure app */ IMG_MCUCFGDATA = 0x37AA, /*!< KM4 MCUConfigData */ IMG_MCUAPPDATA1 = 0x37AE, IMG_MCUAPPDATA2 = 0x37AF, IMG_MCUAPPDATA3 = 0x37B0, IMG_MCUAPPDATA4 = 0x37B1, IMG_MCUAPPDATA5 = 0x37B2, IMG_MCUAPPDATA6 = 0x37B3, IMG_ZIGBEESTACK = 0x37B4, /*!< KM4 Zigbee stack */ IMG_MAX = 0x37B5, IMG_DFU_MAX = IMG_MAX, IMG_RO_DATA1 = 0x3A81, IMG_RO_DATA2 = 0x3A82, IMG_RO_DATA3 = 0x3A83, IMG_RO_DATA4 = 0x3A84, IMG_RO_DATA5 = 0x3A85, IMG_RO_DATA6 = 0x3A86, IMG_USER_DATA8 = 0xFFF7, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA_FIRST = IMG_USER_DATA8, IMG_USER_DATA7 = 0xFFF8, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA6 = 0xFFF9, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA5 = 0xFFFA, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA4 = 0xFFFB, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA3 = 0xFFFC, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA2 = 0xFFFD, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA1 = 0xFFFE, /*!< the image data only support unsafe single bank ota */ IMG_USER_DATA_MAX = 0xFFFF, /*!< the image data only support unsafe single bank ota */ } IMG_ID;
备注
payload_len单位是字节,表示image的大小,不包括1280 Bytes的image header,image total length = payload_len + 1280。
crc16表示对image进行crc和SHA256校验,prepend_header tool会同时计算crc 和sha256值,默认用sha256校验。
ctrl_flag和OTA相关的位域只有not_ready和not_obsolete。
not_ready标识image是否为有效。默认发布、编译或者通过工具生成的文件的image header中 not_ready字段均为0。
通过蓝牙传输将image写入到备份区,中间可能存在断电的风险。所以在写入备份区前,需要将not_ready修改成1再写入flash。
只有当image传输完成,并且image完整性校验成功后,修改备份区image中的not_ready为0,标识备份区image有效。
系统重启后,由BootLoader完成备份image的激活流程。
not_obsolete表示image是否废弃,默认编译的image中not_obsolete为1。
当支持bank切换时,not_obsolete在OTA过程中无效。
当不支持bank切换时,OTA升级完成后,启动代码判断not_ready为0且not_obsolete为1,此时将image从OTA_TMP区域搬运到OTA Bank0内的对应image的运行区域,搬运成功后,将OTA_TMP区image中not_obsolete写为0,防止重复搬运。
OTA工具使用
工具
Flash Map Generate Tool
生成 flash_map.h
、flash map.ini
和 OTA Header file
。
备注
flash_map.h
需要放到工程上级目录下参与编译,生成APP image。flash map.ini
为 MP Pack Tool 和 MP Tool 的输入文件,要保证image和设置的所有输出地址一致。
MP Pack Tool
打包OTA文件。
APP Data Tool
APP Data文件通过SDK/tools/AppData生成脚本生成,具体请参考《APP Data Tool Quick Start Guide》。
User Data Tool
User Data文件通过SDK/tools/UserData生成脚本生成。
支持Bank切换
Flash布局
下面以2M byte的flash为例,介绍Bank切换方案。Flash布局示例如下表所示。
flash总大小为2MB的示例布局 |
大小(字节) |
起始地址 |
---|---|---|
Reserved |
4K |
0x04000000 |
OEM Header |
4K |
0x04001000 |
Bank0 Boot Patch |
32K |
0x04002000 |
Bank1 Boot Patch |
32K |
0x0400A000 |
OTA Bank0 |
596K |
0x04012000 |
|
4K |
0x04012000 |
|
32K |
0x04013000 |
|
60K |
0x0401B000 |
|
212K |
0x0402A000 |
|
284K |
0x0405F000 |
|
4K |
0x040A6000 |
|
0K |
0x040A7000 |
|
0K |
0x040A7000 |
|
0K |
0x040A7000 |
|
0K |
0x040A7000 |
|
0K |
0x040A7000 |
|
0K |
0x040A7000 |
OTA Bank1 |
596K |
0x040A7000 |
|
4K |
0x040A7000 |
|
32K |
0x040A8000 |
|
60K |
0x040B0000 |
|
212K |
0x040BF000 |
|
284K |
0x040F4000 |
|
4K |
0x0413B000 |
|
0K |
0x0413C000 |
|
0K |
0x0413C000 |
|
0K |
0x0413C000 |
|
0K |
0x0413C000 |
|
0K |
0x0413C000 |
|
0K |
0x0413C000 |
Bank0 Secure APP code |
0K |
0x0413C000 |
Bank0 Secure APP Data |
0K |
0x0413C000 |
Bank1 Secure APP code |
0K |
0x0413C000 |
Bank1 Secure APP Data |
0K |
0x0413C000 |
OTA Temp |
32K |
0x0413C000 |
FTL |
16K |
0x04148000 |
APP Defined Section |
736K |
0x040FF000 |
备注
Flash布局需要根据用户实际image和data的大小进行合理划分。
打包工具使用步骤
使用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,stack patch和BT host image。
备注
SDK中发布的system patch,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布局
下面以1M byte的flash为例,介绍不切换Bank方案。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 |
|
304K |
0x0405F000 |
|
4K |
0x040AC000 |
|
0K |
0x040AD000 |
|
0K |
0x040AD000 |
|
0K |
0x040AD000 |
|
0K |
0x040AD000 |
|
0K |
0x040AD000 |
|
0K |
0x040AD000 |
OTA Bank1(等于0) |
0K |
0x040AD000 |
Bank0 Secure APP code |
0K |
0x040AD000 |
Bank0 Secure APP Data |
0K |
0x040AD000 |
Bank1 Secure APP code |
0K |
0x040AD000 |
Bank1 Secure APP Data |
0K |
0x040AD000 |
OTA Temp |
312K |
0x040AD000 |
FTL |
16K |
0x040FB000 |
APP Defined Section |
4K |
0x040FF000 |
备注
此处没有分配APP data,Flash布局需要根据用户实际image和data的大小进行合理划分。
打包工具使用步骤
使用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
保持一致。将
flash_map.h
拷贝到工程文件上级目录下,编译链接生成app_MP_sdk#####+ version+MD5.bin
的文件供打包使用。使用SDK/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 Characterisic:接受控制指令的通道,属性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 |
is 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 ctrl header后,如果开启AES加密需要解密后再解析,会将not_ready临时写成1再写入flash中。
在数据传输时,如果支持AES加密,每16 byte都进行加密,接收端收到数据后,需要先对其解密。最后小于16 byte的部分没有加密发送。当收满buffer check size后,再写入flash。
OTA流程
OTA蓝牙传输流程
OTA激活流程
Bank不切换方案非组合升级,当打包待升级文件中包含Patch、APP或者APP DATA,需要一个文件升级验证成功,重启拷贝激活生效之后,再升级下一个文件。
Bank不切换方案组合升级,在将image数据写到OTA temp区时,会去计算OTA temp区剩余空间能否放得下下一个需要写入的image文件,如果可以放下则继续将下一个image文件写入OTA temp区,当放不下时则再将OTA Temp区数据搬到OTA Bank0区域,重启拷贝激活生效之后,再升级其他文件。
Bank切换方案,当打包待升级文件中包含OTA Header file、Patch、APP或者APP DATA,需要一个文件升级验证成功,再升级验证下一个文件。等所有文件都升级验证成功后,才能进行重启,否则本次升级无效。具体原因是切换Bank方案,需要Bank区所有文件都一起生效,才能正常运行。