安昱昕,杜 彬,田 彬
(陜西重型汽車有限公司汽車工程研究院,陜西 西安 710200)
隨著域、集中式車載電子電器架構的發展,基于SoC芯片的車載控制器及車用操作系統研發成為構建域、集中式電子電器架構軟硬件平臺的落地方向,而引導加載程序是車用操作系統加載運行的必要組成,U-Boot作為主流的嵌入式操作系統內核引導加載程序,其穩定性、易移植性已被廣泛驗證。本文介紹了基于G9-X芯片,移植U-Boot引導加載程序的方法,為車用操作系統移植以及后續軟件開發工作提供參考。
U-Boot負責啟動操作系統內核,并向內核傳遞根文件系統路徑、網絡配置信息、內存地址等重要參數。U-Boot設計目的在于滿足多平臺通用性,通過抽取不同硬件平臺系統啟動的共性特征,形成一套平臺通用引導系統架構。各個芯片廠商根據自己芯片特性進一步完成引導系統的定制化開發或移植,提高開發效率同時減少開發成本。
U-Boot啟動流程主要分為兩個階段:CPU初始化和目標板初始化。CPU初始化階段中通過匯編語言初始化SoC芯片相關硬件,如設置CPU模式、關閉MMU、初始化DDR和時鐘等,以及準備C語言運行環境。在準備好C語言運行環境后,CPU便可以處理C程序了,這時如初始化目標板外設,檢測系統內存映射,啟動內核等C程序將被運行,如圖1所示。

圖1 U-Boot啟動流程
由于SoC芯片平臺與PC平臺芯片架構不同,需要在PC平臺搭建SoC平臺的編譯環境完成系統編譯,編譯后的鏡像燒錄到目標板中運行。本文采用基于ARM內核SoC芯片,交叉編譯工具使用ARM官方提供的arm-linux-gcc編譯工具,并在Linux系統下完成交叉編譯環境的構建。
本文基于DENX官方U-Boot2016-3完成SoC芯片適配和目標板適配。參考第1.2節U-Boot啟動流程,U-Boot主要分為兩類文件:芯片啟動文件和目標板描述文件,主要包含UBoot官方提供的已適配芯片平臺和目標板文件,如圖2所示。

圖2 U-Boot文件目錄
arch/、board/、drivers/這3個文件目錄包括芯片、目標板相關信息,U-Boot移植主要工作是在這3個目錄下添加芯片及目標板適配程序和配置文件等,見表1。

表1 芯片及目標板相關文件目錄
芯片適配主要完成SoC芯片內核架構適配以確保內核完成初始化、程序自拷貝、啟動運行等一系列的工作。本文所適配的控制器芯片為ARM架構,U-Boot提供了完整的適配程序,我們可將相應內核目錄下Kconfig文件中內核名應用到目標板適配的配置文件中即可。
對于目標板適配,是將目標板所用的SoC芯片外設信息數據配置到U-Boot程序中,主要有以下步驟。
1)在board/目標板目錄下創建目標板目錄,包括Kconfig、Maintainers、Makefile以及${boardname}.c程序4種文件,如圖3所示。

圖3 board/目錄下文件
其中,Makefile文件中加入指定編譯對象文件:

MAINTAINERS中添加指定配置相關文件目錄:

Kconfig中添加配置編譯信息:

myboard.c程序中主要負責分配外設GPIO接口,以及完成驅動初始化工作,如I2C、EMMC、USB等,在其中加入初始化程序以及GPIO配置宏定義。
2)在include/configs目錄下新建目標板配置頭文件${boardname}.h,通過宏定義存放配置信息,這里創建myboard.h文件:

通過宏定義配置啟動boot地址、串口波特率、Fuses、GPIO、文件系統支持等,添加以下配置選項。

此外,根據需要使用的外設完成配置項,表示使用該外設,如以太網、MMC、I2C、USB等,也包括U-Boot默認環境變量的定義,添加如以下配置選項:

3)根據CPU架構,在arch/各級目錄下(表1)Kconfig文件中添加目標板配置信息,arch/下Kconfig中添加CPU和目標板配置信息、設備信息和編譯頭文件名稱,并將第一級配置信息名稱添加到defconfig文件中,常用配置關鍵字如表2所示。

表2 Kconfig關鍵字
根據本文芯片架構,調用ARMv8目錄的所有程序,以及設備驅動模型程序,添加配置信息如下:config TARGET_MYBOARD

4)在configs/目錄下新建defconfig配置文件,存放各級Kconfig的具體配置:

myboard_defconfig文件中配置項用于確定Kconfig中哪些配置項被激活,即最終編譯哪些文件,本文采用芯片基于ARM架構,并已構建目標板配置文件myboard.h,以及在arch/Kconfig中完成配置信息聲明,如使用新添加的

完成移植后,根目錄下執行命令配置編譯目標設備并開始編譯:

通過交叉編譯環境完成U-Boot鏡像編譯后,使用燒錄工具將鏡像燒錄到SD卡中。如圖4所示,編譯生成的u-boot.bin為燒錄所需的鏡像文件,一般芯片啟動會需要如校驗等具有固定格式數據信息,所以只燒錄u-boot.bin通常無法成功啟動U-Boot。根據芯片手冊定義的芯片啟動數據格式,將數據按格式要求添加到SD卡中,保證SD卡燒錄的所有數據能夠正確啟動芯片。

圖4 U-Boot編譯結果
燒錄鏡像前通過fdisk命令對SD卡分區,并通過mkfs.vfat命令格式化分區。本文通過dd命令將鏡像拷貝到SD卡中,根據芯片啟動流程及數據格式,設置參數以確定數據寫入位置。
通過SD卡啟動目標板中,根據CPU啟動流程,內部ROM執行初始化后會完成自拷貝,通過將SD卡指定位置的數據拷貝到RAM中執行,后續程序開始執行,測試U-Boot系統開始運行,如圖5所示。

圖5 U-Boot啟動運行界面
本文通過U-Boot能否加載系統內核并掛載文件系統測試移植是否成功,采用內核版本為Linux Kernel4.1.15。如圖6所示,通過設置U-Boot環境變量參數,通過nfs服務遠程加載PC服務端內核鏡像及根文件系統文件,能夠成功啟動操作系統。

圖6 U-Boot引導啟動操作系統
圖6中所示,通過U-Boot命令設置環境變量可指定系統內核啟動位置,由于本文通過nfs服務從上位機加載內核及文件系統,所以需要設置網絡IP地址等信息,如本文設置IP采用以下命令。

綜上,U-Boot減少了芯片及目標板適配的難度及周期,達到了快速移植操作系統的目的,其靈活性和易用性提高了開發效率。此外,移植U-Boot需要對SoC芯片的啟動流程及U-Boot軟件架構有清晰的理解和掌握,這對理解操作系統原理也具有參考意義和價值。