<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文以vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.中的程式碼為例說明UEFI使用者互動介面的實現。
這裡UEFI使用者互動介面的實現載體是OVMF(使用QEMU啟動),其形式如下:
它一般被叫做Front Page(後面將以該名稱來稱呼上述的介面),其下還包括Setup,Boot Manager,Device Manager等選項。
相比Legacy BIOS,UEFI的互動介面要豐富得多,比如支援多語言,支援圖片等,不過EDK預設帶的還是最原始的,跟Legacy BIOS類似的介面。
本文討論的就是該介面的實現。
在EDK2017的OVMF程式碼中,Front Page被做成一個獨立的APP(跟Shell一樣),然後註冊,可以通過在啟動過程中按F2來進入,具體的註冊程式碼如下:
VOID PlatformRegisterOptionsAndKeys ( VOID ) { EFI_STATUS Status; EFI_INPUT_KEY Enter; EFI_INPUT_KEY F2; EFI_INPUT_KEY Esc; EFI_BOOT_MANAGER_LOAD_OPTION BootOption; // // Register ENTER as CONTINUE key // Enter.ScanCode = SCAN_NULL; Enter.UnicodeChar = CHAR_CARRIAGE_RETURN; Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); ASSERT_EFI_ERROR (Status); // // Map F2 to Boot Manager Menu // F2.ScanCode = SCAN_F2; F2.UnicodeChar = CHAR_NULL; Esc.ScanCode = SCAN_ESC; Esc.UnicodeChar = CHAR_NULL; Status = EfiBootManagerGetBootManagerMenu (&BootOption); ASSERT_EFI_ERROR (Status); Status = EfiBootManagerAddKeyOptionVariable ( NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL ); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); Status = EfiBootManagerAddKeyOptionVariable ( NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL ); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); }
而Front Page對應APP的驅動是UiApp.inf,它對應的GUID是:
# Point to the MdeModulePkg/Application/UiApp/UiApp.inf gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
在EfiBootManagerGetBootManagerMenu()函數中會根據上述的GUID尋找UiApp模組,並生成對應的啟動項。
最終的結果就是啟動過程中按F2就可以進入UiApp模組,其入口是InitializeUserInterface(),將在後續的內容中介紹。
InitializeUserInterface()模組的大致流程如下:
其中綠色部分涉及到互動相關的操作,後續會重點說明。
字型使用一種稱為Glyph的元素表示,它其實就是一個二進位制的檔案,裡面包含了描述字型的元素,但是具體是怎麼樣表示的,目前還不是很清楚,這個也不是我們需要關注的重點。
這個二進位制在程式碼中有下述的陣列表示:
typedef struct { /// /// This 4-bytes total array length is required by HiiAddPackages() /// UINT32 Length; // // This is the Font package definition // EFI_HII_PACKAGE_HEADER Header; UINT16 NumberOfNarrowGlyphs; UINT16 NumberOfWideGlyphs; EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER]; EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER]; } FONT_PACK_BIN; FONT_PACK_BIN mFontBin = { sizeof (FONT_PACK_BIN), { sizeof (FONT_PACK_BIN) - sizeof (UINT32), EFI_HII_PACKAGE_SIMPLE_FONTS, }, NARROW_GLYPH_NUMBER, 0, { // Narrow Glyphs { 0x05d0, 0x00, { 0x00, // 後面的省略
這個陣列通過一個通過HiiAddPackages()匯入,如下所示:
/** Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver. **/ EFI_HII_HANDLE ExportFonts ( VOID ) { return HiiAddPackages ( &mFontPackageGuid, gImageHandle, &mFontBin, NULL ); }
字串通過UNI檔案轉換成,編譯時在AutoGen.c中生成對應的陣列,然後通過下面的函數來註冊到HII資料庫中:
/** Initialize HII global accessor for string support. **/ VOID InitializeStringSupport ( VOID ) { gStringPackHandle = HiiAddPackages ( &mUiStringPackGuid, gImageHandle, UiAppStrings, NULL ); ASSERT (gStringPackHandle != NULL); }
這裡的UiAppStrings就是通過.uni檔案生成的字串表示。
可以看到,匯入字型和字串使用的是相同的函數。
進入UI介面是通過UiEntry()來實現的,其大致流程如下:
這裡的重點也主要在綠色部分,它包含了Front Page的初始化和呼叫。
上述的綠色部分大致流程如下所示:
這裡最重要的是兩個部分,一個是更新Front Page的部分,另一個是SendForm()的部分。
更新Front Page部分主要由UpdateFrontPageBannerStrings()、UpdateFrontPageForm()等函陣列成,它們使用了各類HII操作來更新介面,比如說UiCustomizeFrontPageBanner()構成了Front Page介面中的一條條的字串顯示(就是開頭圖片中的藍字部分),另外還有UiCustomizeFrontPage()、HiiUpdateForm()等函數,都更新了介面。
SendForm()部分,它其實是整個UEFI介面顯示的引擎,這部分實現在顯示介面(比如圖形輸出介面,或者串列埠)上顯示前面更新的內容,後續會詳細介紹。
本文只是簡單的介紹,以上就是UEFI開發實戰使用者互動介面基礎說明的詳細內容,更多關於UEFI使用者互動介面的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45