1、Qsys 與 Qurartus II 生成的檔案
搭建好的硬件系統,經過 Qsys generate 還有 Quartus II 編譯后,會產生三種文件提 供給 SoC 系統以進行后續軟件開發。如圖所示,這三種文件分別是:


1. SOPC info file(.sopcinfo):文檔用於生成 Device Tree
2. Handoff Folder:里面有關於產生 preloader 相關配置文件
3. System View Descr(.svd):用於 DS-5 debug 功能
可以看到Preloader image file以及Device Tree是軟件流運行所需文件,這里就需要了解一下Altera SOC fapa的啟動步驟:
第1步:起動固化在內部的廠家ROM程序,根據起動引腳的配置,選擇從哪里起動(QSPI,SD,NAND);
第2步:加載Preloader程序到芯片內部的RAM緩存里運行,這一步很重要,有些重要的參數在這一步設置,比方說,IO口復用,DDR3參數等。
第3步:由Preloader程序加載uboot到DDR3里運行。假如在第2步中,DDR3參數設置不正確,就會報Bad image with mismatched CRC校驗錯誤,就沒反應了。
第4步:uboot讀取起動配置文件(uboot.scr),沒有的話,就直接加載zImage。
第5步:再加載設備樹。
具體可以參照下圖:

工程的文件結構如下:

2、 生成Preloader Image 文件
可以看出,preloader 是啟動中很重要的一步,他可以保存在外部存儲中,也可以保存在FPGA結構中。它主要完成以下幾個操作
- SDRAM接口初始化
- 通過掃描管理器對HPS I/O進行配置
- 通過系統管理器配置多功能引腳
- 通過時鍾管理器配置HPS時鍾
- 初始化存儲下一步軟件程序的存儲器(NAND,SD/MMC,QSPI)
- 加載下一步的啟動軟件程序到SDRAM進入到下一步。
因為我們可以通過Qsys刪減ARM端外設及添加與FPGA相連的組件。我們自定義的設定在經過Qsys generate和Quartus II compile時會產生一些HPS和FPGA相關的配置文件。在進行軟件設計時,這些文件可以通過BSP Editor抓換成Preloader需要的輸入檔案。以進一步生成Image文件。下圖是preloader image的制作流程。

步驟如下(這里以HPS基本概念及其設計里的工程為例):
1. 進入 SoC EDS 的安裝路徑並打開 Embedded Command Shell。打開<your path>\embedded\ 並執行 “Embedded_Command_Shell.bat”。Altera Embedded Command Shell 窗口將會出現。

2. 在Embedded_Command_Shell中啟動 BSP Editor:在窗口內輸入 bsp-editor 並按 enter 鍵

3. 產生新的 BSP:打開 bsp-editor 后選擇菜單 File --> New BSP 來創建新的 BSP

4. 在 New BSP 的窗口下選擇 Preloader Setting Directory 的路徑,把路徑指 向上節實驗工程 DE1_SoC_ghrd\hps_isw_handoff\soc_system_hps_0\(例如我的就是 C:\Users\li\Desktop\peixun\de1_soc_training\de1_soc_training\lab\HW\DE1_SoC_GHRD\hps_isw_handoff\soc_system_hps_0無論何時使用Qsys生成SoC設計並在Quartus中編譯,都將生成“hps_isw_handoff”文件夾。此文件夾包含預加載器配置時鍾,IO和SDRAM控制器所需的配置信息。)。如圖所示:

選擇OK ,會BSP編輯器窗口中,我們希望接受大多數默認設置。如果你的開發板支持ECC SDRAM存儲,則應選擇下面顯示的SDRAM擦除選項,否則請將其取消選中。(DE1-SOC不需要此操作及下面的操作,這里直接采用默認的,然后generate就可以了)

Preloader可以從引導設備中的絕對原始地址或SDMMC設備中的FAT分區加載下一級引導映像。在本實驗中,您將配置Preloader以從FAT分區加載u-boot,該分區是SD卡上的分區1。在“設置”下,展開“公共”和“拆分”,然后選擇“啟動”。在“spl.boot”視圖中,選中標記為“FAT_SUPPORT”的框。確保“FAT_BOOT_PARTITION”設置為1,“FAT_LOAD_PAYLOAD_NAME”設置為“u-boot.img”。這些應該是默認設置。

現在單擊Generate按鈕為Preloader生成BSP。

5. 選擇 OK 來產生 BSP setting 文檔以及文件夾。系統將在工程內產生一個 software 的文件夾,並生成一個 settings.bsp 文 檔,如圖所示

| 文件 | 描述 |
|---|---|
| settings.bsp | 預加載器設置文件,包含預加載器生成器的設置 |
| Makefilefile | Makefile用於構建Preloader |
| generated | 包含基於切換文件夾中的信息生成的源代碼的文件夾 |
| preloader.ds | ARM DS-5 AE,可用於加載Preloader |
6.當生成檔案完 成后,按下 exit 完成任務離開窗口, 接下來按下 Generate 生成 preloader 的原始檔以及 Makefile。進入 software\spl_bsp\generated 的子文件夾並查看產生的文檔。可以看到 之前在 Qsys 中有關 HPS 的相關設定已經轉換成..h 頭文件以配置 preloader source code 對應設置。如圖所示:

