【UEFI基础】Event(一)

第一篇我们就从应用的角度看看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的内容。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值