《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于ARM平臺的UEFI開發與移植
基于ARM平臺的UEFI開發與移植
來源:電子技術應用2014年第4期
韓德強,馬 駿,王宗俠,高雪圓
(北京工業大學 計算機學院,北京100124)
摘要: 介紹了ARM平臺下UEFI的相關概念和引導流程,基于TI公司的OMAP4460 Cortex A9處理器開發平臺分析了ARM-UEFI各個執行階段的移植過程。通過具體實例說明了ARM平臺中UEFI設備驅動程序的移植及開發方法。
中圖分類號:TP393
文獻標識碼:A
文章編號: 0258-7998(2014)04-0011-04
The porting and development of UEFI based on ARM system
Han Deqiang,Ma Jun,Wang Zongxia,Gao Xueyuan
College of Computer, Beijing University of Technology,Beijing 100124,China
Abstract: This paper introduces the general concepts and boot process of UEFI under ARM system. It analyzed the porting step of each ARM-UEFI phase based on TI Cortex A9 processor OMAP4460 demo board. It illustrated the porting process and method to development the UEFI device driver under ARM system.
Key words : ARM-UEFI;OMAP4460;device driver

    統一可擴展固件接口UEFI(Unified Extensible Firmware Interface)在設計之初被定義為一種與處理器架構無關的接口標準。UEFI接口可以采用多種不同的架構實現,對外則都表現為相同的接口。這樣,UEFI就可以最大限度地保證不同設計間的代碼重用,其中也包括不同處理器架構的平臺[1]。2009年發布的UEFI 2.3規范與傳統的BIOS和UEFI早期版本只支持X86架構的處理器相比,最大的改進在于支持不同架構的處理器平臺,ARM-UEFI成為了規范的一部分。2013年發布的UEFI2.4規范中包含了對ARM 64位架構處理器的支持。這些都表明UEFI對ARM系統預引導固件的支持是一個新的機遇。使用基于UEFI標準的ARM預引導固件具有很多優越性,UEFI不僅可以實現不同架構平臺之間的代碼共享,還可以共享標準外設(UART、Ethernet、USB控制器等)的驅動代碼以及豐富的標準函數庫接口。同時,ARM-UEFI的實現為ARM系統提供了真正獨立于操作系統的啟動解決方案,而其他大多數現有的ARM啟動解決方案(UBoot、Redboot等)都是與其所支持的操作系統相耦合[2]。本文詳述了基于OMAP4460嵌入式平臺的ARM-UEFI的移植過程及其外設的UEFI驅動程序的開發方法。
1 OMAP4460處理器及平臺硬件結構
    OMAP4460是TI公司專為智能手機、平板計算機以及具有豐富多媒體功能的移動終端設計的一款高性能、高集成度的嵌入式異構多核處理器[3]。該處理器包括2個Cortex A9內核、1個DSP內核、2個Cortex-M3內核、1個GPU以及豐富的I/O接口資源。在OMAP4460中,嵌入式操作系統運行在ARM內核上,算法的運算工作由DSP內核完成,二者通過TI提供的Codec Engine機制進行數據交互,實現了OMAP4460處理器內部多核的協同工作。
    OMAP4460開發平臺的硬件結構框圖如圖1所示。硬件平臺由核心模塊和擴展板兩部分組成,核心模塊包括OMAP4460處理器、TWL6032電源管理芯片和1 GB的DRAM;擴展板主要實現外設接口電路,包括 SD/TF卡接口、UART接口、USB接口、以太網接口和DVI/HDMI接口等。

2 ARM-UEFI引導流程
    通用UEFI根據不同時間段內平臺初始化所要完成的任務將操作系統啟動過程按順序分為SEC、PEI、DXE和BDS[4] 4個階段。其中SEC(安全)階段檢測并驗證固件鏡像的完整性,同時建立C語言執行環境的堆棧;PEI(預EFI初始化)階段主要完成內存初始化,將固件鏡像加載至內存中執行;DXE(驅動執行環境)階段完成平臺初始化,并為操作系統引導提供軟件抽象的服務;BDS(引導設備選擇)階段從引導設備中啟動操作系統,將控制權交給操作系統,完成引導過程。UEFI上電執行順序如圖2所示。

    目前ARM平臺的啟動方式多種多樣,Bootloader通常采用多階段的啟動過程[5]。首階段確定啟動方式,執行必要的初始化操作,加載后續階段鏡像,后續階段提供復雜的功能用于引導操作系統。這種方式既能夠保證Bootloader的功能性,又具有很好的可移植性。因此對于OMAP4460平臺的啟動方案,采用x-loader + UEFI兩個啟動階段的方式引導操作系統。x-loader作為第一階段的固件,要執行時鐘、內存控制器等部分硬件的初始化,并確定OMAP4460平臺的啟動方式,最終將UEFI加載到內存中并跳轉到指定地址執行。內存初始化已在x-loader中完成,故UEFI不再實現SEC以及PEI階段的大部分功能,OMAP4460平臺ARM-UEFI的PEI階段只需要完成系統內存映射和UEFI執行環境堆棧的建立,并執行硬件平臺相關模塊的初始化配置,之后UEFI跳轉進入DXE和BDS階段。本方案DXE以及BDS階段的執行策略和實現功能與通用UEFI固件基本相同:在DXE階段加載所有的驅動程序,完成平臺初始化工作;在BDS階段創建控制臺,設置內核的啟動參數,加載引導設備的內核鏡像到內存中執行。OMAP4460平臺ARM-UEFI引導流程圖如圖3所示。

3 ARM-UEFI開發與移植
3.1 移植x-loader

    OMAP4460處理器內部的SRAM只有64 KB,相對于第二階段UEFI固件鏡像的數百kB而言過小,OMAP4460處理器無法加載UEFI固件鏡像到SRAM運行,而需要使用外部DRAM加載。因此,本方案采用基于精簡UBoot基本代碼的x-loader作為第一階段的引導固件。由于SRAM容量的限制,x-loader的初始化操作只針對必要的硬件模塊,如引腳復用和功能設置、時鐘、內存控制器等。初始化操作的目的是將UEFI固件鏡像從OMAP446平臺的SD卡中加載到DRAM中,然后跳轉到入口地址執行。
    x-loader的入口位于Start.s文件,Start.s首先執行CPU的基本初始化,包括禁止Cache和TLB、關閉中斷等。其次執行兩個跳轉模塊cpu_init_crit和start_armboot,cpu_init_crit模塊跳轉到s_init()函數執行,s_init()中調用了3個函數實現平臺基本初始化:set_muxconf_regs()實現處理器芯片引腳復用和功能設置;ddr_init()實現內存初始化;prcm_init()則實現平臺各個模塊時鐘的初始化配置。這3個函數的修改要針對OMAP4460平臺的具體硬件結構以及引導過程中所使用到的模塊進行。start_armboot則是在內存初始化完成且堆棧建立以后執行,程序跳轉至lib\board.c文件的start_armboot()函數,實現加載UEFI固件鏡像到指定內存位置的過程。第二階段UEFI固件鏡像的入口地址定義為CFG_LOADADDR,它必須與OAMP4460平臺UEFI固件鏡像的起始地址相同,后者由固件的fdf(Flash描述文件)指定。最終x-loader使用函數指針的方式實現x-loader到UEFI的跳轉,代碼如下:
    ((init_fnc_t *)CFG_LOADADDR)();
3.2 移植PEI階段代碼
    如上所述,OMAP4460平臺的ARM-UEFI沒有SEC階段,且PEI階段實現功能與通用UEFI的PEI階段也有所不同,PEI階段不再需要完成內存初始化任務,而是側重于系統平臺信息、內存資源的收集過程,并通過信息描述塊HOB傳遞給DXE階段。OMAP4460平臺的PEI階段的主體實現代碼位于ArmPlatformPkg\PrePi.c的PrePiMain()函數中,該函數主要實現了3個功能: PEI階段的串口調試信息輸出;調用PEI模塊MemoryPeim實現MMU的初始化,建立UEFI系統堆棧,并將這些系統資源建立成HOB傳遞給后續階段;調用PlatformPeim實現一些硬件模塊的初始化和配置。
    PEI階段的串口輸出是通過調用SerialPortLib中的庫函數實現的。SerialPortLib主要包含兩部分:串口初始化函數和串口讀寫函數。初始化函數SerialPortInitialize()首先配置平臺UART接口的引腳復用,使能時鐘;然后再設置串口通信模式,配置串口通信的波特率等參數;最后使能FIFO,完成UART接口的初始化。而讀寫函數則是通過輪詢標志位的方式判斷FIFO是否為空,再按字節讀寫FIFO。PEI階段調試信息輸出樣例代碼如下:
    SerialPortInitialize (); //UART模塊初始化
    CharCount = AsciiSPrint (Buffer,sizeof(Buffer),"UEFI \n");
    SerialPortWrite((UINT8 *) Buffer, CharCount);//數據輸出
    PlatformPeim中再次實現了平臺模塊的初始化,目的是向后兼容未來采用通用UEFI引導方式的ARM平臺的PEI階段所要實現的完整功能。PlatformPeim中包括了3個函數:PadConfiguration()、ClockInit()和GpmcInit()。PadConfiguration()函數和ClockInit()函數都通過操作宏定義的方式實現平臺功能。PadConfiguration()完成平臺所有引腳復用功能的設置。ClockInit()完成平臺所有模塊時鐘的配置,并使能部分模塊時鐘。這種實現方式的好處是有統一的啟動代碼,開發DXE階段的外設驅動程序時不需要再配置外設接口的引腳和時鐘。引腳復用配置代碼如下:
    typedef struct {
        UINTN   Pin;   //引腳寄存器地址
        UINTN   ConfigValue; //引腳屬性功能
    } PAD_CONFIGURATION;
    MmioWrite16(PadConfigurationTableShared[Index].Pin,
        PadConfigurationTableShared[Index].ConfigValue);
    數據結構PAD_CONFIGURATION類型的數組PadConfigurationTableShared中存放的是OMAP4460處理器芯片所有引腳的寄存器地址宏定義和引腳屬性宏定義。MmioWrite16()函數實現16位寄存器的寫功能,通過獲取指定引腳寄存器的地址,寫入指定的配置屬性,完成引腳復用功能的配置。
    GpmcInit()則用于配置通用存儲控制器GPMC的片選信號,樣例代碼如下:
    for (i = 0; i < 8; i++)
    MmioAnd32(GPMC_CONFIG7_0 + 0x30*i, ~BIT6);
    PEI的工作完成之后,解壓固件鏡像的壓縮部分到內存,并直接跳轉至DXE階段執行,代碼如下:
    Status = DecompressFirstFv (); //解壓固件卷
    Status = LoadDxeCoreFromFv(NULL, 0);//加載DXE核心
3.3 開發設備驅動程序
    EDK II開發工具是基于X86平臺的PCI總線結構實現的。當用其開發OMAP4460平臺ARM-UEFI時,需要重構平臺的接口控制器驅動程序,為上層提供標準的UEFI服務。同時,完整移植處于上層并滿足工業標準的接口驅動程序,從而實現對原有代碼的重用,加快ARM-UEFI的開發。
    以顯示驅動程序的開發為例,在OMAP4460平臺上使用HDMI作為ARM-UEFI引導時的顯示接口。ARM-UEFI系統中只需實現HDMI顯示驅動程序即可實現顯示控制臺的輸出。HDMI顯示驅動程序實現圖像輸出協議EFI_GRAPHICS_OUTPUT_PROTOCOL,該協議提供服務接口給圖像控制臺驅動程序GraphicsConsoledxe, 再由該驅動程序實現簡單文本輸出協議EFI_SIMPLE_TEXTOUT_
PROTOCOL,最后由虛擬控制臺驅動程序Consoleplitterdxe將所有掛載簡單文本輸出協議的設備句柄統一掛載到虛擬控制臺輸出句柄ConOut上,由ConOut實現控制臺的輸出,OMAP4460平臺UEFI圖形控制臺結構圖如圖4所示。

    HDMI顯示驅動程序包括三部分:顯示模塊硬件初始化、顯示模式的配置以及圖像的顯示。其中GOP協議的函數接口實現顯示模式配置與圖像的顯示,QueryMode、SetMode兩個接口實現分辨率、顏色及頻率的配置,Blt接口實現圖像顯示。GOP協議數據結構定義如下:
    struct  _EFI_GRAPHICS_OUTPUT_PROTOCOL {
EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE
QueryMode;
EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode;   
//設置顯示模式
EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT     Blt; //圖像顯示
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE  *Mode;//結構體
    }
    顯示模塊初始化函數InitializeDisplay()在驅動程序的入口函數中執行,具體初始化過程分為3步:
    (1)使能ESD保護芯片TPD12S016的供電及熱插拔引腳功能,檢測HDMI接口的HDMI_HPD引腳狀態,檢測是否接入顯示器。
    (2)使能顯示子系統的功能時鐘和接口時鐘,同時使能HDMI物理層的時鐘。
    (3)申請圖像管道內存,并記錄基地址。
    HDMI接口顯示模式的配置分為顯示子系統和HDMI物理層兩部分的顯示模式配置,由QueryMode和SetMode接口函數實現。QueryMode通過HDMI的I2C接口讀取顯示器的擴展顯示標識數據EDID(Extended Display Identification Data),EDID中包含了監視器時序、定時和分辨率等性能參數,使用這些參數填充Mode結構體,再將Mode作為改變值參數傳遞給SetMode接口,由SetMode完成顯示子系統和HDMI物理層中顯示輸出時鐘頻率、圖像分辨率、位寬等寄存器變化值的寫入和重新使能,從而更新顯示分辨率、圖像格式以及顏色模式等參數。寫寄存器樣例代碼如下:
    MmioWrite32(HDMI_WP_VIDEO_SIZE,
        ((LcdModes[ModeNumber].HorizontalResolution)|
        ((LcdModes[ModeNumber].VerticalResolution)<<16)));
