zynq无ddr在QSPI Flash下XIP模式设计_一阶段

2016-11-21 02:37 阅读 1,103 次 评论 0 条

本阶段的目标是将fsbl在qspi flash中xip模式运行,helloworld应用程序在ocm中正常运行。

首先新建工程完成无ddr使用ocm运行加载,保证fsbl代码正常运行,然后再针对XIP进行修改。

1、增加预编译宏

增加三个宏,DDRLESS_SYSTEM,QSPI_XIP,FSBL_DEBUG_INFO

clip_image002

2、修改FSBL_XIPlscript.ld文件

通过查看已经生成.elf文件,可以查看目前sections分配,对于.elf文件中不存在的sections在lscript.ld文件中可以不分配,并且那些section可以删除。

clip_image004

根据生成的.elf文件分析各个段的属性,是否只读,是否需要load。

对于.text等具有READONLY属性的段,则可以直接放到QSPI Flash中运行,即XIP模式。

直接分配到OCM中的段,包括stack与heap段,在段后已经标明(NOLOAD)说明。

对.data段进行特殊处理,需要load,即需要从QSPI Flash中搬移到ocm中,如下

.data : {

__data_start = .;

*(.data)

*(.data.*)

*(.gnu.linkonce.d.*)

*(.jcr)

*(.got)

*(.got.plt)

__data_end = .;

} > ps7_ram_0_S_AXI_BASEADDR AT > QSPI_FLASH

_dataLMA = LOADADDR(.data); /* 记录地址 */

需要将.rsa_ac设置为NOLOAD,并且增加.sbss段。也可以与demo程序一样,将.rsa_ac段删除。我选择了保留是因为在.elf中有这个段,尽量与.elf保持一致。

如果保留.rsa_ac而没有设置为NOLOAD属性,出现存储器耗尽(memory exhausted)的错误提示如下。

clip_image006

增加.XVtable段,设置为NOLOAD属性

clip_image008

在没有XVTable时elf文件的完整SYMBOL TABLE

clip_image010

增加XVtable后的elf文件分析,XVtable存放的为中断向量表信息(interrupt vector table)。

在link阶段的提示如下:

Building target: FSBL_XIP.elf

Invoking: ARM gcc linker

arm-xilinx-eabi-gcc -L"E:\Test\MicroZed\ZYNQ_XIP\ZYNQ_XIP.sdk\FSBL_XIP\src" -Wl,-T -Wl,../src/lscript.ld -L../../FSBL_XIP_bsp/ps7_cortexa9_0/lib -o "FSBL_XIP.elf" ./src/fsbl_handoff.o ./src/fsbl_hooks.o ./src/image_mover.o ./src/main.o ./src/md5.o ./src/nand.o ./src/nor.o ./src/pcap.o ./src/ps7_init.o ./src/qspi.o ./src/rsa.o ./src/sd.o -lrsa -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilffs,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lrsa,-lxil,-lgcc,-lc,--end-group

d:/xilinx/sdk/2015.1/gnu/arm/nt/bin/../lib/gcc/arm-xilinx-eabi/4.9.1/../../../../arm-xilinx-eabi/bin/ld.exe: FSBL_XIP.elf: section `.data' can't be allocated in segment 0

LOAD: .text .handoff .init .fini .rodata .data .eh_frame .mmu_tbl .init_array .fini_array .rsa_ac

Finished building target: FSBL_XIP.elf

clip_image012

与vivado2016.2版中的提示一样,所以不用理会。

3、修改main.c文件

将viavdo2016.2中的preload_funct()copy()函数内容拷贝到main.c文件中,并且增加包含xl2cc.h头文件。

增加QSPI_XIP宏,并且将LinearBootDeviceFlagc初值赋值为1,如下图

clip_image014

4、修改fsbl_handoff.s文件

在加载完成后跳转,由于没有ddr所以不需要操作cache,修改后如下

clip_image016

5、修改image_mover.c文件

注释掉对FSBL所属的判定;

clip_image018

注释掉对load address check判定,因为它只判定ddr的地址空间为有效的,其它的地址空间均无效;

将代码从boot device搬到内部(PL 逻辑代码)前开启L2 cache

clip_image020

6、修改qspi.c文件

主要是InitQspi(void)中关于qspi初始化部分注释掉,因为运行fsbl xip模式,fsbl的代码已经在qspi中运行了,所以此时再初始化qspi将造成死机。

在下图中,QSPI_XIP宏所在行开始,到函数返回值之前的代码都注释掉。

clip_image022

最后生成bin文件时,必须使用批处理生成,参见zynq soc无外部存储器在QSPI Flash下XIP模式加载运行的中说明。此处又是一个神坑,vivado2015.1的bootgen生成的.bin文件就是不能加载,而使用vivado2016.2版本与vivado2014.2版本均可以正常加载。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:zynq无ddr在QSPI Flash下XIP模式设计_一阶段 | 起点博客
分类:应用笔记 标签:, , , , ,

发表评论


表情