2.1 概述
基于 ZYNQ MPSOC 的启动方式包括了 ZYNQ 的加载流程、支持的加载模式、裸机启动、LINUX 启动等。其中加载模式有常用的 JTAG 模式、QSPI 模式、SD 卡模式、NAND FLASH 模式、QSPI+EMMC 模式。如果需要详细了解其中的原理需要阅读大量资料和一些 XILINX 的 FSBL 代码以及 LINUX 启动部分的源码。
对于 SDK 开发的初级读者来说在刚开始入门的时候,掌握复杂的启动原理相对比较困难,所以对于初级读者关键还是掌握主要的启动模式方法、基本的启动流程原理,比如 QSPI 启动、SD 启动、如何制作 BOOT.BIN 文件的能力,满足一般的项目要求。对于需要更加深入掌握比如精简定制 fsbl、multiboot 方式、QSPI+EMMC 启动方式、JTAG 启动方式等,则可以详细阅读 ug585、ug821、阅读 fsbl 代码、分析 linux 中相关的 uboot 启动流程和参数设置。
实验目的:
1:熟悉 ZYNQ MPSOC 启动模式类型和硬件设置
2:熟悉 ZYNQ MPSOC 启动的过程
3:掌握 ZYNQ MPSOC IP SD 接口启动和 QSPI FLASH 启动的设置
4:利用 SDK 产生或者制作 BOOT.BIN 文件
5:完成 SD 卡启动实验
6:完成 QSPI 启动实验
2.2ZYNQ MPSOC 的启动
2.2.1 启动模式的设置
ZYNQ MPSOC BootROM 可以从 Quad-SPI、SD、eMMC、USB 2.0 控制器 0 或 NAND 外部启动设备引导系统。这里我们的硬件只支持 SD 卡启动模式、QSPI 启动模式、JTAG 启动模式(部分硬件不支持)。
2.2.2 上电时序要求
上电时序是确保芯片能正常工作,正在加载的必要条件。所以必须确保硬件设计正确。
2.2.3ZYNQ MPSOC 的启动流程
阶段 0:
PMU 处理所有复位和唤醒过程,当上电复位 (POR) 或非 POR 系统复位(PS_SRST_B、调试、看门狗、软件)后,BootROM 程序开始执行。BootROM 程序读取外部存储器中的 BOOT.BIN 文件,并且查找其中的 BootROM Heard参数,以确认程序如何切换到下阶段 1。如果外部存储中没有找到 BOOT.BIN 文件,BootROM 会跳到下一个 32KB的位置重新搜索 BOOT.BIN
在以下流程图中,展示了第一个阶段的复制 FSBL 到 OCM 的流程图。
阶段 1:
该阶段的描述我们 UG1085 中没有详细说明我们引用 ZYNQ UG585 中的描述作为参考。
阶段 0 把 FSBL 拷贝到 OCM(On-chip memory)中后,CPU0 开始从 OCM 运行 FSBL 代码。包括:
1:初始化 PS 的配置参数包括 MIO、DDR 等
2:使用 BIT 流对 PL 进行编程
3:加载第二阶段的引导程序或者裸机程序到 DDR 存储器中
4:阶段到阶段 2
阶段 2:
该阶段的描述我们 UG1085 中没有详细说明我们引用 ZYNQ UG585 中的描述。
该阶段一般运行的是应用程序比如裸机的应用程序、或者 LINUX 的 boot.elf。也可能是第二阶段引导程序,比如QSPI+EMMC 模式,从 QSPI 完成 fsbl 加载后可以对 eMMC 分区识别,把剩余的加载项放到 EMMC 中,这样只需要一个很小的 QSPI FLASH 就可以了。当然一般我们开发板都采用了足够大的 QSPI FLASH,一般不需要这么节约使用。等 LINUX 部分我们再探讨这方面的问题。
2.2.3 boot image 搜索机制
在 Zynq UltraScale+ MPSoC 设备中,CSU bootROM 支持 MultiBoot 和 Fallback boot image 搜索,而配置安全单元 CSU ROM 或 bootROM 通过 boot devcie 搜索,寻找要加载的有效映像。顺序如下:
1:BootROM 在 flash 中以 32 KB 的偏移量搜索一个有效的 image 标识字符串(作为 image ID)。
2:找到一个有效的标识值后,验证报头的校验和。
3:如果校验和有效,bootROM 将加载镜像
这允许在 flash 中有多个 image。在 MultiBoot 中:
1:CSU ROM 或 FSBL 或用户应用程序必须初始化 boot image 搜索,以选择要从其中启动的不同 image
2:在启动这个 image 搜索时,CSU ROM 或 FSBL 更新 MultiBoot 偏移量以指向预期的 boot image,并通过写入CRL_APB 寄存器来生成一个软重置。
以上给出了一个 fallback boot 流程图 demo,执行下顺序:
1:CSU 引导 rom 加载在 0x000_0000 处找到的 boot image。
2:如果发现该 image 已损坏或解密和身份验证失败,则 CSU bootROM 将 MultiBoot 偏移量加 1,并在 0x000_8000
(32 KB 偏移量)处搜索有效的 boot image。
3:如果 CSU bootROM 没有找到有效的标识值,它将 MultiBoot 偏移量再次增加 1,并在下一个 32 KB 对齐的地
址搜索有效的 boot image。
4:CSU bootROM 重复此操作,直到找到有效的 boot image 或达到 image 搜索限制。在以上 demo 中,下一个
image 显示在 0x002_0000,对应于 MultiBoot 偏移量值 4。
5:在上图的 demo 中,FSBL/CSU-ROM 将 MutiBoot 偏移量更新为 4,以加载地址为 0x002_0000 的第二个映像。当 MultiBoot 偏移量更新时,软复位系统。
2.2.4 Boot image 格式
Boot iamge 由一个 boot header 和不同 image 的分区以及一个分区 header 组成。如下图所示的 boot image 中只有一个强制 image 分区(FSBL),该分区带有相关的强制标头。其中 PMU FW 不是必须的,没有也能启动。
对于安全引导方式,认证证书必须与 FSBL image 一致。Boot header 和 partition header 都是纯文本格式。Boot header 格式如 ug1085-Table 11-4 所示。这是一个与每个 boot image 相关联的纯文本头,它指示各种特征、属性(ug1085-Table 11-5),以及关于该 boot image 的其他详细信息。
Ug1085-Table11-4:boot header 格式:
2.3 硬件电路分析
ZYNQ MPSOC 支持多种启动模式,我们的硬件通过 3P 模式开关设置启动模式可以支持 JTAG 模式、EMMC 模式、SD 卡模式、USB 模式,QSPI 模式
从以上电路可以看出,通过设置模式开关到 ON 为 0,OFF 为 1,比如设置 SD1 启动 101 而模式开关为 OFF ON OFF
MiLianKe8X 开发平台支持五种启动模式。可以通过模式开关来配置 ZU 的启动模式,该模式开关位于核心板上。当 MDOE 为 000 时,开发板支持 JTAG 调试模式。当 MDOE 为 110 时,开发板支持 EMMC 启动模式。当MDOE 为 101 时,支持 SD 卡启动模式。当 MDOE 为 111,支持 USB3.0 启动式。当 MDOE 为 010,启动模式是 QSPI 模式。(模式开关核心板未集成,已通过连接器接至底板)
2.4 ZYNQ IP 相关设置
由于本 demo 直接使用“01Vitis Soc 开发入门”这个 demo,因此不再对 PS 所有的设置重复,只对涉及到固化的QSPI 接口、SDIO、USB 接口的配置重复强调下。
1:QSPI-FLASH 接口
2:SD0 接口
3:SD1 接口
4:USB0 接口
5:时钟设置
对于 USB3.0 接口输入参考时钟一定要先设置好,才能配置 USB3.0
2.5 搭建 Vitis-sdk 工程
直接使用“01Vitis Soc 开发入门”这个 demo 中已经创建好的工程实现。复制整个工程文件到第二个 demo 的文件路径中。
启动 vitis
设置好路径
完成加载后,可以看到和“01Vitis Soc 开发入门”整个 demo 一样。
由于刚刚修改了路径,因此必须对 SDK 工程的路径修改(奇怪的是 VITIS-SDK 居然不是采用相对路径识别办法,这样每次修改工程路径后,都需要打开 SDK 重新指向新的路径才可以,真的是很不友好)。
双击任何一个 APP demo 的.prj ,右边都会展开该 APP 的 soc_base 路径。这里需要大家读者特别注意,如果复制了之前的文件,必须重新修改 Platform 的 soc_base 路径,否则指向的路径可能还是之前的路径要么无法编译,要么无法调试,或者出现其他异常情况。
单击 Manage
可以看到现在指向的还是老的路径,选中后全部删除
之后重新添加,之后单击 OK
选中以后单击 OK
单击 YES,这样就改好了,而且其他的工程的 soc_base 指向的路径也会一起修改,所以只要改一个即可
2.6 SDK 程序固化
使用 SDK 完成基本的固化方法甚至不需要掌握 ZYNQ 的启动原理。只需要正确产生 BOOT.BIN 文件,正确设置模式开关,掌握烧录流程即可,所以以下关键还是软件的操作流程。
2.6.1BOOT.BIN 产生的方法
1:第一方法
右击工程,单击 Build Project
在以下路径可以找到刚刚产生的文件
2:第二种方法
右击需要制作 BOOT.BIN 文件的 SDK APP 工程
一般会自动添加 3 个文件,顺序必须是 fsbl.elf system_wrapper.bit hello_world.elf,之后单击 Create Image,以下涉及路径部分请根据自己的代码而定
可以看到创建的 BOOT.BIN 文件
第二种方法创建的 BOOT.BIN 文件路径
2.6.2 SD 卡启动
直接复制路径下的 BOOT.BIN 文件并且放到 SD 卡中,之后插入开发板
MiLianKe8X 的 TF 卡安装座子,在开发板的背面,安装 TF 卡注意开发板一定要处于断电状态
SD1 启动 101 而模式开关为 OFF ON OFF
为了观察实现结果,需要打开串口
如果不清楚串口号的,可以查看下设备管理器,如果发现没装串口驱动的安装上驱动
2.6.3 QSPI 的启动
对于 MiLianKe8X-2cg 默认的配置作为学习入门使用,最大化降低成本,没有焊接 FLASH,所以做不 FLASH 固化实验,如果焊接了 FLASH 的 ZU 系列可以参考以下版本设置 QSPI 启动。
QSPI 启动 010 而模式开关为 ON OFF ON
烧录完成后给开发板断电,设置模式开关为 QSPI 启动.
然后给开发板通电
|