简单文本输入协议

获取按键输入的函数位于简单文本输入协议(Simple Text Input Protocol)EFI_SIMPLE_TEXT_INPUT_PROTOCOL中。和上一章所介绍的简单文本输出协议EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL一样,它也是EFI系统表(System Table)EFI_SYSTEM_TABLE的一个成员。

EFI_SYSTEM_TABLE的定义

图3.1:EFI_SYSTEM_TABLE的定义

EFI_SIMPLE_TEXT_INPUT_PROTOCOL的定义如代码3.1所示,这里只定义了我们要使用的函数。关于该结构体的具体定义,参见标准文档"11.3 Simple Text Input Protocol(P.420)"

struct EFI_SIMPLE_TEXT_INPUT_PROTOCOL {
    unsigned long long _buf;
    unsigned long long (*ReadKeyStroke)(
        struct EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
        struct EFI_INPUT_KEY *Key);
};

代码3.1: EFI_SIMPLE_TEXT_INPUT_PROTOCOL的定义

按键输入可以通过ReadKeyStroke函数来获取(标准文档"11.3 Simple Text Input Protocol(P.423)")。该函数是一个非阻塞的函数,当没有按键输入时,它将会返回一个错误的状态。函数的参数如下(省略第一个参数This指针):

  • struct EFI_INPUT_KEY *Key: 指向按键输入缓冲区的指针

结构体EFI_INPUT_KEY的定义如代码3.2所示。

struct EFI_INPUT_KEY {
    unsigned short ScanCode;
    unsigned short UnicodeChar;
};

代码3.2: EFI_INPUT_KEY的定义

其成员的含义如下:

  • unsigned short ScanCode: 按键的扫描码(Scan Code),用于表示Unicode范围之外的按键(Esc键、方向键、功能键等)。扫描码的完整列表见标准文档"Table 88(P.410)"。本书接下来的内容中将只会使用Esc键(扫描码为0x17)。对于Unicode范围内的按键,其扫描码为0。
  • unsigned short UnicodeChar: 当输入按键在Unicode范围内时为其所对应的Unicode值,否则为0。