其中宏定義HDMI_WP_VIDEO_SIZE是HDMI模塊定義顯示器分辨率的32位寄存器地址,該寄存器低16位為水平像素,高16位為垂直像素。結構體LcdModes的HorizontalResolution和VerticalResolution參數代表顯示模式需要配置的分辨率參數,通過MmioWrite32()函數將值寫入寄存器,完成配置。
    圖像的顯示由GOP協議的Blt接口函數實現,Blt函數首先調用LcdPlatformGetBpp()函數獲取平臺設置的圖像格式以及位寬,再計算原圖像像素和目標管道內存的地址,然后將EFI圖像像素轉換成顯示器設置的像素格式,宏定義LCD_BITS_PER_PIXEL_24表示圖像格式為xRGB24,即每個像素占用32位,低24位按照藍綠紅各8位排列,最高8位為空。最后將轉換完成的像素數據存放在計算好的目標管道內存中,使用圖像管道將圖像數據輸出。具體代碼如下:
    LcdPlatformGetBpp (This->Mode->Mode,&BitsPerPixel);
    if(BitsPerPixel== LCD_BITS_PER_PIXEL_24)
    {
    // 計算原地址和目標地址
    EfiSourcePixel    = BltBuffer + SourceLine * BltBufferHori-
zontalResolution + SourcePixelX;
    DestinationPixel32bit = (UINT32 *)FrameBufferBase +
DestinationLine * HorizontalResolution + DestinationPixelX;
    //將原像素轉換后復制到目標地址中
    *DestinationPixel32bit = (UINT32) ((EfiSourcePixel->
    Red<<16)|(EfiSourcePixel->Green<<8)|
    (EfiSourcePixel->Blue<<0) );
    }
3.4 優化BDS階段
    UEFI在BDS階段會連接設備驅動程序、創建控制臺并輪詢引導設備,操作過程非常耗時。而對于嵌入式系統平臺,系統引導時間有嚴格要求,需要優化ARM-UEFI的BDS階段,以縮短引導時間。方案采用的策略是使用平臺配置數據庫PCD(Platform Configuration Database)在平臺包的dsc文件(平臺描述文件)中定義控制臺和引導設備的路徑,并在BDS階段中分兩階段執行:首先讀取控制臺設備路徑,連接控制臺設備驅動程序;然后讀取引導設備路徑,連接指定引導設備的驅動程序,再從引導設備中加載內核,并將控制權移交給操作系統。至此,ARM-UEFI開發流程基本完成。
    ARM-UEFI在系統耦合、代碼重用方面具有明顯的優勢,加速系統開發的同時,還能減少開發成本。隨著越來越多的廠商參與到ARM-UEFI標準的制定和實現中來,ARM-UEFI將會成為ARM系統標準的啟動解決方案。
參考文獻
[1] 石浚菁.EFI接口 BIOS 驅動體系的設計、實現與應用[D]. 南京:南京航空航天大學,2006.
[2] 魏東.UEFI-A new opportunity for preboot firmware on ARM-based system[Z].2013.
[3] TI.OMAP4460 multimedia device silicon revision:technical reference manual[Z].2012.
[4] ZIMMER V,ROTHMAN M,MARISETTY S.Beyond BIOS:developing with the unified extensible firmware interface (2 Edition)[M].Intel Press,2010.
[5] 宋寶華.Linux設備驅動開發詳解(第二版)[M].北京:人民郵電出版社,2010.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 激情综合网站 | 欧美日韩小视频 | 色四月婷婷 | 污视频网站大全 | 五月天精品在线 | 99久久免费国产精品m9 | 四虎永久在线观看 | 欧美八区| 亚洲国产综合在线 | 国产一区美女 | 亚洲成精品动漫久久精久 | 久久久久国产成人精品亚洲午夜 | 视色4se视频在线观看 | 色综合自拍| 成人亚欧网站在线观看 | 国产日产久久高清欧美一区 | 国产精品久久久久久久久久久久 | 丁香六月婷婷激情 | 国内色综合精品视频在线 | 色人阁综合 | 青青草国产精品久久久久 | 欧美日韩午夜 | 一级毛片视频播放 | 久久免费公开视频 | ts在线观看| 国产午夜精品久久久久免费视小说 | 免费观看的美女视频网站 | 成人在线免费小视频 | 国产精品午夜国产小视频 | 四虎国产欧美成人影院 | 久久99国产这里有精品视 | 色视频免费在线观看 | 97在线免费看视频 | 殴美性生活视频 | 黄色短视频在线播放 | 97影院九七影院理论片 | 欧美12一13高清视频 | 97玖玖 | 91精品国产9l久久久久 | 劲爆欧美第一页 | 免费国产综合视频在线看 |