首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ZYNQ-7000使用总结(7)——ZYNQ的启动和配置

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后,会先读取头部信息来获得一些接口的配置信息。头部的数据格式如下表所示:

FieldsHeader Word Offset
Reserved for Interrupts 0×00 – 0x01F
Width Detection0×020
Image Identification0×024
Encryption Status0×028
User Defined0x02C
Source Offset0×030
Length of Image0×034
Reserved0×038
Start of Execution 0x03C
Tot al Ima ge Length0×040
Reserved0×044
Header Checksum0×048
Unused 0x04C – 0x09C
Register Initialization0x0A0 – 0x89C
Unused0x8A0-0x8BF
FSBL Image0x8C0

这里也不必去了解每个字段的含义,如果想要了解每个字段的具体含义,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的结构图吧,感觉很清楚:

记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表