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