目录
1.启动时序总览
2.Boot Firmware干了什么?
3. 应用启动代码逻辑
4.小结
在调TC3xx的板子时,最害怕的就是刷UCB;稍不注意板子就上锁,调试器也连不上了,这里面的逻辑是什么?
在设计SafetyLib时,对于芯片启动阶段的功能安全逻辑应该是怎样的?
在设计SecurityLib时,对于芯片启动阶段的信息安全应该如何考量?
今天就这几个方向来梳理一下TC3xx的启动流程。
1.启动时序总览
常见MCU的启动时序通常可以分为三大步,如下图:
当外部电源上电后,MCU进入到复位状态,此时不会跑任何代码;这个阶段主要是芯片供电选择、时钟开启、各个IP复位释放;
硬件完成上述工作后,将PC指向BootRom中代码(下文称Firmware)的首地址,此时软件开始参与工作,包括用户配置参数的判断和加载、特定寄存器状态判断、复位源设置、启动模式评估等等;需要注意的是Firmware是芯片在流片时固化好,后续用户无法修改,因此这部分代码逻辑我们会在芯片的UserMannul看到,例如英飞凌TC3xx UserMannul Platform Firmware;
Firmware执行完成后,通常会跳转至用户的启动代码(正常流程),这就是我们软件开发常见的start.s;这部分用户进行定制化开发,进一步初始化软硬件;最后跳转至不同Core 的应用代码。
2.Boot Firmware干了什么?
Startup Firmware:简称SSW,主要用于加载用户配置数据、启动模式选择、错误状态处理等等;
Checker Software:简称CHSW,用于检查SSW中的配置是否正确
2.1 BMHD梳理
2.2 HWCFG
2.3 ABM
* 从内部Flash启动,STAD就直接指向用户代码; * 从ABM模式启动,STAD指向ABM Header存放的地址;
2.4 BMHD 无效时处理方案
同时参考流程图,如果Debug访问是使能的,则解锁调试接口,很多人就是卡在这一步,主要是CBS_OSTATECBS_OEC这类似的寄存器也是需要NDA的,不太了解其原理。
总结下来,锁板子有可能是UCB刷错导致BMHD失效,同时开启了HSM或者配置了BootMode Lock;最重要的还是调试接口权限的关闭,大家可以沿着这个思路去逝逝能不能救活板子。
2.5 HSM启动如何影响SSW启动
3. 应用启动代码逻辑
3.1 启动阶段1
if (Ifx_Ssw_isApplicationReset() != 1)
{
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase2);
}
else
{
Ifx_Ssw_jumpToFunction(__StartUpSoftware_Phase3ApplicationResetPath);
}
3.2 启动阶段2
该阶段主要做电源、EVRC的配置,同时检查LBIST结果,值得一提的是,如果在SSW里没有做LBIST,那么就可以选择触发LBIST,这时候就需要进行一个热复位,然后再次跳到该阶段检查LBIST结果。流程如下:
如果LBIST没有错误,继续使能MONBIST,完成测试后进入到启动阶段3; 3.3 启动阶段3
该阶段最简单,即初始化上下文,包括用户堆栈指针设置、CSA区域初始化等等; 3.4 启动阶段4
这个阶段开始进行时钟的配置、MBIST。 时钟配置重点关注CCU,根据需求配置不同模块的时钟。
紧接着来MBIST,之前讲过MTU的用法,我们在这里也会采用NDT方式进行测试,因此只有当所有RAM初始化完成后进行MBIST才有意义。 完成测试后进入到阶段5。 3.5 启动阶段5
该阶段主要是处理alarm,这时候SMU派上用场了,因为之前如果MBIST、LBIST、MONBIST触发了alarm,SMU需要进入到RUN状态才能开始进行处理;同时我们还要在运行app前配置好所有需要的alarm的行为,这样功能安全逻辑才能闭环。在英飞凌示例代码中,这是一个空函数。 3.6 启动阶段6
最后在进入CPU0的main函数前,我们需要开启多核(如有需要) ,示例如下:
#if (IFX_CFG_SSW_ENABLE_TRICORE1 != 0)
Ifx_Ssw_startCore(&MODULE_CPU1, (unsigned int)__START(1));
/*The status returned by function call is ignored */
#endif /* #if (IFX_CFG_CPU_CSTART_ENABLE_TRICORE1 != 0)*/
#if (IFX_CFG_SSW_ENABLE_TRICORE1 == 0)
#if (IFX_CFG_SSW_ENABLE_TRICORE2 != 0)
Ifx_Ssw_startCore(&MODULE_CPU2, (unsigned int)__START(2));
/*The status returned by function call is ignored */
4.小结
上文我们从硬件复位开始,简述了SSW里的关键逻辑,把BMHD、ABMHD、锁板子的现象,同时分析了英飞凌示例的启动代码,整个一套下来,大家应该对英飞凌TC3xx的启动有初步的概念了。 从这个流程我们可以发现,在SSW里涉及到了安全启动,我们需要结合SSW里的描述以及HSM内部启动流程做综合设计,这里面不仅要考虑启动的安全性,还要考虑启动的时效。 在SSW和应用StartUp里涉及到了功能安全,而所有的检查和确认主要集中在应用StartUp,因此我们需要了解不同功能安全机制的前置条件以及触发条件,从而才能设计好符合功能安全的启动流程。借用Hitex关于AURIX 启动的流程图,我们可以复刻出一个具备参考意义的应用启动代码。
往期回顾:
1.汽车标定精选
2.AUTOSAR精选
3.汽车网络安全精选
4.汽车功能安全精选
5.汽车虚拟化精选
6.杂七杂八
原文始发于微信公众号(汽车MCU软件设计):英飞凌TC3xx 启动逻辑梳理