7410f33e366ebeb69173bf41096a78b6509b5396
[people/mcb30/edk2.git] / edk2 / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.h
1 /** @file\r
2   Header file for Terminal driver.\r
3 \r
4 Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 \r
13 **/\r
14 \r
15 #ifndef _TERMINAL_H_\r
16 #define _TERMINAL_H_\r
17 \r
18 \r
19 #include <PiDxe.h>\r
20 #include <Protocol/SimpleTextOut.h>\r
21 #include <Protocol/SerialIo.h>\r
22 #include <Guid/GlobalVariable.h>\r
23 #include <Protocol/DevicePath.h>\r
24 #include <Protocol/SimpleTextIn.h>\r
25 #include <Protocol/SimpleTextInEx.h>\r
26 #include <Guid/HotPlugDevice.h>\r
27 #include <Guid/PcAnsi.h>\r
28 #include <Library/DebugLib.h>\r
29 #include <Library/UefiDriverEntryPoint.h>\r
30 #include <Library/UefiLib.h>\r
31 #include <Library/ReportStatusCodeLib.h>\r
32 #include <Library/BaseMemoryLib.h>\r
33 #include <Library/MemoryAllocationLib.h>\r
34 #include <Library/UefiBootServicesTableLib.h>\r
35 #include <Library/UefiRuntimeServicesTableLib.h>\r
36 #include <Library/DevicePathLib.h>\r
37 #include <Library/PcdLib.h>\r
38 #include <Library/BaseLib.h>\r
39 \r
40 \r
41 #define RAW_FIFO_MAX_NUMBER 256\r
42 #define FIFO_MAX_NUMBER     128\r
43 \r
44 typedef struct {\r
45   UINT8 Head;\r
46   UINT8 Tail;\r
47   UINT8 Data[RAW_FIFO_MAX_NUMBER + 1];\r
48 } RAW_DATA_FIFO;\r
49 \r
50 typedef struct {\r
51   UINT8   Head;\r
52   UINT8   Tail;\r
53   UINT16  Data[FIFO_MAX_NUMBER + 1];\r
54 } UNICODE_FIFO;\r
55 \r
56 typedef struct {\r
57   UINT8         Head;\r
58   UINT8         Tail;\r
59   EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1];\r
60 } EFI_KEY_FIFO;\r
61 \r
62 #define TERMINAL_DEV_SIGNATURE  EFI_SIGNATURE_32 ('t', 'm', 'n', 'l')\r
63 \r
64 #define TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE EFI_SIGNATURE_32 ('t', 'm', 'e', 'n')\r
65 \r
66 typedef struct _TERMINAL_CONSOLE_IN_EX_NOTIFY {\r
67   UINTN                                 Signature;\r
68   EFI_HANDLE                            NotifyHandle;\r
69   EFI_KEY_DATA                          KeyData;\r
70   EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;\r
71   LIST_ENTRY                            NotifyEntry;\r
72 } TERMINAL_CONSOLE_IN_EX_NOTIFY;\r
73 typedef struct {\r
74   UINTN                               Signature;\r
75   EFI_HANDLE                          Handle;\r
76   UINT8                               TerminalType;\r
77   EFI_SERIAL_IO_PROTOCOL              *SerialIo;\r
78   EFI_DEVICE_PATH_PROTOCOL            *DevicePath;\r
79   EFI_SIMPLE_TEXT_INPUT_PROTOCOL      SimpleInput;\r
80   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL     SimpleTextOutput;\r
81   EFI_SIMPLE_TEXT_OUTPUT_MODE         SimpleTextOutputMode;\r
82   UINTN                               SerialInTimeOut;\r
83   RAW_DATA_FIFO                       RawFiFo;\r
84   UNICODE_FIFO                        UnicodeFiFo;\r
85   EFI_KEY_FIFO                        EfiKeyFiFo;\r
86   EFI_UNICODE_STRING_TABLE            *ControllerNameTable;\r
87   EFI_EVENT                           TwoSecondTimeOut;\r
88   UINT32                              InputState;\r
89   UINT32                              ResetState;\r
90 \r
91   //\r
92   // Esc could not be output to the screen by user,\r
93   // but the terminal driver need to output it to\r
94   // the terminal emulation software to send control sequence.\r
95   // This boolean is used by the terminal driver only\r
96   // to indicate whether the Esc could be sent or not.\r
97   //\r
98   BOOLEAN                             OutputEscChar;\r
99   EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL   SimpleInputEx;\r
100   LIST_ENTRY                          NotifyList;\r
101 } TERMINAL_DEV;\r
102 \r
103 #define INPUT_STATE_DEFAULT               0x00\r
104 #define INPUT_STATE_ESC                   0x01\r
105 #define INPUT_STATE_CSI                   0x02\r
106 #define INPUT_STATE_LEFTOPENBRACKET       0x04\r
107 #define INPUT_STATE_O                     0x08\r
108 #define INPUT_STATE_2                     0x10\r
109 \r
110 #define RESET_STATE_DEFAULT               0x00\r
111 #define RESET_STATE_ESC_R                 0x01\r
112 #define RESET_STATE_ESC_R_ESC_r           0x02\r
113 \r
114 #define TERMINAL_CON_IN_DEV_FROM_THIS(a)  CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE)\r
115 #define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE)\r
116 #define TERMINAL_CON_IN_EX_DEV_FROM_THIS(a)  CR (a, TERMINAL_DEV, SimpleInputEx, TERMINAL_DEV_SIGNATURE)\r
117 \r
118 typedef union {\r
119   UINT8 Utf8_1;\r
120   UINT8 Utf8_2[2];\r
121   UINT8 Utf8_3[3];\r
122 } UTF8_CHAR;\r
123 \r
124 #define PCANSITYPE                0\r
125 #define VT100TYPE                 1\r
126 #define VT100PLUSTYPE             2\r
127 #define VTUTF8TYPE                3\r
128 \r
129 #define LEFTOPENBRACKET           0x5b  // '['\r
130 #define ACAP                      0x41\r
131 #define BCAP                      0x42\r
132 #define CCAP                      0x43\r
133 #define DCAP                      0x44\r
134 \r
135 #define MODE0_COLUMN_COUNT        80\r
136 #define MODE0_ROW_COUNT           25\r
137 \r
138 #define MODE1_COLUMN_COUNT        80\r
139 #define MODE1_ROW_COUNT           50\r
140 \r
141 #define MODE2_COLUMN_COUNT        100\r
142 #define MODE2_ROW_COUNT           31\r
143 \r
144 #define BACKSPACE                 8\r
145 #define ESC                       27\r
146 #define CSI                       0x9B\r
147 #define DEL                       127\r
148 #define BRIGHT_CONTROL_OFFSET     2\r
149 #define FOREGROUND_CONTROL_OFFSET 6\r
150 #define BACKGROUND_CONTROL_OFFSET 11\r
151 #define ROW_OFFSET                2\r
152 #define COLUMN_OFFSET             5\r
153 \r
154 typedef struct {\r
155   UINT16  Unicode;\r
156   CHAR8   PcAnsi;\r
157   CHAR8   Ascii;\r
158 } UNICODE_TO_CHAR;\r
159 \r
160 //\r
161 // Global Variables\r
162 //\r
163 extern EFI_DRIVER_BINDING_PROTOCOL   gTerminalDriverBinding;\r
164 extern EFI_COMPONENT_NAME_PROTOCOL   gTerminalComponentName;\r
165 extern EFI_COMPONENT_NAME2_PROTOCOL  gTerminalComponentName2;\r
166 \r
167 extern EFI_GUID                      gSimpleTextInExNotifyGuid;\r
168 \r
169 /**\r
170   The user Entry Point for module Terminal. The user code starts with this function.\r
171 \r
172   @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
173   @param[in] SystemTable    A pointer to the EFI System Table.\r
174 \r
175   @retval EFI_SUCCESS       The entry point is executed successfully.\r
176   @retval other             Some error occurs when executing this entry point.\r
177 \r
178 **/\r
179 EFI_STATUS\r
180 EFIAPI\r
181 InitializeTerminal (\r
182   IN EFI_HANDLE         ImageHandle,\r
183   IN EFI_SYSTEM_TABLE   *SystemTable\r
184   )\r
185 ;\r
186 \r
187 /**\r
188   Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.Reset().\r
189   This driver only perform dependent serial device reset regardless of\r
190   the value of ExtendeVerification\r
191 \r
192   @param  This                     Indicates the calling context.\r
193   @param  ExtendedVerification     Skip by this driver.\r
194 \r
195   @return EFI_SUCCESS              The reset operation succeeds.\r
196   @return EFI_DEVICE_ERROR         The dependent serial port reset fails.\r
197 \r
198 **/\r
199 EFI_STATUS\r
200 EFIAPI\r
201 TerminalConInReset (\r
202   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    *This,\r
203   IN  BOOLEAN                           ExtendedVerification\r
204   )\r
205 ;\r
206 \r
207 \r
208 /**\r
209   Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.ReadKeyStroke().\r
210 \r
211   @param  This                Indicates the calling context.\r
212   @param  Key                 A pointer to a buffer that is filled in with the\r
213                               keystroke information for the key that was sent\r
214                               from terminal.\r
215 \r
216   @return EFI_SUCCESS         The keystroke information is returned successfully.\r
217   @return EFI_NOT_READY       There is no keystroke data available.\r
218   @return EFI_DEVICE_ERROR    The dependent serial device encounters error.\r
219 \r
220 **/\r
221 EFI_STATUS\r
222 EFIAPI\r
223 TerminalConInReadKeyStroke (\r
224   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,\r
225   OUT EFI_INPUT_KEY                   *Key\r
226   )\r
227 ;\r
228 \r
229 /**\r
230   Check if the key already has been registered.\r
231 \r
232   @param  RegsiteredData           A pointer to a buffer that is filled in with the\r
233                                    keystroke state data for the key that was\r
234                                    registered.\r
235   @param  InputData                A pointer to a buffer that is filled in with the\r
236                                    keystroke state data for the key that was\r
237                                    pressed.\r
238 \r
239   @retval TRUE                     Key be pressed matches a registered key.\r
240   @retval FLASE                    Match failed.\r
241 \r
242 **/\r
243 BOOLEAN\r
244 IsKeyRegistered (\r
245   IN EFI_KEY_DATA  *RegsiteredData,\r
246   IN EFI_KEY_DATA  *InputData\r
247   )\r
248 ;\r
249 \r
250 /**\r
251   Event notification function for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.WaitForKeyEx event\r
252   Signal the event if there is key available\r
253 \r
254   @param  Event                    Indicates the event that invoke this function.\r
255   @param  Context                  Indicates the calling context.\r
256 \r
257   @return none.\r
258 \r
259 **/\r
260 VOID\r
261 EFIAPI\r
262 TerminalConInWaitForKeyEx (\r
263   IN  EFI_EVENT       Event,\r
264   IN  VOID            *Context\r
265   )\r
266 ;\r
267 \r
268 //\r
269 // Simple Text Input Ex protocol prototypes\r
270 //\r
271 \r
272 /**\r
273   Reset the input device and optionaly run diagnostics\r
274 \r
275   @param  This                     Protocol instance pointer.\r
276   @param  ExtendedVerification     Driver may perform diagnostics on reset.\r
277 \r
278   @retval EFI_SUCCESS              The device was reset.\r
279   @retval EFI_DEVICE_ERROR         The device is not functioning properly and could\r
280                                    not be reset.\r
281 \r
282 **/\r
283 EFI_STATUS\r
284 EFIAPI\r
285 TerminalConInResetEx (\r
286   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
287   IN BOOLEAN                            ExtendedVerification\r
288   )\r
289 ;\r
290 \r
291 /**\r
292   Reads the next keystroke from the input device. The WaitForKey Event can\r
293   be used to test for existance of a keystroke via WaitForEvent () call.\r
294 \r
295   @param  This                     Protocol instance pointer.\r
296   @param  KeyData                  A pointer to a buffer that is filled in with the\r
297                                    keystroke state data for the key that was\r
298                                    pressed.\r
299 \r
300   @retval EFI_SUCCESS              The keystroke information was returned.\r
301   @retval EFI_NOT_READY            There was no keystroke data availiable.\r
302   @retval EFI_DEVICE_ERROR         The keystroke information was not returned due\r
303                                    to hardware errors.\r
304   @retval EFI_INVALID_PARAMETER    KeyData is NULL.\r
305 \r
306 **/\r
307 EFI_STATUS\r
308 EFIAPI\r
309 TerminalConInReadKeyStrokeEx (\r
310   IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
311   OUT EFI_KEY_DATA                      *KeyData\r
312   )\r
313 ;\r
314 \r
315 /**\r
316   Set certain state for the input device.\r
317 \r
318   @param  This                     Protocol instance pointer.\r
319   @param  KeyToggleState           A pointer to the EFI_KEY_TOGGLE_STATE to set the\r
320                                    state for the input device.\r
321 \r
322   @retval EFI_SUCCESS              The device state was set successfully.\r
323   @retval EFI_DEVICE_ERROR         The device is not functioning correctly and\r
324                                    could not have the setting adjusted.\r
325   @retval EFI_UNSUPPORTED          The device does not have the ability to set its\r
326                                    state.\r
327   @retval EFI_INVALID_PARAMETER    KeyToggleState is NULL.\r
328 \r
329 **/\r
330 EFI_STATUS\r
331 EFIAPI\r
332 TerminalConInSetState (\r
333   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
334   IN EFI_KEY_TOGGLE_STATE               *KeyToggleState\r
335   )\r
336 ;\r
337 \r
338 /**\r
339   Register a notification function for a particular keystroke for the input device.\r
340 \r
341   @param  This                     Protocol instance pointer.\r
342   @param  KeyData                  A pointer to a buffer that is filled in with the\r
343                                    keystroke information data for the key that was\r
344                                    pressed.\r
345   @param  KeyNotificationFunction  Points to the function to be called when the key\r
346                                    sequence is typed specified by KeyData.\r
347   @param  NotifyHandle             Points to the unique handle assigned to the\r
348                                    registered notification.\r
349 \r
350   @retval EFI_SUCCESS              The notification function was registered\r
351                                    successfully.\r
352   @retval EFI_OUT_OF_RESOURCES     Unable to allocate resources for necesssary data\r
353                                    structures.\r
354   @retval EFI_INVALID_PARAMETER    KeyData or NotifyHandle is NULL.\r
355 \r
356 **/\r
357 EFI_STATUS\r
358 EFIAPI\r
359 TerminalConInRegisterKeyNotify (\r
360   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
361   IN EFI_KEY_DATA                       *KeyData,\r
362   IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,\r
363   OUT EFI_HANDLE                        *NotifyHandle\r
364   )\r
365 ;\r
366 \r
367 /**\r
368   Remove a registered notification function from a particular keystroke.\r
369 \r
370   @param  This                     Protocol instance pointer.\r
371   @param  NotificationHandle       The handle of the notification function being\r
372                                    unregistered.\r
373 \r
374   @retval EFI_SUCCESS              The notification function was unregistered\r
375                                    successfully.\r
376   @retval EFI_INVALID_PARAMETER    The NotificationHandle is invalid.\r
377   @retval EFI_NOT_FOUND            Can not find the matching entry in database.\r
378 \r
379 **/\r
380 EFI_STATUS\r
381 EFIAPI\r
382 TerminalConInUnregisterKeyNotify (\r
383   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
384   IN EFI_HANDLE                         NotificationHandle\r
385   )\r
386 ;\r
387 \r
388 /**\r
389   Event notification function for EFI_SIMPLE_TEXT_INPUT_PROTOCOL.WaitForKey event\r
390   Signal the event if there is key available\r
391 \r
392   @param  Event                    Indicates the event that invoke this function.\r
393   @param  Context                  Indicates the calling context.\r
394 \r
395   @return None\r
396 \r
397 **/\r
398 VOID\r
399 EFIAPI\r
400 TerminalConInWaitForKey (\r
401   IN  EFI_EVENT     Event,\r
402   IN  VOID          *Context\r
403   )\r
404 ;\r
405 \r
406 /**\r
407   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset().\r
408   If ExtendeVerification is TRUE, then perform dependent serial device reset,\r
409   and set display mode to mode 0.\r
410   If ExtendedVerification is FALSE, only set display mode to mode 0.\r
411 \r
412   @param  This                  Indicates the calling context.\r
413   @param  ExtendedVerification  Indicates that the driver may perform a more\r
414                                 exhaustive verification operation of the device\r
415                                 during reset.\r
416 \r
417   @return EFI_SUCCESS           The reset operation succeeds.\r
418   @return EFI_DEVICE_ERROR      The terminal is not functioning correctly or the serial port reset fails.\r
419 \r
420 **/\r
421 EFI_STATUS\r
422 EFIAPI\r
423 TerminalConOutReset (\r
424   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,\r
425   IN  BOOLEAN                            ExtendedVerification\r
426   )\r
427 ;\r
428 \r
429 /**\r
430   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString().\r
431   The Unicode string will be converted to terminal expressible data stream\r
432   and send to terminal via serial port.\r
433 \r
434   @param  This                    Indicates the calling context.\r
435   @param  WString                 The Null-terminated Unicode string to be displayed\r
436                                   on the terminal screen.\r
437 \r
438   @retval EFI_SUCCESS             The string is output successfully.\r
439   @retval EFI_DEVICE_ERROR        The serial port fails to send the string out.\r
440   @retval EFI_WARN_UNKNOWN_GLYPH  Indicates that some of the characters in the Unicode string could not\r
441                                   be rendered and are skipped.\r
442   @retval EFI_UNSUPPORTED         If current display mode is out of range.\r
443 \r
444 **/\r
445 EFI_STATUS\r
446 EFIAPI\r
447 TerminalConOutOutputString (\r
448   IN   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
449   IN  CHAR16                            *WString\r
450   )\r
451 ;\r
452 \r
453 /**\r
454   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString().\r
455   If one of the characters in the *Wstring is\r
456   neither valid Unicode drawing characters,\r
457   not ASCII code, then this function will return\r
458   EFI_UNSUPPORTED.\r
459 \r
460   @param  This              Indicates the calling context.\r
461   @param  WString           The Null-terminated Unicode string to be tested.\r
462 \r
463   @return EFI_SUCCESS       The terminal is capable of rendering the output string.\r
464   @return EFI_UNSUPPORTED   Some of the characters in the Unicode string cannot be rendered.\r
465 \r
466 **/\r
467 EFI_STATUS\r
468 EFIAPI\r
469 TerminalConOutTestString (\r
470   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
471   IN  CHAR16                           *WString\r
472   )\r
473 ;\r
474 \r
475 /**\r
476   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().\r
477   It returns information for an available text mode\r
478   that the terminal supports.\r
479   In this driver, we support text mode 80x25 (mode 0),\r
480   80x50 (mode 1), 100x31 (mode 2).\r
481 \r
482   @param This        Indicates the calling context.\r
483   @param ModeNumber  The mode number to return information on.\r
484   @param Columns     The returned columns of the requested mode.\r
485   @param Rows        The returned rows of the requested mode.\r
486 \r
487   @return EFI_SUCCESS       The requested mode information is returned.\r
488   @return EFI_UNSUPPORTED   The mode number is not valid.\r
489   @return EFI_DEVICE_ERROR\r
490 \r
491 **/\r
492 EFI_STATUS\r
493 EFIAPI\r
494 TerminalConOutQueryMode (\r
495   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
496   IN  UINTN                            ModeNumber,\r
497   OUT UINTN                            *Columns,\r
498   OUT UINTN                            *Rows\r
499   )\r
500 ;\r
501 \r
502 /**\r
503   Implements EFI_SIMPLE_TEXT_OUT.SetMode().\r
504   Set the terminal to a specified display mode.\r
505   In this driver, we only support mode 0.\r
506 \r
507   @param This          Indicates the calling context.\r
508   @param ModeNumber    The text mode to set.\r
509 \r
510   @return EFI_SUCCESS       The requested text mode is set.\r
511   @return EFI_DEVICE_ERROR  The requested text mode cannot be set \r
512                             because of serial device error.\r
513   @return EFI_UNSUPPORTED   The text mode number is not valid.\r
514 \r
515 **/\r
516 EFI_STATUS\r
517 EFIAPI\r
518 TerminalConOutSetMode (\r
519   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
520   IN  UINTN                            ModeNumber\r
521   )\r
522 ;\r
523 \r
524 /**\r
525   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute().\r
526 \r
527   @param This        Indicates the calling context.\r
528   @param Attribute   The attribute to set. Only bit0..6 are valid, all other bits\r
529                      are undefined and must be zero.\r
530 \r
531   @return EFI_SUCCESS        The requested attribute is set.\r
532   @return EFI_DEVICE_ERROR   The requested attribute cannot be set due to serial port error.\r
533   @return EFI_UNSUPPORTED    The attribute requested is not defined by EFI spec.\r
534 \r
535 **/\r
536 EFI_STATUS\r
537 EFIAPI\r
538 TerminalConOutSetAttribute (\r
539   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
540   IN  UINTN                            Attribute\r
541   )\r
542 ;\r
543 \r
544 /**\r
545   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen().\r
546   It clears the ANSI terminal's display to the\r
547   currently selected background color.\r
548 \r
549   @param This     Indicates the calling context.\r
550 \r
551   @return EFI_SUCCESS       The operation completed successfully.\r
552   @return EFI_DEVICE_ERROR  The terminal screen cannot be cleared due to serial port error.\r
553   @return EFI_UNSUPPORTED   The terminal is not in a valid display mode.\r
554 \r
555 **/\r
556 EFI_STATUS\r
557 EFIAPI\r
558 TerminalConOutClearScreen (\r
559   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This\r
560   )\r
561 ;\r
562 \r
563 /**\r
564   Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition().\r
565 \r
566   @param This      Indicates the calling context.\r
567   @param Column    The row to set cursor to.\r
568   @param Row       The column to set cursor to.\r
569 \r
570   @return EFI_SUCCESS       The operation completed successfully.\r
571   @return EFI_DEVICE_ERROR  The request fails due to serial port error.\r
572   @return EFI_UNSUPPORTED   The terminal is not in a valid text mode, or the cursor position\r
573                             is invalid for current mode.\r
574 \r
575 **/\r
576 EFI_STATUS\r
577 EFIAPI\r
578 TerminalConOutSetCursorPosition (\r
579   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
580   IN  UINTN                            Column,\r
581   IN  UINTN                            Row\r
582   )\r
583 ;\r
584 \r
585 /**\r
586   Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
587   In this driver, the cursor cannot be hidden.\r
588 \r
589   @param This      Indicates the calling context.\r
590   @param Visible   If TRUE, the cursor is set to be visible,\r
591                    If FALSE, the cursor is set to be invisible.\r
592 \r
593   @return EFI_SUCCESS      The request is valid.\r
594   @return EFI_UNSUPPORTED  The terminal does not support cursor hidden.\r
595 \r
596 **/\r
597 EFI_STATUS\r
598 EFIAPI\r
599 TerminalConOutEnableCursor (\r
600   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
601   IN  BOOLEAN                          Visible\r
602   )\r
603 ;\r
604 \r
605 /**\r
606   Test to see if this driver supports ControllerHandle. \r
607 \r
608   @param  This                Protocol instance pointer.\r
609   @param  ControllerHandle    Handle of device to test\r
610   @param  RemainingDevicePath Optional parameter use to pick a specific child\r
611                               device to start.\r
612 \r
613   @retval EFI_SUCCESS         This driver supports this device\r
614   @retval EFI_ALREADY_STARTED This driver is already running on this device\r
615   @retval other               This driver does not support this device\r
616 \r
617 **/\r
618 EFI_STATUS\r
619 EFIAPI\r
620 TerminalDriverBindingSupported (\r
621   IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
622   IN EFI_HANDLE                     Controller,\r
623   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
624   );\r
625 \r
626 /**\r
627   Start this driver on ControllerHandle by opening a Serial IO protocol,\r
628   reading Device Path, and creating a child handle with a Simple Text In,\r
629   Simple Text In Ex and Simple Text Out protocol, and device path protocol.\r
630   And store Console Device Environment Variables.\r
631 \r
632   @param  This                 Protocol instance pointer.\r
633   @param  ControllerHandle     Handle of device to bind driver to\r
634   @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
635                                device to start.\r
636 \r
637   @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
638   @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
639   @retval other                This driver does not support this device\r
640 \r
641 **/\r
642 EFI_STATUS\r
643 EFIAPI\r
644 TerminalDriverBindingStart (\r
645   IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
646   IN EFI_HANDLE                     Controller,\r
647   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
648   );\r
649 \r
650 /**\r
651   Stop this driver on ControllerHandle by closing Simple Text In, Simple Text\r
652   In Ex, Simple Text Out protocol, and removing parent device path from\r
653   Console Device Environment Variables.    \r
654 \r
655   @param  This              Protocol instance pointer.\r
656   @param  ControllerHandle  Handle of device to stop driver on\r
657   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
658                             children is zero stop the entire bus driver.\r
659   @param  ChildHandleBuffer List of Child Handles to Stop.\r
660 \r
661   @retval EFI_SUCCESS       This driver is removed ControllerHandle.\r
662   @retval other             This driver could not be removed from this device.\r
663 \r
664 **/\r
665 EFI_STATUS\r
666 EFIAPI\r
667 TerminalDriverBindingStop (\r
668   IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
669   IN  EFI_HANDLE                     Controller,\r
670   IN  UINTN                          NumberOfChildren,\r
671   IN  EFI_HANDLE                     *ChildHandleBuffer\r
672   );\r
673 \r
674 /**\r
675   Retrieves a Unicode string that is the user readable name of the driver.\r
676 \r
677   This function retrieves the user readable name of a driver in the form of a\r
678   Unicode string. If the driver specified by This has a user readable name in\r
679   the language specified by Language, then a pointer to the driver name is\r
680   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
681   by This does not support the language specified by Language,\r
682   then EFI_UNSUPPORTED is returned.\r
683 \r
684   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
685                                 EFI_COMPONENT_NAME_PROTOCOL instance.\r
686 \r
687   @param  Language[in]          A pointer to a Null-terminated ASCII string\r
688                                 array indicating the language. This is the\r
689                                 language of the driver name that the caller is\r
690                                 requesting, and it must match one of the\r
691                                 languages specified in SupportedLanguages. The\r
692                                 number of languages supported by a driver is up\r
693                                 to the driver writer. Language is specified\r
694                                 in RFC 3066 or ISO 639-2 language code format.\r
695 \r
696   @param  DriverName[out]       A pointer to the Unicode string to return.\r
697                                 This Unicode string is the name of the\r
698                                 driver specified by This in the language\r
699                                 specified by Language.\r
700 \r
701   @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
702                                 This and the language specified by Language was\r
703                                 returned in DriverName.\r
704 \r
705   @retval EFI_INVALID_PARAMETER Language is NULL.\r
706 \r
707   @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
708 \r
709   @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
710                                 the language specified by Language.\r
711 \r
712 **/\r
713 EFI_STATUS\r
714 EFIAPI\r
715 TerminalComponentNameGetDriverName (\r
716   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
717   IN  CHAR8                        *Language,\r
718   OUT CHAR16                       **DriverName\r
719   );\r
720 \r
721 \r
722 /**\r
723   Retrieves a Unicode string that is the user readable name of the controller\r
724   that is being managed by a driver.\r
725 \r
726   This function retrieves the user readable name of the controller specified by\r
727   ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
728   driver specified by This has a user readable name in the language specified by\r
729   Language, then a pointer to the controller name is returned in ControllerName,\r
730   and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
731   managing the controller specified by ControllerHandle and ChildHandle,\r
732   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
733   support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
734 \r
735   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
736                                 EFI_COMPONENT_NAME_PROTOCOL instance.\r
737 \r
738   @param  ControllerHandle[in]  The handle of a controller that the driver\r
739                                 specified by This is managing.  This handle\r
740                                 specifies the controller whose name is to be\r
741                                 returned.\r
742 \r
743   @param  ChildHandle[in]       The handle of the child controller to retrieve\r
744                                 the name of.  This is an optional parameter that\r
745                                 may be NULL.  It will be NULL for device\r
746                                 drivers.  It will also be NULL for a bus drivers\r
747                                 that wish to retrieve the name of the bus\r
748                                 controller.  It will not be NULL for a bus\r
749                                 driver that wishes to retrieve the name of a\r
750                                 child controller.\r
751 \r
752   @param  Language[in]          A pointer to a Null-terminated ASCII string\r
753                                 array indicating the language.  This is the\r
754                                 language of the driver name that the caller is\r
755                                 requesting, and it must match one of the\r
756                                 languages specified in SupportedLanguages. The\r
757                                 number of languages supported by a driver is up\r
758                                 to the driver writer. Language is specified in\r
759                                 RFC 3066 or ISO 639-2 language code format.\r
760 \r
761   @param  ControllerName[out]   A pointer to the Unicode string to return.\r
762                                 This Unicode string is the name of the\r
763                                 controller specified by ControllerHandle and\r
764                                 ChildHandle in the language specified by\r
765                                 Language from the point of view of the driver\r
766                                 specified by This.\r
767 \r
768   @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
769                                 the language specified by Language for the\r
770                                 driver specified by This was returned in\r
771                                 DriverName.\r
772 \r
773   @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
774 \r
775   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
776                                 EFI_HANDLE.\r
777 \r
778   @retval EFI_INVALID_PARAMETER Language is NULL.\r
779 \r
780   @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
781 \r
782   @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
783                                 managing the controller specified by\r
784                                 ControllerHandle and ChildHandle.\r
785 \r
786   @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
787                                 the language specified by Language.\r
788 \r
789 **/\r
790 EFI_STATUS\r
791 EFIAPI\r
792 TerminalComponentNameGetControllerName (\r
793   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
794   IN  EFI_HANDLE                                      ControllerHandle,\r
795   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
796   IN  CHAR8                                           *Language,\r
797   OUT CHAR16                                          **ControllerName\r
798   );\r
799 \r
800 \r
801 //\r
802 // internal functions\r
803 //\r
804 \r
805 /**\r
806   Check for a pending key in the Efi Key FIFO or Serial device buffer.\r
807 \r
808   @param  This                     Indicates the calling context.\r
809 \r
810   @retval EFI_SUCCESS              There is key pending.\r
811   @retval EFI_NOT_READY            There is no key pending.\r
812   @retval EFI_DEVICE_ERROR         If Serial IO is not attched to serial device.\r
813 \r
814 **/\r
815 EFI_STATUS\r
816 TerminalConInCheckForKey (\r
817   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This\r
818   )\r
819 ;\r
820 \r
821 /**\r
822   Update terminal device path in Console Device Environment Variables.\r
823 \r
824   @param  VariableName           The Console Device Environment Variable.\r
825   @param  ParentDevicePath       The terminal devcie path to be updated.\r
826 \r
827   @return None.\r
828 \r
829 **/\r
830 VOID\r
831 TerminalUpdateConsoleDevVariable (\r
832   IN CHAR16                    *VariableName,\r
833   IN EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath\r
834   )\r
835 ;\r
836 \r
837 /**\r
838   Remove console device variable.\r
839 \r
840   @param  VariableName           A pointer to the variable name.\r
841   @param  ParentDevicePath       A pointer to the parent device path.\r
842 \r
843   @return None.\r
844 \r
845 **/\r
846 VOID\r
847 TerminalRemoveConsoleDevVariable (\r
848   IN CHAR16                    *VariableName,\r
849   IN EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath\r
850   )\r
851 ;\r
852 \r
853 /**\r
854   Read the EFI variable (VendorGuid/Name) and return a dynamically allocated\r
855   buffer, and the size of the buffer. On failure return NULL.\r
856 \r
857   @param  Name                   String part of EFI variable name\r
858   @param  VendorGuid             GUID part of EFI variable name\r
859   @param  VariableSize           Returns the size of the EFI variable that was read\r
860 \r
861   @return Dynamically allocated memory that contains a copy of the EFI variable.\r
862   @return Caller is repsoncible freeing the buffer.\r
863   @retval NULL                   Variable was not read\r
864 \r
865 **/\r
866 VOID                                *\r
867 TerminalGetVariableAndSize (\r
868   IN  CHAR16              *Name,\r
869   IN  EFI_GUID            *VendorGuid,\r
870   OUT UINTN               *VariableSize\r
871   )\r
872 ;\r
873 \r
874 /**\r
875   Build termial device path according to terminal type.\r
876 \r
877   @param  TerminalType           The terminal type is PC ANSI, VT100, VT100+ or VT-UTF8.\r
878   @param  ParentDevicePath       Parent devcie path.\r
879   @param  TerminalDevicePath     Returned terminal device path, if building successfully.\r
880 \r
881   @retval EFI_UNSUPPORTED        Terminal does not belong to the supported type.\r
882   @retval EFI_OUT_OF_RESOURCES   Generate terminal device path failed.\r
883   @retval EFI_SUCCESS            Build terminal device path successfully.\r
884 \r
885 **/\r
886 EFI_STATUS\r
887 SetTerminalDevicePath (\r
888   IN  UINT8                       TerminalType,\r
889   IN  EFI_DEVICE_PATH_PROTOCOL    *ParentDevicePath,\r
890   OUT EFI_DEVICE_PATH_PROTOCOL    **TerminalDevicePath\r
891   )\r
892 ;\r
893 \r
894 /**\r
895   Initialize the Raw Data FIFO.\r
896 \r
897   @param TerminalDevice          The terminal device.\r
898 \r
899   @return None.\r
900 \r
901 **/\r
902 VOID\r
903 InitializeRawFiFo (\r
904   IN  TERMINAL_DEV  *TerminalDevice\r
905   )\r
906 ;\r
907 \r
908 /**\r
909   Initialize the Unicode FIFO.\r
910 \r
911   @param TerminalDevice          The terminal device.\r
912 \r
913   @return None.\r
914 \r
915 **/\r
916 VOID\r
917 InitializeUnicodeFiFo (\r
918   IN  TERMINAL_DEV  *TerminalDevice\r
919   )\r
920 ;\r
921 \r
922 /**\r
923   Initialize the EFI Key FIFO.\r
924 \r
925   @param TerminalDevice          The terminal device.\r
926 \r
927   @return None.\r
928 \r
929 **/\r
930 VOID\r
931 InitializeEfiKeyFiFo (\r
932   IN  TERMINAL_DEV  *TerminalDevice\r
933   )\r
934 ;\r
935 \r
936 /**\r
937   Get one key out of serial buffer.\r
938 \r
939   @param  SerialIo           Serial I/O protocl attached to the serial device.\r
940   @param  Input              The fetched key.\r
941 \r
942   @return EFI_NOT_READY      If serial buffer is empty.\r
943   @return EFI_DEVICE_ERROR   If reading serial buffer encounter error.\r
944   @return EFI_SUCCESS        If reading serial buffer successfully, put\r
945                              the fetched key to the parameter output.\r
946 \r
947 **/\r
948 EFI_STATUS\r
949 GetOneKeyFromSerial (\r
950   EFI_SERIAL_IO_PROTOCOL  *SerialIo,\r
951   UINT8                   *Input\r
952   )\r
953 ;\r
954 \r
955 /**\r
956   Insert one byte raw data into the Raw Data FIFO.\r
957 \r
958   @param  TerminalDevice       Terminal driver private structure.\r
959   @param  Input                The key will be input.\r
960 \r
961   @return TRUE                 If insert successfully.\r
962   @return FLASE                If Raw Data buffer is full before key insertion,\r
963                                and the key is lost.\r
964 \r
965 **/\r
966 BOOLEAN\r
967 RawFiFoInsertOneKey (\r
968   TERMINAL_DEV  *TerminalDevice,\r
969   UINT8         Input\r
970   )\r
971 ;\r
972 \r
973 /**\r
974   Remove one pre-fetched key out of the Raw Data FIFO.\r
975 \r
976   @param  TerminalDevice       Terminal driver private structure.\r
977   @param  Output               The key will be removed.\r
978 \r
979   @return TRUE                 If insert successfully.\r
980   @return FLASE                If Raw Data FIFO buffer is empty before remove operation.\r
981 \r
982 **/\r
983 BOOLEAN\r
984 RawFiFoRemoveOneKey (\r
985   TERMINAL_DEV  *TerminalDevice,\r
986   UINT8         *Output\r
987   )\r
988 ;\r
989 \r
990 /**\r
991   Clarify whether Raw Data FIFO buffer is empty.\r
992 \r
993   @param  TerminalDevice       Terminal driver private structure\r
994 \r
995   @return TRUE                 If Raw Data FIFO buffer is empty.\r
996   @return FLASE                If Raw Data FIFO buffer is not empty.\r
997 \r
998 **/\r
999 BOOLEAN\r
1000 IsRawFiFoEmpty (\r
1001   TERMINAL_DEV  *TerminalDevice\r
1002   )\r
1003 ;\r
1004 \r
1005 /**\r
1006   Clarify whether Raw Data FIFO buffer is full.\r
1007 \r
1008   @param  TerminalDevice       Terminal driver private structure\r
1009 \r
1010   @return TRUE                 If Raw Data FIFO buffer is full.\r
1011   @return FLASE                If Raw Data FIFO buffer is not full.\r
1012 \r
1013 **/\r
1014 BOOLEAN\r
1015 IsRawFiFoFull (\r
1016   TERMINAL_DEV  *TerminalDevice\r
1017   )\r
1018 ;\r
1019 \r
1020 /**\r
1021   Insert one pre-fetched key into the FIFO buffer.\r
1022 \r
1023   @param  TerminalDevice       Terminal driver private structure.\r
1024   @param  Key                  The key will be input.\r
1025 \r
1026   @return TRUE                 If insert successfully.\r
1027   @return FLASE                If FIFO buffer is full before key insertion,\r
1028                                and the key is lost.\r
1029 \r
1030 **/\r
1031 BOOLEAN\r
1032 EfiKeyFiFoInsertOneKey (\r
1033   TERMINAL_DEV      *TerminalDevice,\r
1034   EFI_INPUT_KEY     Key\r
1035   )\r
1036 ;\r
1037 \r
1038 /**\r
1039   Remove one pre-fetched key out of the FIFO buffer.\r
1040 \r
1041   @param  TerminalDevice       Terminal driver private structure.\r
1042   @param  Output               The key will be removed.\r
1043 \r
1044   @return TRUE                 If insert successfully.\r
1045   @return FLASE                If FIFO buffer is empty before remove operation.\r
1046 \r
1047 **/\r
1048 BOOLEAN\r
1049 EfiKeyFiFoRemoveOneKey (\r
1050   TERMINAL_DEV  *TerminalDevice,\r
1051   EFI_INPUT_KEY *Output\r
1052   )\r
1053 ;\r
1054 \r
1055 /**\r
1056   Clarify whether FIFO buffer is empty.\r
1057 \r
1058   @param  TerminalDevice       Terminal driver private structure\r
1059 \r
1060   @return TRUE                 If FIFO buffer is empty.\r
1061   @return FLASE                If FIFO buffer is not empty.\r
1062 \r
1063 **/\r
1064 BOOLEAN\r
1065 IsEfiKeyFiFoEmpty (\r
1066   TERMINAL_DEV  *TerminalDevice\r
1067   )\r
1068 ;\r
1069 \r
1070 /**\r
1071   Clarify whether FIFO buffer is full.\r
1072 \r
1073   @param  TerminalDevice       Terminal driver private structure\r
1074 \r
1075   @return TRUE                 If FIFO buffer is full.\r
1076   @return FLASE                If FIFO buffer is not full.\r
1077 \r
1078 **/\r
1079 BOOLEAN\r
1080 IsEfiKeyFiFoFull (\r
1081   TERMINAL_DEV  *TerminalDevice\r
1082   )\r
1083 ;\r
1084 \r
1085 /**\r
1086   Insert one pre-fetched key into the Unicode FIFO buffer.\r
1087 \r
1088   @param  TerminalDevice       Terminal driver private structure.\r
1089   @param  Input                The key will be input.\r
1090 \r
1091   @return TRUE                 If insert successfully.\r
1092   @return FLASE                If Unicode FIFO buffer is full before key insertion,\r
1093                                and the key is lost.\r
1094 \r
1095 **/\r
1096 BOOLEAN\r
1097 UnicodeFiFoInsertOneKey (\r
1098   TERMINAL_DEV      *TerminalDevice,\r
1099   UINT16            Input\r
1100   )\r
1101 ;\r
1102 \r
1103 /**\r
1104   Remove one pre-fetched key out of the Unicode FIFO buffer.\r
1105 \r
1106   @param  TerminalDevice       Terminal driver private structure.\r
1107   @param  Output               The key will be removed.\r
1108 \r
1109   @return TRUE                 If insert successfully.\r
1110   @return FLASE                If Unicode FIFO buffer is empty before remove operation.\r
1111 \r
1112 **/\r
1113 BOOLEAN\r
1114 UnicodeFiFoRemoveOneKey (\r
1115   TERMINAL_DEV  *TerminalDevice,\r
1116   UINT16        *Output\r
1117   )\r
1118 ;\r
1119 \r
1120 /**\r
1121   Clarify whether Unicode FIFO buffer is empty.\r
1122 \r
1123   @param  TerminalDevice       Terminal driver private structure\r
1124 \r
1125   @return TRUE                 If Unicode FIFO buffer is empty.\r
1126   @return FLASE                If Unicode FIFO buffer is not empty.\r
1127 \r
1128 **/\r
1129 BOOLEAN\r
1130 IsUnicodeFiFoEmpty (\r
1131   TERMINAL_DEV  *TerminalDevice\r
1132   )\r
1133 ;\r
1134 \r
1135 /**\r
1136   Clarify whether Unicode FIFO buffer is full.\r
1137 \r
1138   @param  TerminalDevice       Terminal driver private structure\r
1139 \r
1140   @return TRUE                 If Unicode FIFO buffer is full.\r
1141   @return FLASE                If Unicode FIFO buffer is not full.\r
1142 \r
1143 **/\r
1144 BOOLEAN\r
1145 IsUnicodeFiFoFull (\r
1146   TERMINAL_DEV  *TerminalDevice\r
1147   )\r
1148 ;\r
1149 \r
1150 /**\r
1151   Count Unicode FIFO buffer.\r
1152 \r
1153   @param  TerminalDevice       Terminal driver private structure\r
1154 \r
1155   @return The count in bytes of Unicode FIFO.\r
1156 \r
1157 **/\r
1158 UINT8\r
1159 UnicodeFiFoGetKeyCount (\r
1160   TERMINAL_DEV    *TerminalDevice\r
1161   )\r
1162 ;\r
1163 \r
1164 /**\r
1165   Translate raw data into Unicode (according to different encode), and \r
1166   translate Unicode into key information. (according to different standard). \r
1167 \r
1168   @param  TerminalDevice       Terminal driver private structure.\r
1169 \r
1170   @return none.\r
1171 \r
1172 **/\r
1173 VOID\r
1174 TranslateRawDataToEfiKey (\r
1175   IN  TERMINAL_DEV      *TerminalDevice\r
1176   )\r
1177 ;\r
1178 \r
1179 //\r
1180 // internal functions for PC ANSI\r
1181 //\r
1182 \r
1183 /**\r
1184   Translate all raw data in the Raw FIFI into unicode, and insert\r
1185   them into Unicode FIFO.\r
1186 \r
1187   @param TerminalDevice          The terminal device.\r
1188 \r
1189   @return None.\r
1190 \r
1191 **/\r
1192 VOID\r
1193 AnsiRawDataToUnicode (\r
1194   IN  TERMINAL_DEV    *TerminalDevice\r
1195   )\r
1196 ;\r
1197 \r
1198 /**\r
1199   Converts a stream of Unicode characters from a terminal input device into EFI Keys that\r
1200   can be read through the Simple Input Protocol. \r
1201   \r
1202   The table below shows the keyboard input mappings that this function supports.\r
1203   If the ESC sequence listed in one of the columns is presented, then it is translated\r
1204   into the coorespoding EFI Scan Code.  If a matching sequence is not found, then the raw\r
1205   key strokes are converted into EFI Keys.\r
1206 \r
1207   2 seconds are allowed for an ESC sequence to be completed.  If the ESC sequence is not\r
1208   completed in 2 seconds, then the raw key strokes of the partial ESC sequence are\r
1209   converted into EFI Keys.\r
1210   There is one special input sequence that will force the system to reset.\r
1211   This is ESC R ESC r ESC R.\r
1212 \r
1213   Symbols used in table below\r
1214   ===========================\r
1215     ESC = 0x1B\r
1216     CSI = 0x9B\r
1217     DEL = 0x7f\r
1218     ^   = CTRL\r
1219   +=========+======+===========+==========+==========+\r
1220   |         | EFI  | UEFI 2.0  |          |          |\r
1221   |         | Scan |           |  VT100+  |          |\r
1222   |   KEY   | Code |  PC ANSI  |  VTUTF8  |   VT100  |\r
1223   +=========+======+===========+==========+==========+\r
1224   | NULL    | 0x00 |           |          |          |\r
1225   | UP      | 0x01 | ESC [ A   | ESC [ A  | ESC [ A  |\r
1226   | DOWN    | 0x02 | ESC [ B   | ESC [ B  | ESC [ B  |\r
1227   | RIGHT   | 0x03 | ESC [ C   | ESC [ C  | ESC [ C  |\r
1228   | LEFT    | 0x04 | ESC [ D   | ESC [ D  | ESC [ D  |\r
1229   | HOME    | 0x05 | ESC [ H   | ESC h    | ESC [ H  |\r
1230   | END     | 0x06 | ESC [ F   | ESC k    | ESC [ K  |\r
1231   | INSERT  | 0x07 | ESC [ @   | ESC +    | ESC [ @  |\r
1232   |         |      | ESC [ L   |          | ESC [ L  |\r
1233   | DELETE  | 0x08 | ESC [ X   | ESC -    | ESC [ P  |\r
1234   | PG UP   | 0x09 | ESC [ I   | ESC ?    | ESC [ V  |\r
1235   |         |      |           |          | ESC [ ?  |\r
1236   | PG DOWN | 0x0A | ESC [ G   | ESC /    | ESC [ U  |\r
1237   |         |      |           |          | ESC [ /  |\r
1238   | F1      | 0x0B | ESC [ M   | ESC 1    | ESC O P  |\r
1239   | F2      | 0x0C | ESC [ N   | ESC 2    | ESC O Q  |\r
1240   | F3      | 0x0D | ESC [ O   | ESC 3    | ESC O w  |\r
1241   | F4      | 0x0E | ESC [ P   | ESC 4    | ESC O x  |\r
1242   | F5      | 0x0F | ESC [ Q   | ESC 5    | ESC O t  |\r
1243   | F6      | 0x10 | ESC [ R   | ESC 6    | ESC O u  |\r
1244   | F7      | 0x11 | ESC [ S   | ESC 7    | ESC O q  |\r
1245   | F8      | 0x12 | ESC [ T   | ESC 8    | ESC O r  |\r
1246   | F9      | 0x13 | ESC [ U   | ESC 9    | ESC O p  |\r
1247   | F10     | 0x14 | ESC [ V   | ESC 0    | ESC O M  |\r
1248   | Escape  | 0x17 | ESC       | ESC      | ESC      |\r
1249   | F11     | 0x15 |           | ESC !    |          |\r
1250   | F12     | 0x16 |           | ESC @    |          |\r
1251   +=========+======+===========+==========+==========+\r
1252   \r
1253   Special Mappings\r
1254   ================\r
1255   ESC R ESC r ESC R = Reset System\r
1256 \r
1257 \r
1258   @param TerminalDevice   The terminal device to use to translate raw input into EFI Keys\r
1259 \r
1260   @return None.\r
1261 \r
1262 **/\r
1263 VOID\r
1264 UnicodeToEfiKey (\r
1265   IN  TERMINAL_DEV    *PcAnsiDevice\r
1266   )\r
1267 ;\r
1268 \r
1269 /**\r
1270   Check if input string is valid Ascii string, valid EFI control characters\r
1271   or valid text graphics.\r
1272 \r
1273   @param  TerminalDevice          The terminal device.\r
1274   @param  WString                 The input string.          \r
1275  \r
1276   @retval EFI_UNSUPPORTED         If not all input characters are valid.\r
1277   @retval EFI_SUCCESS             If all input characters are valid.\r
1278 \r
1279 **/\r
1280 EFI_STATUS\r
1281 AnsiTestString (\r
1282   IN  TERMINAL_DEV    *TerminalDevice,\r
1283   IN  CHAR16          *WString\r
1284   )\r
1285 ;\r
1286 \r
1287 //\r
1288 // internal functions for VTUTF8\r
1289 //\r
1290 \r
1291 /**\r
1292   Translate all VT-UTF8 characters in the Raw FIFI into unicode characters, \r
1293   and insert them into Unicode FIFO.\r
1294 \r
1295   @param VtUtf8Device          The terminal device.\r
1296 \r
1297   @return None.\r
1298 \r
1299 **/\r
1300 VOID\r
1301 VTUTF8RawDataToUnicode (\r
1302   IN  TERMINAL_DEV    *VtUtf8Device\r
1303   )\r
1304 ;\r
1305 \r
1306 /**\r
1307   Check if input string is valid VT-UTF8 string.\r
1308 \r
1309   @param  TerminalDevice          The terminal device.\r
1310   @param  WString                 The input string.          \r
1311  \r
1312   @retval EFI_SUCCESS             If all input characters are valid.\r
1313 \r
1314 **/\r
1315 EFI_STATUS\r
1316 VTUTF8TestString (\r
1317   IN  TERMINAL_DEV    *TerminalDevice,\r
1318   IN  CHAR16          *WString\r
1319   )\r
1320 ;\r
1321 \r
1322 /** \r
1323   Translate one Unicode character into VT-UTF8 characters.\r
1324 \r
1325   UTF8 Encoding Table\r
1326   Bits per Character | Unicode Character Range | Unicode Binary  Encoding |     UTF8 Binary Encoding\r
1327         0-7              |     0x0000 - 0x007F     |     00000000 0xxxxxxx        |   0xxxxxxx\r
1328         8-11           |     0x0080 - 0x07FF       |     00000xxx xxxxxxxx        |   110xxxxx 10xxxxxx\r
1329        12-16           |     0x0800 - 0xFFFF       |     xxxxxxxx xxxxxxxx        |   1110xxxx 10xxxxxx 10xxxxxx\r
1330 \r
1331 \r
1332   @param  Unicode          Unicode character need translating.\r
1333   @param  Utf8Char         Return VT-UTF8 character set.\r
1334   @param  ValidBytes       The count of valid VT-UTF8 characters. If\r
1335                            ValidBytes is zero, no valid VT-UTF8 returned.\r
1336   \r
1337   @return None.\r
1338 \r
1339 **/\r
1340 VOID\r
1341 UnicodeToUtf8 (\r
1342   IN  CHAR16      Unicode,\r
1343   OUT UTF8_CHAR   *Utf8Char,\r
1344   OUT UINT8       *ValidBytes\r
1345   )\r
1346 ;\r
1347 \r
1348 /**\r
1349   Get one valid VT-UTF8 characters set from Raw Data FIFO.\r
1350 \r
1351   @param  Utf8Device          The terminal device.\r
1352   @param  Utf8Char            Returned valid VT-UTF8 characters set.\r
1353   @param  ValidBytes          The count of returned VT-VTF8 characters. \r
1354                               If ValidBytes is zero, no valid VT-UTF8 returned.\r
1355 \r
1356   @retval None.\r
1357 \r
1358 **/\r
1359 VOID\r
1360 GetOneValidUtf8Char (\r
1361   IN  TERMINAL_DEV      *Utf8Device,\r
1362   OUT UTF8_CHAR         *Utf8Char,\r
1363   OUT UINT8             *ValidBytes\r
1364   )\r
1365 ;\r
1366 \r
1367 /** \r
1368   Translate VT-UTF8 characters into one Unicode character.\r
1369 \r
1370   UTF8 Encoding Table\r
1371   Bits per Character | Unicode Character Range | Unicode Binary  Encoding |     UTF8 Binary Encoding\r
1372         0-7              |     0x0000 - 0x007F     |     00000000 0xxxxxxx        |   0xxxxxxx\r
1373         8-11           |     0x0080 - 0x07FF       |     00000xxx xxxxxxxx        |   110xxxxx 10xxxxxx\r
1374        12-16           |     0x0800 - 0xFFFF       |     xxxxxxxx xxxxxxxx        |   1110xxxx 10xxxxxx 10xxxxxx\r
1375 \r
1376 \r
1377   @param  Utf8Char         VT-UTF8 character set needs translating.\r
1378   @param  ValidBytes       The count of valid VT-UTF8 characters.\r
1379   @param  UnicodeChar      Returned unicode character. \r
1380   \r
1381   @return None.\r
1382 \r
1383 **/\r
1384 VOID\r
1385 Utf8ToUnicode (\r
1386   IN  UTF8_CHAR       Utf8Char,\r
1387   IN  UINT8           ValidBytes,\r
1388   OUT CHAR16          *UnicodeChar\r
1389   )\r
1390 ;\r
1391 \r
1392 //\r
1393 // functions for boxdraw unicode\r
1394 //\r
1395 \r
1396 /**\r
1397   Detects if a Unicode char is for Box Drawing text graphics.\r
1398 \r
1399   @param  Graphic      Unicode char to test.\r
1400   @param  PcAnsi       Optional pointer to return PCANSI equivalent of\r
1401                        Graphic.\r
1402   @param  Ascii        Optional pointer to return ASCII equivalent of\r
1403                        Graphic.\r
1404 \r
1405   @return TRUE         If Graphic is a supported Unicode Box Drawing character.\r
1406 \r
1407 **/\r
1408 BOOLEAN\r
1409 TerminalIsValidTextGraphics (\r
1410   IN  CHAR16  Graphic,\r
1411   OUT CHAR8   *PcAnsi, OPTIONAL\r
1412   OUT CHAR8   *Ascii OPTIONAL\r
1413   )\r
1414 ;\r
1415 \r
1416 /**\r
1417   Detects if a valid ASCII char.\r
1418 \r
1419   @param  Ascii        An ASCII character.\r
1420                        \r
1421   @retval TRUE         If it is a valid ASCII character.\r
1422   @retval FALSE        If it is not a valid ASCII character.\r
1423 \r
1424 **/\r
1425 BOOLEAN\r
1426 TerminalIsValidAscii (\r
1427   IN  CHAR16  Ascii\r
1428   )\r
1429 ;\r
1430 \r
1431 /**\r
1432   Detects if a valid EFI control character.\r
1433 \r
1434   @param  CharC        An input EFI Control character.\r
1435                        \r
1436   @retval TRUE         If it is a valid EFI control character.\r
1437   @retval FALSE        If it is not a valid EFI control character.\r
1438 \r
1439 **/\r
1440 BOOLEAN\r
1441 TerminalIsValidEfiCntlChar (\r
1442   IN  CHAR16  CharC\r
1443   )\r
1444 ;\r
1445 \r
1446 #endif\r