请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
在UEFI开发探索72中,曾经规划过YIE002的开发板计划。当时的主要目标是使用YIE002做USB HID的双向通信设备,并在Windows、Linux和UEFI下都实现上位机访问程序。
如今,这些目标都已经实现了。特别是Windows下的测试程序UsbHID,现在成为我专用的测试工具了。
当时的开发计划中,还有一项目前还没有完成,那就是让YIE002开发板提供生成随机数的功能,使得在各个系统下都能通过USB通道得到生成的随机数,包括UEFI系统。
这个目标的灵感来源于国外工程师开发的ChaosKey,是以前学习UEFI开发时,在网上搜寻资料时偶然遇到的。一个小小的产生随机数的设备(U盘大小),作者花了不少心思来制作,让我觉得很有意思。因此,在设计YIE002的时候,就预留了生成随机数的机制。
周末的时候,花了一点时间,终于把这个随机数生成器做成了。具体的过程,请见我的另外一篇博客:YIE002开发探索10-随机数生成器。
今天就来UEFI下使用下这个小设备。
1 代码编写
代码编写的过程实际非常简单,借用了UEFI开发探索88篇的工程HelloHID,稍微修改了下其中的函数,就实现了需要的功能。
将HelloHID改为RngUEFI,包括INF文件和源文件名,都修改下。然后在RobinPkg.dsc中,添加对RngUEFI工程的编译支持,就完成了框架调整。
由于YIE002随机数生成器提供了三种USB HID通信能力,可以使用任意一种方式与之通信。因此,我就直接用Feature Report通信的方式来编写代码了。
增加获取随机数的函数如下:
//Name: GetRNG_YIE002
//Input: index
//Output: RNG
UINT16 GetRNG_YIE002(IN INT16 index)
{
EFI_STATUS Status;
UINT8 ReportId;
UINT8 myBuffer[16];
UINT16 random_value;
gBS->SetMem(myBuffer,16,0xA0);
ReportId = 0;
Status = UsbSetReportRequest(
gUsbIO[index],
0, //interface,
ReportId,
HID_FEATURE_REPORT,
16,
myBuffer
);
if(EFI_ERROR(Status))
{
Print(L"UsbSetReportRequest Error!\n");
return FALSE;
}
gBS->SetMem(myBuffer,16,0x00);
Status = UsbGetReportRequest(
gUsbIO[index],
0, //interface,
ReportId,
HID_FEATURE_REPORT,
16,
myBuffer
);
if(EFI_ERROR(Status))
{
Print(L"UsbGetReportRequest Error!\n");
return FALSE;
}
random_value = myBuffer[1];
random_value = (random_value<<8);
random_value += myBuffer[0];
return random_value;
}
主程序中增加访问设备的语句:
//测试YIE002制作的随机数生成器
if(retVal)
{
for(i=0; i<20; i++)
{
wRandomValue = GetRNG_YIE002(myDevice);
Print(L"------ %02d Get Random number from YIE002:%04x\n",i,wRandomValue);
Delayms(1000);
}
}
就完成了获取随机数的代码了。
实际代码如往常一样,放在了文末了,有兴趣可以自己阅读一下。
2 测试
使用如下命令编译代码:
C:\vUDK2018\edk2>build -p RobinPkg\RobinPkg.dsc -m RobinPkg\Applications\RngUEFI\RngUEFI.inf -a X64
将生成文件RngUEFI.efi拷贝到测试用的UEFI启动U盘中,并将YIE002连接到测试用机器上,启动UEFI Shell。测试结果如图1所示。
测试时,将YIE002插在测试机器的USB口上候,在UEFI Shell下使用之前的枚举工具ListUsb.efi,可以看到设备是否插入(我们使用的PID和VID分别为0x4321和0x8765)。
运行RngUEFI.efi,将持续向YIE002获取随机数,图1中可以看出,所得到的都是16位随机值。
测试随机数获取前,运行了三种USB HID的通信方式。上位机通过端点1访问的方式(也即读写文件的访问方式,YIE002使用端点1读写来对应此方式),在此测试机器上不支持,因此返回了错误。
至此,当时设定的YIE002开发板编程几乎,就全部完成了。
Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/ FF RobinPkg/RobinPkg/Applications/RngUEFI下
1,770 total views, 1 views today