[分享] Zynq-7000 XIP 2018.3,在QSPI Flash中運行程序


 
有些應用中,單板沒有DDR,OCM又不夠存儲所有數據和指令。這種情況下,Xilinx提供了參考設計 Zynq-7000 AP SoC Boot - Booting and Running Without External Memory,把代碼和只讀數據放在QSPI Flash中運行程序,這就是execute in place (XIP)。

上述XIP參考設計工作正常,但是最新只更新到了Vivado/SDK 2017.3,顯得有點老舊,不匹配大部分應用中的工具版本。另外,上述XIP參考設計難於理解,也難於移植到其它單板。舊版本XIP參考設計的缺點。

  1. XIP參考設計工具版本舊。
  2. XIP參考設計改動的文件很多。
  3. XIP的相關代碼沒有單獨標示出來。
  4. 有些改動還在BSP工程里,重新生成BSP工程,會被覆蓋。

為了便於使用,把XIP參考設計更新到Vivado/SDK 2018.3,並減少特殊文件,使用宏DDRLESS_XIP_SYSTEM包含所有XIP代碼。改動后,所有與XIP相關的文件在FSBL或者Application的工程src目錄下。所以SDK 2018.3版XIP參考設計具有以下優點。

  1. XIP參考設計工具版本新。
  2. XIP參考設計改動的文件更少。
  3. XIP的相關代碼單獨標示。
  4. 便於移植2018.3版XIP參考設計到其它單板。
  5. 便於移植2018.3版XIP參考設計到其它工具版本。

1.1. Vivado 工程

Zynq-7000 AP SoC Boot - Booting and Running Without External Memory提供了TCL腳本project.tcl、system_top.tcl,用於恢復硬件工程。
把其中的版本號,從2017.3改為2018.3后,可以使用Vivado 2018.3執行project.tcl創建工程。
但是恢復出來的硬件工程,仍然是使能了DDR控制器。建議在Vivado工程里禁止DDR控制器后,再編譯硬件工程,導出HDF文件。

1.2. FSBL

FSBL 更改的文件如下:

fsbl.h
fsbl_handoff.S
fsbl_hooks.c
fsbl_hooks.h
image_mover.c
image_mover.h
lscript.ld
main.c
pcap.c
pcap.h
qspi.c
qspi.h
translation_table.S
xil_exception.c

上述文件都放在FSBL工程的src目錄下。
引用的BSP工程,是普通FSBL工程的BSP工程。

請在FSBL工程里設置里,定義宏FSBL_DEBUG_INFO,DDRLESS_XIP_SYSTEM 。

1.3. C語言Application

C語言Application更改的文件如下:

Application.c
lscript.ld
startup.s
TimerApp.c
xil_exception.c

上述文件都放在C語言Application工程的src目錄下。
引用的BSP工程,是普通Application工程的BSP工程。

1.4. C++語言Application

C++語言Application更改的文件如下:

app.cc
copyRO.cc
cpu_init.S
lscript.ld
startup.s
xil_exception.c

上述文件都放在C++語言Application工程的src目錄下。
引用的BSP工程,是普通Application工程的BSP工程。

1.5. 啟動文件

制作啟動文件時,必須聲明FSBL在Flash里執行,也就是xip_mode;也必須指定各個部分在Flash的地址,它對應軟件的軟的鏈接腳本一致。

FSBL的鏈接腳本指定了FSBL占用Flash的位置從0x2000開始,所以啟動文件的bootgen.bif也指定FSBL從Flash的0x2000開始。
應用程序的鏈接腳本指定了FSBL占用Flash的位置從0x700000開始,所以啟動文件的bootgen.bif也指定應用程序從Flash的0x700000開始。

1.5.1. 啟動文件的bootgen.bif

//arch = zynq; split = false; format = BIN
the_ROM_image:
{
	[bootloader, xip_mode, offset = 0x2000]C:\prj\fsbl_xip_v183.elf
	[offset = 0x200000]C:\prj\design_noddr_wrapper.bit
	[offset = 0x700000]C:\prj\\Application.elf
}

1.5.2. 常見錯誤

在SDK里,重新指定文件名后,xip_mode會被刪除。即使指定Application的ELF文件,FSBL的xip_mode屬性也會被刪除。如果在FSBL沒有xip_mode屬性的情況下直接制作啟動文件,燒寫后FSBL無法啟動,即使定義了FSBL_DEBUG_INFO,也不會有任何打印。在重新指定文件名后,用文本編輯器打開對應的.bif文件,添加xip_mode屬性,再創建啟動文件,才能正常啟動。

1.6. 已知問題

1.6.1. 調試

XIP模式的代碼,無法單步調試。
調試器下載代碼時,會按ELF中的地址下載。調試器假設代碼使用的存儲器是DDR。因為指令和只讀數據在Flash里,所以無法下載。單步調試時,會修改指令,由於指令在Flash里,也無法修改。

1.6.2. FSBL編譯錯誤

編譯FSBL出現下列錯誤,可以忽略:

ld.exe: FSBL_XIP.elf: section `.data' can't be allocated in segment 0

1.6.3. C++語言Application編譯錯誤

編譯C++語言Application出現下列錯誤,可以忽略:

ld.exe: Application_Cpp.elf: section `.data' can't be allocated in segment 0

1.6.4. 燒寫Flash

燒寫Flash的時候必須指定一個FSBL文件。為了初始化單板,燒寫Flash前必須運行這個FSBL,它要初始化QSPI等。因此必須修改FSBL的main.c,使其在沒有DDR基地址情況下,只是不執行DDR相關操作,繼續初始化devcfg、QSPI等模塊。具體請參考SDK 2018.3燒寫沒有DDR的單板的Flash


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM