Cstyle的UEFI导读之UEFI Driver Configuration

来源:互联网 发布:摄像头远程控制软件 编辑:程序博客网 时间:2024/06/11 01:53
    今天的话题比较复杂,在此只做抛砖引玉,聊一聊在pre-boot环境下的driver的配置,主要是涉及到HII 及HII database的相关内容。Driver Configuration  Protocol(1.1 spc) /Driver Configuration 2 Protocol(2.0及以上)。
 
HIi概述:
    UEFI系统提供一个被称作为HII窗体浏览器的机制(有点拗口,姑且暂时这么叫),这个机制类似于我们常见的网页的html的形式。但是UEFI driver不允许直接调用HII窗体浏览器,而是提供了一种访问窗体的机制,当浏览器运行的时候就会把所有的窗体显示在uefi终端上,供用户去操控这些窗体,来完成对driver的配置。
使用窗体来而不用Simple Text Input Protocol and Simple Text Output Protocols得优势:
1.窗体浏览器是预定义好的,可以直接使用,driver开发着可以把更多的精力放在开发更为个性话的GUI界面。
2. 窗体是平台无关的,可移植性好。
3. 窗体机制允许通过窗体浏览器远程控制和访问设备。

HII由以下的部分构成了一个能够同时支持文本和图形的用户界面的引擎:
1. Keyboard: HIi支持键盘按键的映射,按键时通过返回按键的位置而不是Unicode值,然后通过键值映射功能,以语言为依据把键盘的位置转换为相应的Unicode值,以此来支持多国语言的键盘。
2. Fonts:HII支持多打37000个 UCS-2 Unicode可打印字符,并且默认包含拉丁语系的字符,还支持宽体和窄体的类似于中文,日文,韩文等其他类型的意音文字,但是他们不是默认包含的,需要自己添加。
3. Strings: 是按照语言类型来压缩的,使用ID和语言来索引的Unicode字符串。
4. Forms: 窗体,它是由IFR语言来表示,以二进制的形式存储在BIOS ROM当中,使用类似于我们在web开发中常见的HTML标记语言一样,先定义一个HTML语法预定义的格式,有各种<head>
<title>,<body>等等的关键词,最后由IE浏览器来最终解析,显示呈现给用户。

HII Database and Package Lists:
    HII Database 是在系统启动的时候动态创建的,UEFI driver会在这个过程中注册包含了font, string,image, keyboard, and forms data等类型的二进制数据的HII packages到HII Database里面去。Hii package的最主要的目的是为了创建一次窗体同时支持多种语言和字符,并且package一旦被创建就不允许被修改,如:表单,呈现给用户的选项菜单,等等。
在Driver中嵌入HII:
步骤:
1.确定是否允许用户改变配置数据
2.确定那些选项是可以提供给用户修改的,这些选项数据一般会存储在NVRAM中(NVRAM即可以是存在于某个设备,或者    是平台全局的)。
3.定义配置数据的结构体(C语言),一般在头文件中<<DriverName>>.h
4.定义配置选项的布局,如:enable/disable;show/hide一般在<<DriverName>> .Vfr中实现。
5.定义需要显示是所有字符串,一般在<<DriverName>>.Uni中实现。如下图,主意不同的语言用不同的语言代码关键词区分。
 
6.确定是否需要支持多国语言,和本地化,如果支持就需要把字符串进行转码,并包含相应的字符库,或者字体。
7.实现并实例化HII Config Access Protocol,以此来获取和设置保存存在于 HII form中的配置信息。
8.在driver的entry point注册所有的HII package
9.如果是UEFI driver mode的driver,就在driver binding protocol的start方法里面给所有的提供了可配置的功能的,并且受该driver控制的handle注册HII package,如果不是UEFI driver mode的话,就在他的entry point注册。

HII Protocols:
为了方便实现对driver的配置,MdeModulePkg 包提供了一个叫做UefiHiiServicesLib的库实现了一些我们常用的服务,并定于和初始化了一些全局的变量方便使用,使用全要先验证全局变量是否是NULL,下面做详细描述:
Protocol
global variable
EFI_HII_DATABASE_PROTOCOL 
gHiiDatabase
EFI_HII_STRING_PROTOCOL
gHiiString
EFI_HII_FONT_PROTOCOL
gHiiFont
EFI_HII_IMAGE_PROTOCOL
gHiiImage
HII Database Protocol and HII String Protocol:
    string and database protocols 方便了 database and string管理,而窗体浏览器之需要关注如何解析窗体,不需要关注如何解析HII Database或者字符是符合存储的。MdeModulePkg提供了 HiiLib库函数。
Database protocol:用来提交strings, fonts, forms和其他的package到HII Database里面去,由于package是在编译阶段生成的,大多数的package一般不去修改,这样由database protocol去提交到HII database里面去能增加post的速度。
HII string Protocol:
    The strings protocol allows the general purpose forms to adapt to the configuration of a specific platform. This includes configuration information typed in by the user. The forms themselves are created by the VFR during build.
HII Font Protocol:类似于HII string Protocol,它是用来管理字体的,默认的字体是8x16 and 16x16。
HII Image Protocol:提供对图片的支持。

HII Config Routing Protocol:
    This protocol is used by consumers of forms to determine the current configuration of the tags (questions) associated with the forms and to change the configuration of the corresponding data.他提供了一个name=value对来索引我们需要的信息,主要有以下的一个数据结构:
GUID – The GUID in the Setup Form associated with this
NAME – The name of the driver
PATH – The binary device path to the driver’s device
一个driver也可以有多个配置devide的配置信息,使用下面的结构来区分:
• OFFSET―The byte offset into the structure of the item
• WIDTH―The number of bytes the item consumes
• VALUE―The current (or new) configuration of the item
HII Config Access Protocol:
1.ExtractConfig function:This function gives the driver a chance to perform tasks before the form is processed by the HII database engine。
2.RouteConfig function:This function allows the browser to obtain and change configuration information upon the exit of the form.
3.Callback function:This function is called when a user makes changes.After the changes are saved, the original data structure is updated with the new settings.尽量少用callback,只在需要    动态数据更新的地方才用,比如温度,转速,时间等,这样能减少bug的产生,并且能加快窗体浏览器的反应速度。
Forms and VFR 示例:
仔细读下下面的vfr代码是不是很眼熟,如果不眼熟的话,那就证明你是个十足的新手,那还说请你去读读vfr的spc再往下接着看,从下面的代码中我们仿佛看到A家SD,UNI,VFR文件中的语法规则,只不过关键词有少许差别,最明显的是没有AutoID这个关键词,这里面的”formid = 1“被写成了固定值而不是在编译的是动态生成的。

以上是个人读书笔记和总结,转载请注明出处,谢谢Cstyle.z.zhou@gmail.com//http://blog.csdn.net/CStyle_0x007

























 
原创粉丝点击