本应用笔记介绍运行于随 BlueNRG-LP、BlueNRG-LPS 片上系统提供的 Bluetooth®低功耗(LE)栈之上的 BlueNRG-LP、BlueNRG-LPS 无线(OTA)固件升级程序。
首先介绍与 OTA 固件升级过程相关的一些概念,然后帮助用户了解运行一些 OTA 固件升级会话所需的所有步骤。
“无线”固件升级的概念
“无线”(OTA)固件升级是一种协议,允许低功耗蓝牙从设备无线接收来自低功耗蓝牙主设备的固件映像,并将其写入 Flash 存储器。就低功耗蓝牙技术而言,OTA 固件升级框架定义了一种提供其自己的特性,并能与蓝牙 LE 栈上运行的任何给定应用使用的其他服务共存的服务。蓝牙 LE 主设备是由通过 USB 连接到 PC的 BlueNRG-LP、BlueNRG-LPS 开发套件平台构成的组合系统。BlueNRG-LP、BlueNRG-LPS 平台由BlueNRG GUI 驱动。鉴于这种选择,可以使用 PC 上的大量资源,尤其是用于生成固件映像的编译器,以及为了进行固件升级而在无线部署映像前存储映像所需的存储器空间。
OTA 固件升级服务描述
OTA 固 件 升 级 服 务 通 过 BlueNRG-LP 、 BlueNRG-LPS DK 软 件 包 中 提 供 的 文 件 OTA_btl.[ch](MiddlewaresSTBLE_ApplicationOTA folder)实现。
下面是关于 OTA 固件升级服务及其相关特性的简述:
— Btl OTA 服务(OTA_SRVC_UUID):固件升级服务
‒ aci_gatt_srv_add_service((ble_gatt_srv_def_t *)&ota_service);
— Btl 映像的特性(IMAGE_CHR_UUID):包含一些与空闲内存范围相关的信息,这是包含 OTA 固件升级服务的当前应用建议的范围
— Btl 新映像的特性(NEW_IMAGE_CHR_UUID):包含 OTA 固件传输期间主设备想要无线发送的映像的基址和大小以及要求从设备发送确认的通知范围
— Btl 新映像内容的特性(IMAGE_CONTENT_CHR_UUID):它包含主设备发送(通过特性写入指令)的16 字节固件映像数据块,以及一些控制信息,例如块序号(2 字节)和用于完整性检查的校验和(1 字节)
— Btl 预期映像序号特性(IMAGE_SEQ_NUM_CHR_UUID):从设备通过该特性通知主设备其预期的下
一个数据块或错误条件
OTA 固件升级事务
本节将介绍 OTA 固件升级步骤:
1. 在安装了运行 OTA 固件升级服务的主设备和从设备后,需执行搜索程序以便连接两个设备。通过收听无线传输范围内的设备的广播进行搜索(主动扫描),并选择扫描响应中包含 OTA FW 升级服务 UUID(128 位)的设备。
2. 此外,将从广播消息中读取所选设备的名称,主设备将使用该名称强化从设备识别程序。
3. 连接后,主设备将发送“ACI_GATT_CLT_DISC_CHAR_BY_UUID”指令,以便读取所有 OTA 固件升级特性句柄。
4. 主设备通过“ACI_GATT_CLT_READ”指令读取 Btl 映像特性,以获悉目标从设备 Flash 存储器上的空闲空间。
5. 根据上一步中获得的信息,主设备将选择合适的映像进行无线发送。候选映像(位于主设备上某位置的*.bin 文件)必须处于目标的空闲 Flash 存储范围内。
6. 完成选择后,主设备发送“ACI_GATT_CLT_WRITE”指令,以将映像基址、大小和通知范围写入 Btl新映像特性,并通过“ACI_GATT_CLT_READ”读回以进行确认。
7. 主设备写入 Btl 预期映像序号特性描述符,以启用映像块序号和错误的从设备通知。在接收到该指令后,从设备将发回通知。
8.映像传输开始。主设备将通过一系列“ACI_GATT_CLT_WRITE_WITHOUT_RESP”指令以 16 字节数据块发送映像(每个 16 字节数据块一个)。目标从设备每次收到新的 WRITE 指令时,将新数据块写入Btl 新映像内容特性。每个(N*16)字节数据块附带 2 字节序号和 1 字节校验和字段,用于在目标位置检查顺序和消息完整性。每次(N*16)字节数据块占满从设备的内部缓冲区时,数据块被下载到 Flash 存储器。一旦从设备完成 16 字节数据块内部缓冲区的管理,它将向主设备发送通知消息,其中包含下一个预期数据块的数据块号。它可能通过最新数据块通知 Flash 写入错误和 Flash 验证错误,假如问题出在目标设备 Flash 上,此时自举会话应停止。