精华内容
下载资源
问答
  • 本文主要介绍zynq启动过程,主要包括BootROM和FSBL等的执行过程。硬件启动过程1、重新上电或POR复位后进行硬件启动过程2、扫描“启动引脚”设置,并存入只读寄存器slcr.BOOT_MODE中3、若使能pll,则等到pll输出时钟...

    本文主要介绍zynq启动过程,主要包括BootROM和FSBL等的执行过程。

    硬件启动过程

    1、重新上电或POR复位后进行硬件启动过程

    2、扫描“启动引脚”设置,并存入只读寄存器slcr.BOOT_MODE中

    3、若使能pll,则等到pll输出时钟;若旁路pll,则直接使用ps_clk时钟

    更详细硬件启动过程可以参考下图

    BootROM

    BootROM在POR复位后经过硬件启动后自动运行,也可在非POR复位后直接运行(不经过硬件启动),其内容固化在内部ROM中,不能修改,主要初始化MMU和一些系统资源(以使其满足BootROM执行的要求)以及加载FSBL程序段等。BootROM在CPU 0执行,而CPU 1执行WFE指令

    主要过程如下:

    1、硬件启动后BootROM将初始化MMU、NAND、NOR、QSPI、SD和PCAP等基本外设

    2、判断启动设备(决定于硬件启动过程时扫描的“启动模式”引脚,即寄存器slcr.BOOT_MODE)并搜索boot镜像头信息,各启动模式搜索范围:

    Quad-SPI,头16 MB空间搜索

    NAND,头128MB空间搜索

    NOR,头32MB

    SD卡中只加载一次,不会搜索

    3、BootROM会根据启动模式配置MIO,还会根据读取的boot镜像头信息的“寄存器初始化参数”部分配置时间优化寄存器

    4、从指定启动设备中加载SFBL到OCM(加载时也会读取头部信息确定加密状态,文件长度等,若加密则还需解密后加载到OCM,BootROM头信息都不会加密),另外还支持直接在QSPI或NOR中执行(从头部信息中文件长度为0时,这时就不用加载到OCM了)

    5、跳转到SFBL中执行,BootROM关闭

    其它说明:

    如果已经为加密模式,经过非POR复位后,读取BootROM头信息检测到一个非加密的boot,系统将会被锁定

    如果检测到BootROM中有错误,系统也会被锁定

    如果为加密模式则需要等待PL上电才能继续加载,因为解密验证模块(AES and HMAC)在PL部分;而无论时加密模式还是非加密模式再配置.bit文件时都要等待PL部分准备好(通过检查寄存器devcfg.STATUS [PCFG_INIT])

    FSBL

    FSBL主要初始化更多的外设(如DDR)、初始化PL部分和加载SSBL或裸机程序等。

    主要过程如下:

    1.初始化MIO、PLL、CLK等,ps7_init()中所做

    2.根据vivado(或XPS)中设置完成PS端初始化

    3.判断启动设备(决定于寄存器slcr.BOOT_MODE)并从中扫描并加载.bit和SSBL或裸机程序

    4.用.bit配置PL部分(FSBL通过PCAP控制器配置PL部分)

    5.加载SSBL或裸机程序到DDR中

    6.跳转到SSBL或裸机程序中执行

    对于FSBL程序通常使用SDK中自带模板,但是不同于BootROM不可改变,FSBL可以手动修改实现一些自定义的内容。而且可以像裸机程序一样调试排错(在fsbl_debug.h中定义宏FSBL_DEBUG_INFO(#define FSBL_DEBUG_INFO)可以查看FSBL打印的调试信息)

    注意:由于OCM大小为256KB,而在BootROM阶段OCM高64KB(OCM 从0x0000_0000开始192KB,从0xffff_0000开始64KB)用于存储BootROM头信息和变量,在BootROM执行完成后才可用于FSBL,所以FSBL大小要小于192KB。

    其它说明:

    当从外部器件中启动为非加密模式时,才能使用JTAG进入调试模式

    直接在NOR or Quad-SPI中运行的FSBL必须为非加密模式

    FSBL大小要小于192KB,但是直接在flash器件(NOR or Quad-SPI)中直接运行的情况没有这个限制

    AES一次只能解密1Byte,所以PCAP在4个时钟周期内只能发送一个32bit数据(加密配置时)

    SSBL

    通常SSBL就是裸机程序,对于Linux启动来说就是u-boot之类的bootloader。

    对于没有使用PL部分的设计,即只把zynq当做普通ARM来使用,则完全可以不用FSBL,而通过BootROM直接加载裸机程序并运行(使用方式和注意事项请看“zynq的三种启动方式(JTAG,SD,QSPI)”)。

    展开全文
  • ZYNQ 7系列所有可编程器件均可以在安全模式下通过静态存储器配置或者在非安全模式下通过JTAG或者静态存储器配置。(1)JTAG模式主要用于开发和调试(2)NAND、并行NOR、串行NOR、SD卡闪存均可以用作器件的启动处理器系统...

    ZYNQ 7系列所有可编程器件均可以在安全模式下通过静态存储器配置或者在非安全模式下通过JTAG或者静态存储器配置。

    (1)JTAG模式主要用于开发和调试

    (2)NAND、并行NOR、串行NOR、SD卡闪存均可以用作器件的启动

    处理器系统启动主要包括两个阶段:

    (1) Stage-0的启动代码存储在内部的BOOTROM,这部分启动代码用于ARM处理器和必 要的外设的配置以便可以开始从启动器件中取出第一阶段引导加载程序的启动代码。可编程逻辑部分不能被BootROM配置.BootROM是不可写的

    (2)第一阶段引导加载程序的启动代码通常被存储在一个flash存储器中,或者可以通过JTAG下载。BootROM代码将FSBL的启动代码从选定的flash存储器中拷贝到片上存储器中。拷贝到OCM(片上存储器)中的FSBL的代码的大小被限制在192kb。FSBL开始执行的时候,OCM的全部256kb的空间全部可以使用,剩余的64kb的存储空间也不再被保留。

    FSBL的启动代码是受完全使用者控制的,通常被称作用户启动代码。这提供给使用者足够的灵活性以实现其系统所需的任何的启动代码。

    XILINX提供一个参考的FSBL的启动代码帮助使用者实现自己的需求。这部分启动代码包括PS部分外设的初始化代码,FSBL详细的初始化时序请参阅SDK提供的FSBL代码。FSBL的启动镜像可以包括一个用于初始化PL部分的比特流。

    PL并没有要求必须在这一阶段进行配置,因为在PL没有配置的时候,PS是完全可操作的。我们可以自定义FSBL的启动代码,从而使用其他的PS外设,例如以太网、USB、或者标准输入和输出IO口对PL进行配置。

    存在以下几种可能的启动模式:

    (1)PS作为主机的非安全模式

    (2)PS作为主机的安全模式

    (3)通过JTAG/PJTAG启动

    ZYNQ 7系列所有可编程器件均支持安全模式和非安全模式两种启动流程,如下:

    (1)Stage-0启动(BOOTROM)

    (2)第一阶段引导加载程序

    (3)可选择阶段

    Stage-0启动的流程图如下:

    第一阶段引导加载程序(FSBL)开始于boot之后。启动代码被BOOTROM拷贝到片上存储器中,FSBL的主要任务:

    (1)使用XPS提供的PS的配置数据进行系统的初始化

    (2)使用比特流文件进行PL的配置

    (3)向DDR存储器中加载第二阶段引导加载程序或bare-metal引用代码

    (4)执行第二阶段引导加载程序或者bare-metal应用

    FSBL的大致流程如下

    FSBL的特性

    (1)FSBL Fallback

    为了从error中恢复,FSBL会进行一次fallback,并加载另一个存储在flash存储器中可启动的镜像文件。FSBL更新mulTIboot寄存器,并产生一个软件复位,以便bootrom执行并加载一个可执行的现存的镜像文件。

    (2)FSBL MulTIboot

    FSBL存在一种机制:提供一个可以mulTIboot的寄存器,寄存器中列出了flash中多个可以启动的镜像文件,并且可以更新mulTIboot的地址以指向boot的镜像文件,从而可以保证bootrom可以从flash存储器中加载所需的镜像文件。

    (3)FSBL Hooks

    FSBL的hooks提供了一个插入曾经使用过的函数的简单的方法。FSBL的hook函数存在于fsbl_hook.c文件中。

    fsbl_hook.c文件中主要包括以下的函数:

    FsblHookBeforeBitstreamDload:该函数用于在比特流文件被下载之前。可以在比特流文件被下载之前向程序中加载定制的代码。

    FsblHookAfterBitstreamDload: 该函数用于比特流文件被下载之后。可以在比特流文件被下载之后向程序中加载定制的代码。

    FsblHookBeforeHandoff: 该函数用于FSBL转向应用之前。可以在FSBL转向应用之前向程序中加载定制的代码。

    通过使用这些函数,用户可以在FSBL的流程时序中加载任意的初始化代码。

    (4)DDR 错误检查与纠正

    可以通过XPS ZYNQ tab使能DDR的错误检查与纠正:FSBL负责DDR的初始化。

    因为FSBL并不对DDR进行重新构图,所以DDR从大于1MB的位置启动。应用必须从1MB的位置开始使用DDR,如果需要重新构图的话,就初始化小于1MB的存储器用来进行错误检查与纠正。

    ZYNQ的PS的配置

    使用Zynq的配置用户界面,XPS生成用于初始化MIO和SLCR(系统级的控制寄存器)寄存器。在XPS的工程目录下,需要特别关注的文件有:ps7_init.c和ps7_init.h,这两个文件可以用来初始化CLK,DDR和MIO。ps7_init.tcl执行的初始化和ps7_init.c一样。ps7_init.tcl文件,这个文件可以用来初始化CLK、DDR和MIO。ps7_init.tcl执行的初始化和ps7_init.c一样。

    注意:Tcl文件在使用XMD调试程序的时候比较有帮助。例如,你可以运行ps7_init.tcl文件,之后加载应用程序后加载应用程序到DDR中,然后进行调试。这种情况下,完全没到DDR中,然后进行调试。这种情况下,完全没有必要进行FSBL。

    ps7_init.html,该文件描述了初始化的数据。

    镜像文件的格式主要包括启动镜像文件的格式和分区头表文件格式两个方面。

    启动镜像文件格式包含:

    (1)BootROM的头

    (2)FSBL的镜像

    (3)一个或者多个分区镜像

    (4)未使用的空间(如果有)

    下图展示了启动镜像格式的布局

    分区头表:

    分区头表是一个结构体数组包含如下表所示的数据。对于每一个分区存在一个结构体,包括FSBL分区,表中的最后一个结构体被所有NULL值的标记。

    偏移量 名称 描述

    0x00 分区数据大小 分区数据长度(字长表示)

    0x04 写数据长度 解密的分区中的数据长度(字长表示),这个值和未解密的分区的数据长度一致

    0x08 分区总大小 对应于这个分区头表的启动镜像分区的大小,可能包含一些未使用的留作扩展的空间

    0x0c 引导地址 向存储中引导镜像的地址,这个地址就是PS数据写入的地方,这部分对PL的比特流分区不适用

    0x10 执行地址 可执行文件启动的位置,这部分对PL的比特流分区不适用

    0x14 分区偏移量 从分区数据所对应的引导映像的开始到此分区头表起始的字节数

    0x18 属性 第5位被设置为比特流分区,第4位被设置为PS分区,其余保留

    0x1c 分区数据段数 分区数据中独立加载的数据段数目,此分区只适用于内存加载分区数据

    0x20到0x3b 保留 保留

    0x3c 校验 用于第一段启动加载程序检查头部的有效性,校验是对此结构中的所有以前值的和按位非

    启动镜像的产生

    Bootgen是一个为Zynq的配置组织启动镜像的工具。Bootgen依据启动镜像格式文件中定义的格式将一个bit文件和ELF文件合并成为一个单独的启动镜像文件,从而完成ZYNQ flash设备的烧写。

    Bootgen自动的将数据结合到启动镜像中,将启动镜像下载到flash存储器中之后,Zynq的BootROM和FSBL使用这个镜像,并自动地从中提取出烧写的数据镜像,并对ZYNQ的设备进行配置。

    展开全文
  • Zynq7000启动流程介绍打了半天。。。一不小心碰到鼠标后退键,啥都木了。。。再来吧一开始呢,我以为Zynq7000是一个加上了双核A9处理器的FPGA芯片。但是看了资料后,才发现,其实不是这么回事Zynq7000就如同他的名字...

    Zynq7000

    启动流程介绍

    打了半天。。。一不小心碰到鼠标后退键,啥都木了。。。再来吧

    一开始呢,我以为

    Zynq7000

    是一个加上了双核

    A9

    处理器的

    FPGA

    芯片。但是看了资料后,才发现,其

    实不是这么回事

    Zynq7000

    就如同他的名字一样,

    Zynq-7000 Extensible Processing Platform

    ,是一个可扩展处理平台,

    简单说就是有个

    FPGA

    做外设的

    A9

    双核处理器。

    所以,它的启动流程自然也和

    FPGA

    完全不同,而与传统的

    ARM

    处理器类似。

    Zynq7000

    支持从多种设备启动,包括

    Jtag, NAND, parallel NOR, Serial NOR (Quad-SPI),

    以及

    SD

    卡。按手册说明除了

    Jtag

    之外的启动方式均支持安全启动,使用

    AES

    SHA256

    加密后的启动代码

    (不过在勘误里说到,当前硅片版本的无法正常使用

    secure configuration

    功能,所以俺就不介绍它鸟)

    还是按照时间顺序来介绍下具体流程吧

    1.

    在器件上电运行后,处理器自动开始

    Stage-0 Boot

    ,也就是执行片内

    BootROM

    中的代码

    2.BootROM

    会初始化

    CPU

    和一些外设,以便读取下一个启动阶段所需的程序代码,

    FSBL

    (

    First Stage

    Bootloader

    )。

    不过这又有一个问题了

    ----

    之前说到,

    Zynq

    支持多种启动设备,

    BootROM

    怎么知道从哪个启动设备里去

    加载

    FSBL

    ?这就得靠几个特殊的

    MIO

    引脚来选择了,具体见下图

    展开全文
  • zynq fsbl 学习笔记

    2017-12-13 11:25:33
    zynq fsbl 学习笔记,主要记录fsbl的生成过程。还有fsbl的流程含义。
  • 花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程。众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM的部分,ARM部分是双核的A9处理器。关于...

    花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程。

    众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM的部分,ARM部分是双核的A9处理器。关于FPGA的部分在这里就不说了。其实说的简单点,可以吧这个芯片看成一个带有FPGA外设的ARM处理器,下面详细分析一下启动流程。

    所有的芯片都是从0地址启动的,所以首先找到0地址的代码,在..xxxx.sdk\standalone_bsp_0\ps7_cortexa9_0\libsrc\standalone_v5_1\src\asm_vectors.S中的开头也就是0地址的地方有这样得一段代码:

    其中71行B _boot就是一条跳转命令,跳转到_boot的地方继续运行,在boot.s文件中_boot结束的地方有

    这样的代码,跳转到_start的地方,在xil-crt0.s中我们找到了_start的地方

    可以看见最终跳转到了main函数,从这里开始才真正的进入到了FSBL的代码中执行。打开FSBL的main函数,顺便一提我用的版本是2015.2的SDK。

    我们从main函数开始一步一步的分析:

    1. Status = ps7_init();这条语句是初始化cpu,也就是对寄存器进行设置,设置的依据就是从vivado生成的硬件的信息。

    2. GetSiliconVersion();得到PS的版本,我得到的是3.1的版本

    3. BootModeRegister = Xil_In32(BOOT_MODE_REG);得到boot模式,在这里我使用的是qspi的启动模式。

    4.所以会执行上面这段代码,进行初始化QSPI FALSH,在InitQspi()函数中由于我使用的QSPIFLASH是16M的所以LinearBootDeviceFlag就被赋值为1了。

    下面一句QspiAccess函数赋值给MoveImage函数指针,找到QspiAccess函数:

    这个函数的作用是从FLASH的SourceAddress地址开始复制一段长度为LengthBytes的数据到DDR内存中。所以MoveImage也就有了同样的功能。

    5.FlashReadBaseAddress是在InitQspi()函数中赋值的,就是qspi falsh的起始地址为0xFC000000,在zynq7000的数据手册UG585中可以看到。

    6.HandoffAddress = LoadBootImage();这条语句是整个FSBL中最关键的,这个函数主要做两个事情,一个是分析烧录到qspi中的数据的头的部分,其次是根据分析的结果把数据拷贝到DDR中。在这里还要岔开一下,说明一下烧录到QSPI的数据是怎么生成的。

    zynq 7000的启动方式有很多种,其中包括从QSPI FALSH,SDcard,NOR FLASH,NAND FALSH等地方启动,我这里选用QSPI FALSH启动方式为例进行说明,首先要生成.bin文件,然后把这个文件通过SDK烧录到QSPIflash中。那么怎么生成.bin文件呢,一般来说bin文件中包含fsbl代码,FPGA部分生成的代码,在后面就是用户的应用程序了。

    通过SDK中的Create Boot Image工具生成,打开Create Boot Image,

    可以看见其中MY_FSBL.elf就是对应的FSBL,top.bit就是FPGA生成的流文件,HELLO_WORLD.elf跟rsc_ucosii.elf这两个文件都是应用程序,一般来说一个应用程序就可以了,这里我多添加一个是为了更好地演示。这几个文件的顺序是不能变动的。添加完成之后点击Create Image生成.bin文件,在这之后通过sdk带的Programe Flash进行烧录。

    这回先分析到这里,下次对LoadBootImage()进行详细分析。

    本文转载自:网布的世界

    展开全文
  • 一、启动介绍​ zynq一般情况下,我们是通过xilinx的sdk生成fsbl,然后和fpga程序、uboot一起,生成boot.bin文件,最后固化到spi flash。这样,我们每次更新uboot或者fpga程序,都要重新生成boot.bi...
  • 这里跳过了fsbl,直接从第二个partition加载,因为fsbl的东西已经在使用了,第二部分也就是bit文件。 然后会判断是什么类型,比如是bit还是application。 Status = PartitionMove(ImageStartAddress, HeaderPtr); ...
  • 这里跳过了fsbl,直接从第二个partition加载,因为fsbl的东西已经在使用了,第二部分也就是bit文件。 然后会判断是什么类型,比如是bit还是application。 Status = PartitionMove(ImageStartAddress, HeaderPtr); ...
  • 最近由于项目需要,要将bit文件固化到zedboard的flash中,使程序上电自启,断电不丢失。我们知道,一般板级调试的时候都是直接下载bit流到FPGA就行,固化到...一、ZYNQ的启动流程ZYNQ7000 SOC 芯片可以从 FLASH 启...
  • zynq Mpsoc fsbl

    2021-03-31 11:22:20
    zynq MPsoc启动需要多级加载启动,所以有这么一个fsblfsbl生成 fsbl可以建立工程自动生成,不需要添加修改任何代码,但是还是需要建立一个工程来生成。 sdk->new->applicant project 工程名就为fsbl-&...
  • zynq fsbl启动调试模式

    千次阅读 2016-11-24 11:35:10
    zynq fsbl启动调试模式
  • ZYNQ_FSBL学习

    2020-06-28 21:57:30
    zynq内部的BootROM存储有一段在CPU复位后固定执行的代码。称为stage-0启动代码。 这段代码用来配置一个ARM CPU和一些必要外设,从而能从一个启动设备中获取FSBL(first stage boot loader)执行。BootROM是一个ROM,...
  • 1,什么情况下会使用zynq fsbl的启动调试模式? 答:我们在进行zynq开发,常把项目生成bin文件或者mcs文件,然后加载到板子上进行调试运行。然而有时候把文件加载后,上电板子没任何响应,这时则需要启动zynq fsbl...
  • ZYNQ fsbl阶段的调试方法

    千次阅读 2017-03-25 09:58:32
    在我们面对客户单板的时候,fsbl阶段的调试多少会有些问题,在这个过程中怎么快速定位客户的问题,并将有效的信息反馈给希望能帮助到你的人是决定解决问题时间长短的一个重要因素,在这里我写下一些我个人的调试经验...
  • fsbl/src/fsbl_debug.h中添加 #define FSBL_DEBUG_INFO 打开fsbl中所有的调试信息,启动过程中会有各种调试信息打印出来,这样就会很容易知道启动具体卡在哪个位置。(打印的信息一般显示在串口工具如putty) ...
  • ZYNQ 启动问题 :FSBL

    2020-05-14 18:41:48
    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:...
  • 花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程。众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM的部分,ARM部分是双核的A9处理器。关于...
  • xilinx zynq 7000 FSBL启动分析(一)

    千次阅读 2018-04-19 10:00:53
    花了几天看完了FSBL的代码,在这里做个总结,分析一下zynq的启动过程。 众所周知,xilinx zynq 7000系列的芯片中包括两个部分,PS和PL,也就是FPGA的逻辑编程的部分跟嵌入式ARM的部分,ARM部分是双核的A9处理器。...
  • Zynq Linux移植学习笔记之四 fsbl
  • Zynq-Linux移植学习笔记之四-fsbl

    万次阅读 多人点赞 2017-02-09 22:18:36
    zynq上运行程序的时候,加载过程中肯定需要用到一个文件,那就是fsblfsbl的全称为first stage boot loader,从字面上就能够看出这是zynq启动第一阶段的加载程序,经过了fsbl这一阶段,后面系统才能够运行裸奔...
  • Zynq7020 生成fsbl文件和bit文件

    千次阅读 2018-08-30 16:57:09
    查询了Xilinx的数据手册,我们需要6个文件来进行,分别是:bit文件,dtb文件,fsbl文件,uboot文件,uImage文件,文件系统镜像文件。但是我在最后还差bit和fsbl这两个文件,不知如何生成,最终咨询了他们的FAE,这里...
  • ZYNQ平台学习--(2)生成FSBL

    千次阅读 2018-05-04 16:43:52
    1.ZYNQ启动流程ZYNQ是一个可扩展处理平台,可以看成一个有FPGA外设的A9核处理器。它的启动流程自然也和传统的ARM处理器类似。 ZYNQ支持从多种设备启动,包括JTAG,NAND,parallel NOR,Serial NOR (Quad-SPI),以及...
  • xilinx zynq7000开发记录(uboot_fsbl移植)

    热门讨论 2013-12-14 17:48:16
    详述了xilinx zynq7000 uboot和fsbl移植过程
  • FPGA - Zynq - 加载 - FSBL源码解析1

    千次阅读 2019-06-29 13:54:33
    FPGA - Zynq -加载 - FSBL源码解析1前文回顾FSBL的构成:数据段和代码段如何链接欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的...
  • xilinx zynq 7000 FSBL启动分析(二)

    千次阅读 2018-04-24 16:30:38
    这里跳过了fsbl,直接从第二个partition加载,因为fsbl的东西已经在使用了,第二部分也就是bit文件。 然后会判断是什么类型,比如是bit还是application。 Status = PartitionMove(ImageStartAddress, HeaderPtr...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 239
精华内容 95
关键字:

fsblzynq