第一篇我们就从应用的角度看看UEFI Event.
先上代码:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLIb.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status = EFI_SUCCESS;
EFI_EVENT MyEvent[2] = {0};
EFI_INPUT_KEY Key;
UINTN Index;
//1. Create event
MyEvent[0] = gST->ConIn->WaitForKey;
Status = gBS->CreateEvent(EVT_TIMER, TPL_CALLBACK, (EFI_EVENT_NOTIFY)NULL, (VOID*)NULL, &MyEvent[1]);
if(EFI_ERROR(Status)){
Print(L"My create event %r... \n", Status);
return Status;
}
Status = gBS->SetTimer(MyEvent[1], TimerPeriodic, 100*1000*1000); //set 10s timer
if(EFI_ERROR(Status)){
Print(L"My SetTimer %r \n", Status);
return Status;
}
while(1){
Status = gBS->WaitForEvent(2, MyEvent, &Index);
if(EFI_ERROR(Status)){
Print(L"My SetTimer %r \n", Status);
return Status;
}
if(Index == 0){
Status = gST->ConIn->ReadKeyStroke(gST->ConIn, &Key);
switch(Key.ScanCode){
case SCAN_UP:
Print(L"Key UP is pressed\n");
break;
case SCAN_DOWN:
Print(L"Key Down is pressed\n");
break;
case SCAN_LEFT:
Print(L"Key Left is pressed\n");
break;
case SCAN_RIGHT:
Print(L"Key Right is pressed\n");
break;
case SCAN_F1:
Print(L"Key F1 is pressed\n");
break;
case SCAN_F2:
Print(L"Key F2 is pressed\n");
break;
case SCAN_F3:
Print(L"Key F3 is pressed\n");
break;
case SCAN_F4:
Print(L"Key F4 is pressed\n");
break;
case SCAN_ESC:
Print(L"Key Esc is pressed\n");
goto End;
default:
Print(L"Key %a is pressed...\n", (CHAR8 *)&Key.UnicodeChar);
break;
}
}else{
Print(L"Timer event is triggered...\n");
}
}
End:
Status = gBS->CloseEvent(MyEvent[0]);
Status = gBS->CloseEvent(MyEvent[1]);
return Status;
}
实现效果如下:
gBS->CreateEvent 创建了定时器事件;
gST->ConIn->WaitForKey创建了等待按键事件;
gBS->WaitForEvent(2, MyEvent, &Index);等待事件触发;
gBS->CloseEvent关闭事件
注意SetTimer 的第二个参数TimerPeriodic, 表明这个事情将会被周期性的触发
后续主要针对定时器事件和其他事件更新Event的内容。