ZYNQ :FSBL启动
0、ZYNQ外部启动条件
1、 电源要求:
在阶段0 BootROM时,安全模式下PS与PL都是必须上电的;非安全模式PS需要上电,如图:
在阶段1 FSBL时,PS与PL都是必须上电的,因为PL将在这个阶段进行配置,而PS将负责配置的过程。
2、 时钟要求:必须满足时钟 。
3、 复位要求:主要有两个外部复位源将影响BootROM的执行。(电源复位信号,系统复位信号)
4、 启动引脚设置:需要配置好引脚才能正确启动平台。
1、Stage 0 :BootROM
1、 上电复位以后,PS端即开始进行配置。在不使用JTAG的情况下,ARM将在片上的BootROM中开始执行代码。
2、BootROM中的代码对NAND、NOR、Quad-SPI、SD与PCAP的基本外设控制器进行初始化,使得ARM核可以访问、使用这些外设。
3、加载阶段1的启动镜像(Bin文件:包含fsbl应用程序,bit文件、应用程序)到OCM。
4、需要注意的是PL的配置并不在BootROM中完成,BootROM只为配置PL做好准备。
DDR等其他外设将在阶段1或者之后进行初始化。
PS的启动源是由外部模式引脚的高低电平来选择的,也就是指BootROM将根据外部配置引脚的设置来从不同的外部存储中加载阶段1的启动镜像。
在non-POR或者POR以后,Zynq会完成:
1锁存配置引脚,如下图所示,
2初始化PLL(根据复位时锁存的进行选择初始化或者不初始化)
3初始化APU(由两个ARM CPU构成)
4ROM CRC check
5初始化boot用的引脚(Q-spi,NOR,SD,NAND等等),根据上一步锁存的配置引脚进行选择。
6出发并等待PL完成初始化,前提是PL部分上电已经完成的话。如果此时PL上电没有完成,这这一步直接跳过
7开始搜索BootROM Header,如果搜索到了一个合法的header,就会基于这个header加载FSBL(加密或不加密)
8被加载的FSBL可能是XIP(execute in place,在存储器里直接运行)或者是被加载到了DDR中,加载完毕后BootROM完成任务,将控制权交给了FSBL。
2、Stage 1 :FSBL
1、 FSBL是在BootROM之后启动的引导程序。由BootROM加载到OCM或者直接在线性Flash上运行。FSBL主要完成以下工作:
1) 根据XPS(或vivado)中的配置,完成PS端的初始化。(MIO 、Clock 、DDR)
2) 使用比特流文件对PL进行配置 。
3) 加载第二阶段引导程序(SSBL)或者裸跑程序(无操作系统时)到DDR。
4) 跳转到DDR执行SSBL或者裸跑程序。
注意:FSBL在跳转到SSBL或者裸跑程序前,并不使能MMU。这是因为许多操作系统,例如linux假设MMU在启动时是禁用的。FSBL启动流程:
另外需要注意的是:(fsbl.elf、PL的比特流文件、SSBL或裸跑的应用程序) 等都必须组织成Bin镜像。FSBL将会遍历分区头表来寻找比特流文件、SSBL或裸跑程序所在的位置,然后进行加载DDR或配置。
3、Stage 1 :SSBL(无操作系统时,则不需要)
1、SSBL的引导程序称为BootLoader。Zynq平台中的嵌入式linux就是U-Boot,FSBL帮助我们引导U-Boot到内存中。
2、U-Boot拥有非常强大的功能,提供了许多用户指令、读写内存、flash、USB设备。U-Boot会帮助我们完成linux内核启动之前所必须的硬件初始化,例如串口、DDR控制器等。
4、Linux启动过程:
嵌入式linux从软件层面考虑可以分为以下四个部分:
引导程序(BootLoader)、
linux内核、
文件系统、
应用程序。
U-Boot将为linux内核初始化内存和必要的外设,设置好启动参数。在zynq平台中,采用设备树来传递驱动部分的参数,所以U-Boot还将为内核拷贝设备树镜像文件到内存中。由U-Boot传递给内核的启动参数中通常包含了设备树的地址,文件系统的类型、地址等信息。而后U-Boot将把系统控制权交给linux内核。
当linux内核拥有系统的控制权后,将先进行初始化,建议起内核的运行环境。Linux内核在完成了虚拟地址到物理地址映射后,还有就是驱动设备初始化与挂载。在zynq平台中,采用设备树的方式传递设备驱动的信息,如果有为PL中的IP核编写了驱动程序,也可以使用模块化的方式,待linux启动后再进行挂载。
Linux内核将根据U-Boot传递过来的参数信息选择挂载文件系统的格式与挂载点。最后linux内核将运行init函数,这是内核引导的终点,也是系统所有进程的起点。应用程序都是放在文件系统中。
原文链接:https://www.sohu.com/a/343257597_467791
-------------------------------------分割线------------------------------------------------------------------------------------------
FSBL时间测试:
软重启开始:
到Status = ps7_init()结束; ----------------约107ms
到 DDRInitCheck 结束 ------约1ms
到PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); ----------约0ms
到HandoffAddress = LoadBootImage(); 结束----------约676ms
FsblHandoff(HandoffAddress); 进入该函数内部后运行到 FsblHandoffExit(FsblStartAddr); 直接退出fsbl主程序 -----约2ms
上面步骤结束到进入应用程序------约721ms (应该是FSBL加载应用程序到OCM的时间)
∴软重启到应用程序开始:耗时1.507s 。
fsbl.h :
#define EFUSE_STATUS_REG (0xF800D010) /**< Efuse Status Register */
#define EFUSE_STATUS_RSA_ENABLE_MASK (0x400) /**< Status of RSA enable */
eFuse Write Protection (2-bits) = Bit[8:9]
OCM ROM 128KB CRC Enable = Bit[10]
RSA Authenticaiton Enable = Bit[11]
DFT JTAG Disable = Bit[12]
DFT Mode Disable = Bit[13]
Bit value : 0 = unprogrammed; 1 = programmed