mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
318 lines
11 KiB
C
318 lines
11 KiB
C
|
/** @file
|
||
|
Simple Text Input Ex protocol from the UEFI 2.0 specification.
|
||
|
|
||
|
This protocol defines an extension to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL
|
||
|
which exposes much more state and modifier information from the input device,
|
||
|
also allows one to register a notification for a particular keystroke.
|
||
|
|
||
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef __SIMPLE_TEXT_IN_EX_H__
|
||
|
#define __SIMPLE_TEXT_IN_EX_H__
|
||
|
|
||
|
#include <Protocol/SimpleTextIn.h>
|
||
|
|
||
|
#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
|
||
|
{0xdd9e7534, 0x7762, 0x4698, { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa } }
|
||
|
|
||
|
|
||
|
typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
|
||
|
|
||
|
/**
|
||
|
The Reset() function resets the input device hardware. As part
|
||
|
of initialization process, the firmware/device will make a quick
|
||
|
but reasonable attempt to verify that the device is functioning.
|
||
|
If the ExtendedVerification flag is TRUE the firmware may take
|
||
|
an extended amount of time to verify the device is operating on
|
||
|
reset. Otherwise the reset operation is to occur as quickly as
|
||
|
possible. The hardware verification process is not defined by
|
||
|
this specification and is left up to the platform firmware or
|
||
|
driver to implement.
|
||
|
|
||
|
@param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
|
||
|
|
||
|
@param ExtendedVerification Indicates that the driver may
|
||
|
perform a more exhaustive
|
||
|
verification operation of the
|
||
|
device during reset.
|
||
|
|
||
|
|
||
|
@retval EFI_SUCCESS The device was reset.
|
||
|
|
||
|
@retval EFI_DEVICE_ERROR The device is not functioning
|
||
|
correctly and could not be reset.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_INPUT_RESET_EX)(
|
||
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||
|
IN BOOLEAN ExtendedVerification
|
||
|
);
|
||
|
|
||
|
|
||
|
///
|
||
|
/// EFI_KEY_TOGGLE_STATE. The toggle states are defined.
|
||
|
/// They are: EFI_TOGGLE_STATE_VALID, EFI_SCROLL_LOCK_ACTIVE
|
||
|
/// EFI_NUM_LOCK_ACTIVE, EFI_CAPS_LOCK_ACTIVE
|
||
|
///
|
||
|
typedef UINT8 EFI_KEY_TOGGLE_STATE;
|
||
|
|
||
|
typedef struct _EFI_KEY_STATE {
|
||
|
///
|
||
|
/// Reflects the currently pressed shift
|
||
|
/// modifiers for the input device. The
|
||
|
/// returned value is valid only if the high
|
||
|
/// order bit has been set.
|
||
|
///
|
||
|
UINT32 KeyShiftState;
|
||
|
///
|
||
|
/// Reflects the current internal state of
|
||
|
/// various toggled attributes. The returned
|
||
|
/// value is valid only if the high order
|
||
|
/// bit has been set.
|
||
|
///
|
||
|
EFI_KEY_TOGGLE_STATE KeyToggleState;
|
||
|
} EFI_KEY_STATE;
|
||
|
|
||
|
typedef struct {
|
||
|
///
|
||
|
/// The EFI scan code and Unicode value returned from the input device.
|
||
|
///
|
||
|
EFI_INPUT_KEY Key;
|
||
|
///
|
||
|
/// The current state of various toggled attributes as well as input modifier values.
|
||
|
///
|
||
|
EFI_KEY_STATE KeyState;
|
||
|
} EFI_KEY_DATA;
|
||
|
|
||
|
//
|
||
|
// Any Shift or Toggle State that is valid should have
|
||
|
// high order bit set.
|
||
|
//
|
||
|
// Shift state
|
||
|
//
|
||
|
#define EFI_SHIFT_STATE_VALID 0x80000000
|
||
|
#define EFI_RIGHT_SHIFT_PRESSED 0x00000001
|
||
|
#define EFI_LEFT_SHIFT_PRESSED 0x00000002
|
||
|
#define EFI_RIGHT_CONTROL_PRESSED 0x00000004
|
||
|
#define EFI_LEFT_CONTROL_PRESSED 0x00000008
|
||
|
#define EFI_RIGHT_ALT_PRESSED 0x00000010
|
||
|
#define EFI_LEFT_ALT_PRESSED 0x00000020
|
||
|
#define EFI_RIGHT_LOGO_PRESSED 0x00000040
|
||
|
#define EFI_LEFT_LOGO_PRESSED 0x00000080
|
||
|
#define EFI_MENU_KEY_PRESSED 0x00000100
|
||
|
#define EFI_SYS_REQ_PRESSED 0x00000200
|
||
|
|
||
|
//
|
||
|
// Toggle state
|
||
|
//
|
||
|
#define EFI_TOGGLE_STATE_VALID 0x80
|
||
|
#define EFI_KEY_STATE_EXPOSED 0x40
|
||
|
#define EFI_SCROLL_LOCK_ACTIVE 0x01
|
||
|
#define EFI_NUM_LOCK_ACTIVE 0x02
|
||
|
#define EFI_CAPS_LOCK_ACTIVE 0x04
|
||
|
|
||
|
//
|
||
|
// EFI Scan codes
|
||
|
//
|
||
|
#define SCAN_F11 0x0015
|
||
|
#define SCAN_F12 0x0016
|
||
|
#define SCAN_PAUSE 0x0048
|
||
|
#define SCAN_F13 0x0068
|
||
|
#define SCAN_F14 0x0069
|
||
|
#define SCAN_F15 0x006A
|
||
|
#define SCAN_F16 0x006B
|
||
|
#define SCAN_F17 0x006C
|
||
|
#define SCAN_F18 0x006D
|
||
|
#define SCAN_F19 0x006E
|
||
|
#define SCAN_F20 0x006F
|
||
|
#define SCAN_F21 0x0070
|
||
|
#define SCAN_F22 0x0071
|
||
|
#define SCAN_F23 0x0072
|
||
|
#define SCAN_F24 0x0073
|
||
|
#define SCAN_MUTE 0x007F
|
||
|
#define SCAN_VOLUME_UP 0x0080
|
||
|
#define SCAN_VOLUME_DOWN 0x0081
|
||
|
#define SCAN_BRIGHTNESS_UP 0x0100
|
||
|
#define SCAN_BRIGHTNESS_DOWN 0x0101
|
||
|
#define SCAN_SUSPEND 0x0102
|
||
|
#define SCAN_HIBERNATE 0x0103
|
||
|
#define SCAN_TOGGLE_DISPLAY 0x0104
|
||
|
#define SCAN_RECOVERY 0x0105
|
||
|
#define SCAN_EJECT 0x0106
|
||
|
|
||
|
/**
|
||
|
The function reads the next keystroke from the input device. If
|
||
|
there is no pending keystroke the function returns
|
||
|
EFI_NOT_READY. If there is a pending keystroke, then
|
||
|
KeyData.Key.ScanCode is the EFI scan code defined in Error!
|
||
|
Reference source not found. The KeyData.Key.UnicodeChar is the
|
||
|
actual printable character or is zero if the key does not
|
||
|
represent a printable character (control key, function key,
|
||
|
etc.). The KeyData.KeyState is shift state for the character
|
||
|
reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
|
||
|
When interpreting the data from this function, it should be
|
||
|
noted that if a class of printable characters that are
|
||
|
normally adjusted by shift modifiers (e.g. Shift Key + "f"
|
||
|
key) would be presented solely as a KeyData.Key.UnicodeChar
|
||
|
without the associated shift state. So in the previous example
|
||
|
of a Shift Key + "f" key being pressed, the only pertinent
|
||
|
data returned would be KeyData.Key.UnicodeChar with the value
|
||
|
of "F". This of course would not typically be the case for
|
||
|
non-printable characters such as the pressing of the Right
|
||
|
Shift Key + F10 key since the corresponding returned data
|
||
|
would be reflected both in the KeyData.KeyState.KeyShiftState
|
||
|
and KeyData.Key.ScanCode values. UEFI drivers which implement
|
||
|
the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
|
||
|
KeyData.Key and KeyData.KeyState values. These drivers must
|
||
|
always return the most current state of
|
||
|
KeyData.KeyState.KeyShiftState and
|
||
|
KeyData.KeyState.KeyToggleState. It should also be noted that
|
||
|
certain input devices may not be able to produce shift or toggle
|
||
|
state information, and in those cases the high order bit in the
|
||
|
respective Toggle and Shift state fields should not be active.
|
||
|
|
||
|
|
||
|
@param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
|
||
|
|
||
|
@param KeyData A pointer to a buffer that is filled in with
|
||
|
the keystroke state data for the key that was
|
||
|
pressed.
|
||
|
|
||
|
|
||
|
@retval EFI_SUCCESS The keystroke information was returned.
|
||
|
@retval EFI_NOT_READY There was no keystroke data available.
|
||
|
@retval EFI_DEVICE_ERROR The keystroke information was not returned due to
|
||
|
hardware errors.
|
||
|
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_INPUT_READ_KEY_EX)(
|
||
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||
|
OUT EFI_KEY_DATA *KeyData
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The SetState() function allows the input device hardware to
|
||
|
have state settings adjusted.
|
||
|
|
||
|
@param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
|
||
|
|
||
|
@param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
|
||
|
set the state for the input device.
|
||
|
|
||
|
|
||
|
@retval EFI_SUCCESS The device state was set appropriately.
|
||
|
|
||
|
@retval EFI_DEVICE_ERROR The device is not functioning
|
||
|
correctly and could not have the
|
||
|
setting adjusted.
|
||
|
|
||
|
@retval EFI_UNSUPPORTED The device does not support the
|
||
|
ability to have its state set.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_SET_STATE)(
|
||
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||
|
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||
|
);
|
||
|
|
||
|
///
|
||
|
/// The function will be called when the key sequence is typed specified by KeyData.
|
||
|
///
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
|
||
|
IN EFI_KEY_DATA *KeyData
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The RegisterKeystrokeNotify() function registers a function
|
||
|
which will be called when a specified keystroke will occur.
|
||
|
|
||
|
@param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
|
||
|
|
||
|
@param KeyData A pointer to a buffer that is filled in with
|
||
|
the keystroke information for the key that was
|
||
|
pressed. If KeyData.Key, KeyData.KeyState.KeyToggleState
|
||
|
and KeyData.KeyState.KeyShiftState are 0, then any incomplete
|
||
|
keystroke will trigger a notification of the KeyNotificationFunction.
|
||
|
|
||
|
@param KeyNotificationFunction Points to the function to be called when the key sequence
|
||
|
is typed specified by KeyData. This notification function
|
||
|
should be called at <=TPL_CALLBACK.
|
||
|
|
||
|
|
||
|
@param NotifyHandle Points to the unique handle assigned to
|
||
|
the registered notification.
|
||
|
|
||
|
@retval EFI_SUCCESS Key notify was registered successfully.
|
||
|
|
||
|
@retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
|
||
|
data structures.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
|
||
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||
|
IN EFI_KEY_DATA *KeyData,
|
||
|
IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
|
||
|
OUT VOID **NotifyHandle
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The UnregisterKeystrokeNotify() function removes the
|
||
|
notification which was previously registered.
|
||
|
|
||
|
@param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
|
||
|
|
||
|
@param NotificationHandle The handle of the notification
|
||
|
function being unregistered.
|
||
|
|
||
|
@retval EFI_SUCCESS Key notify was unregistered successfully.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER The NotificationHandle is
|
||
|
invalid.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
|
||
|
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||
|
IN VOID *NotificationHandle
|
||
|
);
|
||
|
|
||
|
|
||
|
///
|
||
|
/// 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;
|
||
|
};
|
||
|
|
||
|
|
||
|
extern EFI_GUID gEfiSimpleTextInputExProtocolGuid;
|
||
|
|
||
|
#endif
|
||
|
|