已轉(zhuǎn)至Notion
參考資料:
https://www.bilibili.com/video/BV1qz4y1d7pF?p=20
https://www.youtube.com/watch?v=rn6sNLCiNO4
Zynq啟動流程
1.?BootROM
存放在ZYNQ芯片內(nèi)部ROM不可更改僻澎,用于找到FSBL并啟動它(從SD或者QSPI或者NAND),ug585第六章
2.?FSBL
用于引導(dǎo)U-Boot
3.?U-Boot
用于引導(dǎo)Linux?Kernel
petalinux工具可以構(gòu)建2和3還有內(nèi)核
BOOT.BIN包括fsbl十饥,bitstream窟勃,用戶程序(uboot)
image.ub包括了kernel(devicetree DTB和rootfs通過設(shè)置可選包不包含在ub內(nèi))
FSBL代碼分析
主要是分析下FSBL工程的main函數(shù)
1、對PCW進行初始化
調(diào)用ps7_init函數(shù)
主要是對PS端配置信息進行初始化操作逗堵,包括MIO,PLL,CLK and DDR
我們在vivado軟件中可以通過圖形化的方式對ZYNQ PS端外設(shè)進行相關(guān)配置秉氧,那么這些配置信息會寫入到hdf文件,SDK(或petalinux)會對hdf文件進行解析并生成對應(yīng)的寄存器配置表蜒秤,然后FSBL工程中會通過ps7_init函數(shù)將寄存器配置表寫入到對應(yīng)的寄存器中汁咏,完成對MIO/PLL/CLK/DDR等外設(shè)的硬件配置。
2作媚、刷DCache緩存攘滩、禁用DCache緩存
先調(diào)用Xil_DCacheFlush函數(shù)完成刷DCache緩存的操作,然后再調(diào)用Xil_DCacheDisable禁用DCache緩存纸泡。
3漂问、注冊異常處理函數(shù)
調(diào)用RegisterHandlers函數(shù)
4、DDR讀寫測試
調(diào)用DDRInitCheck函數(shù)
5、PCAP的初始化
調(diào)用InitPcap函數(shù)
處理器配置訪問端口
6蚤假、讀取BOOT_MODE寄存器
這個寄存器記錄ZYNQ的啟動方式(QSPI栏饮、SD、NAND磷仰、Nor袍嬉、JTAG)
可以通過MIO3?MIO4? MIO5這三個引腳去配置ZYNQ的啟動方式
ZYNQ上電復(fù)位的時候,會將這三個引腳的電平狀態(tài)保存在BOOT_MODE寄存器當(dāng)中灶平。
7伺通、逐個比較BOOT_MODE寄存器值,確定ZYNQ當(dāng)前的啟動方式
每一種啟動方式會有不同的處理方式民逼。
第一泵殴、先初始化對應(yīng)的flash設(shè)備
第二、再將MoveImage函數(shù)指針指向Flash設(shè)備的讀寫函數(shù)實體
8拼苍、加載啟動鏡像
調(diào)用LoadBootImage函數(shù)
FSBL的主要工作是啟動U-Boot(終極目標(biāo)),也要將bitstream文件加載到PL端调缨。
找到U-Boot疮鲫、bitstream
在讀取U-Boot拷貝DDR中對應(yīng)的加載地址,讀取bitstream加載到PL端
9弦叶、跳轉(zhuǎn)到U-Boot運行地址啟動U-Boot
調(diào)用FsblHandoff(HandoffAddress)
啟動完U-Boot之后俊犯,F(xiàn)SBL的使命的就完成了。