【问题标题】:Wait for key press GNU EFI等待按键 GNU EFI
【发布时间】:2020-01-21 19:06:10
【问题描述】:

如何在 GNU EFI 中等待密钥?
我打算让它等待一个键,然后继续执行。
我的代码:

#include <efi.h>
#include <efilib.h>
#include <stdlib.h>

EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    EFI_STATUS Status;
    ST = SystemTable;
    Status = uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut);
    if (EFI_ERROR(Status)){
        ...
        return Status;
    }
    ...
    Status = ST->ConIn->Reset(ST->ConIn,1!=1);
    if (EFI_ERROR(Status)){
        ...
        return Status;
    }
    // wait for key here
    return EFI_SUCCESS;
}

【问题讨论】:

    标签: uefi gnu-efi


    【解决方案1】:

    您可以从the EDK2 implementation of UEFI Shell获得一些想法。

    基本原理是需要设置一个按键等待事件。

    另请参阅UEFI specification v2.8 中的12.3 简单文本输入协议部分。

    【讨论】:

      【解决方案2】:

      efi_main(...){...} 顶部之外,您应该添加 EFI_INPUT_KEY 键;

      efi_main 之后,

      #if defined(_GNU_EFI)
      InitializeLib(ImageHandle, SystemTable);  
      #endif
      

      添加 UINTN KeyEvent = 0;

      或者你的方式是什么......


      Print(L"PRESS ANY KEY OR PLEASE PRESS ESC TO EXIT.%N\n");
      
      uefi_call_wrapper(SystemTable->ConOut->OutputString, 1, SystemTable->ConOut, L"START KEY READ\n"); // YES WE COULD DO SIMPLY Print(...);
      
      SystemTable->ConIn->Reset(SystemTable->ConIn, FALSE);
      
      //NOW WE SHOULD READ SOME KEYS
      //YOU CAN ADD ANY OTHER OPTION HERE, WHEN CAPSLOCK ON THAT WILL PRINT FIRST CHAR CAPITALIZED BUT NOT REST OF CHARACTERS SINCE WE RESET...
      //IF YOU WANT MORE KEYS SIMPLY IN VISUAL STUDIO TYPE SCAN_ AND YOU WILL SEE OTHER KEYS
      
      /*...OTHER...*/
      
      while ((UINTN)Key.ScanCode != SCAN_ESC)
      {
          SystemTable->BootServices->WaitForEvent(1, &SystemTable->ConIn->WaitForKey, &KeyEvent);
          SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn, &Key);
          SystemTable->ConIn->Reset(SystemTable->ConIn, FALSE);
          Print(L"%c", Key.UnicodeChar);
      }
      
      /*...OTHER...*/
      
      SystemTable->RuntimeServices->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL);
      return EFI_SUCCESS;
      

      【讨论】:

        猜你喜欢
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多