Using VxWorks BSP with Zynq-7000 AP SoC译文
概述
本文XAPP1158介绍了在Zynq-7000上运行VxWorks 6.9的技术细节。
介绍
Zynq-7000在不使用JTAG的情况下,通过PS完成PS和PL的初始化和配置。配置过程由两部分完成:
- 上电复位或者软复位之后,首先执行BootROM中的固化代码
- PS的设备配置单元(Device Configuration Unit),它控制JTAG调试访问;提供AES、HMAC和PACP等模块的接口,用来实现PL配置和数据解密;
PS可以选择以安全或者非安全模式完成PS和PL的配置。PL的配置还可以由外部主机通过JTAG接口完成。
Zynq-7000的初始化包括以下几个阶段:
Stage 0: BootROM
上电复位或者软复位,从BootROM取第一条指令开始执行。
为了安全起见,BootROM执行过程中,JTAG被禁用。
BootROM包括NAND,NOR,Qual-SPI,SD和PCAP的驱动,不包含DDR和其他外设初始化。
上电复位时,芯片采样一组BOOT_MODE配置引脚的电平,并将采样结果保存到BOOT_ROM寄存器中,BootROM据此选择从哪个启动媒介加载FSBL。
BootROM支持加密和非加密的FSBL镜像文件,由此决定安全启动或者非安全启动。安全启动的解密和校验,通过PL内置的AES-256或者SHA-256硬核实现,因此,如果要支持安全启动,PL必须上电。
Stage 1: FSBL
具体介绍参考UG821。
如果启动媒介支持XIP,则FSBL第一阶段通过XIP方式执行;如果不支持,则由BootROM将FSBL第一阶段代码(不超过192KB)加载到OCM执行。
FSBL负责实现如下功能:
- UG821明确要求的PS配置;
- 加载bitstream文件到PL;
- 加载SSBL或者VxWorks系统镜像到DDR;
- 将控制权移交给SSBL或者VxWorks;
FSBL执行过程中,通常I/D-Cache和MMU被禁用。
Stage 2: VxWorks Bootloader
又称为SSBL(second stage boot loader),负责将VxWorks系统镜像加载到DDR并开始执行,可选。
VxWorks移植
配置和创建VxWorks bootloader
操作步骤详见原文,不予赘述。
配置和创建VxWorks Kernel Image
操作步骤详见原文,不予赘述。
创建和调试Hello World应用程序
操作步骤详见原文,不予赘述。
访问PS侧的外设
Zynq-7000系列SoC使用ARM Cortex-A9处理器,每一个外设都是memory mapped。Zynq-7000的地址映射表在UG585中详细列出。
#include <stdio.h> #include <sys/mman.h> #define GPIO_BASE 0xE000A000 #define GPIO_DIRM_0 0x00000204 #define GPIO_OEN_0 0x00000208 #define GPIO_DATA_0 0x00000040 int main(void) { int val = 0xffffffff; printf("Hello World!\n"); sysOutLong(GPIO_BASE + GPIO_DIRM_0, 0x00000400); sysOutLong(GPIO_BASE + GPIO_OEN_0, 0x00000400); while (1) { sysOutLong(GPIO_BASE + GPIO_DATA_0, val); sleep(1); val ^= 0xffffffff; } return 0; }
访问PL侧的外设
PS和PL之间的两组master GP AXI接口,各自独占1GB地址空间(详见UG585),访问PL侧的外设与访问PS侧外设的区别在于:
首先必须加载bitstream到PL,其中包括AXI_GPIO外设;
其次,必须修改VxWorks BSP,允许访问为PL侧外设分配的地址段;