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 动态下载) |

浙公网安备 33010602011771号