1.铺垫
- 在 ZYNQ 中, PS 作为主器件, PL 可以看作是 PS 的一个外设,因此需要由 PS 来配置 PL。这个配置顺序的优势是它允许对 PS 单独上电的时候, 此时 PL 不上电,以减小功耗。 不过也有例外, 就是我们在使用JTAG 下载程序的时候, 此时是使用电脑作为主机来配置 PL。
- ZYNQ无法只固化PL部分的程序,必须借助PS部分,加入FSBL代码。由ZYNQ的架构可知,flash是连接到PS的。因此PS需要首先对外设flash初始化,之后读取其中内容再对PL进行配置。
- ZYNQ的软硬复位:
- ZYNQ上电后首先将系统硬复位(PS_POR_B,断电重启或者手动按键触发都可以硬复位),之后去采样一组boot引脚的电平状态来决定是否使能PS clk PLLs。之后PS开始执行BootROM(ZYNQ片上的ROM)中的一小段代码(用户无法修改)来启动系统。PS_POR_B可以完全地复位ZYNQ。
- 与之相对的还有软复位(non_POR),软复位也可以使BootROM重新执行,但是一些寄存器值可以保留。软复位是由PS_SRST_B引脚或一些内部其他资源引起的。
- 复位后,APU首先执行BootROM中的代码,由CPU0执行,CPU1等待。BootROM中代码主要功能是配置系统,将Boot镜像中(存储在Flash、SD卡)FSBL(First-Stage Boot Loader,SDK给出模板、用户可编辑)/用户代码拷贝到OCM(on chip memory,容量小因此要求FSBL也要小)中执行。在非安全模式下,FSBL/用户代码可以直接在QSPI或nor flash中运行。
- 启动镜像=BootROM头文件(软件自动产生,BootRom用)+FSBL/用户代码ELF文件(BootRom用)+PL的bit流(可选)+系统/应用程序ELF文件(可选)。BootROM引导FSBL运行,FSBL配合bit流、加载应用程序。可用于存储启动镜像的存储器包括QSPI、NAND、NOR、SD卡。
- BootROM的执行顺序由BOOT引脚组设置、BootROM头文件(【一系列指定BootROM执行顺序的参数,如头包括选择安全模式的参数,还包括用于描述拷贝到OCM中执行的FSBL/用户代码的长度参数(max=192KB),该参数也可为0代表就地执行】、BootROM代码决定。BootROM可以在安全模式下执行加密的FSBL/用户代码,也可在非安全模式下执行(不加密)。
- 系统也可在JTAG模式下启动(即平时调试时的形式),在非安全模式下由flash启动后也可使能JTAG。JTAG总是运行在非安全模式下的,但是在JTAG模式中,我们可以方便地调试软件【by ARM debug access port (DAP) 】和PL硬件【by test access port (TAP) 】。
2. ZYNQ的启动模式
- 1、PS的主启动模式下,系统从flash器件中启动。BootROM通过Boot器件配置PS,读BootROM头文件并校验,最后将FSBL/用户代码拷贝到OCM。主启动模式可以在安全/非安全模式下工作。
-
在安全模式下,启动镜像总是由CPU写入OCM内存。 从那里,它被送 (使用DMA)进、送出AES(Advanced Encryption Standard)/HMAC(密钥相关的哈希运算消息认证码)单元进行解密和身份验证。 解密的引导映像被写入OCM内存,并在引导完成后执行。 也就是每个ZYNQ都有一条解密算法专门这对自己的FLASH进行解密,flash中的代码就只能被本zynq使用。
-
在非安全模式下,引导头可以指示PS直接执行引导映像,在支持就地执行的QSPI或NOR引导设备中直接执行。 在其他情况下,fsbl/user代码被复制到OCM内存中执行。 如果闪存设备中的引导头无效,引导代码将持续搜索,直到找到有效的头文件或搜索了整个范围。 支持对QSPI、NAND和NOR引导模式进行引导头搜索。 用于SD卡引导 模式,只读取一个头。
-
- 2、JTAG从启动模式
- BootROM代码执行最小化系统配置并使能JATG。系统进入空闲状态等待DAP控制器去复位CPU0。级联JTAG启动模式会轮回DAP和TAP控制器,这也是最常见的模式。在非安全的主引导模式下,当PL上电,启用JTAG接口进行调试 启动。 JTAG接口可用于访问TAP和DAP控制器。
3. 启动流程图
- POR硬复位后,硬件采样boot设置引脚组,选择性使能PS clk PLLs。这些硬件行为在软复位后不会发生。首先执行的是BootROM中的代码,然后是FSBL/用户代码和系统代码。如下图:
- 上图中的Mode_Pins即为本文中提及的boot设置引脚组。其实是几个MIO引脚,在刚刚启动或者复位时通过拨码开关设置高低电平,进而被用于启动模式选择。启动之后可用于ARM内核的GPIO。
- STAGE0中,BootROM执行就是将一些基本的外设进行初始化,比如我们从Flash读取后续代码那就需要将flash进行初始化。除此之外BootROM也会从flash等非易失性存储器中把FSBL读出到OCM中运行。
- STAGE1中,FSBL(用户也可修改,由SDK帮忙产生的模板)/用户代码执行的就是对更多外设的初始化,比如DDR等。初始化完毕后会从启动镜像中读取bit流来配置PL,加载裸机应用程序到DDR中去运行。
- STAGE2为裸机运行阶段。
- 安全模式下的解密和认证算法是基于PL部分实现的,因此BootROM 执行时必须等待PL上电完成。
- FSBL/用户或者应用程序代码可以清除、编程、使能PL部分的逻辑。
4.Boot模式引脚设置
- MIO[8:2]这7个引脚可以对进行boot设置。通过接20k的电阻进行上下拉来表示逻辑1/0。这些引脚只有在上电配置时表示boot设定,在配置完成后还可以用于其他用途。
- MIO[2]表示JTAG的连接方式是独立还是级联。
- MIO[5:3]表示启动器件类型,通常通过拨码开关设置。
- MIO[6]配置PLL是否使能。
- MIO[8:7]配置bank电压。