1. 程式人生 > >Zynq啟動過程

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映象頭資訊,各啟動模式搜尋範圍:

  • 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關閉

    其它說明:

  • 如果已經為加密模式,經過非POR復位後,讀取BootROM頭資訊檢測到一個非加密的boot,系統將會被鎖定
  • 如果檢測到BootROM中有錯誤,系統也會被鎖定
  • 如果為加密模式則需要等待PL上電才能繼續載入,因為解密驗證模組(AES and HMAC)在PL部分;而無論時加密模式還是非加密模式再配置.bit檔案時都要等待PL部分準備好(通過檢查暫存器devcfg.STATUS [PCFG_INIT])
  • 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。

    其它說明:

  • 當從外部器件中啟動為非加密模式時,才能使用JTAG進入除錯模式
  • 直接在NOR or Quad-SPI中執行的FSBL必須為非加密模式
  • FSBL大小要小於192KB,但是直接在flash器件(NOR or Quad-SPI)中直接執行的情況沒有這個限制
  • AES一次只能解密1Byte,所以PCAP在4個時鐘週期內只能傳送一個32bit資料(加密配置時)
  • SSBL
    通常SSBL就是裸機程式,對於Linux啟動來說就是u-boot之類的bootloader。

    對於沒有使用PL部分的設計,即只把zynq當做普通ARM來使用,則完全可以不用FSBL,而通過BootROM直接載入裸機程式並執行(使用方式和注意事項請看“zynq的三種啟動方式(JTAG,SD,QSPI)”)。

    以上內容主要來源為UG585