S32系列芯片Boot流程详解!


  博主已开通同名公众号,通过文末或主页二维码关注博主,将为你推送最新、最细、最硬核的车载系统知识和嵌入式开发知识!

学习更多Boot相关内容,获取HSE基于IVT安全启动方案?
>>>>>>>>> 返回专栏总目录 《S32系列芯片——Boot详解》<<<<<<<<<

Tip📌:
  鼠标悬停双虚线关键词/句,可获得更详细的描述;
  阅读本文前建议先阅读以下文章了解相关背景知识:
《Boot过程相关镜像详解:IVT、DCD、App Boot镜像到底是什么?》
《S32系列芯片Boot过程涉及的寄存器有哪些?》

一、预先了解

  在学习Boot流程之前,先简单了解两种不同类型的系统重置方式——“破坏性重置”和“功能性重置”

破坏性重置(Destructive Reset):
  破坏性重置是一种彻底的重置方式,它会导致芯片内大部分寄存器和逻辑单元恢复到它们的初始复位状态。这种重置通常会丢失未保存的数据,因为它会清除大多数内存和寄存器的内容。破坏性重置被用于芯片的初始上电阶段,或者当系统需要从严重错误或不稳定状态中恢复时。例如,遇到无法通过其他手段恢复的硬件错误或系统挂起时,可能会执行破坏性重置。

功能性重置(Functional Reset):
  功能性重置则是一种较为温和的重置方式,它主要影响特定功能相关的寄存器和逻辑单元,而不会影响整个系统状态。这种重置的目的是刷新特定部分的系统配置或状态,而不是完全重启系统。功能性重置可以在不完全破坏系统运行状态的情况下解决一些运行时问题,例如,当特定外设或功能模块不正常工作时,可以对该部分进行功能性重置,以期恢复其正常工作。

  下面是手册中给出的具体描述:

在这里插入图片描述

  下面是从手册中找到的两种复位方式触发后芯片状态的区别,可以看到主要区别在于RAM的内容是否还会保存

在这里插入图片描述

二、Boot流程概述

  在NXP S32芯片中,BootROM是负责在设备加电后首先运行的一段程序。它的主要任务是启动硬件环境并加载必要的固件或者应用代码以便设备能够正常运行。简单来说BootROM的启动流程是这样的:

  1. 首先,BootROM会检查一些自测项和其他的检查项,来决定启动流程是分三个阶段完成还是一次性完成。这主要看设备的自测配置数据(Self-Test DCD)是怎样设置的。

  2. 接下来,BootROM会根据一个叫做BOOT_SEQ的值,决定是要启动应用程序代码还是HSE_H固件。启动哪个部分,还得看启动向量表(IVT)中的镜像指针是否有效。

  3. 此外,BootROM还支持所谓的备份镜像机制,不仅仅是对应用程序代码和HSE_H固件,也包括自测配置数据(Self-Test DCD)和配置数据(DCD)。基本上,如果主镜像指针有效,BootROM就会先尝试执行主镜像。只有当指针指向0地址(这被认为是无效的位置),或者主镜像头格式不正确,或者认证失败的情况下,BootROM才会尝试执行备份镜像。

  4. 如果HSE_H固件在更新时失败了,BootROM允许从备份镜像回滚到之前的版本。失败的情况可能是这样的:更新后的HSE_H主固件镜像通过了所有的头检测和BootROM的认证过程,但在它获得控制权并开始执行,能够启动应用程序代码和提供服务之前,它可能因为各种原因崩溃了。
    Tip📌:如果尝试启动主HSE_H固件镜像失败了8次,它会尝试从备份镜像启动。如果连备份镜像也失败了8次,BootROM就会进入所谓的串行启动模式。

  5. BootROM使用一个特殊的寄存器(POR_CTRL_REG1)来记录尝试启动主固件和备份固件的次数。HSE_H固件在能够启动应用程序代码和提供服务的执行点需要写入一个标记(BADAh)。BootROM会查找这个标记来确认是否从HSE_H固件的主镜像或备份镜像成功启动了。同时,BootROM还使用另外一个寄存器(GPR28)来记录在这次启动周期中,自测DCD、DCD和应用程序使用的是主镜像还是备份镜像。这些寄存器的详细描述可以参考手册或者上一篇文章:《S32系列芯片Boot过程涉及的寄存器有哪些?》

  BootROM的这个流程确保了在硬件启动时安全和可靠地加载系统所需的程序。通过这样的机制,即使在更新固件或处于其他特殊情况时遇到问题,系统也有机会从错误中恢复,提高了整个设备的稳定性和可靠性。

