查看原文
其他

一文搞懂Zynq的两种启动模式!好文收藏

嵌入式ARM 2021-01-31
Zynq-7000AP SOC器件有效利用了片上CPU来帮忙配置,在没有外部JTAG的情况下,处理系统(PS)与可编程逻辑(PL)都必须依靠PS来完成芯片的初始化配置。 ZYNQ的两种启动模式:从BootROM主动启动,从JTAG被动启动。 

ZYNQ的启动配置分多级进行的。配置至少需要两步,但通常按如下三个阶段进行:

阶段0:
该阶段简称为BootROM,控制着整个芯片的初始化过程。放在BootROM中的代码是固化的,不可修改的,处理器核在上电或者热启动时自动执行这部分代码。 

阶段1:该阶段的启动加载器(FSBL)也可以由用户代码控制。

阶段2:
这阶段通常可以是用户的PS端的设计代码,当然也可以是第二阶段的启动加载器(SSBL),这个阶段可以完全由用户控制,是可选的。

ZYNQ外部启动条件: 

1、 电源要求:在阶段0 BootROM状态时,PS与PL的电源要求如表所示: 

 
在阶段1 FSBL时,PS与PL都是必须上电的,因为PL将在这个阶段进行配置,而PS将负责配置的过程。 
2、 时钟要求:必须满足时钟 .
3、 复位要求:主要有两个外部复位源将影响BootROM的执行。(电源复位信号,系统复位信号)
 4、 启动引脚设置:需要配置好引脚才能正确启动平台。

BootROM 
1、 BootROM的作用:上电复位以后,PS端即开始进行配置。在不使用JTAG的情况下,ARM将在片上的BootROM中开始执行代码。BootROM中的代码对NAND、NOR、Quad-SPI、SD与PCAP的基本外设控制器进行初始化,使得ARM核可以访问、使用这些外设。

而DDR等其他外设将在阶段1或者之后进行初始化。BootROM中的代码还负责加载阶段1的启动镜像。 PS的启动源是由外部模式引脚的高低电平来选择的,也就是指BootROM将根据外部配置引脚的设置来从不同的外部存储中加载阶段1的启动镜像,当然也支持在线性Flash上直接运行。 需要注意的是PL的配置并不在BootROM中完成,BootROM只为配置PL做好准备。

FSBL
1、 FSBL是在BootROM之后启动的引导程序。由BootROM加载到OCM或者直接在线性Flash上运行。FSBL主要完成以下工作: 

1) 根据XPS中的配置,完成PS端的初始化。
2) 使用比特流文件对PL进行配置 .
3) 加载第二阶段引导程序(SSBL)或者裸跑程序(直接在ARM上运行无操作系统程序)到内存空间。 
4) 跳转执行SSBL或者裸跑程序。 注意:FSBL在跳转到SSBL或者裸跑程序前,并不使能MMU。这是因为许多操作系统,例如linux假设MMU在启动时是禁用的。 FSBL启动流程: 

 
需要注意的是在FSBL阶段PL的配置不是必须的,可以将zynq平台当做两个ARM核使用。另外需要注意的是:PL的比特流文件、SSBL、裸跑的应用程序等都必须组织成Flash分区镜像。FSBL将会遍历分区头表来寻找比特流文件、SSBL、裸跑程序所在的位置,然后进行加载或配置。SDK提供了生成flash分区镜像的工具。

SSBL 第二阶段的启动加载(SSBL)是可选的。 SSBL的引导程序称为BootLoader。对于运行在zynq平台的linux系统而言,U-Boot就是SSBL。在zynq平台中,FSBL帮助我们加载U-Boot到ARM来运行。U-Boot拥有非常强大的功能,提供了许多用户指令、读写内存、flash、USB设备。U-Boot会帮助我们完成linux内核启动之前所必须的硬件初始化,例如串口、DDR控制器等。

Linux启动过程: 嵌入式linux从软件层面考虑可以分为以下四个部分:引导程序(BootLoader)、linux内核、文件系统、应用程序。 Zynq平台中的嵌入式linux就是U-Boot,FSBL帮助我们引导U-Boot到内存中。

U-Boot将为linux内核初始化内存和必要的外设,设置好启动参数。在zynq平台中,采用设备树来传递驱动部分的参数,所以U-Boot还将为内核拷贝设备树镜像文件到内存中。由U-Boot传递给内核的启动参数中通常包含了设备树的地址,文件系统的类型、地址等信息。而后U-Boot将把系统控制权交给linux内核。

当linux内核拥有系统的控制权后,将先进行初始化,建议起内核的运行环境。Linux内核在完成了虚拟地址到物理地址映射后,还有就是驱动设备初始化与挂载。在zynq平台中,采用设备树的方式传递设备驱动的信息,如果有为PL中的IP核编写了驱动程序,也可以使用模块化的方式,待linux启动后再进行挂载。

Linux内核将根据U-Boot传递过来的参数信息选择挂载文件系统的格式与挂载点。最后linux内核将运行init()函数,这是内核引导的终点,也是系统所有进程的起点。 应用程序都是放在文件系统中。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存