英飞凌TC3xx 启动逻辑梳理

汽车安全 6个月前 admin
133 0 0


目录

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导航

相关文章