本文主要介紹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鏡像頭信息,各啓動模式搜索範圍:
- Quad-SPI,頭16 MB空間搜索
- NAND,頭128MB空間搜索
- NOR,頭32MB
- SD卡中只加載一次,不會搜索
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)”)