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空间分布和功能说明 如下。

../../../../_images/Flash_Layout.png

Flash布局

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内部的布局和说明如下。

../../../../_images/Layout_of_OTA_Bank.png

OTA Bank布局

OTA Bank Flash Segmentation

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布局有以下不同。

  1. OTA Bank1区不分配容量。

  2. OTA TMP区需要分配,且大小必须不小于OTA Bank0最大的image大小。 故不支持Bank切换方案相对节约flash空间,OTA传输完成,重启boot程序会将OTA TMP区数据搬到OTA Bank 0指定image区域,再重启生效,所以相对增加了OTA升级完成的重启时间。

  3. 在不切换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各字段定义如下。

../../../../_images/OTA_Header_Layout.png

OTA Header布局

OTA Header中header部分与OTA相关的各字段的作用如下。

Fields of OTA Header

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中各字段定义下。

../../../../_images/Image_Header_Layout.png

Image Header结构

其中与OTA相关的字段表示的含义如下。

Image Header Field

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;

备注

  1. payload_len单位是字节,表示image的大小,不包括1280 Bytes的image header,image total length = payload_len + 1280。

  2. crc16表示对image进行crc和SHA256校验,prepend_header tool会同时计算crc 和sha256值,默认用sha256校验。

  3. ctrl_flag和OTA相关的位域只有not_ready和not_obsolete。

    1. not_ready标识image是否为有效。默认发布、编译或者通过工具生成的文件的image header中 not_ready字段均为0。

      1. 通过蓝牙传输将image写入到备份区,中间可能存在断电的风险。所以在写入备份区前,需要将not_ready修改成1再写入flash。

      2. 只有当image传输完成,并且image完整性校验成功后,修改备份区image中的not_ready为0,标识备份区image有效。

      3. 系统重启后,由BootLoader完成备份image的激活流程。

    2. not_obsolete表示image是否废弃,默认编译的image中not_obsolete为1。

      1. 当支持bank切换时,not_obsolete在OTA过程中无效。

      2. 当不支持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.hflash map.iniOTA 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布局示例如下表所示。

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

  • OTA Header

4K

0x04012000

  • System Patch code

32K

0x04013000

  • BT Stack Patch code

60K

0x0401B000

  • BT Host code

212K

0x0402A000

  • APP code

284K

0x0405F000

  • APP Config File

4K

0x040A6000

  • APP data1

0K

0x040A7000

  • APP data2

0K

0x040A7000

  • APP data3

0K

0x040A7000

  • APP data4

0K

0x040A7000

  • APP data5

0K

0x040A7000

  • APP data6

0K

0x040A7000

OTA Bank1

596K

0x040A7000

  • OTA Header

4K

0x040A7000

  • System Patch code

32K

0x040A8000

  • BT Stack Patch code

60K

0x040B0000

  • BT Host code

212K

0x040BF000

  • APP code

284K

0x040F4000

  • APP Config File

4K

0x0413B000

  • APP data1

0K

0x0413C000

  • APP data2

0K

0x0413C000

  • APP data3

0K

0x0413C000

  • APP data4

0K

0x0413C000

  • APP data5

0K

0x0413C000

  • APP data6

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的大小进行合理划分。

打包工具使用步骤

  1. 使用Flash Map Generate Tool生成 flash map.iniflash_map.hBank0 OTA Header fileBank1 OTA Header file

    1. 选择Flash Size。

    2. 选择 Enable bank switch。

    3. 设置两级flash layout。

    4. 点击 Confirm 完成flash layout设置。

    5. 修改OTA Header file版本。

    6. 点击 Confirm 生成 flash_map.hflash map.iniBank0 OTA Header fileBank1 OTA Header file

    ../../../../_images/dual_bank_Flash_layout_config.png

    设置Flash布局并生成OTA Header

    备注

    打包用的OTA Header版本号要比原来运行的高,这样OTA升级完新bank才能正常生效。

  2. flash map.ini 文件拷贝到工程文件上级目录下,编译链接生成 app_MP_sdk#####+version+ MD5.bin 的文件供打包使用。

    ../../../../_images/Build_APP_image.png

    编译APP文件

    备注

    切换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
  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。

  2. 生成打包文件,默认在软件同目录下生成 ImgPacketFile-xxxxxx.bin,此文件为升级用的打包文件。

    1. 选择 ForOTA 选项。

    2. 加载生成的 flash map.ini

    3. 根据设置的flash map加载所有OTA Bank0和Bank1 image。

    4. 点击 Confirm 生成打包文件。

    ../../../../_images/MPPackTool_dual_bank.png

    使用MPPackTool打包文件——支持Bank切换

    备注

    • Bank0 OTA Header file和Bank1 OTA Header file都需要打包。(与不切换Bank模式不同)

    • Flash布局中定义的内容都需要进行打包,缺一不可。

    • 建议Bank0和Bank1一起打包。

