北京網(wǎng)站建設(shè)制作公司國內(nèi)seo工具
第七章程序固化實(shí)驗(yàn)
在前面的幾個(gè)實(shí)驗(yàn)中,我們都是通過JTAG接口將FPGA配置文件和應(yīng)用程序下載到MPSOC器件中。接下來我們將嘗試把程序存儲(chǔ)在非易失性存儲(chǔ)器中,在上電或者復(fù)位時(shí)讓程序自動(dòng)運(yùn)行,這個(gè)過程需要啟動(dòng)引導(dǎo)程序(Boot Loader)的參與。Boot Loader會(huì)加載FPGA配置文件,以及運(yùn)行在ARM中的軟件應(yīng)用。
本章包括以下幾個(gè)部分:
77.1簡介
7.2實(shí)驗(yàn)任務(wù)
7.3硬件設(shè)計(jì)
7.4軟件設(shè)計(jì)
7.5下載驗(yàn)證
7.1簡介
MPSOC的系統(tǒng)啟動(dòng)過程由平臺(tái)管理單元(PMU)和配置安全單元(CSU)管理和執(zhí)行。啟動(dòng)過程包括三個(gè)功能階段:預(yù)配置階段、配置階段和后配置階段。
預(yù)配置階段由平臺(tái)管理單元控制。平臺(tái)管理單元運(yùn)行PMU ROM代碼以設(shè)置系統(tǒng)。PMU處理所有復(fù)位和喚醒過程。
在配置階段,BootROM(CSU ROM代碼的一部分)解釋引導(dǎo)頭以配置系統(tǒng),并在安全或非安全引導(dǎo)模式下將處理系統(tǒng)(PS)的第一階段引導(dǎo)加載程序(FSBL)代碼加載到片上RAM(OCM)中。引導(dǎo)頭定義了許多引導(dǎo)參數(shù),包括安全模式和執(zhí)行FSBL的處理器MPCore。在引導(dǎo)期間,CSU還將PMU用戶固件(PMU FW)加載到PMU RAM中,以與PMU ROM一起提供平臺(tái)管理服務(wù)。對于基于Xilinx的FSBL和系統(tǒng)軟件,PMU FW必須存在于大多數(shù)系統(tǒng)中。
FSBL執(zhí)行開始后,CSU ROM代碼進(jìn)入后配置階段,該階段負(fù)責(zé)系統(tǒng)干預(yù)響應(yīng)。CSU硬件提供持續(xù)的硬件支持,以驗(yàn)證文件,通過PCAP配置PL,存儲(chǔ)和管理安全密鑰,解密文件。
啟動(dòng)流程(Boot Flow)
PMU執(zhí)行許多強(qiáng)制性和可選的安全操作,包括:
1、可選功能:將低功耗域(LPD)寄存器歸零。當(dāng)LPD_SC eFUSEs編程時(shí),PMU將LPD中所有寄存器歸零。
2、可選功能:將全功率域(FPD)寄存器歸零。當(dāng)FPD_SC eFUSEs編程時(shí),PMU將FPD中所有寄存器歸零。
3、將PMU RAM歸零:PMU RAM中寫零并讀回以確認(rèn)寫成功。
4、將PMU處理器的TLB內(nèi)存歸零。
5、電壓檢查:PMU檢查LPD、AUX和專用IO的電源電壓,以確認(rèn)電壓在規(guī)格范圍內(nèi)。
6、將內(nèi)存歸零:PMU將位于LPD、FPD和CSU中的內(nèi)存歸零。
一旦這些安全操作完成,PMU通過SHA-3/384引擎發(fā)送CSU不可變ROM代碼,并將計(jì)算出的加密校驗(yàn)和與存儲(chǔ)在設(shè)備中的黃金拷貝(golden copy)進(jìn)行比較,如果校驗(yàn)和匹配,則驗(yàn)證CSU ROM完整性并釋放對CSU的復(fù)位。
PMU負(fù)責(zé)處理主要的預(yù)引導(dǎo)任務(wù)和PS的管理,以確保系統(tǒng)資源的可靠通電斷電。啟動(dòng)PMU的上電復(fù)位(POR)操作,直接或間接的釋放了預(yù)期上電模塊的復(fù)位。在這種情況下,PMU需要ROM代碼來保持初始化上電順序。即使在啟動(dòng)過程之后,PMU仍在運(yùn)行,并且負(fù)責(zé)處理各種系統(tǒng)復(fù)位。在更改系統(tǒng)電源狀態(tài)時(shí)也會(huì)使用它(例如上電、睡眠和喚醒)。
在初始化啟動(dòng)期間,POR將PMU從復(fù)位中釋放,然后執(zhí)行PMU ROM。下面描述了PMU處理器在POR復(fù)位后,通過運(yùn)行PMU ROM預(yù)啟動(dòng)代碼完成的操作序列:
1、初始化PS SYSMON和引導(dǎo)單元所需的PLL。
2、清除PMU RAM和CSU RAM(僅外部POR)。
3、驗(yàn)證PLL鎖。
4、通過PS SYSMON單元驗(yàn)證LPD、AUX和IO電源范圍。
5、清除低功耗和全功耗域。
6、如果前面的步驟沒有錯(cuò),PMU將釋放CSU復(fù)位并進(jìn)入PMU服務(wù)模式。如果有錯(cuò),將產(chǎn)生一個(gè)啟動(dòng)錯(cuò)誤標(biāo)志。
當(dāng)CSU 復(fù)位被釋放,CSU將按照下面序列運(yùn)行:
1、初始化OCM。
2、通過讀取引導(dǎo)模式寄存器來確定啟動(dòng)模式。
3、CSU繼續(xù)在OCM中加載FSBL,以供RPU或APU執(zhí)行。然后,CSU將PMU用戶固件加載到PMU RAM中,以供PMU固件執(zhí)行。
啟動(dòng)模式(Boot Modes)
BootROM可以通過Quad-SPI,SD,eMMC,USB2.0控制器0或NAND等外部設(shè)備啟動(dòng)系統(tǒng)。
MPSOC使用多個(gè)模式引腳來決定配置器件的類型,軟件的存儲(chǔ)位置以及其他的系統(tǒng)設(shè)置,這些引腳共享PS端的MIO引腳。總共有7個(gè)模式引腳,分別為MIO[8:2]。其中,前四個(gè)引腳定義啟動(dòng)模式,第五個(gè)引腳定義是否使用PLL,第六個(gè)和第七個(gè)引腳定義上電過程中MIO bank0和bank1的bank電壓。如下圖所示:
圖 7.1.1 啟動(dòng)模式引腳
整個(gè)系統(tǒng)的啟動(dòng)過程如下圖所示:
圖 7.1.2 MPSOC系統(tǒng)啟動(dòng)過程
7.2實(shí)驗(yàn)任務(wù)
本章的實(shí)驗(yàn)任務(wù)是在“AXI GPIO按鍵控制LED實(shí)驗(yàn)”的基礎(chǔ)上創(chuàng)建FSBL,實(shí)現(xiàn)程序上電自啟動(dòng),包括從SD卡啟動(dòng),QSPI Flash和eMMC啟動(dòng)三種方式。
7.3硬件設(shè)計(jì)
本次實(shí)驗(yàn)在“AXI GPIO按鍵控制LED實(shí)驗(yàn)”的基礎(chǔ)上進(jìn)行。打開《AXI GPIO按鍵控制LED》實(shí)驗(yàn)的Vivado工程,另存為本次實(shí)驗(yàn)工程,工程名為axi_gpio_fsbl,具體過程參考前面的實(shí)驗(yàn)。
接下來對系統(tǒng)的硬件設(shè)計(jì)進(jìn)行修改。在Vivado界面左側(cè)選擇Open Block Design,然后在右側(cè)的Diagram界面中雙擊Zynq UltraScale+ MPSOC模塊修改其配置。
首先使能QSPI外設(shè)。在左側(cè)的導(dǎo)航欄中選擇I/O Configuration,在打開的右側(cè)頁面中,依次展開Low Speed > Memory Interfaces,然后勾選QSPI并在后面的下拉菜單中選擇Single,QSPI Data Mode選擇x4,QSPI IO默認(rèn)為MIO0…5,勾選Feedback Clk并選擇MIO6,如下圖所示。
圖 7.3.1 使能QSPI Flash控制器
然后打開SD卡外設(shè)。在上一步的頁面中,展開SD外設(shè),勾選SD1,在后面的菜單欄中選擇MIO46…51,Slot Type選擇SD2.0,Data Transfer Mode選擇4Bit,勾選CD用于檢測SD卡插入并選擇MIO45,如下圖所示:
圖 7.3.2 使能SD卡控制器
最后打開eMMC外設(shè)。在同樣的頁面中,勾選SD0并選擇MIO13…22,Slot Type設(shè)置成eMMC,Data Transfer Mode選擇8bit,勾選Reset并選擇MIO23,如下圖所示:
圖7.3.3 使能eMMC控制器
上面兩幅圖中具體每個(gè)外設(shè)所連接的MIO引腳可以通過查看開發(fā)板原理圖得知,設(shè)置完成后點(diǎn)擊“OK”。然后在Diagram窗口空白處右擊,然后選擇“Validate Design”驗(yàn)證設(shè)計(jì)。驗(yàn)證完成后彈出對話框提示“Validation Successful”表明設(shè)計(jì)無誤,點(diǎn)擊“OK”確認(rèn)。最后按快捷鍵“Ctrl + S”保存設(shè)計(jì)。
接下來在Source窗口中右鍵點(diǎn)擊Block Design設(shè)計(jì)文件“design_1.bd”,執(zhí)行“Generate Output Products”。最后在左側(cè)Flow Navigator導(dǎo)航欄中找到PROGRAM AND DEBUG,點(diǎn)擊該選項(xiàng)中的“Generate Bitstream”,對設(shè)計(jì)進(jìn)行綜合、實(shí)現(xiàn)、并生成Bitstream文件。
在菜單欄中選擇 File > Export > Export hardware導(dǎo)出硬件,并在彈出的對話框中,勾選“Include bitstream”。
新建vitis文件夾,將生成的xsa文件放入其中。
然后在菜單欄選擇Tools > Launch Vitis,啟動(dòng)Vitis開發(fā)環(huán)境。在彈出的對話框中,將路徑指定到新建的vitis文件夾下,點(diǎn)擊Launch啟動(dòng)Vitis。
到這里我們的硬件設(shè)計(jì)部分已經(jīng)結(jié)束,接下來的軟件設(shè)計(jì)部分需要在Vitis軟件中進(jìn)行。
7.4軟件設(shè)計(jì)
新建工程。參考前面實(shí)驗(yàn)的步驟,新建一個(gè)名為axi_gpio_fsbl的應(yīng)用工程,如下圖所示:
圖 7.4.1 新建應(yīng)用工程
新建源文件。在axi_gpio_fsbl/src目錄上右擊,新建一個(gè)名為main.c的源文件,然后把《AXI GPIO按鍵控制LED》實(shí)驗(yàn)中main.c的代碼拷貝到本實(shí)驗(yàn)的main.c中,如圖7.4.2所示,按“Ctrl+S”保存,然后編譯工程。
圖7.4.2 將代碼拷貝到main.c中
創(chuàng)建啟動(dòng)鏡像。選中應(yīng)用工程,右鍵選擇Create Boot Image,如圖7.4.3所示。接下來,在彈出的界面中添加生成boot.bin所需的文件,然后點(diǎn)擊“Create Image”,如圖7.4.4所示。
圖7.4.3 選擇Create Boot Image
圖7.4.4 添加文件生成Boot.bin
從上圖中可以看到,軟件已經(jīng)給我們自動(dòng)添加所需的文件。首先是Bootloader啟動(dòng)文件,也就是序號(hào)4處的fsbl.elf。其次是FPGA的配置文件design_1_wrapper.bit,在上圖中序號(hào)5處。最后是應(yīng)用程序axi_gpio_fsbl.elf文件,上圖中序號(hào)6處。注意這三個(gè)文件的順序不能錯(cuò)。
圖7.4.4中,序號(hào)2處的bif文件是生成BOOT的配置文件,序號(hào)3處的BOOT.bin就是我們需要的啟動(dòng)文件,可以燒錄到QSPI Flash或eMMC中,也可以放到SD中來啟動(dòng)ZYNQ MOPSOC。
創(chuàng)建完成后,在指定的路徑下可以看到生成的兩個(gè)文件,如下圖所示:
圖7.4.5 生成的BOOT.bin文件
到這里,我們創(chuàng)建啟動(dòng)鏡像文件的過程就結(jié)束了。
7.5下載驗(yàn)證
我們首先來驗(yàn)證如何從SD卡中啟動(dòng)程序。將Micro SD卡插入讀卡器,然后在電腦上將其格式化為FAT32格式,如下圖所示:
圖 7.5.1 格式化SD卡
然后將生成的BOOT.bin文件拷貝到SD卡根目錄下,最后將SD卡從讀卡器中取出,并插入開發(fā)板背面的Micro SD卡的卡槽中。
接下來將開發(fā)板上的啟動(dòng)模式開關(guān)設(shè)置為ON _OFF_ON_OFF,即設(shè)置為從SD卡啟動(dòng)(也就是開發(fā)板上絲印標(biāo)注的0101 SD1)。不同的啟動(dòng)方式與四個(gè)撥碼開關(guān)的狀態(tài)對應(yīng)關(guān)系如下圖所示,其中0代表ON,1代表OFF。
圖 7.5.2 啟動(dòng)模式設(shè)置
最后連接開發(fā)板的電源線,給開發(fā)板上電。
上電后,開發(fā)板上PL配置完成的綠色指示燈點(diǎn)亮。然后每次按下PL_KEY1,可以改變PS_LED1燈的顯示狀態(tài),說明程序能夠?qū)崿F(xiàn)從SD卡中自啟動(dòng)。開發(fā)板實(shí)物如下圖所示:
圖 7.5.3 SD卡啟動(dòng)
SD卡啟動(dòng)驗(yàn)證完成后拔下Micro SD卡。接下來我們來介紹如何將程序固化到QSPI Flash中。
將程序固化到QSPI Flash需要使用JTAG下載器。首先我們將下載器與開發(fā)板上的JTAG接口連接,下載器另外一端與電腦連接。接下來將開發(fā)板上的啟動(dòng)模式開關(guān)設(shè)置為ON_ON_ON_ON,即設(shè)置為JTAG模式(也就是開發(fā)板上絲印標(biāo)注的0000 JTAG)。最后連接開發(fā)板的電源,給開發(fā)板上電。
在Vitis軟件的菜單欄中點(diǎn)擊“Xilinx->Program Flash”,如下圖所示:
圖 7.5.4 打開Program Flash
在彈出的對話框中指定前面所生成的鏡像文件BOOT.bin以及FSBL.elf文件,如下圖中1和2處所示。Flash Type選擇qspi-x4-single,并勾選Verify after flash,如下圖中3和4處所示。
圖 7.5.5 Program Flash 界面
在圖 7.5.5中點(diǎn)擊“Program”,開始對Flash進(jìn)行編程,這個(gè)過程需要花費(fèi)一段時(shí)間。
FLASH編程結(jié)束后,控制臺(tái)提示信息如下圖所示:
圖 7.5.6 QSPI Flash下載成功
接下來斷開開發(fā)板電源,然后將開發(fā)板上的啟動(dòng)模式開關(guān)設(shè)置為ON_ON_OFF_ON,即設(shè)置為32bit QSPI Flash啟動(dòng)(也就是開發(fā)板上絲印標(biāo)注的0010 SPI_32),然后再次連接電源。
連接電源后,開發(fā)板上PL配置完成的指示燈點(diǎn)亮。然后每次按下開發(fā)板上PL_KEY0,可以改變PS_LED1的顯示狀態(tài),說明程序能夠?qū)崿F(xiàn)從QSPI Flash中自啟動(dòng)。實(shí)物圖如下所示:
圖 7.5.7 QSPI Flash啟動(dòng)
最后我們來介紹如何將程序固化到eMMC中。
將程序固化到eMMC需要使用JTAG下載器。首先我們將下載器與開發(fā)板上的JTAG接口連接,下載器另外一端與電腦連接。接下來將開發(fā)板上的啟動(dòng)模式開關(guān)設(shè)置為ON_ON_ON_ON(也就是開發(fā)板上絲印標(biāo)注的0000 JTAG),即設(shè)置為JTAG模式。最后連接開發(fā)板的電源,給開發(fā)板上電。
在Vitis軟件的菜單欄中點(diǎn)擊“Xilinx->Program Flash”,這一步和固化到Flash是一樣的。
在彈出的對話框中指定前面所生成的鏡像文件BOOT.bin以及FSBL.elf文件。Flash Type選擇emmc,并勾選Verify after flash,然后點(diǎn)擊Program,如下圖所示。
圖7.5.8 編程eMMC界面
eMMC編程結(jié)束后,控制臺(tái)提示信息如下圖所示:
圖7.5.9 eMMC下載成功
接下來斷開開發(fā)板電源,然后將開發(fā)板上的啟動(dòng)模式開關(guān)設(shè)置為ON_OFF_OFF_ON,即設(shè)置為eMMC啟動(dòng)(也就是開發(fā)板上絲印標(biāo)注的0110 eMMC),然后再次連接電源。
連接電源后,開發(fā)板上PL配置完成的指示燈點(diǎn)亮。然后每次按下開發(fā)板上PL_KEY0,可以改變PS_LED1的顯示狀態(tài),說明程序能夠?qū)崿F(xiàn)從eMMC中自啟動(dòng)。實(shí)物圖如下所示:
圖7.5.10 eMMC啟動(dòng)