BIOS/UEFIHII 基本框架及概述
Posted 毛毛虫的爹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIOS/UEFIHII 基本框架及概述相关的知识,希望对你有一定的参考价值。
HII(Human Interface Infrastructure )定义了一套管理用户输入的基础框架。HII数据库主要提供用户安装、卸载以及使用各种字符串、字体和图片等资源的接口。
HID Devices 是用户输入设备,如键盘、串口和网络;Display Devices 是输出设备,如显示器、串口和网络。HID Devices 和 Display Devices 通过 Forms Browser 交互。Forms Browser 是负责显示信息和收集输入、输出信息的模块,其要显示的信息从 HII Database 中获取。HII Database 负责所有 HII 数据的管理。Driver 将要显示的信息注册到 HII Database 中,在显示的过程中 Driver 和 Forms Browser 交互。交互后的信息通常存储在 UEFI Global Variable Store 中,也可以存储在其他地方,存储的控制权在 Driver,由 Driver 自己决定。
【UEFI Spec 译文:】驱动程序和应用程序将元素(如字体、字符串、图像和表单)安装到 HII 数据库中,该数据库充当整个平台的中央存储库。Forms Browser 使用这些元素在显示设备上呈现用户界面,并通过 HID 设备从用户接收信息。之后,用户在 Form Browser 所做的更改将保存到 UEFI global variable storage(使用 GetVariable() 和 SetVariable() )或是自定义驱动提供的存储变量中。
UI App 是一个启动选项。BDS (启动设备选择)阶段加载 UI App,该启动选项一方面会调用 Set Browser 所提供的 SentForm 服务,将所需要显示的页面显示出来(主页面)。从主页面中可分级找到系统其他的配置信息并显示。另一方面,UI App 驱动系统中各种 HII Driver,HII Driver 提供其配置信息注册给 HII DataBase,这些信息包括 IFR、String、Font、Image等。 Setup Browser 从 HII DataBase 获取信息用于显示和交互。页面和信息都有了,Setup Browser 就可以完整地显示了。交互后,用户修改地信息存入Flash(前文提到由 HII Driver 决定,这里只是说图中示例)。
UEFI (Spec)中 HII 组件
Strings
在 uni 文件中描述。Strings 以 Unicode 类型(2 byte)存储,以满足多语言的支持。语言格式要符合 RFC 4646 基本格式。String Token 相当于 ID,是唯一的,是 String 的标识。在源代码中要同时指明 String Token 和语言才能获取最终的 String如果指明的语言没有相应的字符描述,则使用默认语言。我见过的情况是:在缺少中文显示的时,setup 的选项显示成一个叹号。
Fonts
Font 通过点阵的方式显示,有宽字符和窄字符,汉字需要使用宽字符,英文使用窄字符。使用的字符需要有对应的字库。
Keyboard
不同的键盘存在布局区别,Keyboard 用于键盘布局的匹配。
Forms
Forms Browser 使用应用程序或驱动在 HII Database 初始化时安装 Forms 数据。 Forms Browser 提供的用户接口包括读取 Forms 的内容、与用户交互以及存储数据。在 UEFI Spec 中定义了二进制格式的 IFR 用来描述页面如何显示、切换等信息。而 VFR 语言是 Edk2 的实现,Edk2 还提供了 IFR Compiler 工具用于实现将 VFR 语言编译成 IFR 语言。使用 XML、javascript 等其他语言也是可以的,只要最终能转换成 IFR 就行,UEFI Spec 只认 IFR。
控件:
checkbox:用于选择 true 或 false,比如先择开还是关
numeric:用于选择一个范围,比如选择年月
oneof:用于从多个选项中选择一个
string:用于输入字串
显示效果 :
disableif:使选项完全失效了
suppressif:只是不显示,选项本身还是有效的,如有默认值则使用默认值
grayoutif:置灰选项,使得选项用户不能更改
.vfr ( .sd ) 文件内容示例:
Packages
Packages 是一个标准的数据结构,把包括 Strings、Fonts、Keyboard、Forms 、以及 Image 的数据组织起来,并管理。换句话说,这些数据都打包成 Package,然后注册,实际中注册使用 PackageList。
HII Database
HII Database 是 HII 框架一个核心的公共模块,用于管理所有 HII 数据,包括 String、Forms、Keyboard、Images、Device Paths等。
HII Protocols
HII Browser Engine Protocols
EFI_HII_CONFIG_ROUTING_PROTOCOL
由 HII Database 提供。
EFI_HII_CONFIG_ACCESS_PROTOCOL
EFI_HII_CONFIG_ACCESS_PROTOCOL 由HII Driver 提供。每个 HII Driver 都需要提供自己的 EFI_HII_CONFIG_ACCESS_PROTOCOL 用来负责自己数据的读和写以及交互。ExtractConfig()和RouteConfig()通常被实现 HII Configuration Routing Protocol 的驱动调用,Callback() 通常被 Forms Browser 调用。ExtractConfig() 函数用于提取元素(Strings)到当前的配置中,RouteConfig() 函数用于存储已经配置好的信息,Callback() 函数用于记录用户的操作(被修改的信息)。
EFI_FORM_BROWSER2_PROTOCOL
SentForm():用于显示页面(主页面);
BrowserCallback():HII Driver 可以通过 BrowserCallback 获取到当前 HII Driver 的配置选项里用户已经修改但还未存储的信息
HII Driver 初始化流程:
HII Driver 提供Config Access Protocols;
安装 Device Path Protocol;
安装 Config Access Protocol。Config Access Protocol 一定是安装在某一个 Device Path 上的;
Create PackageList。PackageList 通常要包含 Form、String、
调用 HII Database Protocol 里的 NewPackageList,将 Package List 安装到 HII Database 里。输入的参数包括 Config Access Protocol 所装在的 Device Path,最终得到 HII handle,至此,信息都安装完毕。一个 HII Handle 对应一个 Device Handle,通过 HII Handle 可以找到 Device Handle,相反的,通过 Device Hanlde 可以找到其对应的 Config Access Protocol。
Form Browser 的处理流程:
BlockToConfig 和 ConfigToBlock
HII Driver 通常调用的是 Browser Callback函数;UI App 调用 SentForm 函数,用于显示主页面。
HII Driver 自己的 Config Access Protocol 里的CallBack 函数调用 UEFI Browser Protocol 里的 CallBack 函数。
————————————————
版权声明:本文为CSDN博主「@一水间」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45258382/article/details/128113834
以上是关于BIOS/UEFIHII 基本框架及概述的主要内容,如果未能解决你的问题,请参考以下文章