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

  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区域,激活后再进行下一个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.hflash map.iniOTA 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布局示例

打包工具使用步骤

  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,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。

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

    1. 选择 ForOTA 选项。

    2. 加载生成的 flash map.ini

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

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

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

    使用MP Pack Tool打包文件—— 支持Bank切换

    备注

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

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

    • 建议Bank0和Bank1一起打包。

不支持Bank切换

Flash布局

请参考 不支持Bank切换方案Flash布局示例

打包工具使用步骤

  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

    使用MP Pack Tool打包文件—— 不支持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. 使用 rtl87x2g_sdk_xxxx\tools\UserData 中的脚本生成可支持打包的User Data文件。

  3. 打开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

使用MP Pack Tool打包文件——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 Characteristic:接受控制指令的通道,属性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

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

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

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