1. 程式人生 > >zynq的啟動方式學習

zynq的啟動方式學習

Zynq-7000AP SOC器件有效利用了片上CPU來幫忙配置。在沒有外部JTAG的情況下,處理系統(PS)與可程式設計邏輯(PL)都必須依靠PS來完成晶片的初始化配置。

ZYNQ的兩種啟動模式:從BootROM主動啟動,從JTAG被動啟動。

ZYNQ的啟動配置分多級進行的。配置至少需要兩步,但通常按如下三個階段進行:

階段0:該階段簡稱為BootROM,控制著整個晶片的初始化過程。放在BootROM中的程式碼是固化的,不可修改的,處理器核在上電或者熱啟動時自動執行這部分程式碼。

階段1:該階段的啟動載入器(FSBL)也可以由使用者程式碼控制。

階段2:這階段通常可以是使用者的PS端的設計程式碼,當然也可以是第二階段的啟動載入器(SSBL),這個階段可以完全由使用者控制,是可選的。

ZYNQ外部啟動條件:
1、 電源要求:在階段0 BootROM狀態時,PS與PL的電源要求如表所示:
這裡寫圖片描述
在階段1 FSBL時,PS與PL都是必須上電的,因為PL將在這個階段進行配置,而PS將負責配置的過程。
2、 時鐘要求:必須滿足時鐘
3、 復位要求:主要有兩個外部復位源將影響BootROM的執行。(電源復位訊號,系統復位訊號)
4、 啟動引腳設定:需要配置好引腳才能正確啟動平臺。

BootROM
1、 BootROM的作用:上電覆位以後,PS端即開始進行配置。在不使用JTAG的情況下,ARM將在片上的BootROM中開始執行程式碼。BootROM中的程式碼對NAND、NOR、Quad-SPI、SD與PCAP的基本外設控制器進行初始化,使得ARM核可以訪問、使用這些外設。而DDR等其他外設將在階段1或者之後進行初始化。BootROM中的程式碼還負責載入階段1的啟動映象。
PS的啟動源是由外部模式引腳的高低電平來選擇的,也就是指BootROM將根據外部配置引腳的設定來從不同的外部儲存中載入階段1的啟動映象,當然也支援線上性Flash上直接執行。
需要注意的是PL的配置並不在BootROM中完成,BootROM只為配置PL做好準備。

FSBL
1、 FSBL是在BootROM之後啟動的載入程式。由BootROM載入到OCM或者直接線上性Flash上執行。FSBL主要完成以下工作:
1) 根據XPS中的配置,完成PS端的初始化。
2) 使用位元流檔案對PL進行配置
3) 載入第二階段載入程式(SSBL)或者裸跑程式(直接在ARM上執行無作業系統程式)到記憶體空間。
4) 跳轉執行SSBL或者裸跑程式。
注意:FSBL在跳轉到SSBL或者裸跑程式前,並不使能MMU。這是因為許多作業系統,例如linux假設MMU在啟動時是禁用的。
FSBL啟動流程:
這裡寫圖片描述
需要注意的是在FSBL階段PL的配置不是必須的,可以將zynq平臺當做兩個ARM核使用。另外需要注意的是:PL的位元流檔案、SSBL、裸跑的應用程式等都必須組織成Flash分割槽映象。FSBL將會遍歷分割槽頭表來尋找位元流檔案、SSBL、裸跑程式所在的位置,然後進行載入或配置。SDK提供了生成flash分割槽映象的工具。

SSBL
第二階段的啟動載入(SSBL)是可選的。
SSBL的載入程式稱為BootLoader。對於執行在zynq平臺的linux系統而言,U-Boot就是SSBL。在zynq平臺中,FSBL幫助我們載入U-Boot到ARM來執行。U-Boot擁有非常強大的功能,提供了許多使用者指令、讀寫記憶體、flash、USB裝置。U-Boot會幫助我們完成linux核心啟動之前所必須的硬體初始化,例如串列埠、DDR控制器等。

Linux啟動過程:
嵌入式linux從軟體層面考慮可以分為以下四個部分:載入程式(BootLoader)、linux核心、檔案系統、應用程式。
Zynq平臺中的嵌入式linux就是U-Boot,FSBL幫助我們引導U-Boot到記憶體中。U-Boot將為linux核心初始化記憶體和必要的外設,設定好啟動引數。在zynq平臺中,採用裝置樹來傳遞驅動部分的引數,所以U-Boot還將為核心拷貝裝置樹映象檔案到記憶體中。由U-Boot傳遞給核心的啟動引數中通常包含了裝置樹的地址,檔案系統的型別、地址等資訊。而後U-Boot將把系統控制權交給linux核心。
當linux核心擁有系統的控制權後,將先進行初始化,建議起核心的執行環境。Linux核心在完成了虛擬地址到實體地址對映後,還有就是驅動裝置初始化與掛載。在zynq平臺中,採用裝置樹的方式傳遞裝置驅動的資訊,如果有為PL中的IP核編寫了驅動程式,也可以使用模組化的方式,待linux啟動後再進行掛載。Linux核心將根據U-Boot傳遞過來的引數資訊選擇掛載檔案系統的格式與掛載點。最後linux核心將執行init()函式,這是核心引導的終點,也是系統所有程序的起點。
應用程式都是放在檔案系統中。