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)”)

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章