《S32G3系列芯片——Boot详解》系列——S32G3系列芯片如何从外置flash进行Boot启动?
- 一、概述
- 二、基于QuadSPI的boot
- 2.1 基于QuadSPI的boot方式概述
- 2.2 IO配置
- 2.3 时钟配置
- 2.4 QuadSPI具体配置参数
- 2.5 系统重置后BootROM对闪存的要求
- 2.6 应用程序对闪存配置的影响
- 三、基于μSDHC接口的boot
- 3.1 启动配置概述
- 3.2 μSDHC时钟配置
- 3.3 μSDHC支持的数据传输速率
- 3.4 μSDHC启动流程
- 四、其他机制
- 4.1 Fail-Safe(故障安全机制)
- 4.2 Boot Target(启动目标)
- 4.3 Boot Target Watchdog(启动目标看门狗)
- 4.4 Standby Boot(待机启动)
学习更多Boot相关内容,获取HSE基于IVT安全启动方案?
>>>>>>>>> 返回专栏总目录 《S32G3系列芯片——Boot详解》<<<<<<<<<
Tip📌:
鼠标悬停双虚线关键词/句,可获得更详细的描述;
建议按照专栏文章目录顺序依次阅读以便了解相关背景知识。
一、概述
BootROM支持从外置flash通过诸如QuadSPI接口或者基于μSDHC接口的SD/MMC/eMMC等设备接口执行Boot流程。具体从哪种外设flash启动由寄存器Boot_CFG1的bit位 [7:5] 的配置决定,如下表所示:
二、基于QuadSPI的boot
2.1 基于QuadSPI的boot方式概述
QuadSPI是一种高速串行外设接口(四线串行外设接口),可以实现微控制器与闪存的高速通讯。在启动过程中,首先,BootROM利用QuadSPI接口从外部闪存启动。这个过程分为两个阶段:
初始配置阶段: 在这个阶段,QuadSPI控制器被配置为低速模式(30MHz),以便识别连接的闪存类型。对于Quad闪存和Octal闪存,它使用1位单数据速率(SDR)模式;对于HyperFlash,则使用8位模式。
Tip📌:
QuadSPI控制器支持双数据速率(DDR)和单数据速率(SDR)两种高速操作模式。DDR模式在每个时钟周期内能够在上升沿和下降沿两次采样数据,而SDR只在每个时钟周期的一个边沿上采样,这样DDR能够提供更高的数据传输速率。
最终配置阶段: 在读取了闪存的重配置数据之后,根据这些数据重新配置QuadSPI控制器,实现更优的性能。
此外,QuadSPI控制器支持通过AHB(高级微控制器总线架构)接口或IP(外设接口)接口来读取数据。AHB接口是一种高性能的总线接口,用于高速数据传输。BootROM,则只支持通过AHB接口读取数据,而不支持通过IP接口。
当然,BootROM在启动过程中不支持对QuadSPI闪存进行任何写操作。这意味着在启动时,BootROM只能读取闪存中的数据,用于加载和执行系统必需的代码,BootROM无法修改闪存内容。这是一种安全措施,确保启动过程中闪存的内容不会被篡改,保障系统的引导安全和可靠性。
简单来说,BootROM利用QuadSPI接口从外部闪存启动时会先确定闪存类型,将QuadSPI控制器设置为低速模式,然后根据读取到的flash信息重新调整QuadSPI控制器的配置。
BootROM在这个过程中使用了一系列配置参数,这些参数需要使用方提前通过RCON寄存器或者fuses设置。以下是一些关键的配置参数,以及它们如何通过RCON寄存器或fuses设置:
Tip📌:
BootROM载入应用程序镜像的时候会起一个500ms的定时器,用户需要确保提供的镜像大小合适,以便BootROM能够在这个时间内完成下载操作。
在S32G3系列芯片中,BOOT_CFG1寄存器位于地址234h,它的位结构与RCON寄存器(重置控制寄存器)的31:0位有逐位对应关系。具体来说,这意味着BOOT_CFG1寄存器中的每一位都可以直接映射到RCON寄存器中的相应位。
2.2 IO配置
BootROM允许用户通过IO配置覆写来修改默认的IOMUX配置,通过设置BOOT_CFG3[9]
这个配置位来启用覆写。如果这个位被设置,BootROM将根据BOOT_CFG3
中的fuses的值应用新的IOMUX配置。这意味着,用户可以预先设定fuses值,以覆盖BootROM固件中默认的IOMUX设置,从而允许硬件在启动时使用用户指定的IOMUX配置。
Tip📌:
IOMUX是指某些微控制器或处理器芯片上的引脚可以被配置成不同的功能。例如,一个引脚可以用作GPIO(通用输入输出),也可以用作特定功能的接口,如SPI时钟线。
QuadSPI IOMUX引脚的配置如下表所示:
这个特性对于QuadSPI的PORT A和PORT B都是适用的,这提供了进一步的灵活性。例如,如果一个系统设计要求不同于BootROM默认提供的QuadSPI接口配置,开发者可以通过设置相应的fuses值来实现所需的配置。
总之,该特性使得在系统启动时,通过BootROM,能够对QuadSPI IOMUX配置进行定制化的修改,从而适应特定的系统需求或优化性能。通过修改BOOT_CFG3
fuses的值,并确保BOOT_CFG3[9]
被启用,开发者可以在硬件层面上调整和优化系统的启动配置。
2.3 时钟配置
QuadSPI的时钟来源与MC_CGM_0(模块时钟生成模块0)中的CLK_MUX_12(时钟复用选择器12)有关。这个选择器可以从内部参考时钟(IRC)或外设相位锁定环(PERIPH_PLL)的分频器DFS1选择QSPI_CLK时钟源。如下图所示:
具体的过程可以分为初始配置阶段和最终配置阶段:
-
初始配置阶段:
- BootROM在启动时为QuadSPI操作配置时钟。
- BootROM尝试通过PLL(PERIPH_PLL)和它的分频器DFS1来生成一个频率为30 MHz的QSPI_1X_CLK。
- 如果PLL和DFS能够成功锁定在30 MHz,那么时钟源就会切换至PLL。
- 如果PLL-DFS没能成功锁定,QuadSPI的时钟就会来自于FIRC(快速内部参考时钟),导致QSPI_1X_CLK的频率为FIRC的一半。
-
最终配置阶段:
- 在系统启动过程结束时,QuadSPI读操作的时钟需求是根据用户提供的QuadSPI重新配置数据来确定的。
- 如果BootROM无法生成这些数据中指定的所需时钟,它会跳过用户提供的配置。
- 在这种失败的情况下,BootROM会继续使用默认配置进行读操作,并且QuadSPI的时钟将继续来自于FIRC。
这个过程确保了,即使在自定义的时钟配置失败时,BootROM也能够回退到一个默认的、已知稳定的配置,允许系统继续执行读取操作。这是一种健壮的设计选择,可以在启动过程中遇到意外时钟配置问题时提供稳定性和可靠性。
2.4 QuadSPI具体配置参数
QuadSPI配置参数需要放置到外置flash的0x200h位置,具体配置项如下所示:
以上提到在初始配置阶段之后,为了获得更好的性能,可能需要使用默认设置重新配置flash。为了支持这一需求,BootROM提供了一种机制,允许通过一系列特定的命令(CMDs)来操作和配置外部闪存。这些命令及其关联数据被编码成12字节的格式(包括要写入闪存配置寄存器的数据、状态寄存器地址等重要配置信息),这12字节可以划分为三个配置字,其组成结构如下所示:
配置字1(Byte0~Byte3):指令配置
配置字2(Byte7~Byte4):外置flash配置寄存器/状态寄存器的地址
配置字3(Byte11~Byte8):需要发送到flash的具体数据
小端模式存储的4字节数据。
每个命令及其相关数据都通过上述结构进行编码,并且每个命令占用12字节,最终一条条指令构成指令数组。BootROM会解析数组,直到遇到CMD字段值为0的项。CMD字段为0表示命令列表的结束。通过连续的命令序列,按顺序对闪存进行配置,直到所有必要的设置完成。
Tip📌:
操作限制:这种配置方式仅用于写入闪存的配置寄存器,并不适用于在闪存数组中执行操作(比如读取或写入数据)。
此外,所有的闪存配置操作都必须通过上述结构的命令在1-bit SPI模式下执行。这意味着在执行这些配置命令时,通信是通过标准的单线SPI接口进行的,而不是使用可能支持的更高速的多线接口模式。
总之,这一机制允许系统在启动时或在需要时对闪存进行精细的配置,以确保最佳的性能和兼容性。通过提供一种灵活但结构化的方式来传递配置命令,系统能够以一种可靠和一致的方式调整闪存的行为,从而满足特定的应用需求或性能目标。
2.5 系统重置后BootROM对闪存的要求
每次系统重置后,BootROM要求连接的闪存需要处于一种配置模式,使得闪存能够响应SPI读取命令。这意味着在重置发生时,闪存必须已经准备好接受来自BootROM的命令,特别是要能够快速响应读操作。
2.6 应用程序对闪存配置的影响
为了确保系统的正常启动和操作,BootROM需要能够在每次设备重置后通过SPI(串行外设接口)命令读取连接的flash。
-
如果应用程序更改了闪存的配置,使得闪存需要重置才能切换回默认的SPI模式,那么在设备重置时,应用程序必须确保闪存被重置。也就是说,应用程序需要采取措施,确保在重置发生时,闪存能够恢复到可以正常工作的状态。
-
如果应用程序更改了闪存的配置,使得即使在重置后,闪存也不会自动恢复到SPI模式,那么应用程序必须采取以下两种策略之一:
- 确保进入SPI模式:在每次重置之前,应用程序必须确保闪存进入SPI模式。这可能意味着在每次重置前发送特定的命令或配置步骤,以确保闪存能够在重置后迅速响应。
- 使用不需要模式变更的命令:应用程序可以选择使用那些不依赖于SPI模式的命令(CMDs)。这样,即使闪存不在SPI模式下,应用程序仍然能够与其交互。
总之,这些要求确保了无论设备如何重置或闪存如何被配置,BootROM总是能够正常地通过SPI命令与闪存通信,这对于确保设备能够稳定启动和运行是至关重要的。开发者需要在设计他们的应用程序和系统时考虑到这些要求,以确保兼容性和可靠性。
基于以上内容,给出基于QuadSPI的boot流程如下图所示:
三、基于μSDHC接口的boot
3.1 启动配置概述
BootROM能够从SD、MMC、eMMC卡启动,支持不同的数据传输速率模式。这种多样性的支持使得BootROM可以根据实际的硬件配置和需求,从多种存储介质上启动。BOOT_CFG1[7:5]
是控制通过μSDHC接口从SD卡启动的配置位。SDHC控制器的配置是通过eFuse或RCON GPIO引脚提供的。
BootROM允许覆盖一些默认的μSDHC IOMUX配置设置。IOMUX(输入/输出复用)配置决定了物理引脚如何映射到设备的不同功能上。通过所谓的“pad override scheme”,可以基于BOOT_CFG3[9]
的fuse值来应用自定义的IOMUX配置。如下表所示:
综上说明了BootROM如何通过灵活的配置选项支持从SDHC接口启动,以及如何通过eFuse和GPIO引脚提供的信息对SDHC控制器进行初始配置。此外,还介绍了如何通过覆盖默认的IOMUX配置来进一步定制启动过程。
3.2 μSDHC时钟配置
SDHC_CLK是μSDHC接口的工作时钟,它来源于CGM_0(时钟管理单元0)中的时钟多路复用器14。对于SDHC_CLK,有两种可能的时钟源:FIRC(快速内部参考时钟)和PERIPHERAL_PLL_DFS3(外设相位锁定环的直接频率合成器3)。如下图所示:
Tip📌:
FIRC通常是一个固定频率的内部振荡器,提供稳定但可能不是非常精确的时钟信号;而PERIPHERAL_PLL_DFS3是一个通过PLL(相位锁定环)生成的时钟信号,可以提供更高精度和可配置的输出频率。
——BootROM的时钟切换策略
启动时,BootROM首先尝试锁定外设相位锁定环的直接频率合成器(即PERIPHERAL_PLL_DFS3)。如果成功,BootROM将SDHC_CLK从默认的FIRC时钟源切换到PLL时钟源。这意味着系统在启动初期可能会使用FIRC作为时钟源,但一旦PLL稳定并锁定,系统会转而使用由PLL提供的时钟信号,因为这通常会提供更优的性能和稳定性。
综上阐明了μSDHC接口的时钟配置过程,包括时钟源的选择以及BootROM如何优先考虑使用PLL时钟源以提高系统性能和稳定性。
3.3 μSDHC支持的数据传输速率
在从SD卡启动时,仅支持3.3V的高速(High Speed)和默认速度(Default Speed)数据传输模式。BootROM不支持切换到1.8V供电的SDR(单数据速率)模式。SDR模式通常能提供更高的数据传输速率,但因为在启动时不支持1.8V电压,这些模式在系统启动阶段不可用。在卡识别模式下,时钟频率保持在400KHz以下。这是SD卡初始化和识别过程中的标准做法,以确保与各种SD卡的兼容性。
Tip📌:
一旦BootROM完成启动并将控制权交给应用程序,应用程序可以切换到SDR(单数据速率)模式。SDR模式通常可以提供更高的数据传输速率,适合数据读写要求较高的应用。
——BOOT_CFG1寄存器在此处的作用:
-
BOOT_CFG1[19]:这个位控制使用SD卡时的速度模式选择。具体来说,应用程序可以通过配置这个位来选择“默认速度”(Default Speed)或“高速”(High Speed)模式。这两个模式适用于SD卡,影响其数据传输速率。默认速度通常为25MHz,而高速模式可以达到50MHz。
-
BOOT_CFG1[22:19]:这组位控制在通过μSDHC接口使用MMC(多媒体卡)或eMMC(嵌入式多媒体卡)时的速度模式选择。通过设置这些位,应用程序可以选择适合其性能需求的速度模式,进一步提高数据传输效率。
在启动阶段,由于不支持1.8V的电压,系统只能使用3.3V的高速和默认速度模式。然而,在应用程序获得控制权后,可以根据具体需求选择更高效的传输模式(如SDR模式),以满足更高数据速率的要求。这种灵活的配置能力允许开发者根据应用的性能需求进行优化。总结来说,BootROM在启动时提供了一些基本的接口配置,而一旦控制权转移到应用程序,开发者可以利用BOOT_CFG1寄存器进行更细致的配置,从而选择适合其应用的速度模式,提高系统性能。
3.4 μSDHC启动流程
- 启动环节
- 电压校验环节
- 芯片初始化环节
- 数据读取环节
- 使用MMC作为boot设备时的设备初始化环节
- 使用MMC作为boot设备时的电压校验环节
四、其他机制
4.1 Fail-Safe(故障安全机制)
在BootROM执行过程中可能发生各种错误,例如程序错误、闪存故障、PCB故障、硬件模块超时、认证失败等。当出现错误时,BootROM会执行功能重置。如果由于持续的错误条件导致多次重置(≥ 8次),BootROM将无法将控制权传递给应用程序。这时,BootROM进入Serial Boot模式(推荐阅读《S32G3系列芯片Serial Boot功能详解!》),允许通过支持的串行接口下载应用程序代码。这种机制被称为故障安全(Fail-Safe)。
应用程序应在启动时检查重置来源和重置次数,并保存这些信息以供后续参考。若不清除这些重置信息,持续的应用程序故障可能导致BootROM误认为是自身错误,从而进入故障安全模式。
4.2 Boot Target(启动目标)
启动目标是负责执行应用程序代码的核心。你可以选择在Cortex-M7_0或Cortex-A53_0核心上启动应用程序。对于安全应用(使能secure boot),启动目标必须是Cortex-M7_0。启动目标的设置需要在IVT启动配置字(BSW)中提供设置。如果设置无效,将触发功能重置。
4.3 Boot Target Watchdog(启动目标看门狗)
启动目标看门狗(SWT_0)是负责监控运行在启动目标上的应用程序代码的看门狗。可以通过在IVT启动配置字(BSW)中设置字段来启用看门狗。
当BOOT_SEQ = 0时,看门狗在启用启动目标之前由BootROM启用。如果BOOT_SEQ = 1,HSE_H固件将配置看门狗。一旦看门狗启用,客户应用程序必须及时“喂狗”,否则将导致功能重置。
4.4 Standby Boot(待机启动)
从待机模式唤醒时,将触发BootROM执行。根据唤醒源,BootROM可能执行快速启动(Fast Boot)或完全启动(Full Boot)。也就是说,决定执行快速启动还是完全启动的依据是触发从待机状态唤醒的唤醒源。如果唤醒源被配置为执行完全启动,BootROM将执行完全启动操作。反之,如果唤醒源配置为执行快速启动,则BootROM将进行快速启动。
Tip📌:
如果有多个唤醒源在唤醒状态中被触发,并且其中一个唤醒源被配置为进行完全启动,则BootROM将执行完全启动。
——快速启动
启动所用的IVT采用与正常的IVT相同的格式,但位置固定在待机RAM的开头(24000000h)。快速启动仅支持DCD操作和应用程序启动,不支持自测或HSE_H固件。在快速启动时,BootROM只支持BOOT_SEQ = 0,这表示要执行非安全启动。如果BOOT_SEQ = 1,BootROM会发出重置信号。
因此,在进入待机模式之前,应用程序应做好以下准备:
- 在待机RAM的地址(24000000h)写入IVT。
- 根据需要写入DCD。
- 将应用程序代码存储在待机RAM中,以确保其在待机模式期间保持有效。
Tip📌:
1.在快速启动过程中,BootROM不支持从QuadSPI或SD/MMC/eMMC卡获取数据。
2.所有IVT中的指针必须指向待机RAM中的地址。BootROM在快速启动时不会对boot、DCD或应用程序进行任何认证。
——完全启动
当BootROM接收到要求进行完全启动的请求时,它将执行正常的启动操作,就像任何重置后的启动过程一样。
基于以上内容,从Standby模式下被唤醒后的boot流程如下所示:
>>>>>>>>> 返回专栏总目录 《S32G3系列芯片——Boot详解》<<<<<<<<<