三、Boot流程的三个阶段

  关于上面提到的“BootROM会检查一些自测项和其他的检查项,来决定启动流程是分三个阶段完成还是一次性完成”,下面做出进一步的解释。

  从外部Flash执行Boot流程时,BootROM的执行分为三个阶段。如下图所示:

在这里插入图片描述

  在经历了Self-Test阶段STCU2引起的重置并完成自我测试后,BootROM会再次在HSE_H核心上执行,并继续启动流程进入Initialize2。但如果Self-Test DCD没有在IVT中标明,那么BootROM会跳过第一和第二阶段,直接从Initialize2开始。直观一些的图示如下:

在这里插入图片描述

3.1 初始化第一阶段(Initialize 1)

在这里插入图片描述

  • 在这个阶段,BootROM首先在HSE_H核心上开始执行。如果之前是从Standby模式退出,会进入从Standby模式启动过程。
  • BootROM会检测是否存在任何严重的错误,如HSE_H或SYS fuse box的双位ECC错误,并在发现时引发一个破坏性重置。然后,BootROM会识别启动接口是什么,并配置PLL@FIRC,使时钟频率提高至400MHz。
  • BootROM会根据保险丝信息配置QuadSPI/SD/MMC/eMMC等接口,并从这些设备中复制IVT镜像。
  • 如果IVT通过认证(只有在安全启动模式下会做IVT镜像的认证),BootROM就会检查IVT,如果存在某些特定条件,比如头部无效,启动目标错误,或者应用程序代码和HSE_H固件的主备指针都为空,这时会发出一个功能性重置。功能性重置超过8次将进入Serial Boot模式

3.2 自测阶段(Self-Test)

  • 这个阶段涉及到内存测试(MBIST)和/或逻辑测试(LBIST),这些测试由STCU2进行(如果配置过的话)。
  • 自测只在电源开机复位(POR)后执行(还有另一个前提:自测完成标志未设置为1)。
  • 如果自测数据的主备指针都为空,表示没有配置自测,因此不会执行。
  • 自测开始后,由STCU2引发的Self-Test DCD会触发STCU2进行测试,并在测试完成后执行重置。

3.3 初始化第二阶段(Initialize 2)

在这里插入图片描述

  • 在经历了STCU2引起的重置并完成自测后,BootROM会再次在HSE_H核心上执行,并继续Boot流程。(如果自测DCD的入口指针没有在IVT中标明,那么BootROM会跳过第一和第二阶段,直接从这个阶段开始。)
  • 这个阶段的目的是在自测完成后初始化设备,并继续执行启动过程。
  • 如果自测已经成功执行,BootROM会记录是执行了主镜像还是备份镜像,并将这些信息存储在特定的寄存器中(SRC_GPR_TOP_REG_28)以便应用程序代码以后检索。

  实际上,重置后的这个阶段会再走一遍前两个阶段的大部分内容,不妨再简单赘述一下,比如:

======================== Initialize 1

  • 初始化堆栈指针。
  • 如果是从Standby模式退出的,则进入Standby模式启动流程。
  • BootROM会检测是否存在任何严重的错误,如HSE_H或SYS fuse box的双位ECC错误,并在发现时引发一个破坏性重置。
  • 确定引导接口,并配置PLL@FIRC,使时钟频率提高至400 MHz。
  • 如果功能性复位次数达到或超过8次,进入串行引导模式(Serial Boot mode)。
  • 根据保险丝信息配置QuadSPI/SD/MMC/eMMC等接口,并从这些设备中复制IVT镜像 。
  • 如果满足以下条件,则对IVT进行身份验证:(LC状态为 OEM_PROD 或 IN_FIELD) 并且 (IVT_AUTH值为1) 并且 (EXPORT CONTROL NOT ENABLED)。
  • 检查IVT,不通过检查则发出功能性复位。

