请保留-> 【原文: 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所示。
3 测试驱动
在上篇编译ServiceDrv的时候,使用的是32位的目标架构。因此,测试用的TestServiceDrv也得是32位架构的:
C:\UEFIWorkspace>build -t VS2015x86 -p RobinPkg\RobinPkg.dsc \
-m RobinPkg\Applications\TestServiceDrv\TestServiceDrv.inf -a IA32
测试的结果如下:
Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/FF RobinPkg/ RobinPkg /Applications/ TestServiceDrv
1,415 total views, 2 views today