UEFI开发探索67- YIE001PCIe开发板(03 UEFI驱动)

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

上一篇做好了服务型UEFI驱动的示例工程,本篇准备编写测试用的UEFI应用,演示如何使用驱动提供的Protocol。另外,对于如何加载驱动进行测试,也会详细讲述。

1 编写测试驱动的UEFI应用

完成了服务型驱动和相应示例Protocol的构建后,我们准备编写访问示例Protocol的UEFI应用。本节准备的示例工程TestServiceDrv,在文末提供了下载地址。

编写测试示例Protocol的代码,步骤如下:

  • 将示例工程ServiceDrv的头文件MyProtocol.h拷贝到示例工程TestServiceDrv的文件夹下。同时修改TestServiceDrv.inf文件,在[Sources] Section下添加此头文件名;
  • 在TestServiceDrv的主程序所在源文件TestServiceDrv.c中添加GUID的声明和定义;
  • 在主程序中添加测试用的代码。

在我们准备的服务型驱动例子中,准备了三个接口函数。其中,接口函数My_SampleIn()和

MySample_DoSth()对私有数据进行了不同赋值,接口函数My_SampleOut()则将私有数据打印了出来。我们可以据此编写测试用的代码,如示例1所示。

【示例1】测试示例Protocol

EFI_STATUS EFIAPI UefiMain (IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE  *SystemTable)
{
  EFI_STATUS      Status;
  EFI_MYSAMPLE_PROTOCOL *myprotocol;
  Status=gBS->LocateProtocol(&gEfiMYSampleProtocolGUID,//示例Protocol GUID
NULL, (VOID **)&myprotocol);
  if(EFI_ERROR(Status))
  {
    Print(L”LocatProtocol error: %r\n”, Status);
    return Status;
  }
  //测试示例Protocol的接口函数
  myprotocol->MySample_In(myprotocol,L”Hello,My protocol!”);
  myprotocol->MySample_Out(myprotocol);
  myprotocol->MySample_DoSth(myprotocol,L”Enjoy UEFI!”);
  myprotocol->MySample_Out(myprotocol);
  return EFI_SUCCESS;
}

示例应用TestServiceDrv是配合之前构建的服务型驱动ServiceDrv工作的,如果ServiceDrv没有加载,则提示找不到Protocol;如果ServiceDrv加载后,则会如示例1所示,依次调用示例Protocol的接口函数。

2 测试驱动的Shell命令

所用到的UEFI Shell命令包括load和dh,它们的用法介绍如下。

  • load命令用于加载UEFI驱动,其语法格式为:

load [-nc] file [file…]

此命令用于将UEFI驱动加载到内存,它可以一次处理单个或多个驱动文件,文件名支持使用通配符。如果命令后跟参数“-nc”,代表加载驱动时只加载到内存,不连接到设备,常用来加载服务型驱动。

  • dh命令用于列出系统中设备句柄的信息,以及设备相关的信息,比如设备路径、驱动名称等。其语法格式为:

dh [-l <lang>] [handle | -p <port_id>] [-d] [-v]

对于此命令的参数说明:

-p <port_id>: 列出所有安装了指定GUID的句柄;
-d:列出UEFI驱动相关的信息;
-l<lang>:用指定语言表示,比如ISO 639-2;
-sfo:使用标准格式化输出显示信息;
-v:输出verbose信息;
handle:指UEFI句柄在系统中的编号,如果使用此命令时不指定句柄,则会列出所有句柄信息。

编译完成示例工程ServerDrv之后,可以在模拟器中使用load命令加载驱动,并使用dh命令查看加载后的情况,如图1所示。

图1 加载服务型驱动

3 测试驱动

在上篇编译ServiceDrv的时候,使用的是32位的目标架构。因此,测试用的TestServiceDrv也得是32位架构的:

C:\UEFIWorkspace>build -t VS2015x86 -p RobinPkg\RobinPkg.dsc \
-m RobinPkg\Applications\TestServiceDrv\TestServiceDrv.inf -a IA32

测试的结果如下:

图2 使用TestServiceDrv测试驱动提供的Protocol

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/FF RobinPkg/ RobinPkg /Applications/ TestServiceDrv

1,446 total views, 1 views today

发表评论

电子邮件地址不会被公开。