1、介绍
执行一个OAD需要两个无线设备:
- OAD目标设备(OAD Target)
- OAD分发设备(OAD Distributor)
OAD目标设备接收通过无线传输的镜像。负责实现用于发送和接收OAD镜像数据的协议栈特定传输层。
OAD分发设备负责将新固件镜像分割成协议堆栈特定的包,并通过空中发送它们。
2、启动镜像管理器 (BIM)
BIM是一个完全可执行的应用程序,它独立于任何高级协议栈或用户应用程序。它永久驻留在OAD目标芯片上的最后一个flash页,CCFG也在此页。修改CCFG的IMAGE_VALID_CONF
字段指向,强制起始地址为BIM。这允许当MCU上电时,BIM执行并决定启动的序列。BIM用到的CCFG位于<SDK_DIR>/examples/nortos/<LaunchPad>/common/bim/bim_<on/off>chip/src,它的连接文件位于<SDK_DIR>/source/ti/common/cc26xx/<ccs/iar>。它负责在新镜像下载完成后加载。BIM在设备复位时执行,并确定是否需要应用固件更新。如果没有应用更新,则BIM会将程序执行转移到主应用程序镜像。
BIM在内核初始化之前执行,因此是单线程和裸机的。硬件访问是通过driverlib完成的。作为一个单独的应用程序,BIM需要自己的中断向量表和链接器文件。它是一个完全可执行的镜像,该镜像必须与用户应用程序镜像合并,以创建一个功能强大的支持OAD的固件系统。
BIM负责查找和分析OAD镜像头。从高层BIM执行以下操作:
- 从最近的OAD检查新下载的镜像。
- 如果可用,将新下载的镜像复制到内部闪存中的目标位置
- 动态定位有效镜像的入口点并跳转
以下部分将详细介绍BIM启动程序和镜像检查程序。
启动程序
复位时,CC2652的ROM中的软件将执行基本的启动例程,然后跳转到CCFG的IMAGE_VALID_CONF
字段指向的位置(BIM 的复位向量表)。CCFG是BIM的一部分。BIM使用 driverlib中提供的工具链特定启动代码。
复位ISR代码可以在startup
文件夹下的driverlib中找到。它执行以下操作:
- 设备特定的修剪功能
- C/C++ 运行时初始化
- 跳转到BIM的
main()
有关引导过程的如下图所示。红框表示driverlib/ROM代码,蓝框表示BIM代码。
设备调整功能负责调整设备的硬件设置,以确保稳定和最佳运行。每次设备启动时它必须至少运行一次,但可以运行多次。部分修剪功能取决于CCFG,这是它与BIM相关联的另一个原因。默认情况下,BIM 和用户应用程序都会修剪设备。
警告:建议在BIM和用户应用程序中启用设备调整,以便在没有BIM的情况下通过调试器进行开发。
仅建议为最终生产代码删除用户应用程序的设备修剪。应在禁用附加修剪的镜像上执行附加验证。可以通过修改内核*.cfg
文件中的引导模块来禁用应用程序级别修剪。
安全的BIM
BIM有一个安全扩展,称为安全BIM。安全BIM添加了验证安全OAD镜像的功能,并启用主应用程序固件镜像的安全启动。安全BIM和不安全BIM之间的唯一区别是在BIM过程中增加了一个安全步骤。
在安全BIM程序中,添加的步骤检查新镜像的安全性。镜像签名被验证,并被接受或拒绝。如果被接受,BIM程序将照常继续;否则,镜像将被拒绝,BIM程序将搜索另一个镜像。安全检查步骤发生在CRC检查之后。
笔记
安全BIM将始终拒绝未签名的新OAD镜像。但是,不安全的BIM将接受已签名和未签名的 OAD镜像。
椭圆曲线数字签名算法 ( ECDSA ) 用于对安全OAD镜像进行签名和验证。更具体地说,实现了 ECSDA-P256 算法。
签名验证始终在BIM程序期间完成。应用程序无法验证新的安全OAD镜像是否具有有效签名。这意味着新的安全OAD镜像可能具有正确的CRC校验,但签名无效。应用程序仍会将其视为有效镜像,但在BIM程序期间将被拒绝。
加密和验证过程描述
生成新的安全秘钥
默认情况下,在private.pem
和public.pem
文件中提供公钥和私钥。在输出二进制文件之前,OAD Image Tool将使用私钥对应用程序映像进行签名。该工具作为OAD应用程序的构建后步骤运行。当作为构建后步骤运行时,该工具将生成一个输出二进制文件,名为 <app_name>_oad.bin
。(如果使用安全,则必须提供私钥的路径,这是使用-k
选项提供的。您必须使用该工具的安全版本才能执行此操作)。建议使用SimpleLink CC13x2 / 26x2 SDK的预期协议栈组件中启用OAD的示例应用程序,并根据需要复制 + 修改后构建步骤。
生成秘钥的过程:
- PC上安装Python3.7以上版本
- 然后安装pip install ecdsa模块
- 打开PowerShell,切换到<SDK_DIR>/tools/common/oad路径下
- 运行python keys/key_generate.py,此时会报“AttributeError: 'array.array' object has no attribute 'tostring'”的错误,因为从Python3.2开始,array不再有tostring方法,打开key_generate.py文件,将其中tostring的地方替换为tobytes。再次运行python keys/key_generate.py。
- 此时在<SDK_DIR>/tools/common/oad中新生成private.pem、public.pem、key_info.txt等3个文件。
安全的BIM程序构建过程:
1. 从SDK中导入BIM工程,有以下2种方法
- 从Resource Explorer中导入
- 从SDK中导入,按照片上还是片外BIM,路径是:<SDK_DIR>\examples\nortos\CC26X2R1_LAUNCHXL\bim\bim_onchip或<SDK_DIR>\examples\nortos\CC26X2R1_LAUNCHXL\bim\bim_offchip
2. 打开上述工程的bim_main.c文件,将下面的“NEW ** HERE”占位符替换为上面生成的key_info.txt
文件中相应行的内容。
{
.version = SECURE_SIGN_TYPE,
.len = SECURE_CERT_LENGTH,
.options = SECURE_CERT_OPTIONS,
.signerInfo = {/* NEW SIGNER INFO HERE */},
.certPayload.eccKey.pubKeyX = {/* NEW PUB KEY X HERE */},
.certPayload.eccKey.pubKeyY = {/* NEW PUB KEY Y HERE */}
};
3. 重新编译BIM程序即可生成安全的BIM程序。
将它们粘贴到BIM工程的bim_main.c文件中时,需要将正确的C样式语法添加到key数组。确保在每个元素之间添加一个逗号,并在所有十六进制值前加上
0x
。同样需要注意字节的顺序。
定位和准备用户应用程序
除了启动和调整设备外,BIM的主要功能是查找和准备在CC2652上运行的用户应用程序。执行此操作的方法取决于正在执行的OAD类型(即片上或片外)。
按照惯例,向量表紧跟在启用OAD的镜像中的镜像头之后。BIM和镜像头紧密耦合。
3、用于片外OAD的BIM
这种方法需要将外部闪存连接到设备。与片上OAD一样,确定应该运行哪个镜像是BIM的责任。
在稳定状态下,正常情况是内部闪存中存在有效镜像,而外部闪存中没有镜像被标记为需要复制。在这种情况下,BIM将验证内部闪存上的镜像并通过加载堆栈指针并跳转到镜像的复位向量位置来执行它。BIM通过附加在其上的OAD镜像头确定镜像的复位向量和堆栈指针的位置。
下面的执行流程假设安全性已开启。如果使用不安全的BIM配置,则过程相同,只是不检查安全性。
下面的流程图描述了BIM选择镜像的过程。
上图用下面的文字说明。为了确定最适合运行的镜像,BIM 采取了以下措施:
1. 在启动时,BIM通过读取前8个字节来查找外部闪存中的有效镜像标头,以找到有效的外部闪存镜像标识值。
2. 找到有效的标头后,它从ext flash读取整个标头并验证BIM和镜像头版本的兼容性。然后它检查“镜像复制状态”是否设置为复制到片上闪存 (0xFE) 并具有有效的CRC(CRC 状态 = 0xFE)。
- 如果找到兼容的标头,BIM的安全版本将使用ECDSA验证算法检查镜像的签名。
- 如果CRC标志无效(CRC 状态!= 0xFE),则它被拒绝。
- 找到无效的CRC后,它继续读取下一个镜像的标题。
3. 如果找到有效镜像,BIM会根据镜像复制程序将镜像复制到片上闪存。
- 复制后,计算CRC并在内部闪存上再次验证签名以确保复制成功。
- 如果复制失败,则更新状态字节并且BIM将继续搜索外部闪存。
- 如果复制成功,则BIM将再次验证镜像,如果成功则直接跳转到应用镜像,搜索过程结束。
4. 如果BIM在没有找到有效镜像的情况下到达外部flash中镜像头区域的末尾,那么它将尝试找到一个片上镜像并执行它。
5. 如果BIM未能找到有效的镜像内部闪存,它将尝试恢复出厂镜像(如果存在)。
6. 如果找不到有效的应用程序镜像,BIM会将设备置于低功耗模式。
如果计算出的CRC32与嵌入在镜像头中的镜像的CRC不匹配,则镜像被认为是坏的/无效的。
4、用于片内OAD(协议栈库)的BIM
本节描述使用组合镜像方法的片上OAD BIM的行为。这种方法需要目标设备上有两个完整的应用程序和堆栈库。与片外OAD一样,确定应该运行哪个镜像是BIM的责任。在片上OAD系统中,只有两种镜像类型可以安全执行:
- Persistent application (0x00):实现OAD配置文件的永久驻留应用程序
- 用户应用程序 (0x01):实现OAD重置服务和用户功能的OAD可升级应用程序
有关OAD镜像类型的更多信息,请参阅本章的OAD镜像头部分。OAD 应用程序部分定义了片上系统中每个应用程序的角色和职责 。
总之,应用程序负责将候选镜像存储在内部闪存中,执行所有OAD程序和协议,更新OAD镜像头中的镜像验证闪存字段,并在适当时重置设备。镜像验证字段是一个共享RAM变量,允许应用程序在重置之前指示BIM应选择哪个镜像。这在使用 Flash 中的验证字节的应用程序执行切换中进行了描述。
根据镜像头中的镜像验证字段,BIM将决定哪个镜像最适合运行。下面将描述BIM选择镜像的过程。
上面的图像用下面的文字描述。为了确定最适合运行的镜像,BIM采取了以下措施:
1. 启动时,BIM会检查OAD Image Header 中的镜像验证字段, 并根据使用 Flash 中的验证字节进行应用程序执行切换abc来设置活动的Flash页面或镜像类型。如果未设置镜像验证字段,它将默认为0的闪存页面和用户应用程序的镜像类型。
2. BIM检查BIM_ONCHIP_MAX_NUM_SEARCHES
以确保未超出最大搜索迭代次数。
3. BIM现在将遍历内部flash中的每个flash页面,以搜索有效的镜像识别值。这是通过以下方式完成的:
- 读取前8个字节并与任何有效的镜像标识值进行比较
- 如果找到有效的镜像标题,BIM将读取整个镜像标题
- 如果未找到标题,请增加flash页面并再次搜索(跳到第 2 步)
重复此过程,直到找到有效镜像,或达到最大搜索迭代次数。
4. 检查标题和BIM版本是否与当前BIM兼容。
- 如果此检查失败,请增加闪存页码并再次搜索(跳至步骤 #2)。如果是用户应用程序,请更改镜像类型,以便BIM在再次搜索之前启动到持久应用程序。
5. 如果尚未在镜像上计算CRC,则计算一个并更新CRC状态字段。
- 如果未决复制(堆栈镜像),请先不更新CRC字段,这将在复制后完成
6. 检查安全性。
- 通过在镜像上运行ECDSA签名/验证算法,确保镜像来自受信任的对等方。
- 如果安全检查失败,请增加 flash页面并再次搜索(跳到第 2 步)
默认情况下,
AUTHENTICATE_PERSISTENT_IMG
在BIM应用程序中定义。这意味着BIM还将在启动之前检查持久性应用程序的有效性。
7. 检查镜像标头 (0xFE) 中的有效CRC和镜像复制状态。
- 复制新的用户镜像,计算CRC以确保复制成功。相应地更新复制状态和CRC状态字段。
- 如果成功,将镜像类型设置为持久应用程序并将闪存页码设置为 0。
- 如果失败,继续搜索。
8. 继续此过程,直到找到镜像或执行最大迭代(16 次不成功的下载尝试)。
- 如果找到有效镜像,则跳转到该镜像
- 如果未找到有效镜像且已执行最大迭代次数,则转至低功耗模式。
上面的文字和图表描述的执行流程假设安全性已开启。如果使用不安全的 BIM 配置,则过程相同,只是不检查安全性。
使用 Flash 中的验证字节进行应用程序执行切换
在该方案中,BIM根据镜像验证字段中“0”位的数量通过执行。如果0的位数为奇数,则执行持久应用程序,如果计数为偶数,则执行用户应用程序。
默认情况下,镜像标题中的镜像验证字段将设置为 0xFFFFFFFF。上电时,BIM会将执行传递给用户应用程序。当用户应用程序想要上传新镜像时,它必须将执行切换到持久应用程序。为此,应用程序将第一个可用的非零位翻转为“0”,从“镜像验证”字段中的LSB开始。这样做将使“0”位的数量成为奇数。然后应用程序应该执行重置命令。
复位后,BIM 将继续执行并检查“0”位的计数是奇数还是偶数。一旦在镜像验证字段中找到奇数个0,BIM将运行持久应用程序镜像(由用户应用程序启动)。持久性应用程序将开始下载,新用户镜像将通过身份验证。如果新镜像下载和存储成功,“镜像验证”字段将再次覆盖为0xFFFFFFFF,BIM将能够执行新下载的镜像。
如果身份验证或“镜像识别”命令(请参阅BLE-Stack OAD Profile 有关详细信息)失败,应重新验证已在闪存中的用户应用程序。在持久应用程序中,这是通过将现有用户应用程序OAD镜像标头的镜像验证字段中的第一个可用非零位翻转为“0”来处理的。这使得非零位的数量均匀。然后电路板再次自行复位。启动时,BIM将再次检查“0”位的计数是奇数还是偶数。这一次它会发现非零位数是偶数,BIM执行用户应用程序。这使用户应用程序免于未经授权的OAD尝试。这四个字节将允许BIM在用户和持久图像之间重试执行切换过程16次,而不会将所有位都变为“0”(16次下载失败)。当所有位都设置为“0”时,BIM总是会跳转到持久镜像,迫使用户升级用户应用程序。
5、OAD镜像头
通过OAD传输的所有固件镜像均为二进制格式,并包含一个镜像头。应用程序和 BIM 使用镜像头中的信息来确定镜像是否适合下载或加载。
TI 提供了一种生成OAD镜像的工具,称为 OAD Image Tool。默认情况下,此工具作为所有启用 OAD的项目的构建后步骤运行。
OAD镜像头由核心头和段组成。核心头是所有OAD镜像头所必需的并且是通用的。镜像段是可选的,对于给定的OAD用例(即片上与片外OAD)可能不同。当由OAD 图像工具添加到镜像时,OAD 核心头和段按顺序打包在一起。如下图:
下面的表显示了核心镜像头的描述。
字段 | 大小(字节) | 描述 |
---|---|---|
镜像识别值 | 8 | 识别OAD镜像开始的唯一编号 |
CRC | 4 | CRC校验 |
BIM版本 | 1 | 支持镜像格式的版本 |
镜像头版本 | 1 | 镜像头版本 |
无线技术 | 2 | 镜像中使用的连接类型(BLE 0xFFFE) |
镜像信息 | 4 | 镜像信息的字节 |
镜像验证 | 4 | 检查镜像是否有效运行 |
镜像长度 | 4 | 包含镜像头在内的镜像总长度 |
程序入口地址 | 4 | 应用启动的入口地址 |
镜像软件版本 | 4 | 镜像软件版本。在oad_image_header*.c文件中 |
镜像结束地址 | 4 | 镜像结束地址 |
镜像头长度 | 2 | 镜像头总长度 |
这个结构体imgFixedHdr_t在《oad_image_header.h》文件中。
OAD镜像识别值
CC13x2或CC26x2的OAD镜像识别值是根据SDK提供的DeviceFamily_*定义设置的。该值使用OAD_IMG_ID_VAL定义。注意,协议特定的实现OAD应该检查OAD_IMG_ID_VAL字段在当前驻留在设备上的镜像和传入的镜像之间是否匹配。
OAD图像识别值有两个目的:
- 为应用程序提供一种快速的方法来识别它是否正在接收正确的镜像。
- 为BIM提供了一种找到包含片上OAD的OAD镜像开始的flash页面的方法
建议客户定制图像识别字段,以唯一标识其产品。
CC2652R1工程中如下定义
#define OAD_IMG_ID_VAL {'C', 'C', '2', '6', 'x', '2', 'R', '1'}
镜像信息
字节编号 | 条目 | 描述 |
---|---|---|
0 | 镜像复制状态 | 0xFF:默认状态,不需要操作; 0xFE:镜像需要复制到镜像头中指示的片内flash的位置; 0XFC:镜像复制完成 |
1 | CRC状态 | 0xFC: CRC无效; 0xFE: CRC有效; 0XFF:CRC没有计算 |
2 | 镜像类型 | 设备镜像(0x00 - 0x15) 0x00:持久应用程序(对片上OAD来说); 0x01:应用程序; 0x02:协议栈; 0x03:应用程序和协议栈合并; 0x04:网络处理器; 0x05:工厂镜像; 0x06:BIM; 0x07:应用和堆栈结合(APP/栈库) 0x10-0xFF:保留 |
3 | 镜像编号 | 如果存储多个类型的镜像编号 0xFF:默认; 0x00-0xFE:镜像编号 |
注意:镜像类型0x03与0x07不同。0x03是应用和协议栈被分别构建软化通过一个hex合并工具合并到一起;镜像0x07是应用和协议栈构建成一个可以在的镜像
OAD镜像工具目前只支持以下镜像类型:0x00-0x03、0x07。
镜像验证
镜像验证字段由BIM用于在用户应用程序和目标镜像之间来回切换,而不会破坏当前镜像头部。该字段仅用于片上OAD。
镜像头的段(segments)
分段结构的设计使当前的OAD实现具有灵活性和可扩展性。这使得扩展镜像头向量成为可能,因为特性被添加到OAD实现,而不破坏现有的系统。
字段 | 大小(字节) | 描述 |
---|---|---|
边界信息 | 24 | 包含RAM和Flash的边界信息 |
连续的镜像信息 | 12 | 包含被下载的镜像的信息 |
安全信息 | 85 | 包含镜像签名及相关信息 |
当前的实现只支持连续类型的镜像,因此需要此段。
边界段是可选的,仅用于分割镜像类型。
镜像头的段的头
每个段有一个公共的头结构。下面将记录公共头,所以它不需要为每个段类型重复。
字段 | 大小(字节) | 描述 |
---|---|---|
段类型=X | 1 | 段头操作码 |
无线技术 | 2 | 与上面主要无线技术表中的选项相同。这里只能设置一个位。 |
安全信息 | 85 | 包含镜像签名及相关信息 |
保留 | 1 | 默认是0xFF |
载荷长度 | 4 | 段的字节长度 |
安全信息段
使用安全OAD特性构建的镜像将包含一个安全信息片段作为镜像头的一部分。安全段的格式如下所示:
字段 | 大小(字节) | 描述 |
---|---|---|
段类型=3 | 1 | 告诉BIM此段包含安全信息 |
无线技术 | 2 | 与上面主要无线技术表中的选项相同。这里只能设置一个位。 |
认证状态 | 1 | 默认设置为0xFF。“0xFC”表示签名验证失败。“0xFE”表示签名验证成功 |
载荷长度 | 4 | 安全信息字节的实际长度+结构的长度 |
安全载荷 | 可变 | 结构将包括安全算法类型和关于其各个组件的数据 |
安全有效载荷结构定义如下:
字段 | 大小(字节) | 描述 |
---|---|---|
版本 | 1 | 0x1: ECC P-256原始公钥 0x2-0xFF:保留 |
时间戳 | 4 | 时间戳 |
证书有效载荷 | 可变 | 8字节签名者信息,64字节公钥(看eccSignature_t) |
安全结构体定义在oad_image_header.h中的securityInfoSeg_t结构体中。
6、OAD外部闪存镜像头
OAD外部闪存镜像头是核心镜像头的扩展,具有启用外部闪存OAD的附加信息。
外部闪存镜像头放置在外部闪存开头的表中,每个条目将占用一页。
BIM将遍历外部Flash镜像头表,以根据外部Flash镜像头确定准备加载哪个镜像。一旦选择了目标镜像,外部闪存镜像头将指向内部闪存中的镜像地址,以便BIM可以将镜像复制到内部闪存中。
为举例说明,请参阅下面的图中,完整的外部flash布局的进一步说明是覆盖在外部闪存布局。
7、片外OAD的flash布局
内部闪存是指CC2652内部的闪存,外部闪存是指通过SPI连接到CC2652的外部SPI闪存。
片外 OAD 的限制和要求
为了执行片外OAD,目标系统必须具有:
- 一个与应用程序大小一样大的片外闪存+一个用于存储外部闪存图像标头的外部闪存页面。(默认示例将使用1MB的外部闪存)
- 串行连接 (SPI) 用于与片外闪存组件进行通信。
- 用于连接外部存储器的空闲GPIO引脚(即 4 条 SPI 线)
- 足够的可用代码空间为BIM保留最后1-2个闪存页面的全部内容
内部闪存布局
设备的内部闪存包含活动的用户应用程序和BIM。由于片外OAD能够在下载过程中将传入的镜像存储在外部闪存中,因此可以最大限度地为用户应用程序提供可用的闪存空间。
使用安全性时,BIM可能会根据设备的页面大小使用第二个页面。有关详细信息,请参阅BIM的链接器文件。
上图中的用户应用程序负责以下内容:
- 实现 OAD 传输的协议栈特定实现
- 在外部闪存中为图像寻找合适的位置并将其图像标题存储在表中
外部闪存布局
CC26x2 LaunchPad上的片外闪存包含镜像头向量表和用户应用程序。外部闪存部分的存储器映射布局在ext_flash_layout.h
中定义。为每个应用程序保留的空间量是由用户应用程序对OAD协议的实现动态调整大小的。一旦通过空中发送镜像标头矢量,就可以确定外部闪存中镜像的大小。
应用程序将根据以下等式根据需要进行四舍五入:
片外OAD应用程序的内存分区如下图所示。
镜像头表的大小是可扩展的,可以在OAD协议的用户应用程序实现中更改。
图像头表的每个条目都包含一个指向它在外部闪存中的相关图像位置的指针。
约定镜像头扇区0是为Factory Image保留的 。该区域应保留用于已知良好的镜像,因为如果内部或外部闪存(用户部分)中没有可接受的镜像,BIM将恢复为出厂镜像。
8、片上OAD的flash布局
设备的内部flash包含:
- 活动用户应用程序+用户应用程序BLE-Stack库
- 持久应用程序+持久应用程序BLE-Stack库
- BIM(Boot Image Manager)。
每个应用程序的角色定义如下。
注意:由于采用了堆栈-库方法,下面引用的堆栈镜像是每个应用程序镜像的一部分(即用户和持久应用程序有他们自己的专用堆栈)
应用名称 | 描述 |
BIM |
|
持久应用程序 | 提供实现OAD配置文件的轻量级应用程序 |
Stack | BLE协议栈实现 |
用户应用程序 |
|
上图中的用户应用程序(称为OAD_IMG_B)负责以下工作:
- 实现OAD复位服务的协议栈定义
- 实现客户定义的行为
上图中的持久应用程序(称为OAD_IMG_A)负责以下工作:
- 实现此镜像中OAD服务的协议栈定义
- 永久驻留在设备上
持久应用程序的位置取决于所选设备的可用flash大小。这样做是为了最大化用户的应用程序空间。参考链接器cmd文件中定义的IMG_A_FLASH_START以进一步确定持久应用程序的确切位置。
9、OAD应用程序
应用层负责插入OAD服务。OAD配置文件和与BLE-Stack的通信被封装在OAD模块中。希望实现使用 TI OAD 解决方案的开发人员无需担心实现OAD状态机,而只需包含模块并进行正确调用。此处记录了 OAD 应用程序层的详细信息,以确保完整性并有助于调试。
OAD软件架构
OAD 软件架构的构建块详述如下。在下图中,为了使图像紧凑,以下术语已被缩写。
- CB:回调
- SVC:BLE 服务
- 功能:功能
在内部,OAD服务负责以下内容:
- 实施OAD配置文件
- 从BLE5-Stack插入GATT读写回调
- 从消息序列化和反序列化结构
- 向BLE5-Stack发送OAD相关请求和响应以通过空中发送
- 从堆栈回调中排队消息以供应用程序稍后处理
- 实现OAD状态机,并确保正确的状态转换
- 实现OAD不活动计时器
- 为应用程序实现getter/setter函数以使用和配置OAD服务
在OAD服务之外,应用程序任务负责以下内容。更多信息,请参阅将 BLE OAD 添加到现有项目。
- 插入OAD事件处理程序
- 发布事件时在任务上下文中调用OAD事件处理函数。
OAD_DL_COMPLETE
接收到事件时重置设备。
下面包含一个消息序列图,以显示应用程序与 OAD 服务交互的示例。
OAD状态机
OAD 服务实现了一个“OAD 状态机”来执行OAD,状态和状态转换封装在OAD服务中。以下状态机描述了OAD服务状态转换及其与片上和片外OAD的OAD通信配置文件消息的交互。
镜像验证
镜像块传输
完成 OAD 流程
10、BLE-Stack OAD配置文件
11、设置BLE OAD环境
可查看CC2652 on-chip OAD程序升级记录全过程
12、执行BLE OAD
本节将详细介绍使用 BTool 通过 BLE 执行 OAD 所需的步骤。
13、创建生产镜像
生产映像是在工厂准备好刷写的镜像,并将在启用OAD的商业产品中发布。
14、恢复到出厂镜像
每个启用 OAD 的应用程序都启用了一种机制来恢复到出厂镜像。本节将详细介绍如何使当前应用程序映像无效以恢复为出厂镜像。
15、将BLE OAD添加到现有项目
细节步骤查看 SimpleLink Academy Enhanced OAD Module for SimpleLink CC26x2/CC13x2 SDK.