Microchip Curiosity PIC32MZEF 的演示启动加载程序 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Microchip Curiosity PIC32MZEF 的演示启动加载程序

此演示启动加载程序实施固件版本检查、加密签名验证和应用程序自我测试。这些功能支持 FreeRTOS 的无线 (OTA) 固件更新。

固件验证包括验证无线接收的新固件的真实性和完整性。在启动之前,启动加载程序验证应用程序的加密签名。该演示在 SHA-256 之上使用了椭圆曲线数字签名算法 (ECDSA)。提供的实用程序可用于生成签名的应用程序,该应用程序可刷写设备。

启动加载程序支持 OTA 需要的以下功能:

  • 在设备上维护应用程序映像,并在这些映像之间切换。

  • 允许对收到的 OTA 映像执行自行测试并在出现故障时回退。

  • 检查 OTA 更新映像的签名和版本。

启动加载程序状态

以下状态机中显示启动加载程序进程。

下表介绍了启动加载程序状态。

启动加载程序状态 描述

初始化

启动加载程序处于初始化状态。

验证

启动加载程序正在验证设备上存在的映像。

执行映像

启动加载程序正在启动所选映像。

执行默认映像

启动加载程序正在启动默认映像。

错误

启动加载程序处于出错状态。

在前面的示意图中,Execute ImageExecute Default 都显示为 Execution 状态。

启动加载程序执行状态

启动加载程序处于 Execution 状态,已准备好启动经过验证的选定映像。如果要启动的映像位于较高的库中,则在执行映像之前交换库,因为应用程序始终针对较低的库生成。

启动加载程序默认执行状态

如果启动默认映像的配置选项已启用,则启动加载程序将从默认执行地址启动应用程序。除了在调试期间,否则应禁用此选项。

启动加载程序出错状态

启动加载程序处于出错状态,设备上没有有效的映像。启动加载程序必须通知用户。默认实施发送日志消息到控制台,并无限期快速闪烁主板上的 LED。

闪存设备

Microchip Curiosity PIC32MZEF 平台包含 2 MB 的内部程序闪存,划分为两个库。它支持这两个库之间的内存交换映射和实时更新。演示启动加载程序在单独的较低引导闪存区域中编程。

应用程序映像结构

该图显示存储在设备的各个库中应用程序映像的主要组件。

组件 大小(字节)

映像标头

8 字节

映像描述符

24 字节

应用程序二进制文件

< 1 MB - (324)

Trailer

292 字节

映像标头

设备上的应用程序映像必须以由幻码和映像标志组成的标头为开头。

标头字段 大小(字节)

幻码

7 字节

映像标志

1 字节

幻码

闪存设备上的映像必须以幻码开头。默认幻码为 @AFRTOS。启动加载程序在启动映像之前检查是否存在有效的幻码。这是验证的第一步。

映像标志

映像标志用于存储应用程序映像的状态。标志在 OTA 过程中使用。两个库的映像标志确定了设备的状态。如果正在执行的映像标记为等待提交,这意味着设备处于 OTA 自我测试阶段。即使设备上的映像标记为有效,在每次启动时也会经过相同的验证步骤。如果某个映像被标记为新的,则启动加载程序会将其标记为等待提交,并在验证之后启动它进行自我测试。启动加载程序还会初始化并启动监视程序计时器,以便在新的 OTA 映像自我测试失败时重启设备,此时启动加载程序擦除无效映像来拒绝该映像,并执行之前有效的映像。

设备只能有一个有效的映像。其他映像可以是新 OTA 映像或等待提交(自我测试)。OTA 更新成功后,将从设备上擦除旧映像。

状态 描述

新映像

0xFF

应用程序映像是新的,从未执行。

等待提交

0xFE

标记应用程序映像供测试执行。

有效

0xFC

应用程序映像标记为有效且已提交。

无效

0xF8

应用程序映像标记为无效。

映像描述符

闪存设备上的应用程序映像必须在映像标头之后包含映像描述符。映像描述符由构建后实用程序生成,该实用程序使用配置文件 (ota-descriptor.config) 生成相应的描述符并添加到应用程序二进制文件前面。此构建后步骤的输出是可用于 OTA 的二进制映像。

描述符字段 大小(字节)

序列号

4 字节

开始地址

4 字节

结束地址

4 字节

执行地址

4 字节

硬件 ID

4 字节

预留

4 字节

序列号

序列号必须在生成新 OTA 映像之前递增。请参阅 ota-descriptor.config 文件。启动加载程序使用此编号来确定要启动的映像。有效值介于 1 到 4294967295 之间。

开始地址

设备上应用程序映像的开始地址。由于映像描述符附加到应用程序二进制文件的前面,此地址是映像描述符的开头。

结束地址

设备上应用程序映像的结束地址,不包括映像的后缀部分。

执行地址

映像的执行地址。

硬件 ID

启动加载程序用于验证为正确的平台生成了 OTA 映像的唯一硬件 ID。

预留

此项保留供将来使用。

映像后缀

映像后缀附加到应用程序二进制文件。其中包含签名类型字符串、签名大小和映像的签名。

后缀字段 大小(字节)

签名类型

32 字节

签名大小

4 字节

签名

256 字节

签名类型

签名类型是一个字符串,表示使用的加密算法,并用作后缀的标记。启动加载程序支持椭圆曲线数字签名算法 (ECDSA)。默认值为 sig-sha256-ecdsa。

签名大小

加密签名的大小,以字节为单位。

签名

随映像描述符一起附加的应用程序二进制文件加密签名。

启动加载程序配置

基本启动加载程序配置选项在 freertos/vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/aws_boot_config.h 中提供。一些选项仅提供用于调试目的。

启用默认启动

从默认地址启用应用程序的执行,并且只能为调试启用。映像从默认地址执行而不经过任何验证。

启用加密签名验证

在启动时启用加密签名验证。失败的映像从设备中擦除。此选项仅提供用于调试用途,并且必须在生产中保持启用。

擦除无效映像

如果库上的映像验证失败,则启用该库的完整擦除。此选项仅提供用于调试,并且必须在生产中保持启用。

启用硬件 ID 验证

对在 OTA 映像描述符中的硬件 ID 以及在启动加载程序内编程的硬件 ID 启用验证。此项可选,如果无需硬件 ID 验证,则可以禁用。

启用地址验证

在 OTA 映像的描述符中启用开始地址、结束地址和执行地址的验证。建议您保持启用此选项。

构建启动加载程序

在 FreeRTOS 源代码存储库的 freertos/vendors/microchip/boards/curiosity_pic32mzef/aws_demos/mplab/ 中,演示启动加载程序作为可加载的对象包括在 aws_demos 项目中。生成 aws_demos 项目时,它先生成启动加载程序,然后生成应用程序。最终输出是一个统一的十六进制映像,包括启动加载程序和应用程序。提供 factory_image_generator.py 实用程序用于生成具有加密签名的统一十六进制映像。启动加载程序实用程序脚本位于 freertos/demos/ota/bootloader/utility/ 中。

启动加载程序构建前步骤

此构建前步骤执行名为 codesigner_cert_utility.py 的实用程序脚本,该脚本从代码签名证书中提取公有密钥,并生成包含采用抽象语法表示法 1 (ASN.1) 编码格式公有密钥的 C 标头文件。此标头编译到启动加载程序项目中。生成的标头包含两个常量:公有密钥以及密钥长度的数组。也可以不带 aws_demos 生成启动加载程序项目,并作为普通应用程序进行调试。