不支持Bank切换

Flash布局

下面以1M byte的flash为例,介绍不切换Bank方案。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

  • OTA Header

4K

0x04012000

  • System Patch code

32K

0x04013000

  • BT Stack Patch code

60K

0x0401B000

  • BT Host code

212K

0x0402A000

  • APP code

304K

0x0405F000

  • APP Config File

4K

0x040AC000

  • APP data1

0K

0x040AD000

  • APP data2

0K

0x040AD000

  • APP data3

0K

0x040AD000

  • APP data4

0K

0x040AD000

  • APP data5

0K

0x040AD000

  • APP data6

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的大小进行合理划分。

打包工具使用步骤

  1. 使用Flash Map Generate Tool生成 flash map.iniflash_map.hBank0 OTA Header file

    1. 选择Flash Size。

    2. 选择 Disable bank switch。

    3. 设置两级flash layout。

    4. 点击 Confirm 完成flash layout设置。

    5. 修改OTA Header file版本。

    6. 点击 Confirm 生成 flash_map.hflash map.iniBank0 OTA Header file

    ../../../../_images/single_bank_Flash_layout_config.png

    配置Flash Layout并生成Bank0 OTA Header file

    备注

    此处生成的 flash map.ini 需要和MP阶段使用的 flash map.ini 保持一致。

  2. 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
  1. 打开MP Pack Tool,加载第一步生成的 flash map.ini,并load相应image文件。

    1. 选择 ForOTA 选项。

    2. 加载生成的 flash map.ini

    3. 根据设置的flash map加载所有OTA Bank0 image。

    4. 点击 Confirm 生成打包文件。

    ../../../../_images/MPPackTool_single_bank.png

    使用MPPackTool打包文件——不支持Bank切换

    备注

    • Bank0 OTA Header file在不切换Bank方案时不允许打包。(与切换Bank的模式不同)。

    • 如果只需要更新Patch Image或者APP Image,可只打包其中一个。

User Data升级

Flash布局

下面以1M byte的flash为例,介绍User Data升级。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

  • OTA Header

4K

0x04012000

  • System Patch code

32K

0x04013000

  • BT Stack Patch code

60K

0x0401B000

  • BT Host code

212K

0x0402A000

  • APP code

192K

0x0405F000

  • APP Config File

4K

0x0408F000

  • APP data1

0K

0x04090000

  • APP data2

0K

0x04090000

  • APP data3

0K

0x04090000

  • APP data4

0K

0x04090000

  • APP data5

0K

0x04090000

  • APP data6

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

打包工具使用步骤

  1. 使用 Flash Map Generate Tool 生成 flash map.iniflash_map.hBank0 OTA Header file

    ../../../../_images/user_data_Flash_layout_config.png

    配置Flash Layout并生成Bank0 OTA Header file

    备注

    此处生成的 flash map.ini 需要和 MP 阶段使用的 flash map.ini 保持一致。

  2. flash_map.h 拷贝到工程文件上级目录下,编译链接生成 app_MP_sdk#####+ version+MD5.bin 的文件供打包使用。

  3. 使用SDK/tools/UserData中的脚本生成可支持打包的User Data文件。

  4. 打开MP Pack Tool,加载第一步生成的 flash map.ini,并load相应image文件。

    1. 选择 ForOTA 选项。

    2. 加载生成的 flash map.ini

    3. 根据设置的flash map加载User data image。

    4. 点击 Confirm 生成打包文件。

../../../../_images/MPPackTool_user_data.png

使用MPPackTool打包文件——User Data升级

备注

  • 如果只需要更新某一个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}
OTA characteristics

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

Device info Format (OTA version=1)

Device info Format (OTA version=1)

读取设备的固件基本信息

Protocol Type

M

0xFFF3

Read

Uint16

0xNNNN

读取请求以获取ota协议信息

Image Version

M

0xFFE0~FFE1

Read

(Uint32+Uint16)*21+2

Byte0: bank num

  • 0: active bank

  • 1: inactive bank

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

……

此特性是读取请求以获得固件的最大大小

Device info Format (OTA version=1)

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如下表。

DFU Opcode

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蓝牙传输流程

../../../../_images/OTA_Bluetooth_transmission_process.png

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区所有文件都一起生效,才能正常运行。