目录
1.启动时序总览
2.Boot Firmware干了什么?
2.1 BMHD梳理
2.2 HWCFG
2.3 ABM
2.4 BMHD 无效时处理方案
2.5 HSM启动如何影响SSW启动
3.小结
在调TC3xx的板子时,最害怕的就是刷UCB;稍不注意板子就上锁,调试器也连不上了,这里面的逻辑是什么?
在设计SafetyLib时,对于芯片启动阶段的功能安全逻辑应该是怎样的?
在设计SecurityLib时,对于芯片启动阶段的信息安全应该如何考量?
今天就这几个方向来梳理一下TC3xx的启动流程。
1.启动时序总览
常见MCU的启动时序通常可以分为三大步,如下图:
- 当外部电源上电后,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 Software:简称SSW,主要用于加载用户配置数据、启动模式选择、错误状态处理等等;
- Checker Software:简称CHSW,用于检查SSW中的配置是否正确
2.1 BMHD梳理
SSW有很多步骤,这里就不一一列举了,基本流程如下:
其中,最值得我们关注的是在启动模式的选择、Error Pin的处理。
前者涉及到我们芯片能不能正常起来(锁板子的痛),后者涉及到系统级功能安全的设计。
启动模式选择与我们在UCB中关于BMHD的配置息息相关,TC3xx共计8个BMHD,其中4个原始BMHD,4个COPY BMHD防止数据损坏,如下图:
因此,为了MCU能正常启动,我们至少得配置一个有效的BMHD,具体配置项如下:
其中,BMI_BMHDID包含了启动模式、功能等配置信息,以及这个Header的固定ID:0xB359(还挺幽默,转出来显示"Y"):
SSW软件在进入模式选择流程后,首先会判断Origin BMHD是否有效, 这其中包括ID、STAD、BMI、CRC、CRCN的判定,如果都通过了,则会判定PINDIS和Boot Mode Lock,用于确定是否使用硬件Pin来选择启动模式。
2.2 HWCFG
假设使用硬件HWCFG用于启动模式选择,这时候Hardware Configuration Pins派上了用场(PMS章节 Figure92),如下图:
SSW会检查pin是否使能(HWCFG[3] == 0 ),如使能则根据SCU_STSTAT中锁存的HWCFG[4:5]两个PIN脚的电平进行模式选择;
不过这种方式有个风险,容易被暴力刷新,比较少用。
如果不使用硬件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。
这种固定的启动方式在今天看来有些笨拙,所以提出了ABM模式供用户任意配置启动地址。
从TC27x的BMHD也可以窥探到一些信息,其结构如下:
可以发现TC27x中BMHD仅有STADABM,没有TC3xx的STAD配置项,且这个BMHD是存在PFlash 0xA0000000-0xA000001F这个位置,所以它的ABM启动方式为:
而到TC3xx系列,它把BMI.STAD做成了两种方式:
- 从内部Flash启动,STAD就直接指向用户代码;
- 从ABM模式启动,STAD指向ABM Header存放的地址;
因此这二者启动方式总结如下:
但仔细看,这二者都在从内部Flash启动,在应用层面的用法有什么不一样吗?
我们从BMHD、ABMHD的存放位置和结构属性进行分析。
TC3xx的BMHD存放在UCB中(DFlash),而众所周知UCB的刷新很容易导致板子上锁;ABMHD存放在PFlash中,这就好办了,随便刷。示意如下:
那我们是否可以BMHD配置为ABM,然后在ABM里配置启动地址,这样刷UCB的次数少了,相应锁板子的几率就小了?
2.4 BMHD 无效时处理方案
当所有BMHD无效时,SSW给出了解决方案,流程图如下:
可以看到,当HSM Boot没有使能且Boot Mode没有上锁时, 即使没有BMHD,SSW仍会从PFlash0或者CPU0_PSPR进行启动;
那为什么会锁板子呢?锁板子意味着调试器都连不上,当没有找到任何有效BMHD时,HSM Boot如果开启了,或者BootMode上锁了(DMU_HF_PROCONTP.BML),则找不到有效的BOOT_CFGH,在3.1.1.6.4章节,详细描述了这种情况,如下图:
这就有点疑惑了,什么叫做该设备的默认配置失效?同时参考流程图,如果Debug访问是使能的,则解锁调试接口,很多人就是卡在这一步,主要是CBS_OSTATE\CBS_OEC这类似的寄存器也是需要NDA的,不太了解其原理。
2.5 HSM启动如何影响SSW启动
当SSW启动完成后,按理说应该跳转至用户代码开始运行,但在TC3xx中还有一个特别的配置,即SSWWAIT,用于决定SSW是否等待HSM响应后才运行用户代码,如下:
因为我们可以推断出其运行逻辑如下:
而我们常见顺序、并行、混合启动逻辑,就在这HSM SecureBoot Code中进行处理。
3.小结
限于篇幅,本章讲述了SSW里面的一些关键事项,接下来我们来看应用启动代码中的逻辑