• 276查看
  • 0回复

[芯片硬件] 英飞凌TC3xx 启动逻辑梳理

[复制链接]


该用户从未签到

发表于 13-5-2024 19:18:44 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


目录

1.启动时序总览

2.Boot Firmware干了什么?
2.1 BMHD梳理2.2 HWCFG2.3 ABM2.4 BMHD 无效时处理方案2.5 HSM启动如何影响SSW启动
3. 应用启动代码逻辑
3.1 启动阶段13.2 启动阶段23.3 启动阶段33.4 启动阶段43.5 启动阶段53.6 启动阶段6
4.小结

在调TC3xx的板子时,最害怕的就是刷UCB;稍不注意板子就上锁,调试器也连不上了,这里面的逻辑是什么?

在设计SafetyLib时,对于芯片启动阶段的功能安全逻辑应该是怎样的?

在设计SecurityLib时,对于芯片启动阶段的信息安全应该如何考量?

今天就这几个方向来梳理一下TC3xx的启动流程。


1.启动时序总览

常见MCU的启动时序通常可以分为三大步,如下图:

英飞凌TC3xx 启动逻辑梳理w1.jpg


    当外部电源上电后,MCU进入到复位状态,此时不会跑任何代码;这个阶段主要是芯片供电选择、时钟开启、各个IP复位释放;

    硬件完成上述工作后,将PC指向BootRom中代码(下文称Firmware)的首地址,此时软件开始参与工作,包括用户配置参数的判断和加载、特定寄存器状态判断、复位源设置、启动模式评估等等;需要注意的是Firmware是芯片在流片时固化好,后续用户无法修改,因此这部分代码逻辑我们会在芯片的UserMannul看到,例如英飞凌TC3xx UserMannul Platform Firmware;

    Firmware执行完成后,通常会跳转至用户的启动代码(正常流程),这就是我们软件开发常见的start.s;这部分用户进行定制化开发,进一步初始化软硬件;最后跳转至不同Core 的应用代码。
这么简单描述起来,感觉是不是很简单。但是当我们把Boot Firmware中启动模式评估、功能安全以及信息安全结合到一起时,总会有在本文开头提到的那些疑惑。那么接下来我们来过一遍Boot Firmware流程,再补充Safety和Security的一些思考。

2.Boot Firmware干了什么?

在TC3xx的Boot Firmware由CPU0执行,包含了两大功能:


    Startup Firmware:简称SSW,主要用于加载用户配置数据、启动模式选择、错误状态处理等等;

    Checker Software:简称CHSW,用于检查SSW中的配置是否正确
2.1 BMHD梳理

SSW有很多步骤,这里就不一一列举了,基本流程如下:
英飞凌TC3xx 启动逻辑梳理w2.jpg
其中,最值得我们关注的是在启动模式的选择,涉及到我们芯片能不能正常起来(锁板子的痛)启动模式选择与我们在UCB中关于BMHD的配置息息相关,TC3xx共计8个BMHD,其中4个原始BMHD,4个COPY BMHD防止数据损坏,如下图:
英飞凌TC3xx 启动逻辑梳理w3.jpg
因此,为了MCU能正常启动,我们至少得配置一个有效的BMHD,具体配置项如下:
英飞凌TC3xx 启动逻辑梳理w4.jpg
其中,BMI_BMHDID包含了启动模式、功能等配置信息,以及这个Header的固定ID:0xB359(还挺幽默,转出来显示"Y"):
英飞凌TC3xx 启动逻辑梳理w5.jpg
SSW软件在进入模式选择流程后,首先会判断Origin BMHD是否有效, 这其中包括ID、STAD、BMI、CRC、CRCN的判定,如果都通过了,则会判定PINDIS和Boot Mode Lock,用于确定是否使用硬件Pin来选择启动模式。2.2 HWCFG

假设使用硬件HWCFG用于启动模式选择,这时候Hardware Configuration Pins派上了用场(PMS章节 Figure92),如下图:
英飞凌TC3xx 启动逻辑梳理w6.jpg
SSW会检查pin是否使能(HWCFG[3] == 0 ),如使能则根据SCU_STSTAT中锁存的HWCFG[4:5]两个PIN脚的电平进行模式选择;
英飞凌TC3xx 启动逻辑梳理w7.jpg
不过这种方式有个风险,容易被暴力刷新,比较少用。如果不使用硬件PIN选择启动模式,那么就根据我们在UCB_BMHD配置的启动模式进行配置(BMHD.BMI,HWCFG[3:1])。注意,这里非常容易和硬件HWCFG[5:4]搞混淆,其实只要明确一个是通过硬件PIN,一个是通过UCB里的配置(软件)即可。2.3 ABM

