英飞凌TC3xx 启动逻辑梳理


目录

1.启动时序总览

2.Boot Firmware干了什么?

2.1 BMHD梳理
2.2 HWCFG
2.3 ABM
2.4 BMHD 无效时处理方案
2.5 HSM启动如何影响SSW启动

3. 应用启动代码逻辑

3.1 启动阶段1
3.2 启动阶段2
3.3 启动阶段3
3.4 启动阶段4
3.5 启动阶段5
3.6 启动阶段6

4.小结

 


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

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

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

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


1.启动时序总览

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

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

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

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

2.2 HWCFG

假设使用硬件HWCFG用于启动模式选择,这时候Hardware Configuration Pins派上了用场(PMS章节 Figure92),如下图:
英飞凌TC3xx 启动逻辑梳理
SSW会检查pin是否使能(HWCFG[3] == 0 ),如使能则根据SCU_STSTAT中锁存的HWCFG[4:5]两个PIN脚的电平进行模式选择;
英飞凌TC3xx 启动逻辑梳理
不过这种方式有个风险,容易被暴力刷新,比较少用。
如果不使用硬件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 启动逻辑梳理
这种固定的启动方式在今天看来有些笨拙,所以提出了ABM模式供用户任意配置启动地址。
从TC27x的BMHD也可以窥探到一些信息,其结构如下:
英飞凌TC3xx 启动逻辑梳理
可以发现TC27x中BMHD仅有STADABM,没有TC3xx的STAD配置项,且这个BMHD是存在PFlash 0xA0000000-0xA000001F这个位置,所以它的ABM启动方式为:
英飞凌TC3xx 启动逻辑梳理
而到TC3xx系列,它把BMI.STAD做成了两种方式:
* 从内部Flash启动,STAD就直接指向用户代码;
* 从ABM模式启动,STAD指向ABM Header存放的地址;
 因此这二者启动方式总结如下:
英飞凌TC3xx 启动逻辑梳理
但仔细看,这二者都在从内部Flash启动,在应用层面的用法有什么不一样吗?
我们从BMHD、ABMHD的存放位置和结构属性进行分析。
TC3xx的BMHD存放在UCB中(DFlash),而众所周知UCB的刷新很容易导致板子上锁;ABMHD存放在PFlash中,这就好办了,随便刷。示意如下:
英飞凌TC3xx 启动逻辑梳理
那我们是否可以BMHD配置为ABM,然后在ABM里配置启动地址,这样刷UCB的次数少了,相应锁板子的几率就小了?

2.4 BMHD 无效时处理方案

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

可以看到,当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 启动逻辑梳理

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

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

2.5 HSM启动如何影响SSW启动

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

3. 应用启动代码逻辑

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

3.1 启动阶段1

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


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

3.3 启动阶段3

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

3.4 启动阶段4

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


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

3.5 启动阶段5

该阶段主要是处理alarm,这时候SMU派上用场了,因为之前如果MBIST、LBIST、MONBIST触发了alarm,SMU需要进入到RUN状态才能开始进行处理;同时我们还要在运行app前配置好所有需要的alarm的行为,这样功能安全逻辑才能闭环。在英飞凌示例代码中,这是一个空函数。
英飞凌TC3xx 启动逻辑梳理

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 启动逻辑梳理

往期回顾:

1.汽车标定精选

汽车标定技术–标定概念详解
汽车标定技术–Bypass的前世今生
万字长文:汽车标定技术–XCP概述

2.AUTOSAR精选

AUTOSAR CryptoStack–CSM Job夹带了哪些私货
AUTOSAR 诊断栈分析(一)
AUTOSAR OS概述(一)

3.汽车网络安全精选

汽车信息安全–MCU启动常用密码算法
汽车网络安全方案需求分析
汽车信息安全–常见车规MCU安全启动方案
车载信息安全场景概述

4.汽车功能安全精选


5.汽车虚拟化精选

    汽车ECU虚拟化技术初探(一)

    汽车ECU虚拟化技术(二)–U2A虚拟化功能

6.杂七杂八

    Flash模拟EEPROM原理浅析

    征途漫漫:汽车MCU的国产替代往事

    车规MCU应用场景及国产替代进展


原文始发于微信公众号(汽车MCU软件设计):英飞凌TC3xx 启动逻辑梳理

版权声明:admin 发表于 2024年5月10日 下午7:01。
转载请注明:英飞凌TC3xx 启动逻辑梳理 | CTF导航

相关文章