Zynq啟動過程
本文主要介紹zynq啟動過程,主要包括BootROM和FSBL等的執行過程。
硬體啟動過程
1、重新上電或POR復位後進行硬體啟動過程
2、掃描“啟動引腳”設定,並存入只讀暫存器slcr.BOOT_MODE中
3、若使能pll,則等到pll輸出時鐘;若旁路pll,則直接使用ps_clk時鐘
更詳細硬體啟動過程可以參考下圖
BootROM
BootROM在POR復位後經過硬體啟動後自動執行,也可在非POR復位後直接執行(不經過硬體啟動),其內容固化在內部ROM中,不能修改,主要初始化MMU和一些系統資源(以使其滿足BootROM執行的要求)以及載入FSBL程式段等。BootROM在CPU 0執行,而CPU 1執行WFE指令
主要過程如下:
1、硬體啟動後BootROM將初始化MMU、NAND、NOR、QSPI、SD和PCAP等基本外設
2、判斷啟動裝置(決定於硬體啟動過程時掃描的“啟動模式”引腳,即暫存器slcr.BOOT_MODE)並搜尋boot映象頭資訊,各啟動模式搜尋範圍:
3、BootROM會根據啟動模式配置MIO,還會根據讀取的boot映象頭資訊的“暫存器初始化引數”部分配置時間優化暫存器
4、從指定啟動裝置中載入SFBL到OCM(載入時也會讀取頭部資訊確定加密狀態,檔案長度等,若加密則還需解密後加載到OCM,BootROM頭資訊都不會加密),另外還支援直接在QSPI或NOR中執行(從頭部資訊中檔案長度為0時,這時就不用載入到OCM了)
5、跳轉到SFBL中執行,BootROM關閉
其它說明:
FSBL
FSBL主要初始化更多的外設(如DDR)、初始化PL部分和載入SSBL或裸機程式等。
主要過程如下:
1.初始化MIO、PLL、CLK等,ps7_init()中所做
2.根據vivado(或XPS)中設定完成PS端初始化
3.判斷啟動裝置(決定於暫存器slcr.BOOT_MODE)並從中掃描並載入.bit和SSBL或裸機程式
4.用.bit配置PL部分(FSBL通過PCAP控制器配置PL部分)
5.載入SSBL或裸機程式到DDR中
6.跳轉到SSBL或裸機程式中執行
對於FSBL程式通常使用SDK中自帶模板,但是不同於BootROM不可改變,FSBL可以手動修改實現一些自定義的內容。而且可以像裸機程式一樣除錯排錯(在fsbl_debug.h中定義巨集FSBL_DEBUG_INFO(#define FSBL_DEBUG_INFO)可以檢視FSBL列印的除錯資訊)
注意:由於OCM大小為256KB,而在BootROM階段OCM高64KB(OCM 從0x0000_0000開始192KB,從0xffff_0000開始64KB)用於儲存BootROM頭資訊和變數,在BootROM執行完成後才可用於FSBL,所以FSBL大小要小於192KB。
其它說明:
SSBL
通常SSBL就是裸機程式,對於Linux啟動來說就是u-boot之類的bootloader。
對於沒有使用PL部分的設計,即只把zynq當做普通ARM來使用,則完全可以不用FSBL,而通過BootROM直接載入裸機程式並執行(使用方式和注意事項請看“zynq的三種啟動方式(JTAG,SD,QSPI)”)。
以上內容主要來源為UG585