1*1370a723SSascha Wildner /** @file 2*1370a723SSascha Wildner Simple Text Input Ex protocol from the UEFI 2.0 specification. 3*1370a723SSascha Wildner 4*1370a723SSascha Wildner This protocol defines an extension to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL 5*1370a723SSascha Wildner which exposes much more state and modifier information from the input device, 6*1370a723SSascha Wildner also allows one to register a notification for a particular keystroke. 7*1370a723SSascha Wildner 8*1370a723SSascha Wildner Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 9*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent 10*1370a723SSascha Wildner 11*1370a723SSascha Wildner **/ 12*1370a723SSascha Wildner 13*1370a723SSascha Wildner #ifndef __SIMPLE_TEXT_IN_EX_H__ 14*1370a723SSascha Wildner #define __SIMPLE_TEXT_IN_EX_H__ 15*1370a723SSascha Wildner 16*1370a723SSascha Wildner #include <Protocol/SimpleTextIn.h> 17*1370a723SSascha Wildner 18*1370a723SSascha Wildner #define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \ 19*1370a723SSascha Wildner {0xdd9e7534, 0x7762, 0x4698, { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa } } 20*1370a723SSascha Wildner 21*1370a723SSascha Wildner typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL; 22*1370a723SSascha Wildner 23*1370a723SSascha Wildner /** 24*1370a723SSascha Wildner The Reset() function resets the input device hardware. As part 25*1370a723SSascha Wildner of initialization process, the firmware/device will make a quick 26*1370a723SSascha Wildner but reasonable attempt to verify that the device is functioning. 27*1370a723SSascha Wildner If the ExtendedVerification flag is TRUE the firmware may take 28*1370a723SSascha Wildner an extended amount of time to verify the device is operating on 29*1370a723SSascha Wildner reset. Otherwise the reset operation is to occur as quickly as 30*1370a723SSascha Wildner possible. The hardware verification process is not defined by 31*1370a723SSascha Wildner this specification and is left up to the platform firmware or 32*1370a723SSascha Wildner driver to implement. 33*1370a723SSascha Wildner 34*1370a723SSascha Wildner @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. 35*1370a723SSascha Wildner 36*1370a723SSascha Wildner @param ExtendedVerification Indicates that the driver may 37*1370a723SSascha Wildner perform a more exhaustive 38*1370a723SSascha Wildner verification operation of the 39*1370a723SSascha Wildner device during reset. 40*1370a723SSascha Wildner 41*1370a723SSascha Wildner 42*1370a723SSascha Wildner @retval EFI_SUCCESS The device was reset. 43*1370a723SSascha Wildner 44*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device is not functioning 45*1370a723SSascha Wildner correctly and could not be reset. 46*1370a723SSascha Wildner 47*1370a723SSascha Wildner **/ 48*1370a723SSascha Wildner typedef 49*1370a723SSascha Wildner EFI_STATUS 50*1370a723SSascha Wildner (EFIAPI *EFI_INPUT_RESET_EX)( 51*1370a723SSascha Wildner IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, 52*1370a723SSascha Wildner IN BOOLEAN ExtendedVerification 53*1370a723SSascha Wildner ); 54*1370a723SSascha Wildner 55*1370a723SSascha Wildner /// 56*1370a723SSascha Wildner /// EFI_KEY_TOGGLE_STATE. The toggle states are defined. 57*1370a723SSascha Wildner /// They are: EFI_TOGGLE_STATE_VALID, EFI_SCROLL_LOCK_ACTIVE 58*1370a723SSascha Wildner /// EFI_NUM_LOCK_ACTIVE, EFI_CAPS_LOCK_ACTIVE 59*1370a723SSascha Wildner /// 60*1370a723SSascha Wildner typedef UINT8 EFI_KEY_TOGGLE_STATE; 61*1370a723SSascha Wildner 62*1370a723SSascha Wildner typedef struct _EFI_KEY_STATE { 63*1370a723SSascha Wildner /// 64*1370a723SSascha Wildner /// Reflects the currently pressed shift 65*1370a723SSascha Wildner /// modifiers for the input device. The 66*1370a723SSascha Wildner /// returned value is valid only if the high 67*1370a723SSascha Wildner /// order bit has been set. 68*1370a723SSascha Wildner /// 69*1370a723SSascha Wildner UINT32 KeyShiftState; 70*1370a723SSascha Wildner /// 71*1370a723SSascha Wildner /// Reflects the current internal state of 72*1370a723SSascha Wildner /// various toggled attributes. The returned 73*1370a723SSascha Wildner /// value is valid only if the high order 74*1370a723SSascha Wildner /// bit has been set. 75*1370a723SSascha Wildner /// 76*1370a723SSascha Wildner EFI_KEY_TOGGLE_STATE KeyToggleState; 77*1370a723SSascha Wildner } EFI_KEY_STATE; 78*1370a723SSascha Wildner 79*1370a723SSascha Wildner typedef struct { 80*1370a723SSascha Wildner /// 81*1370a723SSascha Wildner /// The EFI scan code and Unicode value returned from the input device. 82*1370a723SSascha Wildner /// 83*1370a723SSascha Wildner EFI_INPUT_KEY Key; 84*1370a723SSascha Wildner /// 85*1370a723SSascha Wildner /// The current state of various toggled attributes as well as input modifier values. 86*1370a723SSascha Wildner /// 87*1370a723SSascha Wildner EFI_KEY_STATE KeyState; 88*1370a723SSascha Wildner } EFI_KEY_DATA; 89*1370a723SSascha Wildner 90*1370a723SSascha Wildner // 91*1370a723SSascha Wildner // Any Shift or Toggle State that is valid should have 92*1370a723SSascha Wildner // high order bit set. 93*1370a723SSascha Wildner // 94*1370a723SSascha Wildner // Shift state 95*1370a723SSascha Wildner // 96*1370a723SSascha Wildner #define EFI_SHIFT_STATE_VALID 0x80000000 97*1370a723SSascha Wildner #define EFI_RIGHT_SHIFT_PRESSED 0x00000001 98*1370a723SSascha Wildner #define EFI_LEFT_SHIFT_PRESSED 0x00000002 99*1370a723SSascha Wildner #define EFI_RIGHT_CONTROL_PRESSED 0x00000004 100*1370a723SSascha Wildner #define EFI_LEFT_CONTROL_PRESSED 0x00000008 101*1370a723SSascha Wildner #define EFI_RIGHT_ALT_PRESSED 0x00000010 102*1370a723SSascha Wildner #define EFI_LEFT_ALT_PRESSED 0x00000020 103*1370a723SSascha Wildner #define EFI_RIGHT_LOGO_PRESSED 0x00000040 104*1370a723SSascha Wildner #define EFI_LEFT_LOGO_PRESSED 0x00000080 105*1370a723SSascha Wildner #define EFI_MENU_KEY_PRESSED 0x00000100 106*1370a723SSascha Wildner #define EFI_SYS_REQ_PRESSED 0x00000200 107*1370a723SSascha Wildner 108*1370a723SSascha Wildner // 109*1370a723SSascha Wildner // Toggle state 110*1370a723SSascha Wildner // 111*1370a723SSascha Wildner #define EFI_TOGGLE_STATE_VALID 0x80 112*1370a723SSascha Wildner #define EFI_KEY_STATE_EXPOSED 0x40 113*1370a723SSascha Wildner #define EFI_SCROLL_LOCK_ACTIVE 0x01 114*1370a723SSascha Wildner #define EFI_NUM_LOCK_ACTIVE 0x02 115*1370a723SSascha Wildner #define EFI_CAPS_LOCK_ACTIVE 0x04 116*1370a723SSascha Wildner 117*1370a723SSascha Wildner // 118*1370a723SSascha Wildner // EFI Scan codes 119*1370a723SSascha Wildner // 120*1370a723SSascha Wildner #define SCAN_F11 0x0015 121*1370a723SSascha Wildner #define SCAN_F12 0x0016 122*1370a723SSascha Wildner #define SCAN_PAUSE 0x0048 123*1370a723SSascha Wildner #define SCAN_F13 0x0068 124*1370a723SSascha Wildner #define SCAN_F14 0x0069 125*1370a723SSascha Wildner #define SCAN_F15 0x006A 126*1370a723SSascha Wildner #define SCAN_F16 0x006B 127*1370a723SSascha Wildner #define SCAN_F17 0x006C 128*1370a723SSascha Wildner #define SCAN_F18 0x006D 129*1370a723SSascha Wildner #define SCAN_F19 0x006E 130*1370a723SSascha Wildner #define SCAN_F20 0x006F 131*1370a723SSascha Wildner #define SCAN_F21 0x0070 132*1370a723SSascha Wildner #define SCAN_F22 0x0071 133*1370a723SSascha Wildner #define SCAN_F23 0x0072 134*1370a723SSascha Wildner #define SCAN_F24 0x0073 135*1370a723SSascha Wildner #define SCAN_MUTE 0x007F 136*1370a723SSascha Wildner #define SCAN_VOLUME_UP 0x0080 137*1370a723SSascha Wildner #define SCAN_VOLUME_DOWN 0x0081 138*1370a723SSascha Wildner #define SCAN_BRIGHTNESS_UP 0x0100 139*1370a723SSascha Wildner #define SCAN_BRIGHTNESS_DOWN 0x0101 140*1370a723SSascha Wildner #define SCAN_SUSPEND 0x0102 141*1370a723SSascha Wildner #define SCAN_HIBERNATE 0x0103 142*1370a723SSascha Wildner #define SCAN_TOGGLE_DISPLAY 0x0104 143*1370a723SSascha Wildner #define SCAN_RECOVERY 0x0105 144*1370a723SSascha Wildner #define SCAN_EJECT 0x0106 145*1370a723SSascha Wildner 146*1370a723SSascha Wildner /** 147*1370a723SSascha Wildner The function reads the next keystroke from the input device. If 148*1370a723SSascha Wildner there is no pending keystroke the function returns 149*1370a723SSascha Wildner EFI_NOT_READY. If there is a pending keystroke, then 150*1370a723SSascha Wildner KeyData.Key.ScanCode is the EFI scan code defined in Error! 151*1370a723SSascha Wildner Reference source not found. The KeyData.Key.UnicodeChar is the 152*1370a723SSascha Wildner actual printable character or is zero if the key does not 153*1370a723SSascha Wildner represent a printable character (control key, function key, 154*1370a723SSascha Wildner etc.). The KeyData.KeyState is shift state for the character 155*1370a723SSascha Wildner reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode . 156*1370a723SSascha Wildner When interpreting the data from this function, it should be 157*1370a723SSascha Wildner noted that if a class of printable characters that are 158*1370a723SSascha Wildner normally adjusted by shift modifiers (e.g. Shift Key + "f" 159*1370a723SSascha Wildner key) would be presented solely as a KeyData.Key.UnicodeChar 160*1370a723SSascha Wildner without the associated shift state. So in the previous example 161*1370a723SSascha Wildner of a Shift Key + "f" key being pressed, the only pertinent 162*1370a723SSascha Wildner data returned would be KeyData.Key.UnicodeChar with the value 163*1370a723SSascha Wildner of "F". This of course would not typically be the case for 164*1370a723SSascha Wildner non-printable characters such as the pressing of the Right 165*1370a723SSascha Wildner Shift Key + F10 key since the corresponding returned data 166*1370a723SSascha Wildner would be reflected both in the KeyData.KeyState.KeyShiftState 167*1370a723SSascha Wildner and KeyData.Key.ScanCode values. UEFI drivers which implement 168*1370a723SSascha Wildner the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return 169*1370a723SSascha Wildner KeyData.Key and KeyData.KeyState values. These drivers must 170*1370a723SSascha Wildner always return the most current state of 171*1370a723SSascha Wildner KeyData.KeyState.KeyShiftState and 172*1370a723SSascha Wildner KeyData.KeyState.KeyToggleState. It should also be noted that 173*1370a723SSascha Wildner certain input devices may not be able to produce shift or toggle 174*1370a723SSascha Wildner state information, and in those cases the high order bit in the 175*1370a723SSascha Wildner respective Toggle and Shift state fields should not be active. 176*1370a723SSascha Wildner 177*1370a723SSascha Wildner 178*1370a723SSascha Wildner @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. 179*1370a723SSascha Wildner 180*1370a723SSascha Wildner @param KeyData A pointer to a buffer that is filled in with 181*1370a723SSascha Wildner the keystroke state data for the key that was 182*1370a723SSascha Wildner pressed. 183*1370a723SSascha Wildner 184*1370a723SSascha Wildner 185*1370a723SSascha Wildner @retval EFI_SUCCESS The keystroke information was returned. 186*1370a723SSascha Wildner @retval EFI_NOT_READY There was no keystroke data available. 187*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The keystroke information was not returned due to 188*1370a723SSascha Wildner hardware errors. 189*1370a723SSascha Wildner 190*1370a723SSascha Wildner 191*1370a723SSascha Wildner **/ 192*1370a723SSascha Wildner typedef 193*1370a723SSascha Wildner EFI_STATUS 194*1370a723SSascha Wildner (EFIAPI *EFI_INPUT_READ_KEY_EX)( 195*1370a723SSascha Wildner IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, 196*1370a723SSascha Wildner OUT EFI_KEY_DATA *KeyData 197*1370a723SSascha Wildner ); 198*1370a723SSascha Wildner 199*1370a723SSascha Wildner /** 200*1370a723SSascha Wildner The SetState() function allows the input device hardware to 201*1370a723SSascha Wildner have state settings adjusted. 202*1370a723SSascha Wildner 203*1370a723SSascha Wildner @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. 204*1370a723SSascha Wildner 205*1370a723SSascha Wildner @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to 206*1370a723SSascha Wildner set the state for the input device. 207*1370a723SSascha Wildner 208*1370a723SSascha Wildner 209*1370a723SSascha Wildner @retval EFI_SUCCESS The device state was set appropriately. 210*1370a723SSascha Wildner 211*1370a723SSascha Wildner @retval EFI_DEVICE_ERROR The device is not functioning 212*1370a723SSascha Wildner correctly and could not have the 213*1370a723SSascha Wildner setting adjusted. 214*1370a723SSascha Wildner 215*1370a723SSascha Wildner @retval EFI_UNSUPPORTED The device does not support the 216*1370a723SSascha Wildner ability to have its state set. 217*1370a723SSascha Wildner 218*1370a723SSascha Wildner **/ 219*1370a723SSascha Wildner typedef 220*1370a723SSascha Wildner EFI_STATUS 221*1370a723SSascha Wildner (EFIAPI *EFI_SET_STATE)( 222*1370a723SSascha Wildner IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, 223*1370a723SSascha Wildner IN EFI_KEY_TOGGLE_STATE *KeyToggleState 224*1370a723SSascha Wildner ); 225*1370a723SSascha Wildner 226*1370a723SSascha Wildner /// 227*1370a723SSascha Wildner /// The function will be called when the key sequence is typed specified by KeyData. 228*1370a723SSascha Wildner /// 229*1370a723SSascha Wildner typedef 230*1370a723SSascha Wildner EFI_STATUS 231*1370a723SSascha Wildner (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)( 232*1370a723SSascha Wildner IN EFI_KEY_DATA *KeyData 233*1370a723SSascha Wildner ); 234*1370a723SSascha Wildner 235*1370a723SSascha Wildner /** 236*1370a723SSascha Wildner The RegisterKeystrokeNotify() function registers a function 237*1370a723SSascha Wildner which will be called when a specified keystroke will occur. 238*1370a723SSascha Wildner 239*1370a723SSascha Wildner @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. 240*1370a723SSascha Wildner 241*1370a723SSascha Wildner @param KeyData A pointer to a buffer that is filled in with 242*1370a723SSascha Wildner the keystroke information for the key that was 243*1370a723SSascha Wildner pressed. If KeyData.Key, KeyData.KeyState.KeyToggleState 244*1370a723SSascha Wildner and KeyData.KeyState.KeyShiftState are 0, then any incomplete 245*1370a723SSascha Wildner keystroke will trigger a notification of the KeyNotificationFunction. 246*1370a723SSascha Wildner 247*1370a723SSascha Wildner @param KeyNotificationFunction Points to the function to be called when the key sequence 248*1370a723SSascha Wildner is typed specified by KeyData. This notification function 249*1370a723SSascha Wildner should be called at <=TPL_CALLBACK. 250*1370a723SSascha Wildner 251*1370a723SSascha Wildner 252*1370a723SSascha Wildner @param NotifyHandle Points to the unique handle assigned to 253*1370a723SSascha Wildner the registered notification. 254*1370a723SSascha Wildner 255*1370a723SSascha Wildner @retval EFI_SUCCESS Key notify was registered successfully. 256*1370a723SSascha Wildner 257*1370a723SSascha Wildner @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary 258*1370a723SSascha Wildner data structures. 259*1370a723SSascha Wildner 260*1370a723SSascha Wildner **/ 261*1370a723SSascha Wildner typedef 262*1370a723SSascha Wildner EFI_STATUS 263*1370a723SSascha Wildner (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)( 264*1370a723SSascha Wildner IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, 265*1370a723SSascha Wildner IN EFI_KEY_DATA *KeyData, 266*1370a723SSascha Wildner IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, 267*1370a723SSascha Wildner OUT VOID **NotifyHandle 268*1370a723SSascha Wildner ); 269*1370a723SSascha Wildner 270*1370a723SSascha Wildner /** 271*1370a723SSascha Wildner The UnregisterKeystrokeNotify() function removes the 272*1370a723SSascha Wildner notification which was previously registered. 273*1370a723SSascha Wildner 274*1370a723SSascha Wildner @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. 275*1370a723SSascha Wildner 276*1370a723SSascha Wildner @param NotificationHandle The handle of the notification 277*1370a723SSascha Wildner function being unregistered. 278*1370a723SSascha Wildner 279*1370a723SSascha Wildner @retval EFI_SUCCESS Key notify was unregistered successfully. 280*1370a723SSascha Wildner 281*1370a723SSascha Wildner @retval EFI_INVALID_PARAMETER The NotificationHandle is 282*1370a723SSascha Wildner invalid. 283*1370a723SSascha Wildner 284*1370a723SSascha Wildner **/ 285*1370a723SSascha Wildner typedef 286*1370a723SSascha Wildner EFI_STATUS 287*1370a723SSascha Wildner (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)( 288*1370a723SSascha Wildner IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, 289*1370a723SSascha Wildner IN VOID *NotificationHandle 290*1370a723SSascha Wildner ); 291*1370a723SSascha Wildner 292*1370a723SSascha Wildner /// 293*1370a723SSascha Wildner /// The EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL is used on the ConsoleIn 294*1370a723SSascha Wildner /// device. It is an extension to the Simple Text Input protocol 295*1370a723SSascha Wildner /// which allows a variety of extended shift state information to be 296*1370a723SSascha Wildner /// returned. 297*1370a723SSascha Wildner /// 298*1370a723SSascha Wildner struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL{ 299*1370a723SSascha Wildner EFI_INPUT_RESET_EX Reset; 300*1370a723SSascha Wildner EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx; 301*1370a723SSascha Wildner /// 302*1370a723SSascha Wildner /// Event to use with WaitForEvent() to wait for a key to be available. 303*1370a723SSascha Wildner /// 304*1370a723SSascha Wildner EFI_EVENT WaitForKeyEx; 305*1370a723SSascha Wildner EFI_SET_STATE SetState; 306*1370a723SSascha Wildner EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify; 307*1370a723SSascha Wildner EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify; 308*1370a723SSascha Wildner }; 309*1370a723SSascha Wildner 310*1370a723SSascha Wildner extern EFI_GUID gEfiSimpleTextInputExProtocolGuid; 311*1370a723SSascha Wildner 312*1370a723SSascha Wildner #endif 313