目录
前言
Chapter 7: System Boot and Configuration 系统引导和配置
7.1 Boot Process Overview 引导过程概述
7.2 Boot Flow 启动流
7.2.1 Non-Secure Boot Flow 非安全引导流程
7.2.2 安全引导流程 Secure Boot Flow
7.3 Boot Image Creation 引导镜像创建
7.4 Boot Modes 引导模式
7.4.1 QSPI24 and QSPI32 Boot Modes
7.4.2 SD Boot Mode
7.4.3 eMMC18 Boot Mode
7.4.4 NAND Boot Mode
7.4.5 JTAG Boot Mode
7.4.6 USB Boot Mode
7.5 Detailed Boot Flow 详细的引导流程
7.5.1 Pre-Boot Sequence 预引导步骤
7.6 Disabling FPD in Boot Sequence 在引导序列中失效FPD(Full Power Domain)
7.7 Setting FSBL Compilation Flags 设置FSBL编译标志
7.7.1 Fallback and MultiBoot Flow
7.8 FSBL Build Process FSBL构建流程
7.8.1 Creating a New Zynq UltraScale+ MPSoC FSBL Application Project
7.8.2 Phases of FSBL Operation FSBL运行阶段
7.8.2.1 Initialization 初始化
7.8.2.1.1 XFsbl_SystemInit
7.8.2.1.2 XFsbl_ProcessorInit
7.8.2.1.3 Initialize DDR
7.8.2.1.4 XFsbl_BoardInit
7.8.2.2 Boot Device Initialization 引导设备初始化
7.8.2.2.1 XFsbl_PrimaryBootDeviceInit
7.8.2.2.2 XFsbl_ValidateHeader
7.8.2.2.3 XFsbl_SecondaryBootDeviceInit
7.8.2.3 Partition Loading 分区加载
7.8.2.3.1 XFsbl_PartitionHeaderValidation
7.8.2.3.2 XFsbl_PartitionCopy
7.8.2.3.3 XFsbl_PartitionValidation
7.8.2.4 Handoff 移交/切换
7.8.2.4.1 XFsbl_PmInit
7.8.2.4.2 Protection Configuration
7.8.2.4.3 Handoff
7.8.2.4.4 Supported Handoffs
7.8.2.4.5 Error Lock Down
7.8.2.5 Miscellaneous Functions 辅助函数
7.8.3 Using the Ethernet-Based Recovery Tool 使用基于以太网的恢复工具
总结
前言
上一章我们讲了ug1137的第5章和第6章,两章实质上的内容也很少,也还都是介绍性的内容。这一章我们来阅读第7章节,有关系统引导的章节,这一章的内容非常非常多,所以可能很多我觉得不重要的地方我可能都不进行翻译了,就只提一句了,我们下面开始。
Chapter 7: System Boot and Configuration 系统引导和配置
这一章节讲的东西很多,归纳来看有这几个方面:
引导过程
引导镜像创建
引导模式
FSBL的建立过程
我们下面就按照文档分节来讲。
7.1 Boot Process Overview 引导过程概述
这一节描述了引导过程的三个阶段,原文描述的很详细,我这里直接翻译原文:
平台管理单元(PMU)和配置安全单元(CSU)管理和执行多阶段引导。您可以以安全(使用经过验证的引导镜像)或非安全(使用未经验证的引导镜像)模式引导设备。引导阶段如下:
预配置阶段(Pre-configuration stage):PMU主要控制运行PMU ROM以设置系统的预配置阶段。PMU控制与复位和唤醒相关的所有过程。
配置阶段(Configuration stage):该阶段负责将PS的第一阶段引导加载程序(FSBL)代码加载到片上RAM(OCM)中。它支持安全和非安全启动模式。通过引导头,您可以在Cortex®-R5F-0/R5-1处理器或Cortex®-A53处理器上执行FSBL。Cortex-R5F-0处理器还支持锁步模式。
后配置阶段(Post-configuration stage):FSBL执行开始后,MPSoC进入后配置阶段。
这里可以看到,在第一阶段,PMU会首先执行PMU ROM以完成预配置,然后第二阶段才会加载FSBL到OCM中进行执行,我们在之前的章节的一个NOTE中就提到FSBL的代码在编译完成后需要被标记到OCM的特定地址才能正常执行。在第三阶段则是完成了FSBL的配置。
7.2 Boot Flow 启动流
这一小节就是紧跟着上一小节的概述,开始详细描述引导过程了。引导主要分为两种引导方式,非安全引导和安全引导,但两种方式都遵循一个共同的流程,这个共同的流程如下:
能看到,在这共同的流程中,PMU最先运行,在释放CSU后就进行功耗监控而把工作转交给CSU,CSU则加载FSBL到OCM,之后将工作转交给RPU并进行篡改监控,RPU则正式的执行FSBL,FSBL执行后就可以开始执行APU任务了,图中的任务有ATF(Arm Trusted Firmware),U-Boot,Linux三个。
下面就详述非安全和安全的引导流程。
7.2.1 Non-Secure Boot Flow 非安全引导流程
原文描述如下:
在非安全引导模式下,PMU释放配置安全单元(CSU)的复位,并进入监控电源的PMU服务模式。在PMU将CSU从复位中释放后,CSU将FSBL加载到OCM中。PMU硬件将运行PMU RAM,该过程将同步于FSBL在OCM中运行。FSBL在APL或RPU上运行。FSBL在APL/RPU和TF-A上运行; U-Boot和Linux在APU上运行。其他引导配置允许RPU完全独立于APU启动和运行,反之亦然。
在APU上,TF-A将在FSBL移交给TF-A后执行。TF-A移交给U-Boot等第二阶段引导加载程序,该加载程序执行和加载Linux等操作系统。
在RPU上,FSBL将移交给软件应用程序。
Linux反过来加载可执行软件。
7.2.2 安全引导流程 Secure Boot Flow
原文描述如下:
在安全引导模式下,PMU释放配置安全单元(CSU)的复位,并进入用于监视电源的PMU服务模式。PMU将CSU从复位中释放后,CSU将检查以确定FSBL或用户应用程序是否需要身份验证。 CSU采取以下措施:
执行身份验证检查,并仅在身份验证检查通过时继续。然后检查图像是否有任何加密分区。
如果CSU检测到已加密的分区,CSU将执行解密并将FSBL加载到OCM中。
运行在APU上的FSBL将移交给TF-A。在RPU上运行的FSBL加载TF-A。在这两种情况下,TF-A都会加载U-Boot,U-Boot会加载OS。然后TF-A执行U-Boot并加载Linux等操作系统。然后Linux反过来加载可执行软件。同样,FSBL检查其尝试加载的每个分区的身份验证和加密。FSBL仅在成功验证和解密(如果之前加密)后才加载分区。 可以看到,两种引导其在流程上并没有本质的区别,主要的区别在于安全引导下CSU会进行FSBL的检查和应用程序身份的检查,还有对加密FSBL内容的解密,然后FSBL接手对后续分区的身份验证和解密,然后加载这些分区,而非安全引导是直接进行执行的。
7.3 Boot Image Creation 引导镜像创建
这一节主要是讲了镜像创建工具Bootgen的用途和使用方法,也都是介绍性的内容,而且我对安全验证的内容不熟,所以就还是以原文翻译为主:
Bootgen是一个工具,可以让您将二进制文件缝合在一起并生成设备引导图像。Bootgen定义了在创建在设备中使用的引导图像时输入的多个属性、属性和参数。 设备的安全引导功能使用公钥和公钥加密算法。Bootgen为每个分区提供特定目标内存地址的分配和对齐要求。它还支持加密和身份验证,如Bootgen User Guide (UG1283)中所述。Bootgen User Guide (UG1283)的“Using HSM Mode”部分讨论了更高级的身份验证流程和密钥管理选项,其中Bootgen可以输出中间哈希文件,这些文件可以使用私人密钥离线签名,以签署引导图像中包含的身份验证证书。该程序通过将标头块添加到分区列表来组装引导镜像。 可选地,每个分区都可以使用Bootgen进行加密和验证。输出是一个可以直接编程到系统的引导闪存中的单个文件。 该工具可以生成各种输入文件以支持身份验证和加密。 Bootgen同时配备了一个图形界面和一个命令行选项。该工具集成到软件开发工具包集成开发环境(IDE)中,用于使用GUI生成基本引导映像,但大多数Bootgen选项都是命令行驱动的。命令行选项可以编写脚本。Bootgen工具由引导映像格式(BIF)配置文件驱动,文件扩展名为 *. bif。与SoC、自适应SoC和Bootgen一起,它能够为以后的FPGA加密和验证分区,如FPGA支持中所述。除了定义引导镜像行为的支持命令和属性外,还有一些实用程序可以帮助您使用Bootgen。Bootgen代码现已在GitHub上提供。 总的来说,Bootgen用于为不同分区提供执行地址以及对该分区的加密功能,这部分还有一小节是创建镜像文件的步骤,但是内容比较少其比较基础,这里就不写了,具体在第57页。
7.4 Boot Modes 引导模式
这一章大致介绍了几种用于boot的外部存储设备,但是在本节开头也声明了这些介绍并不完整,要进行细致的了解还是要看技术参考手册,不过我们还是挑稍微重点的内容来翻译一下:
7.4.1 QSPI24 and QSPI32 Boot Modes
BootROM在x8模式下搜索前256Mb。在QSPI24和QSPI32引导模式下(QSPI24/32设备<128Mb),要使用MultiBoot,请放置多个镜像,使其适合小于128 Mb的内存位置。QSPI24引导模式的管脚配置为0x1。 Note1:不支持QSPI双堆叠(x8)引导。仅支持QSPI单传输速率(STR)。单个Quad-SPI内存(x1、x2和x4)是唯一支持就地执行(XIP)的引导模式。 Note2 SPI24引导模式的管脚配置为0x1,QSPI32为0x2。 7.4.2 SD Boot Mode
Note:FSBL和U-Boot中的SD引导不支持exFat。 下图显示了在SD模式下引导Linux的示例。 IMPORTANT! 要从SD1启动,请将启动管脚配置为0x5。要从SD0启动,请将启动管脚配置为0x3。要从带有level shifter的SD启动,请将启动管脚配置为0xE。 7.4.3 eMMC18 Boot Mode
下图显示了以eMMC18模式启动Linux的示例。 (PS:我发现和SD那张图一模一样,不过确实两者都是用SD协议) 7.4.4 NAND Boot Mode
NAND Boot仅支持8位宽度来读取引导镜像,并支持MultiBoot的镜像搜索。下图显示了以NAND模式启动Linux的示例。 IMPORTANT! 要使用NAND引导,请将引导管脚配置为0x4 7.4.5 JTAG Boot Mode
您可以使用JTAG手动下载PS所需的任何软件镜像和PL上的任何硬件镜像。有关TAG引导模式设置,请参阅Zynq UltraScale+ Device Technical Reference Manual (UG1085).中的“Boot Modes”部分。 IMPORTANT! JTAG模式下不支持安全引导。7.4.6 USB Boot Mode
USB引导模式仅支持USB2.0。在USB引导模式下,支持安全和非安全引导模式。DDR-less系统不支持USB引导模式。不支持Multi Boot、后备镜像和XIP等功能。 USB启动模式需要一台安装了dfu-utils的主机PC。主机和设备需要通过USB2.0或USB3.0电缆连接。主机必须包含一个要由bootROM加载的boot.bin,其中只包含fsbl.elf和另一个要由FSBL加载的boot_all.bin。在USB引导模式下启动电路板时,发出以下命令:
在Linux主机上:
dfu-util-D Boot.bin:这将文件下载到设备,由BootROM处理。
dfu-util-D Boot_all.bin:这将文件下载到设备,由FSBL处理。
在Windows主机上:
dfu-util. exe-D Boot.bin:这将文件下载到设备,由BootROM处理。
dfu-util. exe-D start_all.bin:这将文件下载到设备,然后由FSBL处理。
7.5 Detailed Boot Flow 详细的引导流程
这一节比较重要,是MPSOC启动流程的具体描述,这一节我也会重点的来分析。首先我们要复习一下,在之前的启动流程概述中提到过MPSOC的启动有三个阶段,预配置阶段(Pre-configuration stage),配置阶段(Configuration stage)和后配置阶段(Post-configuration stage)。
这其中的预配置阶段(Pre-configuration stage)主要是由PMU(平台管理单元)来进行控制的,具体描述如下:
PMU ROM将在引导期间从ROM执行,以配置设备的默认电源状态、初始化RAM以及测试内存和寄存器。在PMU执行这些任务并将系统控制权移交给配置安全单元(CSU)后,它将进入服务模式。在此模式下,PMU响应由系统软件通过寄存器接口或由硬件专用I/O发出的中断请求,以执行平台管理服务。 下面我们来看预配置阶段(Pre-configuration stage)的详细步骤。
7.5.1 Pre-Boot Sequence 预引导步骤
预引导阶段的PMU其任务序列如下图:
我们来简要分析一下,PMU会使能并激活一大堆的基础设备,例如LPD,FPD,PLL以及供电等等,在完成这些任务后,就会是否CSU单元使其进行工作,或者进入发生错误模式,然后进入服务模式开始进行功耗监控,而在CSU复位被释放后,CSU会马上执行bootROM并执行下面的任务:
初始化OCM。
通过读取引导模式寄存器来确定引导模式,该寄存器会在POR(上电复位)时捕获引导模式管脚。
CSU继续执行FSBL负载和可选的PMU Firmware负载。PMU Firmware是可以由PMU单元执行的软件,其在PMU的RAM中执行。
具体的执行流程如下图所示,我已经在图中做了对应的中文注释:
7.6 Disabling FPD in Boot Sequence 在引导序列中失效FPD(Full Power Domain)
这一节的内容是讲在引导时为了防止FPD短暂的上电造成的FPD锁定的操作,具体如下:
执行以下操作以避免暂时施加FPD电源时发生FPD锁定:
通电直到BootROM执行完成。
To power down the FP during FSBL execution, set FPD bit '22' of PMU_GLOBAL REQ_PWRDWN_STATUS register.
To bring the FP domain up in a later stage of the boot process, set the PMU_GLOBAL REQ_PWRUP_STATUS bit to '22’.
(PS:最后这两句我没翻译,因为我也没看懂原文到底是要说讲该寄存器置位22还是说置位寄存器的第22位,这里就放原文大家自己判别)
如果FSBL启动前未施加FPD电源,请执行以下操作
启动R5。
一个寄存器被置位来指示FPD由于复位或清除命令无法执行而被锁定,只能等待POR。
R5可以从SAL_GLOBAR_ISO_SAL寄存器第4位来读取FP锁定状态。
在此阶段,将不会置位SAL_GlobAL RST_PWURA_SAL位22。
要恢复FPD节点,必须向该节点供电并发出POR。
7.7 Setting FSBL Compilation Flags 设置FSBL编译标志
这一部分内容是为了解决MPSOC引导中的两个问题,一个是FSBL文件过大的问题,另一个是需要多个镜像文件进行引导的问题,我们来一个个解决。
首先是FSBL文件过大的问题,这个问题可以通过设置编译标志,将一些不需要的内容隔离在编译之外,从而缩小FSBL文件大小,具体的设置界面和标志类型如下面两张图所示,这里不翻译了:
通过设置标志去除某些不需要的代码,就能减少编译文件的大小,这里有一点注意事项:
Note:无需更改任何FSBL源文件或头文件来包含这些标志。 7.7.1 Fallback and MultiBoot Flow
这一小节就是讲如何进行fallback boot(备份引导)和multiboot(多引导),这部分原文介绍比较关键,我们来看原文:
在AMD Zynq UltraScale+ MPSoC中,CSU BootROM支持MultiBoot和后备引导镜像搜索,其中配置安全单元CSU ROM或BootROM搜索引导设备,寻找要加载的有效镜像。顺序如下:
BootROM在flash中以32KB的偏差搜索有效图像识别字符串(XLNX作为图像ID)。
找到有效的标识值后,验证标识头的校验和。
如果检验和有效,则BootROM加载该镜像。这允许flash中出现多个镜像。
也就是说,CSU中的bootROM会自动在flash(这泛指闪存存储器)中镜像镜像的搜索,在搜索到第一个镜像后,就进行校验,校验成功则加载镜像进行执行(按照流程应该会加载FSBL到RPU执行)。我们再来看multiBoot的原文:
在进行multiBoot时:
CSU ROM或FSBL或用户应用程序必须启动引导镜像搜索以选择要引导的不同镜像。
要启动此镜像搜索,CSU ROM或FSBL更新MultiBoot偏置以指向预期的引导图像,并通过写入CRL_APB寄存器来生成软重置。
下图显示了使用MultiBoot进行回退的示例 在示例后备引导流程图中,发生以下序列:
最初,CSU BootROM加载位于0x000_0000处的引导镜像。
如果发现此镜像已损坏或解密和身份验证失败,CSU BootROM将MultiBoot偏差增加一,并在0x000_8000(32KB偏差)处搜索有效引导图像。
如果CSU BootROM找不到有效的标识值,它将再次将MultiBoot偏差增加1,并在下一个32 KB对齐地址处搜索有效的引导图像。
CSU BootROM重复此操作,直到找到有效的引导图像或达到图像搜索限制。在此示例流程中,下一个图像显示在0x002_0000处,对应于MultiBoot偏置值四。
在示例MultiBoot流中,要加载地址0x002_0000处的第二个镜像,FSBL/CSU-ROM将MutiBoot偏差更新为4。更新MultiBoot偏差时,软重置系统。
下表显示了不同引导设备的MultiBoot图像搜索范围。 我现在来总结下multiBoot的流程,如果我们要使用multiBoot,就需要在特定的以32KB为偏置的位置上放置镜像,CSU ROM会依据32KB的偏置从低地址到高地址进行镜像搜索,如果搜索到镜像头则进行解析验证然后执行,而且要注意的是,CSU ROM在不同的存储设备上能够搜索的范围是有限的,也就是我们针对不同器件所能进行的multiBoot有限。
7.8 FSBL Build Process FSBL构建流程
这一节讲了FSBL的构建和其具体的执行流程,也是比较重要的内容,我先翻译一下本节开篇,内容比较重要,原文如下:
(CSU)验证和/或解密后,FSBL被加载到OCM中并由CSU BootROM移交。第一阶段引导加载程序(FSBL)用比特流(如果存在)配置该FPGA,并将Standalone(SA)镜像或第二阶段引导加载程序图像从非易失性存储器(NAND/SD/eMMC/QSPI)加载到RAM(DDR/TCM/OCM)。它会使Cortex-R5F-0/R5F-1处理器或Cortex-A53处理器单元脱离复位。它支持多个分区。每个分区可以是代码镜像或比特流。如果需要,这些分区中的每一个都将被认证和/或解密。 注意:如果您正在创建自定义FSBL,则应该注意OCM大小为256KB,并且可用于CSU BootROM。FSBL大小接近170KB,适合OCM。使用USB引导模式时,您应确保由FSBL而不是CSU bootROM加载PMU firmware(PS:PMU firmware是一段运行在PMU RAM中的软件)。这是因为CSU BootROM加载的Boot.bin大小应该小于256 KB。 注意:即使设计中存在DDR,用户也可以从OCM加载未加密的情况下的比特流。默认情况下,在xfsbl_config.h中,FSBL_PL_ADD_OF_OCM_EXCLUDE_VAR值设置为0,从而在未加密的情况下使比特流从DDR复制和加载。通过将FSBL_PL_ADD_LOS_OCM_EXCLUDE_VAR值设置为1,用户可以确保从OCM块加载比特流,而不是从DDR加载比特流。此外,如果设计中不存在DDR,则无论FSBL_PL_ADD_LOS_OCM_EXCLUDE_VAR值如何,都将从OCM加载比特流。 7.8.1 Creating a New Zynq UltraScale+ MPSoC FSBL Application Project
没实际内容不说了。
7.8.2 Phases of FSBL Operation FSBL运行阶段
这一小节讲了FSBL运行过程中的具体流程,我们来详细看一下。
首先FSBL在运行时主要有四个阶段:
初始化
引导设备(如SD,eMMC,QSPI)初始化
加载分区
移交(也就是将代码执行移交给APU或RPU)
下面这张图表展示了各个阶段的运行,内容比较直白我就没做标注:
这里我用文字稍微解释一下,在CSU将运行移交到FSBL后,FSBL会进行如之前所说的4阶段运行步骤,这4步的内容都写在左下角方框内了,而一旦每个阶段执行出来问题,就会转入黑圈所示的状态,如果此时没有后备镜像可以加载,则运行会直接结束,否则应该会回到CSU加载镜像的状态,而如果四个步骤都正常,则程序会正常的被移交给APU或者RPU的应用程序。
文档下面的内容是挨个阶段的介绍每个阶段下FSBL会运行什么代码并执行什么操作,且每个操作中又有对应的流程图指示该操作的流程,内容非常繁杂,而且我也没有完全理解,为了内容精简,我就不再贴流程图了,只是对每个步骤的原文描述进行翻译了,具体的内容要参考ug1137的原文,我会将每个步骤写成小小节以便于在目录中查看流程。
7.8.2.1 Initialization 初始化
初始化阶段有着4个内部阶段:
7.8.2.1.1 XFsbl_SystemInit
该功能为1.0和2.0silicon的PL供电,并消除PS-PL隔离。它按照psu-init中的规定来初始化时钟和外围设备。该函数在仅复位的APU中不被调用。 7.8.2.1.2 XFsbl_ProcessorInit
处理器初始化将在此阶段开始。它将为R5-0设置指令和数据缓存、L2缓存、MMO设置、堆栈指针(如果是A53的话还有I/D缓存)、MPU设置、内存区域、堆栈指针和TCM设置。这些设置中的大部分将在BSP代码初始化中执行。如果处理器为是A53,IVT(应该是中断向量表)向量指向OCM的起点,如果是R5-0,IVT指向为TCM的起点(lowvec中为0x0,highvec中为0xffff000)。 7.8.2.1.3 Initialize DDR
DDR将在此阶段初始化。该函数在Master only reset中不会被调用。 7.8.2.1.4 XFsbl_BoardInit
此功能执行所需的开发板特定初始化。最重要的是,它配置GT(Gigabit Transceiver)通道和IIC。 7.8.2.2 Boot Device Initialization 引导设备初始化
7.8.2.2.1 XFsbl_PrimaryBootDeviceInit
此阶段涉及读取引导模式寄存器以识别主引导设备并初始化相应的设备。每个引导设备驱动程序都提供init、copy和release函数,这些函数在此阶段被初始化为DevOps函数指针。 7.8.2.2.2 XFsbl_ValidateHeader
使用提供的复制函数,FSBL读取引导标头属性和镜像偏置地址。它读取EFUSE位来检查身份验证。它读取镜像标头并验证镜像标头表。然后,它读取镜像标头的Partition Present File属性。非零值表示次级引导设备。零值表示次级引导设备与主引导设备相同。 7.8.2.2.3 XFsbl_SecondaryBootDeviceInit
当图像头表的Partition Present Unit属性非零值时,调用该函数。它初始化辅助引导设备驱动程序,辅助引导设备将用于通过FSBL加载所有分区。 XFsbl_SetATFHandoffParams 假设TF-A是FSBL之后的下一个可加载的分区。它能够加载U-Boot和安全操作系统,因此,它传递了切换结构。 应用程序的第一个分区将具有非零执行地址。该应用程序的所有剩余分区将以0作为执行地址。因此,为不是第一个分区的分区查找非零执行地址,并确保CPU为A53。 此函数将切换参数设置为Trusted Firmware-A(TFA)。第一个参数取自FSBL分区头。指向包含这些参数的切换结构的指针存储在TF-A读取的PMU_GLOBAL.GLOBAL_GEN_STORAGE6寄存器中。该结构填充了magic characters“X”、“L”、“N”和“X”,后面是分区总数和每个分区的执行地址。 7.8.2.3 Partition Loading 分区加载
7.8.2.3.1 XFsbl_PartitionHeaderValidation
分区标头通过各种检查进行验证。所有所需的分区变量都会在此阶段更新。如果分区所有者不是FSBL,则分区将被忽略,FSBL将继续加载其他分区。 7.8.2.3.2 XFsbl_PartitionCopy
分区将被复制到DDR或TCM或OCM或PMU RAM。 7.8.2.3.3 XFsbl_PartitionValidation
分区将根据分区属性进行验证。如果启用了校验和,则将首先验证该分区校验和的正确性,然后根据身份验证标志对其进行身份验证。如果设置了加密标志,则分区将被解密,然后复制到目的地。 7.8.2.4 Handoff 移交/切换
在此阶段,将执行psu_inits的protection_connect函数,然后执行任何handoff功能。PS-PL隔离也被无条件取消。如果R5的核心上应该运行任何分区,则R5将退出重置。R5-0/R5-1将根据您在构建引导镜像时提供的设置配置为以lowvec模式或highvec模式引导。lowvec模式下的移交地址为0x0,highvec模式下的移交地址为0xffff0000。构建引导镜像时应指定Lowvec/Highvec信息。完成所有其他PS镜像后,运行的中央处理器将通过PC值的更新来实现handoff。如果没有镜像要移交到中央处理器,则FSBL将进入wfe循环中。 任何正在运行的处理器都不能将任何参数传递给任何其他处理器。各个分区之间的任何通信都可以通过读取(或写入)PMU全局寄存器来发生。 正在运行的处理器上的移交操作涉及到对程序计数器(PC)的更新,类似于在对APU进行复位的情况。切换到其他处理器涉及也都涉及更新其PC并使处理器脱离复位。 7.8.2.4.1 XFsbl_PmInit
该功能初始化并配置处理器间中断(IPI)。然后,它将PM配置对象地址写入IPI缓冲区,并触发目标的IPI。然后,PMU firmware读取并配置对象中指定的设备节点。 7.8.2.4.2 Protection Configuration
在此阶段,将执行psu_init中的protection_connect函数。保护的应用发生在这个阶段。 7.8.2.4.3 Handoff
正在运行的处理器上的切换涉及更新正在运行的处理器的程序计数器(PC),就像在APL重置的情况下所做的那样。切换到其他处理器涉及更新其PC并使处理器脱离重置。A53如果有任何分区可在R5上运行,FSBL将使R5退出重置。R5将根据您在构建引导镜像时提供的设置配置为以低vec模式或高vec模式引导。低vec模式下的切换地址为0x 0,高vec模式下的切换地址为0xffff 0000。 构建引导镜像时必须指定Lowvec/Highvec信息。完成所有其他PS镜像后,运行的中央处理器镜像将被移交给该中央处理器,并更新PC值。如果正在运行的中央处理器没有镜像,则它将处于wfe循环中。 7.8.2.4.4 Supported Handoffs
下表显示了FSBL中支持的各种移交组合。 7.8.2.4.5 Error Lock Down
XFsbl_errorLockDown函数处理FSBL中的错误。每当函数的返回值不成功时,就会调用此函数。如果不支持回退(fallback),此函数会更新错误状态寄存器,然后无限期循环。 如果引导模式支持回退,则更新MultiBoot偏置寄存器,然后等待WDT复位发生。重新启动时,BootROM和FSBL从根据MultiBoot偏差计算的新地址读取镜像,从而加载新镜像。 7.8.2.5 Miscellaneous Functions 辅助函数
这个小节讲了一堆FSBL中肯会用到的函数,差不多总的有十几个,这里就不一一介绍了,因为我感觉能够用到的概率可能不大,所以不展开讲了,具体内容常看第91~95页
7.8.3 Using the Ethernet-Based Recovery Tool 使用基于以太网的恢复工具
这一节讲了使用以太网来对MPSOC进行镜像更新或者恢复的方法,这里简单翻译一下:
SOM(system on module)解决方案堆栈包括基于以太网的恢复模式,可与主机PC上的应用程序一起使用,以提供完整的工厂QSPI镜像重置/重新加载机制。恢复工具将保存在QSPI内存的保留部分中。之所以选择基于以太网的恢复而不是USB,是因为许多有安全意识的客户更喜欢禁用USB,而在其应用程序中使用以太网。以太网恢复应用程序是一种运行简化以太网堆栈的应用程序,用于与客户/工程师的主机(例如笔记本电脑)交互,以允许手动更新/重写SOM上QSPI上的图像A和图像B。 除了网络浏览器之外,基于以太网的恢复不需要PC上的任何增量工具。您的PC必须在其本地文件系统中具有新的硬件二进制文件。您应该能够处理从AMD存储库下载相关的AMD工厂引导文件更新,而目标固装将处理给定文件到物理地址的映射以及写入闪存的行为。图像恢复实用程序使用固定IP地址192.168.0.111。 基于以太网的恢复工具能够读取边带控制EEPROM以验证SOM的品牌和型号。以太网工厂回退/恢复过程通过在通电重置序列期间按住FWUEN按钮来启动。该工具需要按下硬件更新按钮才能重写任何硬件内容。它将相应的A/B持久寄存器更新为适当的状态。 总结
在写这章之前我就知道boot部分的内容应该是非常多且复杂的,到真的上手写才发现内容不仅多,而且很多地方都有些理解不了是最难受的,感觉还得加把劲学。不过学了这章还是大致理解了FSBL对器件的启动过程,还是有帮助的。下一章节的Security Features说实话我可能会先跳过不讲,因为这部分内容我确实太不熟了。我们下次再见。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
相关推荐