======================== Self-Test

  • 如果DCD指针非NULL,则复制并验证DCD数据(取决于上一步)。如果发生任何失败——例如验证失败、头无效或DCD错误则不执行主指针下的剩余DCD,而是开始对备份指针下的DCD数据进行DCD操作。
  • 如果指向DCD备份指针的DCD数据验证失败,则发出复位。
  • 如果发生其他失败——例如头无效或DCD错误——则跳过后续的DCD执行,并允许BootROM继续后续的应用程序引导步骤。
  • 如果DCD成功执行,BootROM将识别执行的是主镜像还是备份镜像,并将信息存储在SRC_GPR_TOP_REG_28中,应用程序代码可以读取该寄存器以确定DCD执行阶段的结果。

  Initialize 2阶段除了以上过程,还增加了以下流程:

  • 设置调试挑战码/响应:随着LC状态的推进,芯片会禁用JTAG调试功能,此时需要发送密钥才能使能JTAG调试功能,调试设备向被禁用JTAG功能的设备发送密钥既可以使用明文发送的方式,也可以使用动态验证的方式。动态验证的场景下需要调试设备从BootROM 获取挑战码,配合远端管理的密钥执行加密操作后给到被锁定的芯片。
  • 解析IVT并定位主HSE_H固件。(通过以下两步是决定使用哪个区的HSE固件—主区还是备份区,涉及到的寄存器的详细描述可以参考手册或者上一篇文章:《S32系列芯片Boot过程涉及的寄存器有哪些?》)。下面的逻辑稍微有些绕,实际上,你也可以不关注这个逻辑,因为他是BootROM里面固化好的逻辑,如不想深入了解,你只需要知道BootROM有能力判断使用主区镜像还是备份区镜像。

==============BootROM固化逻辑判断使用主区镜像还是备份区镜像 START==============

  • 如果SRC模块的POR_CTRL_REG1[7:0]中的HSE_ROLLBACK_COUNT_A值≤8:
    a. 如果SRC模块的POR_CTRL_REG1[31:16]中的HSE_ROLLBACK_MARKER值等于BADAh:
      i. 将SRC模块的POR_CTRL_REG1[7:0]中的HSE_ROLLBACK_COUNT_A清零。
      ii. 将SRC模块的POR_CTRL_REG1[7:0]中的HSE_ROLLBACK_MARKER清零。
    b. 如果主HSE_H固件头有效:
      i. 解密HSE_H固件,验证并复制到目标内存。
      ii. 如果验证成功:将HSE_H固件下载状态设为真(true)。
      iii. 否则,跳转到下个环节。
    c. 否则,跳转到下个环节。
  • 如果SRC模块的POR_CTRL_REG1[15:8]中的HSE_ROLLBACK_COUNT_B值≤8:
    a. 如果SRC模块的POR_CTRL_REG1[31:16]中的HSE_ROLLBACK_MARKER值等于BADAh:
      i. 将SRC模块的POR_CTRL_REG1[15:8]中的HSE_ROLLBACK_COUNT_B清零。
      ii. 将SRC模块的POR_CTRL_REG1[31:16]中的HSE_ROLLBACK_MARKER清零。
    b. 如果HSE_H固件备份镜像头有效:
      i. 解密HSE_H固件,验证并复制到目标内存。
      ii. 如果验证成功:将HSE_H固件下载状态设为真(true)。
      iii. 否则跳转到下个环节。

==============BootROM固化逻辑判断使用主区镜像还是备份区镜像 END==============

  • 如果IVT引导配置字[BOOT_SEQ] == 0,说明没有使能安全启动,则解析IVT并定位主应用程序启动代码结构。
    a. 如果主应用程序头有效,下载应用程序到目标内存。
    b. 如果主应用程序头无效,验证备份应用程序头是否有效,如果有效,则下载备份应用程序到目标内存。
    c. 如果主应用程序头和备份应用程序头都无效,跳过下载应用程序。
    d. 如果应用程序已成功下载并执行,BootROM将识别复制的是主应用程序还是备份应用程序,并将信息存储在SRC_GPR_TOP_REG_28中,应用程序代码可以读取该寄存器以确定哪个应用程序已启动。

  • 如果应用程序没有成功下载,并且HSE_H固件也没有成功下载,则发出功能性复位。

  • 如果HSE_H固件下载状态为真:
    a. 根据选择的HSE镜像,在SRC模块的POR_CTRL_REG1[7:0]中将HSE_ROLLBACK_COUNT_A值增加1或在POR_CTRL_REG1[15:8]中增加HSE_ROLLBACK_COUNT_B。
    b. 启用HSE固件。
    c. 如果BOOT_SEQ值为0(即未使能安全启动)并且在上面的步骤中成功下载了应用程序,则启用应用程序核心。
    d. 进入等待中断(wfi)状态。

  • 否则:
    a. 如果BOOT_SEQ值为0(即未使能安全启动)并且在上面的步骤中成功下载了应用程序:
      i. 启用应用程序核心。
      ii. 进入等待中断(wfi)状态。
    b. 否则,发出功能性复位。

