ZYNQ :FSBL啟動


0、ZYNQ外部啟動條件

1、 電源要求:
在階段0 BootROM時,安全模式下PS與PL都是必須上電的;非安全模式PS需要上電,如圖:
在這里插入圖片描述
在階段1 FSBL時,PS與PL都是必須上電的,因為PL將在這個階段進行配置,而PS將負責配置的過程。

2、 時鍾要求:必須滿足時鍾 。

3、 復位要求:主要有兩個外部復位源將影響BootROM的執行。(電源復位信號,系統復位信號)

4、 啟動引腳設置:需要配置好引腳才能正確啟動平台。

1、Stage 0 :BootROM

1、 上電復位以后,PS端即開始進行配置。在不使用JTAG的情況下,ARM將在片上的BootROM中開始執行代碼。

2、BootROM中的代碼對NAND、NOR、Quad-SPI、SD與PCAP的基本外設控制器進行初始化,使得ARM核可以訪問、使用這些外設。

3、加載階段1的啟動鏡像(Bin文件:包含fsbl應用程序,bit文件、應用程序)到OCM。

4、需要注意的是PL的配置並不在BootROM中完成,BootROM只為配置PL做好准備。

DDR等其他外設將在階段1或者之后進行初始化。

PS的啟動源是由外部模式引腳的高低電平來選擇的,也就是指BootROM將根據外部配置引腳的設置來從不同的外部存儲中加載階段1的啟動鏡像。


在non-POR或者POR以后,Zynq會完成:
1鎖存配置引腳,如下圖所示,
2初始化PLL(根據復位時鎖存的進行選擇初始化或者不初始化)
3初始化APU(由兩個ARM CPU構成)
4ROM CRC check
5初始化boot用的引腳(Q-spi,NOR,SD,NAND等等),根據上一步鎖存的配置引腳進行選擇。
6出發並等待PL完成初始化,前提是PL部分上電已經完成的話。如果此時PL上電沒有完成,這這一步直接跳過
7開始搜索BootROM Header,如果搜索到了一個合法的header,就會基於這個header加載FSBL(加密或不加密)
8被加載的FSBL可能是XIP(execute in place,在存儲器里直接運行)或者是被加載到了DDR中,加載完畢后BootROM完成任務,將控制權交給了FSBL。


2、Stage 1 :FSBL

1、 FSBL是在BootROM之后啟動的引導程序。由BootROM加載到OCM或者直接在線性Flash上運行。FSBL主要完成以下工作:

1) 根據XPS(或vivado)中的配置,完成PS端的初始化。(MIO 、Clock 、DDR)

2) 使用比特流文件對PL進行配置 。

3) 加載第二階段引導程序(SSBL)或者裸跑程序(無操作系統時)到DDR。

4) 跳轉到DDR執行SSBL或者裸跑程序。
注意:FSBL在跳轉到SSBL或者裸跑程序前,並不使能MMU。這是因為許多操作系統,例如linux假設MMU在啟動時是禁用的。FSBL啟動流程:

另外需要注意的是:(fsbl.elf、PL的比特流文件、SSBL或裸跑的應用程序) 等都必須組織成Bin鏡像。FSBL將會遍歷分區頭表來尋找比特流文件、SSBL或裸跑程序所在的位置,然后進行加載DDR或配置。

3、Stage 1 :SSBL(無操作系統時,則不需要)

1、SSBL的引導程序稱為BootLoader。Zynq平台中的嵌入式linux就是U-Boot,FSBL幫助我們引導U-Boot到內存中。

2、U-Boot擁有非常強大的功能,提供了許多用戶指令、讀寫內存、flash、USB設備。U-Boot會幫助我們完成linux內核啟動之前所必須的硬件初始化,例如串口、DDR控制器等。

4、Linux啟動過程:

嵌入式linux從軟件層面考慮可以分為以下四個部分:
引導程序(BootLoader)、
linux內核、
文件系統、
應用程序。

U-Boot將為linux內核初始化內存和必要的外設,設置好啟動參數。在zynq平台中,采用設備樹來傳遞驅動部分的參數,所以U-Boot還將為內核拷貝設備樹鏡像文件到內存中。由U-Boot傳遞給內核的啟動參數中通常包含了設備樹的地址,文件系統的類型、地址等信息。而后U-Boot將把系統控制權交給linux內核。

當linux內核擁有系統的控制權后,將先進行初始化,建議起內核的運行環境。Linux內核在完成了虛擬地址到物理地址映射后,還有就是驅動設備初始化與掛載。在zynq平台中,采用設備樹的方式傳遞設備驅動的信息,如果有為PL中的IP核編寫了驅動程序,也可以使用模塊化的方式,待linux啟動后再進行掛載。

Linux內核將根據U-Boot傳遞過來的參數信息選擇掛載文件系統的格式與掛載點。最后linux內核將運行init函數,這是內核引導的終點,也是系統所有進程的起點。應用程序都是放在文件系統中。


原文鏈接:https://www.sohu.com/a/343257597_467791


-------------------------------------分割線------------------------------------------------------------------------------------------
FSBL時間測試:

軟重啟開始:

到Status = ps7_init()結束; ----------------約107ms

到 DDRInitCheck 結束 ------約1ms

到PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); ----------約0ms

到HandoffAddress = LoadBootImage(); 結束----------約676ms

FsblHandoff(HandoffAddress); 進入該函數內部后運行到 FsblHandoffExit(FsblStartAddr); 直接退出fsbl主程序 -----約2ms

上面步驟結束到進入應用程序------約721ms (應該是FSBL加載應用程序到OCM的時間)

∴軟重啟到應用程序開始:耗時1.507s 。

fsbl.h :

#define EFUSE_STATUS_REG			(0xF800D010)  /**< Efuse Status Register */
#define EFUSE_STATUS_RSA_ENABLE_MASK (0x400)  /**< Status of RSA enable */

eFuse Write Protection (2-bits) = Bit[8:9]

OCM ROM 128KB CRC Enable = Bit[10]

RSA Authenticaiton Enable = Bit[11]

DFT JTAG Disable = Bit[12]

DFT Mode Disable = Bit[13]

Bit value : 0 = unprogrammed; 1 = programmed


免責聲明!

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



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