【HD】第一阶段引导加载程序——FSBL
第一阶段引导加载程序——FSBL
文章目录
- 【HD】第一阶段引导加载程序——FSBL
- 目标target
- 一、FSBL是什么?
- 二、FSBLs和引导顺序
-
- 1.Power Applied 应用电源
- 2.PMU ROM Code Executes PMU ROM代码执行
- 3.CSU ROM Code Executes CSU ROM代码执行
- 4 .Either Processor or Mux处理器或复用器
- 5 .Boot Image 启动映像
- 三、FSBL执行流程
- 四、定制FSBL
- 五、理解psu_init
- 六、引导映像分区
-
-
-
- (1)初始化NAND
- (2)初始化NOR
- (3)图像活动
- 七、启动设备详细信息:QSPI
- 八、启动设备详细信息:SD/eMMC
- 九、PS/PL交互和设置
- 总结
目标target
1.描述FSBL的目的目标
2.解释如何在SoC设备中实现FSBL
提示:以下是本篇文章正文内容,下面案例可供参考
一、FSBL是什么?
什么是FSBL,为什么需要FSBL ?第一阶段引导加载程序是运行的第一个用户应用程序。它的基本工作是将一个或多个可执行应用程序(通常是独立的或第二阶段引导加载程序)从非易失性内存(通常是某种类型的Flash)复制到RAM中。
- SoCs
SoC代表片上系统。从它的名字可以看出,这里有相当多的复杂性。自适应SoC,包括Zynq®-7000 SoC,超scale +TM MPSoC, RFSoC,Versal®ACAP等将由多个cpu、外设和内存控制器组成的强大处理系统与灵活的可编程逻辑或用于加速器、外设和其他用户IP的专用计算资源相结合。考虑到用户熟悉cpu以及它们易于编程,处理系统被赋予了管理引导序列的责任;因此,它首先启动。
- Boot Process
对于SoC中所有不同的可编程元素,是什么决定了哪个元素以什么顺序获得哪段代码?考虑引导系统的种类和顺序。如何将可执行代码定向到它应该运行的处理器?操作系统是如何加载的?如果需要多个操作系统,并且必须使用一个管理程序来管理它们,该怎么办?可编程逻辑什么时候装载它的映像?如果将系统分为安全区域和非安全区域,会发生什么情况?如何管理加密图像?我们提供了一个名为Bootgen的工具,它可以从命令行运行,也可以通过软件开发工具将所有这些部分组装成一个可引导的映像。这仍然回避了一个问题:如何打开这个单一的可引导映像?
- FSBL
我们提供了一个First Stage Boot Loader模板,作为软件开发工具的一部分,它可以用操作所需的代码解包和加载每个处理器。该模板是作为C源代码提供的,这意味着它可以由用户修改,或者用户可以按原样运行应用程序。当以JTAG模式连接到电路板时,可以像其他任何应用程序一样调试此应用程序。一旦构建完成,FSBL应用程序就成为引导映像的一部分。如果设计者希望使用不同于模板中提供的FSBL,甚至是自己开发的FSBL,他们当然可以这样做;然而,要使用工具生成的图像,图像的标题部分必须符合用户指南1137:Zyng UltraScale+ MPSoC软件开发人员指南中概述的规范,特别是在标题为引导图像格式的部分中关于引导图像创建的章节。虽然本用户指南的标题显示了特定的设备系列,但引导头对所有系列都是通用的,并且该规范可以在其他软件开发人员指南中找到。
Versal ACAP设备包含他们自己的专有FSBL,目前,用户无法修改。本模块中提供的原理提供了对通用ACAP设备使用的FSBL过程的各个方面的见解;但是,不支持自定义。因此,对特定功能名称的引用集中在MPSoC设备支持的功能名称上。zyn7000系列soc通常是MPSoC设备使用的简化形式,前缀为“ps7_”而不是“psu_”。
二、FSBLs和引导顺序
现在我们知道了第一阶段引导加载程序对引导过程至关重要,让我们更详细地了解它们。虽然我们不会讨论引导过程的所有细节,但我们将关注与FSBL直接相关的引导过程部分
1.Power Applied 应用电源
当电源被应用到设备上时,内部电路保证。电源轨很稳定,而且。释放复位到平台管理单元。
2.PMU ROM Code Executes PMU ROM代码执行
平台管理单元检查引导模式引脚的状态,以确定将从何处获取映像。然后,PMU执行与加载FSBL无关的其他几个任务,这些任务在PMU上的模块中进行了描述。当PMU完成这些任务时,它释放重置到配置和安全单元。
3.CSU ROM Code Executes CSU ROM代码执行
配置和安全单元使用由引导模式引脚指定的设备定位引导映像的标头部分。这个头描述了FSBL在图像中的位置。犯罪现场组将FSBL复制到OCM RAM中。
CSU还可以定位平台管理单元的映像,并将平台管理固件加载到PMU的RAM中。
最后,CSU将控制转移到启动头中指定的处理器,该处理器现在应该在OCM中运行FSBL代码。
4 .Either Processor or Mux处理器或复用器
指定的处理器将自身指向OCM并开始执行FSBL代码。FSBL的基本功能是至少将一个应用程序加载到一个处理器。通常,为多个处理器加载多个应用程序,当使用操作系统或管理程序时,这包括第二阶段引导加载程序。这个第二阶段引导加载程序从引导映像或其他源提取可执行块,并将其加载到DDR或其他大容量内存中。回到第一阶段引导加载程序,应该注意的是,FSBL可以为各种处理器加载多个映像。在FSBL的生命周期中,第一次配置可编程逻辑的机会变得可用。PL也可以通过第二阶段引导加载程序或其他应用程序进行配置或重新配置。
5 .Boot Image 启动映像
引导映像是一个相当复杂的数据结构,在软件开发人员指南中有很好的定义,其中之一是UG1137。引导映像包含一个主标题,它作为映像的索引,列出可用的块,它们做什么,它们将在哪个处理器上运行,等等。有关引导映像的详细信息可以在名为“引导映像”的模块中找到。
三、FSBL执行流程
系统初始化系统初始化植根于硬件开发阶段使用Vivado Design Suite完成的工作。当PS被“重新定制”时,将创建几个包含配置信息的文件。其中一个这样的文件是psu_init Tcl脚本,Vitis IDE在通过JTAG链连接设备时运行该脚本。这在开发和调试代码时最常用。另一个文件作为FSBI项目的一部分自动包含在FSBL中。这些文件执行相同的任务,但在不同的情况下使用。不管运行哪个代码,PS寄存器都是根据硬件规范配置的。
- 1、系统初始化System Initialization
系统初始化植根于硬件开发阶段使用Vivado Design Suite完成的工作。当PS被“重新定制”时,将创建几个包含配置信息的文件。
其中一个这样的文件是psu_init Tcl脚本,Vitis IDE在通过JTAG链连接设备时运行该脚本。这在开发和调试代码时最常用。另一个文件作为FSBL项目的一部分自动包含在FSBL中。这些文件执行相同的任务,但在不同的情况下使用。不管运行哪个代码,PS寄存器都是根据硬件规范配置的。
- 2、启动设备初始化Boot Device Initialization
引导设备不再是无用的内存块力量被运用的那一刻。FSBL执行周期的这个阶段初始化FSBL被模式引脚指示使用的任何存储设备。
一旦装置准备好,FSBL就会继续。
- 3、分区头读取Partition Header Read
FSBL有一个特殊的分区。引导头指向这个分区头,FSBL读取分区头。这个头包含关于FSBL即将加载的图像的信息。
- 4、分头读取开始后:已启用身份验证Authentication Enabled
要加载的映像中的引导头包含标记处理器块是否需要身份验证的指示器。如果需要身份验证,那么FSBL将块传递给CSU进行身份验证。如果块通过了身份验证,它将进入下一阶段,否则FSBL将寻找一个“回退”映像来安全引导。
- 5、分区加密Partition Encrypted
头描述了块是否被加密,这是系统安全部分所必需的。如果需要解密,FSBL将分区传递给CSU以获得对AES-HMAC引擎的访问权。不管是否需要解密,FSBL现在都将分区移动到它的目的地,这个目的地可以是任何内存目标—甚至是可编程逻辑的配置内存。请注意:如果分区目标在OCM中,应小心避免用新代码…覆盖FSBL那很可能非常非常糟糕。
- 6、最后分区Last Partition
FSBL检查索引,看看这是否是要加载的最后一个分区,如果不是,它读取索引的分区头以及指定分区的位置和类型的其他信息。下一个分区。
否则,加载部分完成,FSBL检查一个特殊分区。(再次进入分区头读取)
- 7、准备PS部分PS Partion Present
分区头FSBL通常指定在加载过程结束时将控制传递给哪个处理器。一种可能性是,用户仅仅希望加载应用程序并进入调试或分析开发阶段,其中通过JTAG发出命令。这可以在使用Bootgen tos构建映像时指定
四、定制FSBL
当在Vitis IDE中创建平台项目时,FSBL可以作为默认引导映像生成选项的一部分自动生成。带有必要库的独立BSP将自动创建并形成一个域。这个FSBL项目的源代码和一些编译器选项可以修改;然而,这不是定制FSBL最简单的方法。相反,应该使用First Stage Boot Loader应用程序模板创建常规应用程序项目。这使得源代码和编译器选项都可用于开发。当修改完成后,它们可以被复制到平台中的FSBL项目中。
虽然FSBL为引导系统提供了所有基本和一些高级支持,包括管理回退、黄金映像和安全引导,但用户可能有额外的需求。有几个可用的开关,可以通过定义一个符号来激活,该符号将提供几种类型的增强引导诊断消息,这些消息将通过默认串行端口显示。如果这些开关不提供必要的功能,则有一段代码用于添加用户特定的代码。
- Hooks使用模板
FSBL模板包括一个名为fsbl_hooks.c的文件,其中包含一系列函数骨架,根据它们在引导序列中的执行时间命名。例如,用户可以在FSBL移交控制权之前插入代码APU 和 RPU。
五、理解psu_init
- 设置PS
处理系统虽然是专用的硅,但仍然包含许多寄存器,这些寄存器决定使用哪些资源以及如何使用。这些资源包括外设、设备锁相环、内存控制器和其他方面。毫不夸张地说,这需要数千个寄存器来描述。FSBL的第一个任务是根据Vivado Design Suite或HSM工具指定的硬件描述配置PS。方便的是,这些工具自动生成用于配置PS的文件,从而消除了开发人员对每个寄存器进行编程的繁琐工作。有一些修改的硅需要轻微调整寄存器。psu_init检查特定的硅版本,并运行适当的代码来正确初始化所有寄存器。
- 不同的种类的psu_init
有几个文件以“psu_init”开头。一个是一个C源文件,其中包含用于设置PS寄存器集合的函数定义。接下来是头文件,它提供C源文件使用的寄存器代码和宏。接下来是执行与C源文件相同功能的Td脚本。不同之处在于C源文件及其头文件被构建到由FSBL运行的对象中;各种工具使用Tcl脚本来初始化PS,而无需在PS中的处理器上运行任何代码。这样做是为了在调试和分析时减少对FSBL的需求。
六、引导映像分区
引导映像是由boot.bin工具创建的单个映像,它既可以作为独立的(即命令行应用程序)运行,也可以从Vitis IDE中作为脚本运行。图像被分成不同的标头和分区。这些分区在各种软件开发人员指南中都有描述。MPSoC设备通常包含至少五个分区。FSBL由CSU加载,并且需要从引导映像中提取其他分区。如果没有FSBL分区,引导过程就会停止。配置和安全单元从引导头中识别FSBL分区,并将其复制到OCM中,然后根据引导头所指示的内容将控制权交给R5或A53处理器。Arm可信固件可用于管理程序和安全系统。PMU固件负责电源管理等工作。虽然它不是必需的,但它的缺失使用户无法访问电源管理和安全功能。通常会有CortexTM-A53处理器的应用程序。虽然这可能是一个独立的应用程序,但它通常是第二阶段引导加载程序,例如U-boot,然后将操作系统或管理程序加载到APU中。如果操作系统支持SMP,那么操作系统将管理将应用程序加载到APU中的其他处理器上。否则,可以将其他独立应用程序加载到APU中的其他处理器中。
RPU中的r5或r5的应用程序通常也包括在内,尽管APU中的操作系统可以稍后加载r5。同样可行的是,r5可以在更方便的时间将操作系统装入APU。当启动速度非常关键时,通常会这样做。我们当然不能忘记可编程逻辑的一个或多个完整或部分比特流。它可以由FSBL、SSBL或运行在RPU或APU中的应用程序或操作系统加载。
- FSBL
让我们更细致地看看FSBL的活动。FSBL初始化内存设备,然后调用image_mover.c源文件中的LoadBootlmage函数。这个函数解析引导头和分区头。FSBL代码足够聪明,可以知道代码的不同部分属于哪里。它将位流移动到PL和SSBL中的配置内存,并将其他应用程序移动到它们在DDR或OCM中的各自位置FSBL在CSU的解密和认证引擎的帮助下,处理管理安全启动的大部分细节。请记住,当安全引导时,系统必须在安全模式下启动,并且永远不要退出。概述哪些应用程序是安全的,哪些不安全的信息包含在引导头中。
- 启动方式详细说明:NAND和NOR Flash
NAND闪存是众多类型闪存中的一种。NAND闪存既最大限度地提高了芯片容量,也因此降低了每比特的成本。在MP3播放器、数码相机和USB闪存驱动器等需要频繁重写大文件的地方,通常可以找到NAND存储器。和其他类型的闪存一样,NAND的写入周期是有限的。由于单个电池的配置文件“磨损”,许多制造商在设备中提供比广告更多的内存,并在用户意识到任何问题之前补偿一定数量的故障。NAND闪存是以块(而不是独立的字节)的形式写入和读取的,因此它更适合于二级存储设备,而不是RAM或ROM驱动器。NOR闪存的读取速度比NAND快,但它更昂贵,擦除和写入时间更长,存储容量也比NAND低。NAND器件的接口是串行完成的——8个引脚用于控制、地址和数据。NOR使用更传统的内存地址配置。
(1)初始化NAND
初始化NAND闪存很简单。设置处理系统的Flash控制器的基址,初始化裸机驱动程序。由于NAND设备是面向块的,Flash控制器为主机缓冲这些块
(2)初始化NOR
初始化NOR闪存甚至比初始化NAND闪存更简单。不需要坏块管理,接口也不太复杂——Flash控制器只需要NOR Flash的基址。
(3)图像活动
从Flash到请求主机的图像移动也很简单。NAND的一些复杂性被裸金属驱动器抽象了出来。驱动器的坏块管理功能引导传输远离闪存中已知的坏区域,这些坏区域已经磨损。驱动程序的XNandPs读取功能用于将数据块从NAND闪存复制到OCM。
NOR驱动程序看到一个线性接口内存模型,每次可以复制一个字节,如下面的代码片段所示。
七、启动设备详细信息:QSPI
QSPl是一个SPI模块,支持单、双和四SPI读访问。内存映射寄存器接口提供了访问数据的直接接口。SPI代表串行外设接口。这种简单的串行协议只需要几个封装引脚,并且可以被插入到数百兆赫兹。
- 配置configurations
QSPI控制器有几种基本配置。第一种模式是线性地址模式,它使用设备操作的一个子集来最小化软件开销。控制器使它看起来好像Flash设备是一个ROM。接下来是通用的QSPI模式。该模式支持SPI、dual-SPI和Quad-SPI模式的所有特性。Quad-SPI可以进一步细分为三种不同的子模式。I/O子模式使用fifo,因此软件可以向RxFIFO写入数据并从RxD寄存器读取数据。该控制器消除了在管理TxFIFO时可能发生的软件开销。DMA模式利用内部DMA模块,一旦配置完成,就会移除处理器负载,并在Flash和其他目标之间自主移动数据。SPI模式默认为标准SPI控制器的功能。最后,QSPI可用于多个I/O配置(单、双堆叠和双并行)。QSPI控制器支持24位和32位模式,并且是唯一支持就地执行的引导模式。就地执行是一种过程,其中可执行代码直接从非易失性内存运行,而不是复制到本地RAM中。
- Page Selections页面选择
如果在PS复位时没有选择“bank zero”,大型QSPI设备可能会遇到页面选择问题,因为控制器可能会变得混乱并开始从错误的页面读取。系统软件需要考虑到这一点,并确保在进入重置之前设置正确的页面。
- FSBL QSPI
如果选择QSPI作为引导设备,默认的FSBL代码将设置一个除以8的时钟前标量。这可以通过编辑InitQspi函数来修改,该函数可以在FSBL项目的gspi.c源文件中找到。在BSP的xqspps .h文件中可以找到各种标量前选项。与往常一样,详细的文档是可用的。请参见《UG1085 Zynq UltraScale+设备技术参考手册》
八、启动设备详细信息:SD/eMMC
安全数字卡是一种物理上小的闪存卡,提供高容量的内存。这些卡用于许多小型便携式设备,如数码摄像机、数码相机、MP3播放器等。eMMC或嵌入式多媒体卡是一种经济有效的,但比固态驱动器慢的基于闪存的存储介质。由于其占地面积小,emmc通常用于智能手机和相机。通常,emmc被放置在适配器中,以扩大其占用空间,以便用作SD卡。SD内存在嵌入式世界中脱颖而出,因为它不仅是一种易于移动的引导设备,而且是唯一支持的可以配备文件系统的引导介质。
- FAT文件系统
文件分配表或FAT文件系统是行业标准文件系统之一,是一种简单而健壮的遗留策略。虽然可以追溯到1977年,但由于其轻量级驱动程序,它仍然被广泛使用-特别是在嵌入式系统中。FAT文件系统可以在u盘、闪存和其他固态存储卡和模块中找到。在创建板支持包时,会提供FAT文件系统库作为选项。api简单、合乎逻辑且熟悉。
- 初始化SD(IintSD())函数
FAT文件系统通过调用InitSD来初始化,参数为“BOOT.BIN”,这是Bootgen工具的输出。通过更改该函数的参数,可以修改FSBL以从另一个文件启动。参考FSBL应用程序中的main.c文件。
- 后续访问
使用标准API函数调用执行对SD卡的进一步访问。最常见的两个是fIseek,它将读取指针定位在打开的文件中以供读取,而f_read则从文件中读取数据块。请参阅《操作系统及图书馆文件汇编》,编号UG643。在集合中,查找LibXil FFS,查找通用FAT文件系统文档,即User Guide 1032。这个简短的用户指南包含一个到通用FAT文件系统模块的链接,该模块提供了一个完整的api。
九、PS/PL交互和设置
如果将FSBL设置为加载可编程逻辑,并且期望PS和PL之间存在通信,例如通过基于PL的外设发生的通信,则需要采取三个操作。首先,很明显,必须给可编程逻辑供电,并且必须用位流加载配置内存。该位流可以在稍后的时间用部分位流或另一个完整的位流重载。虽然不是标准做法,但可以将MPSoC配置为在PL处于断电状态时启动,或者更糟糕的是,将eFuses设置为永久禁用可编程逻辑。显然,如果efuse这样做,整个MPSoC将需要更换。PS和PL之间的电平转换器必须启用。虽然这些电平移位器在硬件开发时对用户是透明的,但软件仍然必须启用移位器。这段代码已经存在于FSBL的psu_post_config函数中。缺省情况下,PS持有reset中的PL。只有在重置解除并启用PL的时钟后,PL才会激活并响应PS。可以在任何时候配置到PL的时钟,但必须是可操作的,才能使PL运行。唯一的例外是PL可以由外部源进行计时。关于PL中的时钟的最后一点:使用基于PL的时钟来计时AXI连接是不寻常的,并且不符合最佳设计实践。
- 一旦FSBL加载了处理器的存储器并可选地配置了可编程逻辑,它就必须通过控件转到应用程序并退出。这有两种形式。
(1)失败的的加载
关于FSBL有两种类型的故障可能发生。第一个处理如果FSBL加载和执行失败会发生什么。这是设备相关的。Zynq7000系列设备将回落到JTAG通信,用户可以手动下载代码或调试FSBL,而MPSoC设备将锁定作为安全预防措施。但是,如果我们说的是FSBL移交程序,我们已经过了这个阶段第二种类型的故障发生在FSBL成功运行并将应用程序加载到内存中,并准备将控制权移交给该应用程序时。如果新应用程序运行在运行FSBL的同一处理器上,并且切换失败,或者更有可能的是切换成功,但由于应用程序中的错误而导致代码无法运行,那么系统将锁定。如果加载的应用程序在FSBL退出后无法正常运行,则可以将FSBL配置为启动看门狗定时器来重置系统。回想一下,运行FSBL的处理器不一定是运行新应用程序的处理器。例如,FSBL可以在其中一个RPU处理器上运行,并加载U-boot应用程序,由其中一个APU处理器运行。这将允许FSBL监视新的应用程序,并在出现问题时重新加载它。由于有许多解决方案,因此如何进行这种监视留给用户自己练习。
(2)好的加载;
一旦加载了用户应用程序,就会调用程序集函数fsbl切换。该函数使适当的缓存和预测管道失效,禁用缓存和MMU使用,然后跳转到FSBL刚刚加载到内存中的应用程序。默认情况下,PS块中的外设不会重置,它们将保留FSBL设置的配置;否则,如果FSBL没有显式地配置它们,它们将处于硬件配置所描述的默认状态。在使用外设之前初始化外设总是一个好主意。如果PL是由FSBL配置的,那么PL外设将处于硬件规范所描述的默认状态。与PS中的外设一样,最好在使用前在PL中初始化外设。如果存在操作系统,或者将要存在操作系统,那么操作系统可能会在PS和PL中初始化外围设备。
总结
1、FSBL是第一个运行的用户应用程序,它的任务是加载至少一个应用程序。该应用程序可能是加载操作系统的第二阶段引导加载程序,用户可以创建自己的FSBL,它必须与引导映像一起工作AMD Xilinx提供可定制的FSBL。
2、支持多种启动设备,包括NAND和NOR Flash, SD/eMMC和QSPI。启动设备通过三个模式引脚选择,默认FSBL读取。