寫在前面
ZYNQ固化時(shí),正常情況下都需要DDR參與,但是有時(shí)硬件設(shè)計(jì)時(shí),可能將DDR去掉或設(shè)計(jì)出錯(cuò),這將導(dǎo)致ZYNQ無(wú)法正常固化,之前有寫過(guò)一個(gè)使用靜態(tài)鏈接庫(kù)進(jìn)行無(wú)DDR固化的文章,當(dāng)時(shí)那個(gè)是壓縮了FSBL的相關(guān)代碼只保留FLASH模式下的功能,對(duì)于其他模式可能無(wú)法正常使用,本文將無(wú)DDR固化的情況進(jìn)一步進(jìn)行介紹,講解如何修改FSBL實(shí)現(xiàn)ZYNQ的程序固化,給出一個(gè)demo進(jìn)行演示測(cè)試。
適用范圍
不論是之前提到的靜態(tài)鏈接庫(kù)的版本還是本文版本(暫且叫做運(yùn)行在OCM版本)。都只適合PS端的輕量級(jí)代碼,PL端無(wú)特殊要求,但是PL PS交互部分如果需要太多驅(qū)動(dòng)可能也會(huì)超出片上RAM的空間。本工程根本思想就是將fsbl分配到較大的ocm0上,其余應(yīng)用工程分配到ocm1上。
建立工程
建立一個(gè)Block design,添加zynq核,然后勾選,F(xiàn)LASH和UART部分。
ZYNQ配置界面
這里為了驗(yàn)證PL端功能正常啟動(dòng),添加了一個(gè)邏輯常數(shù)用于驅(qū)動(dòng)LED燈。
連接界面
創(chuàng)建HDL頂層,生成output products,因?yàn)樯婕暗絇L端部分,所以需要綜合導(dǎo)出生成bitstream,不要忘記加管腳約束。
操作步驟
當(dāng)運(yùn)行生成bitstream后,導(dǎo)出硬件,并且包含bit流文件。
準(zhǔn)備好硬件平臺(tái)后就可以進(jìn)行SDK的FSBL代碼的修改了。
SDK代碼修改
新建應(yīng)用工程建一個(gè)helloworld工程,打開(kāi)lscript.ld文件將helloworld的代碼段映射區(qū)對(duì)應(yīng)到ps7_ram_1,保存編譯。
helloworld工程的lscript.ld文件
新建應(yīng)用工程建一個(gè)fsbl工程,打開(kāi)lscript.ld文件將helloworld的代碼段映射區(qū)對(duì)應(yīng)到ps7_ram_0,保存編譯。
fsbl工程的lscript.ld文件
打開(kāi)fsbl代碼的fsbl_debug.h文件,增加FSBL_DEBUG_INFO的宏定義方便進(jìn)行查看fsbl的調(diào)試信息。
增加FSBL_DEBUG_INFO
打開(kāi)main.c文件,找到main函數(shù),定位到296行附近,在這里可以看到因?yàn)槿鄙賒dr的部分,該部分代碼將不會(huì)正常執(zhí)行,將會(huì)跳轉(zhuǎn)到下面的代碼中。
定位代碼
代碼以下兩行代碼執(zhí)行后FSBL 狀態(tài)打印輸出0XA008,在fsbl.h文件中對(duì)應(yīng)DDR missing 的狀態(tài)。
實(shí)際執(zhí)行代碼
因此要想使得代碼正常運(yùn)行就要將正常存在ddr時(shí)的代碼正常運(yùn)行,僅刪除和DDR強(qiáng)有關(guān)的部分(影響編譯和運(yùn)行的),然后將代碼運(yùn)行地址設(shè)置到OCM上。
所以,取消對(duì)296行的定義改成如下內(nèi)容。
修改內(nèi)容
此時(shí)如果使用當(dāng)前版本的fsbl的可執(zhí)行文件可以正常進(jìn)行燒寫固化了。但是可能此時(shí)還是無(wú)法正常啟動(dòng),下面步驟用于演示并定位具體問(wèn)題。
選中helloworld工程創(chuàng)建鏡像工程。
創(chuàng)建鏡像
BootLoader選中剛剛修改好的fsbl.elf。
BootLoader選擇
打開(kāi)開(kāi)發(fā)板,選擇jtag模式下燒寫,選擇創(chuàng)建好的鏡像和剛剛的fsbl的elf文件。
燒寫配置
正在燒寫....
燒寫
燒寫完成后關(guān)掉開(kāi)發(fā)板,切換到flash模式下打開(kāi)串口觀察應(yīng)用程序能否正常啟動(dòng)。在我的開(kāi)發(fā)板FPGA done的指示燈和PL端的LED等都只是閃爍了一下,不能正常啟動(dòng)。
此時(shí)還在flash模式下去嘗試在線燒寫。從調(diào)試信息可見(jiàn),F(xiàn)LASH正常啟動(dòng),啟動(dòng)初始化后存在失敗,單步調(diào)試后發(fā)現(xiàn)main函數(shù)的在570行的LoadBootImage()運(yùn)行后就會(huì)存在上述問(wèn)題。
定位問(wèn)題代碼
定位到image_mover.c的436行,發(fā)現(xiàn)此處的DDR_END_ADDR的默認(rèn)定義是0X00,無(wú)法正常執(zhí)行下面的程序。
修改定位
所以這里修改DDR_END_ADDR為片上rom的結(jié)束地址。
修改宏定義
再次重復(fù)操作,完成鏡像生成后,jtag模式燒寫,flash模式啟動(dòng),觀察打印調(diào)試信息。從調(diào)試信息中可以看到,PS端正常啟動(dòng),此時(shí)掛在PL端的LED燈也能正常點(diǎn)亮。
打印信息