Tip📌:
  当BOOT_SEQ == 0时,BootROM会按照第二阶段引导流程描述将应用程序代码下载到SRAM。尽管BootROM期望所有程序镜像的长度都是8字节对齐的,但对于应用程序的下载,它会在复制的镜像的最后一个位置之后初始化额外的8字节内存,这是为了当应用程序执行时避免预取错误。

  Boot的整体流程如下图所示:

在这里插入图片描述

Tip1📌:
  可以看到绿色虚线框内的步骤是Initialize 2阶段,它是在自检完成后触发复位之后执行的,相当于又跑了一遍Initialize 1和自检这前两个步骤。当然,前面提到过执行自检有一个前提:自测完成标志未设置为1。因此实际上Initialize 2是不会再次执行自检的。

Tip2📌:
  当BootROM执行完毕并将控制权转移到应用程序时,可能会改变某些模块寄存器的复位值。这意味着在应用程序开始执行时,某些寄存器的初始值可能与预期不同。这部分需要参考“Boot Settings”附件,以获得受影响的模块、寄存器以及它们的具体值列表,可以去NXP官网-设计中心-文档中下载。

Tip3📌:
  如果应用程序需要在执行开始时修改时钟配置或更改接口设置,应该首先禁用相关接口。这是为了避免在配置更改过程中可能出现的错误或不稳定状态。

  这些阶段确保了从外部闪存启动时,设备能够安全地执行必要的自我测试,并加载正确的启动代码,即使在遇到错误或问题时也能够有效地恢复。通过这种多阶段的流程,提高了系统启动的稳定性和可靠性。

四、Boot期间如何管理时钟源和时钟配置?(BootROM时钟配置)

  • 默认时钟源:BootROM开始执行时,默认的系统时钟源是FIRC(快速内部时钟)。

  • 性能提升尝试:为了更好的性能,BootROM尝试使用CORE PLL-DFS(锁相环-数字频率合成器)覆盖FIRC。如果CORE PLL-DFS成功锁定,BootROM将引导核心的XBAR时钟(引导核心的时钟源)切换到CORE_DFS1_CLOCK,目标频率约为400 MHz。如果无法锁定PLL-DFS,BootROM将继续使用FIRC作为系统时钟进行引导。

  • 系统时钟切换:当BOOT_SEQ等于0时(即未使能安全启动),在BootROM将控制权传递给应用程序代码之前,系统时钟会切回到FIRC,并且CORE PLL-DFS会被关闭。

  • 安全引导和时钟配置:当BOOT_SEQ等于1时(即使能安全启动),BootROM会将控制权以CORE PLL-DFS作为系统时钟传递给HSE_H固件。后面就属于安全启动的过程了,HSE FW参考手册中有关于安全引导后时钟配置的更多细节。

五、Boot过程中镜像的认证

  BootROM可以从非易失性存储空间(如QuadSPI或SD/MMC/eMMC)加载多个镜像,以启动不同的核心,包括:

  • HSE_H核心(又称安全核,用于HSE_H固件)
  • Cortex-M7/Cortex-A53核心(用于应用启动代码)

  应用程序的启动可以是非安全的或安全的,这取决于LC状态和IVT的BCW中的BOOT_SEQ字段值。在执行安全启动时,BootROM将对以下镜像进行认证:IVT(提供了启动镜像的重要信息和入口点)、DCD(包含了硬件初始化所需的配置数据)、Self-Test DCD(用于系统自检,确保硬件的正确配置和功能)、应用程序镜像、HSE_H固件镜像(是高安全环境的固件,专门用于处理安全相关的任务)

  这一过程确保了系统启动过程的安全性,防止了未授权的代码执行。通过验证这些镜像的真实性,BootROM可以确保只有经过验证和信任的代码才能在系统上执行。这对于防止恶意软件攻击和确保系统安全至关重要。

  综上便是Boot过程的大致流程了,也许有不少名词不清楚其具体含义,比如什么是LC?LC状态推进顺序又是什么?什么是BCW?什么是BOOT_SEQ?… … 这些内容都会在其他文章中详细解释。

  由于boot过程牵扯到的内容相对广泛,比如qspi配置、时钟配置相关内容、复位相关的内容等等,且博主能力有限,所以不好在一篇文章中通透的解释清楚,仅以此文大致梳理boot流程,在对S32G系列芯片各个模块有更多的了解之后再回过头来阅读,也许会有更深刻的印象和收获。

>>>>>>>>> 返回专栏总目录 《S32系列芯片——Boot详解》<<<<<<<<<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车载系统攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值