单片机/MCU论坛
直播中

吴凡

11年用户 1013经验值
擅长:48674
私信 关注
[问答]

TC387 HOST触发软件复位导致HSM挂了,怎么解决?

TC387在FBL中触发了软件复位导致HSM挂了,请提供排查方向

回帖(1)

张鹏

2025-8-13 17:51:41

针对TC387在FBL(Flash BootLoader)中触发软件复位导致HSM(Hardware Security Module)挂起的问题,以下是详细的排查方向和解决建议:




1. 确认复位类型与范围



  • 问题核心:软件复位可能误复位了HSM的硬件资源。

  • 排查步骤

    • 检查FBL中触发软件复位的代码(如寄存器 SCU_SYSRSTCON.B.SW),确认是否 错误复位了整个系统(包括HSM域)。

    • 查阅TC387手册 “Reset System”章节,确认HSM是否属于独立电源域/复位域(如 HSM_PWRCTRL 相关寄存器)。

    • 优化建议

      • 若需仅复位主核(Host),使用 局部复位(如通过 SCU_RSTCON 复位特定CPU核)。

      • 在触发复位前,禁用全局复位对HSM的影响:
        // 示例:仅复位主核,避免复位HSM域
        SCU_SYSRSTCON.B.SW = 1;      // 触发软件复位
        SCU_SYSRSTCON.B.SRST = 0;    // 禁用系统全局复位(具体位域需参考手册)






2. HSM初始化流程修复



  • 问题现象:复位后HSM未正确重初始化。

  • 排查步骤

    • 检查FBL复位后的代码是否 重新初始化了HSM(包括时钟、接口、固件加载)。

    • 验证HSM固件(hsm_firmware.bin)是否在复位后重新加载。


  • 解决建议

    • 在FBL复位处理函数中 显式调用HSM初始化函数
      void SystemReset_Handler(void) {
         // ... 其他初始化
         HSM_Init(); // 重新初始化HSM时钟、寄存器、固件
         while (!HSM_IsReady()); // 等待HSM就绪
      }

    • 确保HSM固件存储在 非易失存储区(如Flash),避免复位导致固件丢失。





3. 复位同步与延迟处理



  • 问题原因:复位后HSM启动慢于主核,导致访问超时。

  • 排查步骤

    • 测量HSM启动时间(参考手册时序),检查FBL复位后是否立即访问HSM。


  • 解决建议

    • 添加延迟或状态轮询:
      void HSM_WaitReady(void) {
         while (HSM_STATUS_REG.B.RDY == 0); // 轮询HSM状态寄存器
      }

    • 在复位后首次访问HSM前调用 HSM_WaitReady()





4. HSM操作中断保护



  • 问题诱因:复位发生在HSM操作中(如签名验证)。

  • 排查步骤

    • 在FBL触发复位前,添加调试日志检查HSM状态(如 HSM_CMD_STATUS 寄存器)。


  • 解决建议

    • 复位前终止HSM操作并清空队列:
      if (HSM_BUSY) {
         HSM_SendAbortCommand(); // 发送终止命令
         while (HSM_BUSY);        // 等待HSM空闲
      }

    • 复位前复位HSM控制器(若支持):
      HSM_CR.B.SWRESET = 1; // 复位HSM本地控制器





5. 寄存器配置冲突检查



  • 潜在问题:关键寄存器复位后配置错误。

  • 排查步骤

    • 对比正常启动与复位后的寄存器状态(如 HSM_CLCHSM_CON)。

    • 检查HSM时钟源(如 fHSM)是否在复位后保持使能。


  • 解决建议

    • 在HSM初始化中 显式配置时钟
      CLC_DISR.B.DISR = 0;          // 确保HSM时钟使能
      HSM_CON.B.CLK_SEL = 0x1;      // 选择正确的时钟源





6. HSM固件与安全性设置



  • 特殊场景:HSM固件依赖安全上下文。

  • 排查步骤

    • 确认复位是否导致HSM 密钥丢失安全会话中断

    • 检查TC387的HSM 启动模式(如调试模式/安全模式)。


  • 解决建议

    • 避免在HSM安全操作(如密钥交换)后立即复位。

    • 在FBL中重新加载HSM所需的密钥素材。





7. 工具链与调试手段



  • 快速定位工具

    • 使用 Lauterbach Trace32Infineon DAP MiniWiggler 捕获复位时的寄存器快照。

    • 在复位异常处理中添加 HSM错误日志
      void HSM_ErrorHandler(void) {
         uint32 err_code = HSM_ERR_REG;
         Log_Error("HSM Error: 0x%08X", err_code); // 记录到Flash/UART
      }





8. 复位替代方案



  • 如问题持续,评估替代复位策略:

    • 关闭HSM后复位:在FBL中显式关闭HSM再触发复位。
      HSM_CR.B.PWDN = 1;    // 关闭HSM
      delay_ms(10);
      Trigger_Software_Reset();

    • 硬件复位替代:若允许,使用硬件复位(如看门狗)代替软件复位。





总结流程


graph TD
  A[触发软件复位] --> B{复位范围是否包含HSM?}
  B -->|是| C[修改复位配置:局部复位主核]
  B -->|否| D[检查HSM初始化]
  D --> E[复位后是否重初始化HSM?]
  E -->|否| F[在复位处理中显式初始化HSM]
  E -->|是| G[检查HSM状态/延迟]
  G --> H[复位前终止HSM操作]
  H --> I[验证寄存器/时钟配置]
  I --> J[记录HSM错误日志]
  J --> K[问题解决?]
  K -->|否| L[联系Infineon支持]

通过以上步骤,重点聚焦在 复位范围隔离HSM重初始化操作中断保护,可解决90%以上的同类问题。若仍无法解决,提供HSM错误代码与寄存器快照给Infineon技术支持进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分