2 Implementation for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL protocol.
4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 // This list is used to define the valid extend chars.
19 // It also provides a mapping from Unicode to PCANSI or
20 // ASCII. The ASCII mapping we just made up.
23 UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii
[] = {
24 { BOXDRAW_HORIZONTAL
, 0xc4, L
'-' },
25 { BOXDRAW_VERTICAL
, 0xb3, L
'|' },
26 { BOXDRAW_DOWN_RIGHT
, 0xda, L
'/' },
27 { BOXDRAW_DOWN_LEFT
, 0xbf, L
'\\' },
28 { BOXDRAW_UP_RIGHT
, 0xc0, L
'\\' },
29 { BOXDRAW_UP_LEFT
, 0xd9, L
'/' },
30 { BOXDRAW_VERTICAL_RIGHT
, 0xc3, L
'|' },
31 { BOXDRAW_VERTICAL_LEFT
, 0xb4, L
'|' },
32 { BOXDRAW_DOWN_HORIZONTAL
, 0xc2, L
'+' },
33 { BOXDRAW_UP_HORIZONTAL
, 0xc1, L
'+' },
34 { BOXDRAW_VERTICAL_HORIZONTAL
, 0xc5, L
'+' },
35 { BOXDRAW_DOUBLE_HORIZONTAL
, 0xcd, L
'-' },
36 { BOXDRAW_DOUBLE_VERTICAL
, 0xba, L
'|' },
37 { BOXDRAW_DOWN_RIGHT_DOUBLE
, 0xd5, L
'/' },
38 { BOXDRAW_DOWN_DOUBLE_RIGHT
, 0xd6, L
'/' },
39 { BOXDRAW_DOUBLE_DOWN_RIGHT
, 0xc9, L
'/' },
40 { BOXDRAW_DOWN_LEFT_DOUBLE
, 0xb8, L
'\\' },
41 { BOXDRAW_DOWN_DOUBLE_LEFT
, 0xb7, L
'\\' },
42 { BOXDRAW_DOUBLE_DOWN_LEFT
, 0xbb, L
'\\' },
43 { BOXDRAW_UP_RIGHT_DOUBLE
, 0xd4, L
'\\' },
44 { BOXDRAW_UP_DOUBLE_RIGHT
, 0xd3, L
'\\' },
45 { BOXDRAW_DOUBLE_UP_RIGHT
, 0xc8, L
'\\' },
46 { BOXDRAW_UP_LEFT_DOUBLE
, 0xbe, L
'/' },
47 { BOXDRAW_UP_DOUBLE_LEFT
, 0xbd, L
'/' },
48 { BOXDRAW_DOUBLE_UP_LEFT
, 0xbc, L
'/' },
49 { BOXDRAW_VERTICAL_RIGHT_DOUBLE
, 0xc6, L
'|' },
50 { BOXDRAW_VERTICAL_DOUBLE_RIGHT
, 0xc7, L
'|' },
51 { BOXDRAW_DOUBLE_VERTICAL_RIGHT
, 0xcc, L
'|' },
52 { BOXDRAW_VERTICAL_LEFT_DOUBLE
, 0xb5, L
'|' },
53 { BOXDRAW_VERTICAL_DOUBLE_LEFT
, 0xb6, L
'|' },
54 { BOXDRAW_DOUBLE_VERTICAL_LEFT
, 0xb9, L
'|' },
55 { BOXDRAW_DOWN_HORIZONTAL_DOUBLE
, 0xd1, L
'+' },
56 { BOXDRAW_DOWN_DOUBLE_HORIZONTAL
, 0xd2, L
'+' },
57 { BOXDRAW_DOUBLE_DOWN_HORIZONTAL
, 0xcb, L
'+' },
58 { BOXDRAW_UP_HORIZONTAL_DOUBLE
, 0xcf, L
'+' },
59 { BOXDRAW_UP_DOUBLE_HORIZONTAL
, 0xd0, L
'+' },
60 { BOXDRAW_DOUBLE_UP_HORIZONTAL
, 0xca, L
'+' },
61 { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE
, 0xd8, L
'+' },
62 { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL
, 0xd7, L
'+' },
63 { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL
, 0xce, L
'+' },
65 { BLOCKELEMENT_FULL_BLOCK
, 0xdb, L
'*' },
66 { BLOCKELEMENT_LIGHT_SHADE
, 0xb0, L
'+' },
68 { GEOMETRICSHAPE_UP_TRIANGLE
, 0x1e, L
'^' },
69 { GEOMETRICSHAPE_RIGHT_TRIANGLE
, 0x10, L
'>' },
70 { GEOMETRICSHAPE_DOWN_TRIANGLE
, 0x1f, L
'v' },
71 { GEOMETRICSHAPE_LEFT_TRIANGLE
, 0x11, L
'<' },
73 { ARROW_LEFT
, 0x3c, L
'<' },
74 { ARROW_UP
, 0x18, L
'^' },
75 { ARROW_RIGHT
, 0x3e, L
'>' },
76 { ARROW_DOWN
, 0x19, L
'v' },
78 { 0x0000, 0x00, L
'\0' }
81 CHAR16 mSetModeString
[] = { ESC
, '[', '=', '3', 'h', 0 };
82 CHAR16 mSetAttributeString
[] = { ESC
, '[', '0', 'm', ESC
, '[', '4', '0', 'm', ESC
, '[', '4', '0', 'm', 0 };
83 CHAR16 mClearScreenString
[] = { ESC
, '[', '2', 'J', 0 };
84 CHAR16 mSetCursorPositionString
[] = { ESC
, '[', '0', '0', ';', '0', '0', 'H', 0 };
87 // Body of the ConOut functions
91 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset().
93 If ExtendeVerification is TRUE, then perform dependent serial device reset,
94 and set display mode to mode 0.
95 If ExtendedVerification is FALSE, only set display mode to mode 0.
97 @param This Indicates the calling context.
98 @param ExtendedVerification Indicates that the driver may perform a more
99 exhaustive verification operation of the device
102 @retval EFI_SUCCESS The reset operation succeeds.
103 @retval EFI_DEVICE_ERROR The terminal is not functioning correctly or the serial port reset fails.
108 TerminalConOutReset (
109 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
110 IN BOOLEAN ExtendedVerification
114 TERMINAL_DEV
*TerminalDevice
;
116 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
119 // Perform a more exhaustive reset by resetting the serial port.
121 if (ExtendedVerification
) {
123 // Report progress code here
125 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
127 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_PC_RESET
),
128 TerminalDevice
->DevicePath
131 Status
= TerminalDevice
->SerialIo
->Reset (TerminalDevice
->SerialIo
);
132 if (EFI_ERROR (Status
)) {
134 // Report error code here
136 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
137 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
138 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_EC_CONTROLLER_ERROR
),
139 TerminalDevice
->DevicePath
146 This
->SetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BLACK
));
148 Status
= This
->SetMode (This
, 0);
155 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString().
157 The Unicode string will be converted to terminal expressible data stream
158 and send to terminal via serial port.
160 @param This Indicates the calling context.
161 @param WString The Null-terminated Unicode string to be displayed
162 on the terminal screen.
164 @retval EFI_SUCCESS The string is output successfully.
165 @retval EFI_DEVICE_ERROR The serial port fails to send the string out.
166 @retval EFI_WARN_UNKNOWN_GLYPH Indicates that some of the characters in the Unicode string could not
167 be rendered and are skipped.
168 @retval EFI_UNSUPPORTED If current display mode is out of range.
173 TerminalConOutOutputString (
174 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
178 TERMINAL_DEV
*TerminalDevice
;
179 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
189 // flag used to indicate whether condition happens which will cause
190 // return EFI_WARN_UNKNOWN_GLYPH
199 // get Terminal device data structure pointer.
201 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
204 // Get current display mode
208 if (Mode
->Mode
>= Mode
->MaxMode
) {
209 return EFI_UNSUPPORTED
;
219 for (; *WString
!= CHAR_NULL
; WString
++) {
221 switch (TerminalDevice
->TerminalType
) {
227 if (!TerminalIsValidTextGraphics (*WString
, &GraphicChar
, &AsciiChar
)) {
229 // If it's not a graphic character convert Unicode to ASCII.
231 GraphicChar
= (CHAR8
) *WString
;
233 if (!(TerminalIsValidAscii (GraphicChar
) || TerminalIsValidEfiCntlChar (GraphicChar
))) {
235 // when this driver use the OutputString to output control string,
236 // TerminalDevice->OutputEscChar is set to let the Esc char
237 // to be output to the terminal emulation software.
239 if ((GraphicChar
== 27) && TerminalDevice
->OutputEscChar
) {
247 AsciiChar
= GraphicChar
;
251 if (TerminalDevice
->TerminalType
!= PCANSITYPE
) {
252 GraphicChar
= AsciiChar
;
257 Status
= TerminalDevice
->SerialIo
->Write (
258 TerminalDevice
->SerialIo
,
263 if (EFI_ERROR (Status
)) {
270 UnicodeToUtf8 (*WString
, &Utf8Char
, &ValidBytes
);
272 Status
= TerminalDevice
->SerialIo
->Write (
273 TerminalDevice
->SerialIo
,
277 if (EFI_ERROR (Status
)) {
283 // Update cursor position.
288 if (Mode
->CursorColumn
> 0) {
289 Mode
->CursorColumn
--;
294 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
299 case CHAR_CARRIAGE_RETURN
:
300 Mode
->CursorColumn
= 0;
304 if (Mode
->CursorColumn
< (INT32
) (MaxColumn
- 1)) {
306 Mode
->CursorColumn
++;
310 Mode
->CursorColumn
= 0;
311 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
323 return EFI_WARN_UNKNOWN_GLYPH
;
329 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
330 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
331 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_EC_OUTPUT_ERROR
),
332 TerminalDevice
->DevicePath
335 return EFI_DEVICE_ERROR
;
340 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString().
342 If one of the characters in the *Wstring is
343 neither valid Unicode drawing characters,
344 not ASCII code, then this function will return
347 @param This Indicates the calling context.
348 @param WString The Null-terminated Unicode string to be tested.
350 @retval EFI_SUCCESS The terminal is capable of rendering the output string.
351 @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered.
356 TerminalConOutTestString (
357 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
361 TERMINAL_DEV
*TerminalDevice
;
365 // get Terminal device data structure pointer.
367 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
369 switch (TerminalDevice
->TerminalType
) {
374 Status
= AnsiTestString (TerminalDevice
, WString
);
378 Status
= VTUTF8TestString (TerminalDevice
, WString
);
382 Status
= EFI_UNSUPPORTED
;
391 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
393 It returns information for an available text mode
394 that the terminal supports.
396 @param This Indicates the calling context.
397 @param ModeNumber The mode number to return information on.
398 @param Columns The returned columns of the requested mode.
399 @param Rows The returned rows of the requested mode.
401 @retval EFI_SUCCESS The requested mode information is returned.
402 @retval EFI_UNSUPPORTED The mode number is not valid.
407 TerminalConOutQueryMode (
408 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
414 TERMINAL_DEV
*TerminalDevice
;
416 if (ModeNumber
>= (UINTN
) This
->Mode
->MaxMode
) {
417 return EFI_UNSUPPORTED
;
421 // Get Terminal device data structure pointer.
423 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
424 *Columns
= TerminalDevice
->TerminalConsoleModeData
[ModeNumber
].Columns
;
425 *Rows
= TerminalDevice
->TerminalConsoleModeData
[ModeNumber
].Rows
;
432 Implements EFI_SIMPLE_TEXT_OUT.SetMode().
434 Set the terminal to a specified display mode.
435 In this driver, we only support mode 0.
437 @param This Indicates the calling context.
438 @param ModeNumber The text mode to set.
440 @retval EFI_SUCCESS The requested text mode is set.
441 @retval EFI_DEVICE_ERROR The requested text mode cannot be set
442 because of serial device error.
443 @retval EFI_UNSUPPORTED The text mode number is not valid.
448 TerminalConOutSetMode (
449 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
454 TERMINAL_DEV
*TerminalDevice
;
457 // get Terminal device data structure pointer.
459 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
461 if (ModeNumber
>= (UINTN
) This
->Mode
->MaxMode
) {
462 return EFI_UNSUPPORTED
;
466 // Set the current mode
468 This
->Mode
->Mode
= (INT32
) ModeNumber
;
470 This
->ClearScreen (This
);
472 TerminalDevice
->OutputEscChar
= TRUE
;
473 Status
= This
->OutputString (This
, mSetModeString
);
474 TerminalDevice
->OutputEscChar
= FALSE
;
476 if (EFI_ERROR (Status
)) {
477 return EFI_DEVICE_ERROR
;
480 This
->Mode
->Mode
= (INT32
) ModeNumber
;
482 Status
= This
->ClearScreen (This
);
483 if (EFI_ERROR (Status
)) {
484 return EFI_DEVICE_ERROR
;
493 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute().
495 @param This Indicates the calling context.
496 @param Attribute The attribute to set. Only bit0..6 are valid, all other bits
497 are undefined and must be zero.
499 @retval EFI_SUCCESS The requested attribute is set.
500 @retval EFI_DEVICE_ERROR The requested attribute cannot be set due to serial port error.
501 @retval EFI_UNSUPPORTED The attribute requested is not defined by EFI spec.
506 TerminalConOutSetAttribute (
507 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
511 UINT8 ForegroundControl
;
512 UINT8 BackgroundControl
;
517 TERMINAL_DEV
*TerminalDevice
;
523 // get Terminal device data structure pointer.
525 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
528 // only the bit0..6 of the Attribute is valid
530 if ((Attribute
| 0x7f) != 0x7f) {
531 return EFI_UNSUPPORTED
;
535 // Skip outputting the command string for the same attribute
536 // It improves the terminal performance significantly
538 if (This
->Mode
->Attribute
== (INT32
) Attribute
) {
543 // convert Attribute value to terminal emulator
544 // understandable foreground color
546 switch (Attribute
& 0x07) {
549 ForegroundControl
= 30;
553 ForegroundControl
= 34;
557 ForegroundControl
= 32;
561 ForegroundControl
= 36;
565 ForegroundControl
= 31;
569 ForegroundControl
= 35;
573 ForegroundControl
= 33;
579 ForegroundControl
= 37;
584 // bit4 of the Attribute indicates bright control
585 // of terminal emulator.
587 BrightControl
= (UINT8
) ((Attribute
>> 3) & 1);
590 // convert Attribute value to terminal emulator
591 // understandable background color.
593 switch ((Attribute
>> 4) & 0x07) {
596 BackgroundControl
= 40;
600 BackgroundControl
= 44;
604 BackgroundControl
= 42;
608 BackgroundControl
= 46;
612 BackgroundControl
= 41;
616 BackgroundControl
= 45;
620 BackgroundControl
= 43;
626 BackgroundControl
= 47;
630 // terminal emulator's control sequence to set attributes
632 mSetAttributeString
[BRIGHT_CONTROL_OFFSET
] = (CHAR16
) ('0' + BrightControl
);
633 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (ForegroundControl
/ 10));
634 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (ForegroundControl
% 10));
635 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (BackgroundControl
/ 10));
636 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (BackgroundControl
% 10));
639 // save current column and row
640 // for future scrolling back use.
642 SavedColumn
= This
->Mode
->CursorColumn
;
643 SavedRow
= This
->Mode
->CursorRow
;
645 TerminalDevice
->OutputEscChar
= TRUE
;
646 Status
= This
->OutputString (This
, mSetAttributeString
);
647 TerminalDevice
->OutputEscChar
= FALSE
;
649 if (EFI_ERROR (Status
)) {
650 return EFI_DEVICE_ERROR
;
653 // scroll back to saved cursor position.
655 This
->Mode
->CursorColumn
= SavedColumn
;
656 This
->Mode
->CursorRow
= SavedRow
;
658 This
->Mode
->Attribute
= (INT32
) Attribute
;
666 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen().
667 It clears the ANSI terminal's display to the
668 currently selected background color.
670 @param This Indicates the calling context.
672 @retval EFI_SUCCESS The operation completed successfully.
673 @retval EFI_DEVICE_ERROR The terminal screen cannot be cleared due to serial port error.
674 @retval EFI_UNSUPPORTED The terminal is not in a valid display mode.
679 TerminalConOutClearScreen (
680 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
684 TERMINAL_DEV
*TerminalDevice
;
686 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
689 // control sequence for clear screen request
691 TerminalDevice
->OutputEscChar
= TRUE
;
692 Status
= This
->OutputString (This
, mClearScreenString
);
693 TerminalDevice
->OutputEscChar
= FALSE
;
695 if (EFI_ERROR (Status
)) {
696 return EFI_DEVICE_ERROR
;
699 Status
= This
->SetCursorPosition (This
, 0, 0);
706 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition().
708 @param This Indicates the calling context.
709 @param Column The row to set cursor to.
710 @param Row The column to set cursor to.
712 @retval EFI_SUCCESS The operation completed successfully.
713 @retval EFI_DEVICE_ERROR The request fails due to serial port error.
714 @retval EFI_UNSUPPORTED The terminal is not in a valid text mode, or the cursor position
715 is invalid for current mode.
720 TerminalConOutSetCursorPosition (
721 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
726 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
730 TERMINAL_DEV
*TerminalDevice
;
732 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
740 // get geometry of current mode
742 Status
= This
->QueryMode (
748 if (EFI_ERROR (Status
)) {
749 return EFI_UNSUPPORTED
;
752 if (Column
>= MaxColumn
|| Row
>= MaxRow
) {
753 return EFI_UNSUPPORTED
;
756 // control sequence to move the cursor
758 mSetCursorPositionString
[ROW_OFFSET
+ 0] = (CHAR16
) ('0' + ((Row
+ 1) / 10));
759 mSetCursorPositionString
[ROW_OFFSET
+ 1] = (CHAR16
) ('0' + ((Row
+ 1) % 10));
760 mSetCursorPositionString
[COLUMN_OFFSET
+ 0] = (CHAR16
) ('0' + ((Column
+ 1) / 10));
761 mSetCursorPositionString
[COLUMN_OFFSET
+ 1] = (CHAR16
) ('0' + ((Column
+ 1) % 10));
763 TerminalDevice
->OutputEscChar
= TRUE
;
764 Status
= This
->OutputString (This
, mSetCursorPositionString
);
765 TerminalDevice
->OutputEscChar
= FALSE
;
767 if (EFI_ERROR (Status
)) {
768 return EFI_DEVICE_ERROR
;
771 // update current cursor position
772 // in the Mode data structure.
774 Mode
->CursorColumn
= (INT32
) Column
;
775 Mode
->CursorRow
= (INT32
) Row
;
782 Implements SIMPLE_TEXT_OUTPUT.EnableCursor().
784 In this driver, the cursor cannot be hidden.
786 @param This Indicates the calling context.
787 @param Visible If TRUE, the cursor is set to be visible,
788 If FALSE, the cursor is set to be invisible.
790 @retval EFI_SUCCESS The request is valid.
791 @retval EFI_UNSUPPORTED The terminal does not support cursor hidden.
796 TerminalConOutEnableCursor (
797 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
802 return EFI_UNSUPPORTED
;
810 Detects if a Unicode char is for Box Drawing text graphics.
812 @param Graphic Unicode char to test.
813 @param PcAnsi Optional pointer to return PCANSI equivalent of
815 @param Ascii Optional pointer to return ASCII equivalent of
818 @retval TRUE If Graphic is a supported Unicode Box Drawing character.
822 TerminalIsValidTextGraphics (
824 OUT CHAR8
*PcAnsi
, OPTIONAL
825 OUT CHAR8
*Ascii OPTIONAL
828 UNICODE_TO_CHAR
*Table
;
830 if ((((Graphic
& 0xff00) != 0x2500) && ((Graphic
& 0xff00) != 0x2100))) {
832 // Unicode drawing code charts are all in the 0x25xx range,
838 for (Table
= UnicodeToPcAnsiOrAscii
; Table
->Unicode
!= 0x0000; Table
++) {
839 if (Graphic
== Table
->Unicode
) {
840 if (PcAnsi
!= NULL
) {
841 *PcAnsi
= Table
->PcAnsi
;
845 *Ascii
= Table
->Ascii
;
856 Detects if a valid ASCII char.
858 @param Ascii An ASCII character.
860 @retval TRUE If it is a valid ASCII character.
861 @retval FALSE If it is not a valid ASCII character.
865 TerminalIsValidAscii (
870 // valid ascii code lies in the extent of 0x20 ~ 0x7f
872 if ((Ascii
>= 0x20) && (Ascii
<= 0x7f)) {
880 Detects if a valid EFI control character.
882 @param CharC An input EFI Control character.
884 @retval TRUE If it is a valid EFI control character.
885 @retval FALSE If it is not a valid EFI control character.
889 TerminalIsValidEfiCntlChar (
894 // only support four control characters.
896 if (CharC
== CHAR_NULL
||
897 CharC
== CHAR_BACKSPACE
||
898 CharC
== CHAR_LINEFEED
||
899 CharC
== CHAR_CARRIAGE_RETURN
||