"30年---我与赛灵思FPGA的故事”:ZYNQ-7000使用总结(7) ——ZYNQ的启动和配置

前面在生成从Flash和SD卡启动的镜像文件时有提到一个FSBL,这个和ZYNQ的启动有关系。今天我就介绍一下ZYNQ的启动和配置。因为ZYNQ SoC由PS和PL部分组成,所以它的启动和配置也会稍微复杂一点,这里仅作简单介绍,希望可以起到抛砖引玉的效果。要了解具体的细节可以参考Xilinx官方文档UG585 第6章.

概述
在Zynq上,有一块静态存储区ROM,专门负责zynq刚上电时的启动过程,这个区域称之为boot ROM。系统上电后,根据用户选择的启动方式,boot ROM读取启动方式寄存器内容来决定用户设置的启动方式。不过,只有当电源复位信号PS_POR_B和系统复位信号PS_SRST_B没有处于复位状态时,boot ROM才会读取该寄存器。这里,用户可以选择的启动方式包括Quad-SPI,SD卡,NAND Flash,NOR Flash和JTAG。上电自检完成后,boot ROM会从先前选择的启动设备处读取下一启动阶段会用到的启动镜像(我们之前编译的fsbl镜像),并先读取该镜像文件的头部信息,然后根据这些信息对镜像进行认证。通过认证后,就会把镜像从Flash加载到OCM(On-Chip Memory),然后接下来的启动过程就由FSBL控制。

Zynq的启动还分为安全模式和非安全模式,这个使用用户在前面所提到的头部信息中设置的。除了JTAG方式为,不管以何种模式启动,都是由PS部分的代码来完成PS和PL部分的配置。所以,对于Zynq-7000器件,不能从PL端直接进行启动配置。

不过,Zynq-7000 AP SoC包括电源、时钟、复位等外部设备,boot ROM要想成功运行,这些条件也必须满足才可以。关于这些外部条件的细节,可参阅UG585文档6.2小结。这里着重介绍一下Zynq的启动过程的三个阶段:
阶段0(Stage 0):这个阶段也就是前面所将的Boot ROM阶段,控制整个芯片的初始化过程。Boot ROM中的代码是固化的,不可修改的,处理器在上电或者热启动时自动执行这部分代码。

阶段1(Stage 1):这个阶段由FSBL(First Stage Boot Loader)负责启动过程。在Zynq中,可以直接利用SDK生成这部分的文件,但是用户可以对该部分的代码进行修改,满足自己的需要。所以这个阶段的启动代码已经是用户可以控制的了。

阶段2(Stage 2):这个阶段其实就是用户自己的设计代码了,对应于FSBL,这一阶段一般称之为SSBL(Second Stage Boot Loader)。

接下来会对这三个阶段进行介绍。

Stage 0——Boot ROM

BootROM的作用
上电复位后,PS端开始配置工作。在非JTAG启动模式下,ARM将执行Boot ROM中的代码,该部分代码负责对NAND、NOR、Quad-SPI、SD卡与PACP的基本外设控制器进行初始化,使得ARM核可以访问这些外设。而DDR等其他外设将在Stage 1或者之后进行初始化。处于安全考虑,在PS所有主要模块当中,CPU总是最先启动的。

如前面概述中所述,Boot ROM还负责加载Stage 1阶段的启动镜像,即FSBL。一旦FSBL加载后,Boot ROM就会将系统的控制权交给FSBL,这个时候要想重新执行Boot ROM部分的代码,就必须重启系统。需要注意的是,Boot ROM部分的代码并不对PL部分做任何配置。

Boot ROM的特性

Boot ROM拥有如下指令和特性:

1. 三种不同的PS端配置方法,其中两种主动模式和一种被动模式

. 安全的,加密镜像,主动模式
. 非安全的主动模式
. 基于JTAG的非安全被动模式

2. 四种主动启动源:
. Quad-SPI flash
. NAND flash
. NOR flash
. SD card

3. PS部分采用AES-256和HMAC(SHA-256)加密的安全配置

4. SoC debug安全

5. 在NOR和QSPI中直接运行

Boot ROM Header
前面介绍过,Boot ROM加载FSBL后,会先读取头部信息来获得一些接口的配置信息。头部的数据格式如下表所示:

Fields Header Word Offset
Reserved for Interrupts  0×00 – 0x01F
Width Detection 0×020
Image Identification 0×024
Encryption Status 0×028
User Defined 0x02C
Source Offset 0×030
Length of Image 0×034
Reserved 0×038
Start of Execution  0x03C
Tot al Ima ge Length 0×040
Reserved 0×044
Header Checksum 0×048
Unused  0x04C – 0x09C
Register Initialization 0x0A0 – 0x89C
Unused 0x8A0-0x8BF
FSBL Image 0x8C0

这里也不必去了解每个字段的含义,如果想要了解每个字段的具体含义,UG585文档里面都有介绍。

Boot ROM的运行所耗的时间由多宗因素共同影响,比如电源进入稳定供电时间、选择的配置模式、外部非易失性设备的使用、PS启动镜像的大小以及PL是否供电等。

Stage 1——FSBL
Boot ROM将FSBL加载到OCM或者直接在线性Flash中运行,启动便进入Stage 1阶段。这一阶段FSBL主要完成以下几项工作:
. 根据XPS中的配置,完成PS端的初始化。
. 使用比特流文件对PL进行配置
. 加载SSBL或者裸跑程序到内存空间
. 跳转执行SSBL或者裸跑程序

需要注意的是,FSBL在跳转到SSBL或者裸跑程序之前,并不能使能MMU,因为许多操作系统(例如Linux)假设MMU在启动时是禁用的。根据前面的例子我们也看到了,Xilinx提供了FSBL代码,我们可以通过SDK生成这部分代码,这部分代码可以帮我们完成了PS部分必要外设的初始化工作。当然这部分的代码我们也可以根据自己的需要在SDK中进行修改。


需要指出的是,PL部分的比特流文件、SSBL/裸机程序需要封装成特定格式的Flash分区镜像或是SD卡启动镜像,因为FSBL会遍历分区表来寻找比特流文件、SSBL/裸机程序,然后进行加载配置。封装的方法我们已经在《ZYNQ-7000使用总结(4)——如何生成从Flash和SD卡启动的镜像文件》中进行了讲解,现在我们也知道为什么当时对相关的文件顺序要求比较严格,因为他们在分区表中是有一定格式的。

Stage 2——SSBL
Stage 2阶段是可选的。如果在ARM核上运行的是一个裸跑程序,那么该部分就可以省略了。其实,SSBL就是我们平常嵌入式系统开发中的Bootloader,主要负责将操作系统加载到内存中。

至此,Zynq的启动配置就介绍完了,基本的流程和关键点都覆盖到了。如果想更加深入的了解,可以去参考UG585文档的第6章,专门讲解Zynq的启动和配置。

最后附一张UG585里面的ZYNQ-7000 AP SoC的结构图吧,感觉很清楚:

ZYNQ-7000 AP SoC的结构图
  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值