7

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

 3 years ago
source link: http://yiiyee.cn/blog/2021/01/14/uefi%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a267-yie001%e5%bc%80%e5%8f%91%e6%9d%bf%ef%bc%8803-uefi%e9%a9%b1%e5%8a%a8%ef%bc%89/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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-exolorer
项目代码位于:/FF RobinPkg/ RobinPkg /Applications/ TestServiceDrv

51 total views, 1 views today

210c9a4d410d265665667a36fbe0f529?s=49&d=identicon&r=g作者 罗冰(Robin)发布于 2021年1月14日2021年1月21日分类 BIOS/UEFI


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK