前言
一般的調試中我們都是通過 JTAG 接口將 FPGA 配置文件和應用程序下載到 ZYNQ 器件中。同樣的,我們也可以將嘗試把程序存儲在非易失性存儲器中,在上電或者復位時讓程序自動運行,這個過程需要啟動引導程序( Boot Loader) 的參與。 Boot Loader 會加載 FPGA 配置文件,以及運行在 ARM 中的軟件應用。好吧下面又要開始大段摘抄原子的開發手冊了(感謝原子):
對了很重要的一點:在官方的的fsbl工程中是有調試開關的,在src/fsbl_debug.h中增加FSBL_DEBUG_INFO的宏定義,這樣就將fsbl中所有的調試信息打開,啟動過程中會有各種打印信息。
在 ZYNQ SoC 的啟動和配置過程中, 既需要 PS 的配置信息,又需要 PL 的配置信息。 為了簡化配置 PS和 PL 的處理過程, ZYNQ 的配置順序與 Xilinx FPGA 的配置順序有所不同。 差異來源於以下兩種類型的文件:
1、 FPGA BIT 文件——定義 PL 的行為
2、 軟件 ELF 文件——運行在 PS 中的程序
在 ZYNQ 中, PS 作為主器件, PL 可以看作是 PS 的一個外設,因此需要由 PS 來配置 PL。這個配置順序的優勢是它允許對 PS 單獨上電的時候, 此時 PL 不上電,以減小功耗。 不過也有例外, 就是我們在使用JTAG 下載程序的時候, 此時是使用電腦作為主機來配置 PL。
軟件代碼和配置 FPGA 的 BIT 文件可以存儲在連接到 PS 端的配置存儲器件中。 PS 支持多種片外非易失性存儲器( Quad SPI Flash, NAND Flash, NOR Flash 或 SD 卡) 。領航者 ZYNQ 開發板從硬件上支持 SD卡和 QSPI 作為配置器件。
ZYNQ SoC 的啟動由片上的 BootROM 開始。片上 BootROM 是 ZYNQ 芯片上的一塊非易失性存儲器,它包含了 ZYNQ 所支持的配置器件的驅動, 而且里面的代碼是不可修改的。 BootROM 中的代碼首先會在片外的非易失性存儲器中尋找一個頭文件, 頭文件里定義了一些啟動信息, 用於配置BootROM 的運行。 這些啟動信息包括是程序是否就地執行( excute in place) , FSBL 的偏移地址以及是否為安全模式等。頭文件的存在確保 BootROM 能夠按照配置器件被格式化后的方式操作。
BootROM 執行之后,下一個配置階段被稱為 First-Stage Boot Loader( FSBL), 它是由設計者所創建的。
FSBL 可以配置 DDR 存儲器和硬件設計過程中所定義的一些外設。這些器件需要在加載軟件應用及配置 PL之前就初始化完畢。
總結一下 FSBL 的工作內容:
1、 初始化 PS;
2、 如果提供了 BIT 文件,則配置 PL;
3、 加載裸機應用程序到 DDR 中,或者加載 Second-Stage Boot Loader( SSBL);
4、 開始執行裸機應用程序,或者 SSBL。
PL 的配置是通過處理器配置訪問接口( Processor Configuration Access Port, PCAP) 進行的,它允許對PL 進行部分配置或者完全配置。有關 PL 的部分配置我們會在其他章節予以介紹。 一旦 PS 啟動運行之后, PL 可以在任意時刻被配置, FSBL 和應用程序可以清除、 配置以及使能 PL。要重建一個 ZYNQ 的啟動鏡像我們需要執行以下文件:
1、 Boot ROM 頭文件:控制 Boot ROM 設置,比如就地執行、 加密、 FSBL 偏移量、鏡像文件大小等;
2、 First-Stage Boot Loader;
3、 PL 配置文件, 即 BIT 文件;
4、 運行在 PS 上的軟件應用程序。
ZYNQ SoC 使用多個模式引腳來決定配置器件的類型, 軟件的存儲位置以及其他的系統設置, 這些引腳共享 PS 端的 MIO 引腳。 總共有 7 個模式引腳, 分別為 MIO[8:2]。其中,前四個引腳定義啟動模式,第五個引腳定義是否使用 PLL, 第六個和第七個引腳定義上電過程中 MIO bank0 和 bank1 的 bank 電壓。如下圖所示

整個系統的啟動過程如下

在上電復位( Power On Reset, POR) 之后,硬件會采集模式引腳的狀態, 禁用器件內部的模塊,並根據模式引腳的設置選擇是否使能 PS 的時鍾鎖相環。而在其他的復位條件下, 比如通過 PS 的復位按鍵, 硬件不會執行上述的動作
在菜單欄中選擇“ File->New->Application Project”,然后在彈出的新建工程界面中設置工程名, 並選擇工程中的 BSP, 如下圖所示:

接下來點擊 Next, 並在示例工程中選擇“ Zynq FSBL”,最后點擊“ Finish”如下圖所示:

FSBL 工程創建完成之后, SDK 軟件會自動執行編譯過程,生成 FSBL.elf 文件
接下來我們就可以使用 FSBL、 BIT 文件和 C 應用程序來創建啟動鏡像。在需要的工程文件上右鍵

在彈出的創建 Boot Image 對話框中,設置輸出文件的路徑,如下圖所示

在圖中,設置了兩個文件的輸出路徑, 路徑中的“ bootimage”是我們在 FSBL 目錄下新建的文件夾。紅色方框中的 BIF 是 Boot Image 的配置文件, BIN 是啟動文件。
接下來,點擊圖中紅色圓圈所指示的 Add 按鈕來添加用於生成 Boot Image 的文件,彈出如下圖所示的界面

首先添加的是 FSBL, 在 Partion type 一欄默認的文件類型為 bootloader, 然后指定 FSBL.elf 所在的文件路徑。點擊“OK”后返回圖 7.4.7 所示的界面,再次點擊“ Add”按鈕,添加 FPGA 配置文件,如下圖所示:

從圖可以看到, Partion type 一欄的文件類型變成了 datafile,而 BIT 文件在我們創建SDK 應用時已經導入到 SDK 工程中了。需要注意的是, BIT 文件必須跟在 FSBL 后面,文件添加的順序不能弄錯。
再次點擊OK,返回添加添加elf文件

點擊“ OK”。 ELF 文件添加完成后, 創建 Boot Image 界面如下圖所示:

生成即可
在 SDK 軟件的菜單欄中點擊“ Xilinx->Program Flash”, 如下圖所示:

鏡像文件和FSBL文件放在如圖所示的位上(這個圖都偷原子是不是太過分了,實在沒辦法自己的工程路徑會透露個人隱私和咳咳咳,保密第一所以,對不住了)FLASH類型這塊選擇默認的就行 如下圖所示,應該是和原子的FLASH類型不同吧

至此為止大功告成,固化也就成功了(相比之前單片機的一鍵傻瓜式確實麻煩一些,但是真的不難,從頭到尾自己來上這么一次就熟悉了)