英飞凌TC3xx提供了四种启动模式,从内部Flash启动、ABM(Alternate Boot Mode)启动、CAN Bootstrap和ASC Bootstrap;在这之前我去回顾了TC27x的启动流程,并与TC3xx进行对比,从中发现了一些端倪。TC27x也分从内部Flash启动和ABM启动,但是如果选择从内部Flash启动,启动地址固定为0xA0000020。
英飞凌TC3xx 启动逻辑梳理w8.jpg
这种固定的启动方式在今天看来有些笨拙,所以提出了ABM模式供用户任意配置启动地址。从TC27x的BMHD也可以窥探到一些信息,其结构如下:
英飞凌TC3xx 启动逻辑梳理w9.jpg
可以发现TC27x中BMHD仅有STADABM,没有TC3xx的STAD配置项,且这个BMHD是存在PFlash 0xA0000000-0xA000001F这个位置,所以它的ABM启动方式为:
英飞凌TC3xx 启动逻辑梳理w10.jpg
而到TC3xx系列,它把BMI.STAD做成了两种方式:
* 从内部Flash启动,STAD就直接指向用户代码;* 从ABM模式启动,STAD指向ABM Header存放的地址;
因此这二者启动方式总结如下:
英飞凌TC3xx 启动逻辑梳理w11.jpg
但仔细看,这二者都在从内部Flash启动,在应用层面的用法有什么不一样吗?我们从BMHD、ABMHD的存放位置和结构属性进行分析。TC3xx的BMHD存放在UCB中(DFlash),而众所周知UCB的刷新很容易导致板子上锁;ABMHD存放在PFlash中,这就好办了,随便刷。示意如下:
英飞凌TC3xx 启动逻辑梳理w12.jpg
那我们是否可以BMHD配置为ABM,然后在ABM里配置启动地址,这样刷UCB的次数少了,相应锁板子的几率就小了?2.4 BMHD 无效时处理方案

当所有BMHD无效时,SSW给出了解决方案,流程图如下:
英飞凌TC3xx 启动逻辑梳理w13.jpg

可以看到,当HSM Boot没有使能且Boot Mode没有上锁时, 即使没有BMHD,SSW仍会从PFlash0或者CPU0_PSPR进行启动;那为什么会锁板子呢?锁板子意味着调试器都连不上,当没有找到任何有效BMHD时,HSM Boot如果开启了,或者BootMode上锁了(DMU_HF_PROCONTP.BML),则找不到有效的BOOT_CFGH,在3.1.1.6.4章节,详细描述了这种情况,如下图:
英飞凌TC3xx 启动逻辑梳理w14.jpg

英飞凌TC3xx 启动逻辑梳理w15.jpg
同时参考流程图,如果Debug访问是使能的,则解锁调试接口,很多人就是卡在这一步,主要是CBS_OSTATE\CBS_OEC这类似的寄存器也是需要NDA的,不太了解其原理。

总结下来,锁板子有可能是UCB刷错导致BMHD失效,同时开启了HSM或者配置了BootMode Lock;最重要的还是调试接口权限的关闭,大家可以沿着这个思路去逝逝能不能救活板子。
2.5 HSM启动如何影响SSW启动

当SSW启动完成后,按理说应该跳转至用户代码开始运行,但在TC3xx中还有一个特别的配置,即SSWWAIT,用于决定SSW是否等待HSM响应后才运行用户代码,如下:
英飞凌TC3xx 启动逻辑梳理w16.jpg
因为我们可以推断出其运行逻辑如下:
英飞凌TC3xx 启动逻辑梳理w17.jpg
而我们常见顺序、并行、混合启动逻辑,就在这HSM SecureBoot Code中进行处理。

3. 应用启动代码逻辑

SSW完成后,进入到用户的应用启动代码,英飞凌称之为Startup Software,这部分代码可以让用户修改和更新,所以我们就从iLLD中的启动代码 Ifx_Ssw_Tc0.c 开始入手。应用启动代码共分为6个阶段,整体逻辑如下:
英飞凌TC3xx 启动逻辑梳理w18.jpg
可以看到,根据复位类型的不一样,启动代码逻辑也存在差异,冷复位需要走全流程,应用复位则只需要1->3->5->6步骤。3.1 启动阶段1

该阶段,主要是判断启动类型,并跳转至目标启动阶段。时序图如下:
英飞凌TC3xx 启动逻辑梳理w19.jpg
需要关注的寄存器包括:SCU_RSTSTAT
英飞凌TC3xx 启动逻辑梳理w20.jpg
RSTCON:
英飞凌TC3xx 启动逻辑梳理w21.jpg
CPU0_KRST:
英飞凌TC3xx 启动逻辑梳理w22.jpg
代码逻辑如下:    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结果。流程如下:
英飞凌TC3xx 启动逻辑梳理w23.jpg

如果LBIST没有错误,继续使能MONBIST,完成测试后进入到启动阶段3;3.3 启动阶段3

该阶段最简单,即初始化上下文,包括用户堆栈指针设置、CSA区域初始化等等;3.4 启动阶段4

这个阶段开始进行时钟的配置、MBIST。时钟配置重点关注CCU,根据需求配置不同模块的时钟。
英飞凌TC3xx 启动逻辑梳理w24.jpg

紧接着来MBIST,之前讲过MTU的用法,我们在这里也会采用NDT方式进行测试,因此只有当所有RAM初始化完成后进行MBIST才有意义。完成测试后进入到阶段5。3.5 启动阶段5

该阶段主要是处理alarm,这时候SMU派上用场了,因为之前如果MBIST、LBIST、MONBIST触发了alarm,SMU需要进入到RUN状态才能开始进行处理;同时我们还要在运行app前配置好所有需要的alarm的行为,这样功能安全逻辑才能闭环。在英飞凌示例代码中,这是一个空函数。
英飞凌TC3xx 启动逻辑梳理w25.jpg
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 启动的流程图,我们可以复刻出一个具备参考意义的应用启动代码。
英飞凌TC3xx 启动逻辑梳理w26.jpg

-end-

分享不易,恳请点个【👍】和【在看】

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 10:56 , Processed in 0.205625 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.