UEFI HII 相关
一、orderedlist
orderedlist是可以创建有序字符串的显示,可用作BIOS里面bootorder按键的实现。
创建之后,会在SETUP上显示一个选项(STR_BOOT_OPTIONS),值(STR_BOOT_OPTION1等)可以通过"+“,”-"来修改顺序。
mField3可以定义为数组,在c文件中对有序的值进行操作。
orderedlist
varid = STestPriData.mField3,
prompt = STRING_TOKEN(STR_BOOT_OPTIONS), help = STRING_TOKEN(STR_BOOT_OPTIONS),
option text = STRING_TOKEN(STR_BOOT_OPTION2), value = 2, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_BOOT_OPTION1), value = 1, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_BOOT_OPTION3), value = 3, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_BOOT_OPTION4), value = 4, flags = RESET_REQUIRED;
option text = STRING_TOKEN(STR_EMPTY_STRING), value = {1,2,3,4}, flags = DEFAULT;
//or default = {1,2,3,4};
endlist;
二、label
label 标签,可以先在Setup界面插入你需要的显示的标签,然后由c文件去生产操作码(EFI_IFR_GUID)去操作。
1.Hii datebase
以我所了解,UEFI规范中对Setup上的显示,由Hii(Human Interface Infrastructure)架构控制,即开发人员提供字符串(uni),框架(VFR->IFR),字体,图像等,然后调用Hii来安装删除等进Hii datebase,然后Hii就会显示在setup上面。
可添加种类:
Font
Simplified
Font
String
Image
Device
Path
keyboard Layout
GUID
Forms
更多Hii相关知识:等研究后再补上
2.label在vfr文件
在vfr文件你需要显示的地方加入如下代码即可,LABEL_START需要在.h文件中定义。
label LABEL_START;
//这里显示
label LABEL_END;
edkii代码中有label使用,详细例子请看edkii代码。
3.label在c文件
label在c文件中有一套流程规范
1.定义
VOID *StartOpCodeHandle;
VOID *EndOpCodeHandle;
EFI_IFR_GUID_LABEL *StartLabel;
EFI_IFR_GUID_LABEL *EndLabel;
EFI_STRING_ID GuidID;
EFI_STRING_ID Help;
2.为动态操作码初始化容器并创建Hii扩展标签操作码
//
// Initialize the container for dynamic opcodes.
//
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
if (StartOpCodeHandle == NULL) {
Status = EFI_OUT_OF_RESOURCES;
}
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
if (EndOpCodeHandle == NULL) {
Status = EFI_OUT_OF_RESOURCES;
}
//
// Create Hii Extend Label OpCode.
//
StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
StartOpCodeHandle,
&gEfiIfrTianoGuid,
NULL,
sizeof (EFI_IFR_GUID_LABEL)
);
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
StartLabel->Number = LabelNumber;
EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
EndOpCodeHandle,
&gEfiIfrTianoGuid,
NULL,
sizeof (EFI_IFR_GUID_LABEL)
);
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
EndLabel->Number = LABEL_END;
3.进行对数据的操作
***主要的操作都在这***
4.创建操作码
创建操作码相当于创建一个格式,HiiUpdateForm时把handle里面的结构数据按照操作码架构显示
创建操作码的接口有如下几种:
HiiCreateOneOfOptionOpCode 创建 EFI_IFR_ONE_OF_OPTION_OP 操作码
HiiCreateDefaultOpCode 创建 EFI_IFR_DEFAULT_OP 操作码
HiiCreateGuidOpCode
HiiCreateActionOpCode
HiiCreateSubTitleOpCode
HiiCreateGotoOpCode
HiiCreateGotoExOpCode
HiiCreateCheckBoxOpCode
HiiCreateNumericOpCode
HiiCreateStringOpCode
HiiCreateOneOfOpCode
HiiCreateOrderedListOpCode
HiiCreateTextOpCode
HiiCreateDateOpCode
HiiCreateTimeOpCode
如下实例,通过for语句一个个读取数据,再一个个创建操作码,通过
偏移量((EFI_QUESTION_ID)(QuestionIdBase + GuidIndex++))区分
//创建操作码
HiiCreateCheckBoxOpCode (
StartOpCodeHandle,
(EFI_QUESTION_ID)(QuestionIdBase + GuidIndex++),
0,
0,
GuidID,
Help,
EFI_IFR_FLAG_CALLBACK,
0,
NULL
);
}
5.更新界面,Handle是通过HiiAddPackages将字符串,框架等加入hii datebase返回的Handle
//更新界面,通过Handle,Guid,FormId来查找匹配需要更新的界面
HiiUpdateForm (
Handle, //hiidatebase中的handle,所有的字符串,框架,字体等都需要通过接口添加到hiidatebase中并返回一个Handle,才能在setup中显示,这里使用formset返回的handle
&Guid, //formset等vfr里面的GUID (可选参数)
FormId, //FormId
StartOpCodeHandle,
EndOpCodeHandle
);
6.释放handle
//释放handle
if (StartOpCodeHandle != NULL) {
HiiFreeOpCodeHandle (StartOpCodeHandle);
}
if (EndOpCodeHandle != NULL) {
HiiFreeOpCodeHandle (EndOpCodeHandle);
}
总结
后续有更深理解,会继续补充。
学艺不精,错误请指正;
如有侵权,请联系删除。
参考文档: 《VFR_1_9.pdf》