TC397中Bootloader集成HSM及全链路OTA调试总结

1.系统架构
在基于英飞凌AURIX TC397芯片的Bootloader(FBL)开发中,引入了ETAS cryptoHsm硬件安全模块,实现了基于双核异构的安全启动与安全刷写(Secure Boot / Secure Flashing)。
图片

2.TC397关键硬件特性约束
①TC397 PFlash最小擦除单位为16 KB(0x4000)。任何发往底层擦除指令的起始地址,必须严格按0x4000整数倍对齐,否则硬件直接产生时序/地址错误。
②CPU0本地私有DSPR(0x70000000)受芯片硬件防火墙(ACCEN/访问控制)保护,HSM内核无法直接DMA访问CPU0的私有栈。Host与HSM的数据交互必须放置在全局共享RAM(0x50000000)(即.hsm_shared内存段)。
③HSM配置了UCB扇区独占保护(UCB_HSM_COTP0/PROCONHSMCX),独占了Sector 4~13(0x80010000 ~ 0x80037FFF),因此宿主APP的起始地址必须顺延放置在保护区之后的Sector 14(0x80044000)。

3.调试问题处理
Ⅰ.0x31 EraseMemory擦除APP阶段整机超时挂死
现象描述:
上位机下发31 01 FF 00 80 04 40 00 ...请求擦除APP,上位机卡在30 秒超时等待,ECU无任何回复。TRACE32查看Flash地址0x80044000,数据完全没有被擦除。
处理逻辑1:怀疑擦除的区域太大导致的超时
检查擦除的区域,不停的缩小擦除区域最后甚至固定为最小单元依旧发现超时,暂排除区域大小的影响。
处理逻辑2:怀疑代码逻辑导致的超时
①优化内存分配后的boot flash的地址为0x80000000~0x8000BFFF,FL_Erasing()中存在指纹数据的写操作,并且指纹区的起始地址定义为了0x8000B000。明显存在重合。
②0x8000B000非16KB对齐地址,硬件拒绝擦除返回NOK
③指纹操作失败导致后续的APP擦除跳过

Ⅱ.0x34 RequestDownload报GeneralReject(0x10)拒绝
现象描述:
APP擦除成功后,上位机发送34 00 44 80 04 40 00 00 19 1B A9,ECU回复否定响应7F 34 10(GeneralReject)
①FL_DownloadRequestValid()校验APP起始地址0x80044000和长度0x191BA9完全合法,返回FL_OK
②由于TC397架构采用的是在0x31 01 02 02 CheckMemory阶段做整块SHA-256签名校验,未启用边下边算的流式HSM驱动,导致ImageM_InitHashSHA256Block()返回了E_NOT_OK,错误地将原本校验成功的requestRet覆盖成了错误码,误发了0x10

requestRet = ImageM_InitHashSHA256Block(); // 调用 HSM 流式 Hash 初始化
if (requestRet != E_OK) {
    Dcm_SendNcr(DCM_E_GENERAL_REJECT);     // 返回 0x10
}

处理逻辑:下面的代码替换requestRet = ImageM_InitHashSHA256Block();
requestRet = FL_DownloadRequestValid(dcmDspProgram.address, programSize, dcmDspProgram.compressed);

Ⅲ.HSM双核通信与内存总线防火墙
现象描述:
在执行31 01 02 02(Check Memory 签名验签)时,Host端计算出的Hash需要与上位机Signature比对。若直接将CPU0的局部变量指针0x7000xxxx传给HSM进行写回,会触发TC397硬件总线错误
原因分析:
HSM运行于独立的ARM Cortex-M3内核,通过SRI Crossbar访问内存且CPU0的DSPR本地内存具有私有访问控制属性,HSM无权写入CPU0私有栈地址。
处理逻辑:双重保护

