打印
[通用 MCU]

英飞凌TC3xx 启动逻辑梳理(1)

[复制链接]
640|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-5-22 15:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在调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里面的一些关键事项,接下来我们来看应用启动代码中的逻辑
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/djkeyzx/article/details/138605628

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1510

主题

14449

帖子

9

粉丝