xref: /dflybsd-src/stand/contrib/edk2/MdePkg/Include/Protocol/SimpleTextInEx.h (revision 1370a72311f999d5cc5041717aeea26d08ad6923)
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