【EDKII笔记】orderedlist&lebal

UEFI HII 相关

EDKII开发 – VFR&SD



一、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》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值