22.2 Simple Text Input Protocol Implementation

The implementation of the Simple Text Input Protocols is typically found in the file SimpleTextInput.c. Appendix A contains a template for a SimpleTextInput.c file for a UEFI Driver. The list of tasks to implement the Simple Text Input Protocols is as follows:

  • Add global variable for the EFI_SIMPLE_TEXT_INPUT_PROTOCOL instance to SimpleTextInput.c. - Add global variable for the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance to SimpleTextInput.c.
  • Implement the Reset() and ReadKeyStroke()services in SimpleTextInput.c that is shared between the Simple Text Input Protocol and the Simple Text Input Ex Protocol.
  • Implement the SetState(), RegisterKeyNotify()and UnregisterKeyNotify() services in SimpleTextInput.c for the Simple Text Input Ex Protocol.
  • Implement notification function for the WaitForKey and WaitForKeyEx events in SimpleTextInput.c that is shared between the Simple Text Input Protocol and the Simple Text Input Ex Protocol.
  • Create WaitForKey and WaitForKeyEx events before the Simple Input Protocols are installed into the Handle Database.
  • If a device does not buffer keystrokes, or the buffer is very small, a timer event may be required to periodically read contents from a keyboard buffer.

Example 223, following, shows the protocol interface structure for the Simple Text Input Protocol and Example 224, below that, shows the protocol interface structure for the Simple Text Input Ex Protocol for reference. These two protocols are composed of services and each has an EFI_EVENT that may be used by the UEFI Boot Manager or UEFI Applications to determine if a keystroke has been pressed. The UEFI Boot Services WaitForEvent() and CheckEvent() can be used to perform these checks on the events specified by WaitForKey and WaitForKeyEx.

Example 223-Simple Text Input Protocol
typedef struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL;

///
/// The EFI_SIMPLE_TEXT_INPUT_PROTOCOL is used on the ConsoleIn device.
/// It is the minimum required protocol for ConsoleIn.
///
struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL {
  EFI_INPUT_RESET Reset;
  EFI_INPUT_READ_KEY ReadKeyStroke;
  ///
  /// Event to use with WaitForEvent() to wait for a key to be available
  ///
  EFI_EVENT WaitForKey;
};
Example 224-Simple Text Input Ex Protocol
typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;

///
/// The EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL is used on the ConsoleIn
/// device. It is an extension to the Simple Text Input protocol
/// which allows a variety of extended shift state information to be
/// returned.
///
struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
  EFI_INPUT_RESET_EX Reset;
  EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
  ///
  /// Event to use with WaitForEvent() to wait for a key to be available.
  ///
  EFI_EVENT WaitForKeyEx;
  EFI_SET_STATE SetState;
  EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
  EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
};