Zynq中存储程序的地方有QSPI Flash,SD卡,EMMC。
Zynq的程序分为三部分,上电启动的引导程序(fsbl),FPGA的程序,arm程序。这里以arm程序存储位置为主进行讨论。
1 ARM为裸机程序
裸机程序比较小,可以将全部程序(fsbl,FPGA的程序,arm程序)一起存储在QSPI Flash,SD卡,EMMC中的任何一个位置。
1.1 固化在QSPI FLASH
使用JTAG和sdk固化。
或者先运行程序,然后通过程序将可执行文件写入到QSPI Flash中,然后将启动方式设置为QSPI Flash启动,下次启动就可以从QSPI Flash启动了。
1.2 固化在SD卡
通过读卡器将可执行文件复制进SD卡,将启动方式设置为SD卡启动,下次启动就可以从SD卡启动了。
1.3 固化在EMMC中
先运行sd卡中的程序(或者通过jtag运行程序),然后通过程序将可执行文件写入到emmc中,然后将启动方式设置为emmc启动,下次启动就可以从emmc启动了。
2 ARM为运行linux的程序
linux跟文件系统一般比较大,全部固化在QSPI Flash中装不下。可以在QSPI Flash中固化一部分。
2.1 部分固化在QSPI FLASH中
可以在QSPI Flash中固化 fsbl+uboot+FPGA的程序+linux内核+设备树,将根文件系统存储在emmc中。
fsbl+uboot本身已经可以运行,uboot运行后会将其余部分拷贝到内存继续运行。以下是uboot中的zynq-common.h中的一部分程序。
"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \"sf probe 0 0 0 && " \
"sf read ${bitstream_load_address} 0x120000 ${bitstream_size} && " \
"fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && " \
"sf read ${kernel_load_address} 0x540000 ${kernel_size} && " \
"sf read ${devicetree_load_address} 0x520000 ${devicetree_size} && " \
"bootz ${kernel_load_address} - ${devicetree_load_address}\0" \