7、以 pinmux_config.h 為例,可以看到 HPS 的外設的配置使用情況,其中“(1)” 代表該外設被使用,如圖所示:

8.. 在 shell 窗口,進入項目位置里的 softeare\spl_bsp 活頁夾,然后輸入 make 指令如圖所示(若 PC CPU 內核為多核,如 4 核,可輸入 make -j8 進行多線程編譯以提高編譯效率)。

Makefile(也由Preloader Generator創建)執行以下步驟:
- 提取Preloader源代碼的固定部分
- 使用Preloader源代碼的固定和生成部分構建Preloader可執行文件
- 將可執行文件轉換為二進制文件,然后將引導ROM所需的標頭添加到它
9.完成后以下文件內置於“software / spl_bsp /“文件夾:
| 文件 | 描述 |
|---|---|
| uboot-socfpga/spl/u-boot-spl | 預加載器ELF文件 |
| uboot-socfpga/spl/u-boot-spl.bin | 預加載器二進制文件 |
| preloader-mkpimage.bin | 具有引導ROM所需標頭的預加載器映像 |
10. 下一步是產生 preloader 的 image file。先將\sotware\spl_bsp\uboot-socfpga\spl下的u-boot-spl.bin復制到向上 兩層的\sotware\spl_bsp\文件夾下,如圖所示:

12.在 shell 窗口下,路徑也重新定位於此。 並輸入指令 mkpimage –hv 0 –o preloader_with_header.img u-boot-spl.bin 如圖所示:

如此便可以產生 preloader_with_header.img 文件,產生的新的 preloader image file 即可在 linux 環境下,通過輸入相應命令更新到 boot SD card。

3、 生成Devixe Tree
1.設備樹的起源
linux 2.6及之前,大量板級信息被硬編碼到內核里,十分龐大,大量冗余代碼;
linux 2.6之后,引入了設備樹;
設備樹源於OpenFirmware,描述硬件的數據結構。由一些列節點node和屬性property組成,通常包括下列信息:

本質上是畫一棵CPU、總線、設備組成的樹,Linux內核會把設備樹展開成platform_device、i2c_client、spi_device等設備,而這些設備用到的內存、中斷等資源,也會傳遞個內核,內核會將這些資源綁定給展開的相應設備。
典型SOC的內容通常是非常靜態的。因此,描述SOC的設備樹源非常靜態,通常通過手動編輯文本文件來創建。但是,當電路板包含FPGA時,可能包含可以頻繁更改的復雜設計,用於創建設備樹源的工具非常有用。
總的來說,Device Tree是一種有關硬件系統描述的數據結構,他可以描述整個系統上掛載了多少種硬件。通過Device Tree,系統上的硬件信息都可以傳遞給OS(linux)。如此便可以不用在kernel內放置大量的代碼。這種特性對於硬件里有FPGA情況下提供了很大的靈活性。
2.設備樹流程
下圖描繪了生成設備樹的整個流程。

當Qsys產生出 FPGA 的設計后(.sopcinfo),可以使用Altera SoC EDS工具里的Device Tree Generator 來產生 Device Tree 的源文檔(dts)。它描述了有關 HPS 的外設還有 選擇使用到的 FPGA Soft IP 以及用戶自定義的外設等信息。 .dtb文件是.dts文件被Device Tree Compiler編譯后生成的二進制格式的Device Tree 描述,可被 Linux 內核解析。通常在我們為開發板制作 NAND、Sdcard 啟動 image 時, 會為.dtb 文件預留一個很小的存放區域(FAT 分區)。之后 bootloader 在引導 kernel 的過程中,會先讀取該.dtb 到內存。更多關於 Device Tree 的介紹可以參考的鏈接。
設備樹的組成和結構DTS/DTC/DTB
dts:文本
dtc:編譯dts的
dtb:編譯后的二進制文件
3、更新 preloader
我們也 可 以 同 時 更 新 u-boot.img 文件和 preloader.img 文 件 。 將software\spl_bsp\uboot-socfpga 目錄下 生 成 的 u-boot.img 文件也拷貝到software\preloader 中,
4.設備樹生成步驟
1.開啟前面的工程文件夾,檢視是否 Qsys 有生成 soc_system.sopcinfo 文件。同時確認是否有 hps_clock_info.xml 和 soc_system_board_info.xml. Device Tree Generate 將使用這兩個文件來產生 出.dts 文件。

2、在shell中進入工程目錄,輸入以下的命令以產生 .dts 文件,這里直接使用這三個文件,用原來的Makefile文件來生成dts和dtb,dts能夠生成,但是有錯誤,dtb直接無法生成。原因就在於,這是因為在新版本的Quartus II軟件中,第二個使用的不再是hps_clock_info.xml文件,而是hps_common_board_info.xml。這個文件我們可以在SOCEDS軟件安裝目錄下的examples\hardware\cv_soc_devkit_ghrd 文件夾下找到


: 將其中的兩個xml文件hps_common_board_info.xml、soc_system_board_info.xml和一個Makefile復制出來,粘貼到我們自己的工程目錄下,並將原來的三個文件刪除即可。然后make dts在文件夾下可以看到.dts文件已經被生成

2、接着輸入make dtb來產生 .dtb 文件如圖所示:


