ZHCAEV6 December   2024 F29H850TU , F29H859TU-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1编程基础知识
  5. 2引言
    1. 2.1 硬件安全模块
    2. 2.2 ROM 引导加载程序
    3. 2.3 带有 X.509 证书的合并映像
  6. 3闪存内核实现
    1. 3.1 CPU1 固件升级 (HS-FS)
    2. 3.2 密钥预置(HS-FS 至 HS-KP)
    3. 3.3 CPU1 安全固件升级(HS-KP/SE 至 HS-SE)
    4. 3.4 HSM 固件升级(HS-KP/SE 至 HS-SE)
    5. 3.5 SECCFG 代码预置(HS-KP/SE 至 HS-SE)
  7. 4主机应用程序:UART 闪存编程器
    1. 4.1 概述
    2. 4.2 使用 Visual Studio 构建 UART 闪存编程器
    3. 4.3 使用 CMake 构建 UART 闪存编程器
    4. 4.4 数据包格式
    5. 4.5 内核命令
  8. 5示例用法
    1. 5.1 将闪存内核加载到器件中
      1. 5.1.1 硬件设置
      2. 5.1.2 运行 UART 闪存编程器
    2. 5.2 CPU1 器件固件升级(仅限 HS-FS)
    3. 5.3 将 HS-FS 转换为 HS-SE
    4. 5.4 加载基于 RAM 的 HSMRt 映像
    5. 5.5 密钥预置(HS-FS 至 HS-KP)
    6. 5.6 代码预置(HS-KP/SE 至 HS-SE)
  9. 6故障排除
    1. 6.1 一般信息
    2. 6.2 UART 引导
    3. 6.3 应用程序加载
  10. 7总结
  11. 8参考资料

闪存内核实现

与基于 C28 的设计相比,F29H85x 的 UART 闪存内核由于集成了 HSM 而有很大不同。下面简要说明了本示例中实现的功能。

  • CPU1 DFU(仅限 HS-FS)
    1. 器件需要配置为存储体模式 0。
    2. CPU1 中的闪存内核将应用程序编程到闪存存储体。
    3. 在 0x10000000 - 0x10000FFF 中对证书编程,证书不用于身份验证,而是用于推断内核二进制文件的大小。
    4. 可在其余闪存地址中对应用程序进行编程,TI 建议将 codestart 设置为 0x10001000。因为 0x10001000 是闪存引导模式中的闪存入口地址。
警告: 对于不关心 HSM 提供的安全功能的用户,只需使用 CPU1 DFU 流来升级 CPU1 固件。
  • 加载 HSMRt(密钥预置和代码预置的先决条件)
    1. CPU1 中的闪存内核接收密钥预置 HSM 运行时 (HSMRt) 并将其放置在 LDAx RAM 中。
    2. HSM 验证 HSMRt 映像的身份并开始在 LDAx RAM 中执行运行时。
  • CPU1 密钥预置 (HS-FS -> HS-KP)
    1. CPU1 中的闪存内核加载 HSMRt
    2. 闪存内核接收密钥证书并放置在 LDAx RAM 中
    3. HSM 验证密钥证书并将其编程到 OTP 中
  • CPU1 代码预置(仅限 HS-SE)
    1. CPU1 中的闪存内核加载到 HSMRt
    2. 闪存内核接收 CPU1 应用程序映像证书并与 HSMRt 共享证书
    3. 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将数据块导入到 LDAx 存储器中。
    4. 每次接收到 16KB(LDAx 存储器的大小)数据后,闪存内核都会发送 HSM 请求来对数据进行编程,以供进一步处理
    5. 接收到所有数据块并进行编程后,请求 HSMRt 验证在 HSM 活动和休眠存储体中进行编程的代码。当 HSMRt 固件根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
    6. 成功完成身份验证后,HSM 会将固件编程到 CPU1 闪存
  • HSM 代码预置 (HS-KP/HS-SE -> HS-SE)
    1. CPU1 中的闪存内核加载到 HSMRt
    2. 闪存内核接收 HSM 应用程序映像证书并与 HSMRt 共享证书
    3. 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将数据块导入到 LDAx 存储器中。
    4. 每次接收到 16KB(LDAx 存储器的大小)数据后,闪存内核都会发送 HSM 请求来对数据进行编程,以供进一步处理
    5. 接收到所有数据块并进行编程后,请求 HSMRt 验证在 HSM 活动和休眠存储体中进行编程的代码。当 HSMRt 固件根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
  • SECCFG 代码预置 (HS-KP -> HS-SE)
    1. CPU1 中的闪存内核加载到 HSMRt
    2. 闪存内核接收映像证书并与 HSMR 共享证书
    3. 成功对映像进行身份验证后,HSMRt 通过确认消息进行响应,之后闪存内核开始通过 UART 将 SecCfg 数据导入 LDAx 存储器
    4. 在接收所有 SecCfg 数据并对其进行编程后,请求 HSMRt 验证在休眠存储体中编程的 SecCfg,确保计数器值有效。当 HSMRt 根据证书对编程的映像进行身份验证时,还会对证书进行进一步编程,以便确保在后续的下电上电期间能够成功引导。
    5. 注意,对于 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。