void Hsm_Hash_SHA256(uint8 *pdata, int len, uint8* res)
{
    Std_ReturnType hsm_open_ret = E_NOT_OK;
    Std_ReturnType hsm_init_ret = E_NOT_OK;
    Std_ReturnType hsm_finish_ret = E_NOT_OK;
    Std_ReturnType hsm_close_ret = E_NOT_OK;

    /* 1. 优先尝试调用 HSM 硬件安全引擎 */
    hsm_open_ret = CryptoHSM_OpenHashBlockSession();
    if (E_OK == hsm_open_ret)
    {
        hsm_init_ret = CryptoHSM_InitHashSHA256Block(pdata, (uint32)len);
        if (E_OK == hsm_init_ret)
        {
            hsm_finish_ret = CryptoHSM_HashSHA256BlockFinish(res);
        }
        hsm_close_ret = CryptoHSM_CloseHashBlockSession();
    }

    /* 2. 双重保障:若因内存防火墙拦截或 HSM 繁忙导致未完成,内核快速算法自动接管 */
    if (E_OK != hsm_finish_ret)
    {
        (void)mbedtls_sha256((const unsigned char*)pdata, (size_t)len, res, 0);
    }
}

Ⅳ.0x31 CAL标定数据擦除报RequestOutOfRange (0x31)
现象描述:
APP成功烧录且签名校验通过后,上位机进入CAL标定区下载,下发31 01 FF 00 80 70 00 00 00 00 3A 5F,ECU 回复7F 31 31(RequestOutOfRange)
原因分析:
①上位机使用的标定固件DEFAULT_CAL.hex的实际物理起始地址是0x80700000;
②TC3XX链接脚本时标定符号_calibration_start依旧为0x80800000;
③当上位机请求擦除0x80700000时,Bootloader匹配不到任何合法的Block起始地址,判定超出范围。

优化处理:
①linkscript_AD10_internalFlash_gcc.lcf将calibration纠正回0x80700000

application(rx!p):        org = 0x80044000, len = 0x006BBFE0
application_header(rx!p): org = 0x806FFFE0, len = 0x00000020
calibration(rx!p):        org = 0x80700000, len = 0x000FFFE0
calibration_header(rx!p): org = 0x807FFFE0, len = 0x00000020

②块描述表同步:修改FlashLoader_Cfg.c设置APP块最大长度为0x6BC000(即0x80700000 - 0x80044000)
③HSM校验表同步:修改HSM_Integration.h,设置FBL_PORT_CALIBRATION_START_ADDRESS为0x80700000UL

最后地址属性总结:

物理地址范围 区域名称 物理扇区属性 归属模块 / 用途
0x80000000 ~ 0x800004FF BMHD / Startup Sector 0 芯片硬件启动头(BMHD0~3)
0x80000500 ~ 0x8000AF00 internal_flash Sector 0~2 Bootloader 主固件代码
0x8000B000 ~ 0x8000CFFF fingerprint_flash Sector 2 内部指纹数据区(只读/追加,禁止自擦除)
0x8000D000 ~ 0x8000EFE0 vendorPI_flash Sector 3 Vendor 产线配置信息
0x80010000 ~ 0x80037FFF HSM 独占保护区 Sector 4~13 UCB HSM 硬件物理独占区(宿主禁止访问)
0x80044000 ~ 0x806FFFE0 application Sector 17 起 宿主应用软件(APP 分区,最大 6.7MB)
0x806FFFE0 ~ 0x806FFFFF application_header Sector 对齐 APP 头部校验信息(32 字节)
0x80700000 ~ 0x807FFFE0 calibration 标定物理扇区 宿主标定数据(CAL 分区,1MB)
0x807FFFE0 ~ 0x807FFFFF calibration_header Sector 对齐 CAL 头部校验信息(32 字节)
0x50000000 ~ 0x50018000 internal_variables 全局共享 RAM .hsm_shared(Host 与 HSM 通信共享内存池)
0x70016100 ~ 0x7001A100 flash_ram CPU0 DSPR Flash Driver 运行内存(S19 动态下载)
posted @ 2026-09-08 10:03  日暮_途远  阅读(20)  评论(0)    收藏  举报