Zynq中程序存储位置和设置方法

2023-09-01 13:27:46 浏览数 (1)

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中的一部分程序。

代码语言:javascript复制
 "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}" 

第三行是将fpga文件拷贝到内存中,第四行是处理内存中的fpga程序,第五行是将linux内核文件拷贝到内存中,第六行是将设备树文件拷贝到内存中。然后开始运行内核。内核运行后会去运行emmc中的根文件系统。

可以看出 fsbl uboot FPGA的程序和裸机程序是一样的,剩下的就是uboot执行程序的一部分。如果linux内核 设备树存储在别的地方,只需要将上述程序修改为从相应地方拷贝到内存就可以。

固化的话,可以在sd卡中先运行程序,然后按照设定将QSPI Flash分区并将对应的执行程序复制进QSPI Flash中,将emmc格式化为ext4文件系统在将跟文件系统复制进emmc中。再将启动方式设置为QSPI Flash启动,下次启动就可以从qspi启动了。

Qspi存储程序的分区大小可以自定义但是要能存的下程序,比如fpga程序3Mb不能只给个2Mb的分区。

2.2 固化在SD卡

通过读卡器将可执行文件复制进SD卡,将启动方式设置为SD卡启动,下次启动就可以从SD卡启动了。

2.3 固化在EMMC中

先运行sd卡中的程序,然后通过程序将可执行文件写入到emmc中,然后将启动方式设置为emmc启动,下次启动就可以从emmc启动了。

3 区别与联系

可以看出带Linux的就是多了一段跳转,固化在QSPI Flash中的时候由于全部程序比较大需要分散放。fsbl 第一段ARM程序需要在一起并且名字是固定的为BOOT.BIN(这是芯片内部预置程序决定的)。

0 人点赞