与基于 C28 的设计相比,F29H85x 的 UART 闪存内核由于集成了 HSM 而有很大不同。下面简要说明了本示例中实现的功能。
- CPU1 DFU(仅限 HS-FS)
- 器件需要配置为存储体模式 0。
- CPU1 中的闪存内核将应用程序编程到闪存存储体。
- 在 0x10000000 - 0x10000FFF 中对证书编程,证书不用于身份验证,而是用于推断内核二进制文件的大小。
- 可在其余闪存地址中对应用程序进行编程,TI 建议将 codestart 设置为 0x10001000。因为 0x10001000 是闪存引导模式中的闪存入口地址。
警告: 对于不关心 HSM 提供的安全功能的用户,只需使用 CPU1 DFU 流来升级 CPU1 固件。
- 加载 HSMRt(密钥预置和代码预置的先决条件)
- CPU1 中的闪存内核接收密钥预置 HSM 运行时 (HSMRt) 并将其放置在 LDAx RAM 中。
- HSM 验证 HSMRt 映像的身份并开始在 LDAx RAM 中执行运行时。
- CPU1 密钥预置 (HS-FS -> HS-KP)
- CPU1 中的闪存内核加载 HSMRt
- 闪存内核接收密钥证书并放置在 LDAx RAM 中
- HSM 验证密钥证书并将其编程到 OTP 中
- CPU1 代码预置(仅限 HS-SE)
- CPU1 中的闪存内核加载到 HSMRt
- 闪存内核接收 CPU1 应用程序映像证书并与 HSMRt 共享证书
- 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将数据块导入到 LDAx 存储器中。
- 每次接收到 16KB(LDAx 存储器的大小)数据后,闪存内核都会发送 HSM 请求来对数据进行编程,以供进一步处理
- 接收到所有数据块并进行编程后,请求 HSMRt 验证在 HSM 活动和休眠存储体中进行编程的代码。当 HSMRt 固件根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
- 成功完成身份验证后,HSM 会将固件编程到 CPU1 闪存
- HSM 代码预置 (HS-KP/HS-SE -> HS-SE)
- CPU1 中的闪存内核加载到 HSMRt
- 闪存内核接收 HSM 应用程序映像证书并与 HSMRt 共享证书
- 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将数据块导入到 LDAx 存储器中。
- 每次接收到 16KB(LDAx 存储器的大小)数据后,闪存内核都会发送 HSM 请求来对数据进行编程,以供进一步处理
- 接收到所有数据块并进行编程后,请求 HSMRt 验证在 HSM 活动和休眠存储体中进行编程的代码。当 HSMRt 固件根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
- SECCFG 代码预置 (HS-KP -> HS-SE)
- CPU1 中的闪存内核加载到 HSMRt
- 闪存内核接收映像证书并与 HSMR 共享证书
- 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将 SecCfg 数据导入 LDAx 存储器
- 在接收所有 SecCfg 数据并对其进行编程后,请求 HSMRt 验证在休眠存储体中编程的 SecCfg,确保计数器值有效。当 HSMRt 根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
- 注意,对于 HS-SE 器件,根据 SSU 寄存器的交换值作出证书的编程决策。
警告:
密钥预置和代码预置都需要在 HSM 上运行基于 RAM 的 HSMRt 映像。但是,该映像在预置的每个阶段都需要不同的密钥证书。
在密钥预置中,用户必须为 HSMRt 映像提供默认 TI 密钥证书,以便在 HS-FS 器件上完成身份验证,而代码预置则需要包含用户密钥证书的映像,以便在 HS-KP/HS-SE 器件上完成身份验证。
硬件安全模块部分介绍的 OTP Keywriter 固件包含可执行这些任务的二进制映像。
在存储体模式 0 中,UART 闪存内核专为 CPU1 而设计。这意味着所有闪存存储体都分配给 CPU1,并且存储体交换功能不可用。有关存储体模式的更多详细信息,请参阅 TRM 的存储体模式和交换 部分。闪存内核与 F29H85x MCU SDK 中提供的主机 PC 应用程序 (MCU_SDK_F28H85x > utilities > flash_programmers > serial_flash_programmer) 进行通信,并就接收数据包和给定命令的完成情况向主机提供反馈。
将内核加载到 RAM 并通过 UART ROM 引导加载程序执行后,内核首先初始化 PLL、GPIO、UARTA 模块和闪存模块。UART 通信的波特率配置为 115200,与 UART 引导流程类似。在此之后,内核开始一个 while 循环,等待来自主机的命令,执行命令,并将状态包发送回主机。当发送 Run(运行)或 Reset(重置)命令时,此 while 循环中断。
命令在表 4-2 中描述的数据包中发送,每个数据包要么被确认,要么不被确认。除 Run(运行)和 Reset(重置)外,所有命令都在完成后发送带有操作状态的数据包。状态数据包会发送 16 位状态代码和 32 位地址。如果出现错误,数据中的地址会指定第一个错误的地址。发生 NO_COMMAND_ERROR 时,地址为 0x1000。