2 Implementation for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL protocol.
4 Copyright (c) 2006 - 2008, Intel Corporation. <BR>
5 All rights reserved. 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 STATIC 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().
92 If ExtendeVerification is TRUE, then perform dependent serial device reset,
93 and set display mode to mode 0.
94 If ExtendedVerification is FALSE, only set display mode to mode 0.
96 @param This Indicates the calling context.
97 @param ExtendedVerification Indicates that the driver may perform a more
98 exhaustive verification operation of the device
101 @return EFI_SUCCESS The reset operation succeeds.
102 @return EFI_DEVICE_ERROR The terminal is not functioning correctly or the serial port reset fails.
107 TerminalConOutReset (
108 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
109 IN BOOLEAN ExtendedVerification
113 TERMINAL_DEV
*TerminalDevice
;
115 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
118 // Perform a more exhaustive reset by resetting the serial port.
120 if (ExtendedVerification
) {
122 // Report progress code here
124 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
126 PcdGet32 (PcdStatusCodeValueRemoteConsoleReset
),
127 TerminalDevice
->DevicePath
130 Status
= TerminalDevice
->SerialIo
->Reset (TerminalDevice
->SerialIo
);
131 if (EFI_ERROR (Status
)) {
133 // Report error code here
135 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
136 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
137 PcdGet32 (PcdStatusCodeValueRemoteConsoleError
),
138 TerminalDevice
->DevicePath
145 This
->SetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BLACK
));
147 Status
= This
->SetMode (This
, 0);
154 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString().
155 The Unicode string will be converted to terminal expressible data stream
156 and send to terminal via serial port.
158 @param This Indicates the calling context.
159 @param WString The Null-terminated Unicode string to be displayed
160 on the terminal screen.
162 @retval EFI_SUCCESS The string is output successfully.
163 @retval EFI_DEVICE_ERROR The serial port fails to send the string out.
164 @retval EFI_WARN_UNKNOWN_GLYPH Indicates that some of the characters in the Unicode string could not
165 be rendered and are skipped.
166 @retval EFI_UNSUPPORTED If current display mode is out of range.
171 TerminalConOutOutputString (
172 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
176 TERMINAL_DEV
*TerminalDevice
;
177 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
187 // flag used to indicate whether condition happens which will cause
188 // return EFI_WARN_UNKNOWN_GLYPH
196 // get Terminal device data structure pointer.
198 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
201 // Get current display mode
205 if (Mode
->Mode
> 2) {
206 return EFI_UNSUPPORTED
;
216 for (; *WString
!= CHAR_NULL
; WString
++) {
218 switch (TerminalDevice
->TerminalType
) {
224 if (!TerminalIsValidTextGraphics (*WString
, &GraphicChar
, &AsciiChar
)) {
226 // If it's not a graphic character convert Unicode to ASCII.
228 GraphicChar
= (CHAR8
) *WString
;
230 if (!(TerminalIsValidAscii (GraphicChar
) || TerminalIsValidEfiCntlChar (GraphicChar
))) {
232 // when this driver use the OutputString to output control string,
233 // TerminalDevice->OutputEscChar is set to let the Esc char
234 // to be output to the terminal emulation software.
236 if ((GraphicChar
== 27) && TerminalDevice
->OutputEscChar
) {
244 AsciiChar
= GraphicChar
;
248 if (TerminalDevice
->TerminalType
!= PCANSITYPE
) {
249 GraphicChar
= AsciiChar
;
254 Status
= TerminalDevice
->SerialIo
->Write (
255 TerminalDevice
->SerialIo
,
260 if (EFI_ERROR (Status
)) {
267 UnicodeToUtf8 (*WString
, &Utf8Char
, &ValidBytes
);
269 Status
= TerminalDevice
->SerialIo
->Write (
270 TerminalDevice
->SerialIo
,
274 if (EFI_ERROR (Status
)) {
280 // Update cursor position.
285 if (Mode
->CursorColumn
> 0) {
286 Mode
->CursorColumn
--;
291 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
296 case CHAR_CARRIAGE_RETURN
:
297 Mode
->CursorColumn
= 0;
301 if (Mode
->CursorColumn
< (INT32
) (MaxColumn
- 1)) {
303 Mode
->CursorColumn
++;
307 Mode
->CursorColumn
= 0;
308 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
320 return EFI_WARN_UNKNOWN_GLYPH
;
326 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
327 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
328 PcdGet32 (PcdStatusCodeValueRemoteConsoleOutputError
),
329 TerminalDevice
->DevicePath
332 return EFI_DEVICE_ERROR
;
337 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString().
338 If one of the characters in the *Wstring is
339 neither valid Unicode drawing characters,
340 not ASCII code, then this function will return
343 @param This Indicates the calling context.
344 @param WString The Null-terminated Unicode string to be tested.
346 @return EFI_SUCCESS The terminal is capable of rendering the output string.
347 @return EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered.
352 TerminalConOutTestString (
353 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
357 TERMINAL_DEV
*TerminalDevice
;
361 // get Terminal device data structure pointer.
363 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
365 switch (TerminalDevice
->TerminalType
) {
370 Status
= AnsiTestString (TerminalDevice
, WString
);
374 Status
= VTUTF8TestString (TerminalDevice
, WString
);
378 Status
= EFI_UNSUPPORTED
;
387 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
388 It returns information for an available text mode
389 that the terminal supports.
390 In this driver, we support text mode 80x25 (mode 0),
391 80x50 (mode 1), 100x31 (mode 2).
393 @param This Indicates the calling context.
394 @param ModeNumber The mode number to return information on.
395 @param Columns The returned columns of the requested mode.
396 @param Rows The returned rows of the requested mode.
398 @return EFI_SUCCESS The requested mode information is returned.
399 @return EFI_UNSUPPORTED The mode number is not valid.
400 @return EFI_DEVICE_ERROR
405 TerminalConOutQueryMode (
406 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
412 if (This
->Mode
->MaxMode
> 3) {
413 return EFI_DEVICE_ERROR
;
416 if (ModeNumber
== 0) {
417 *Columns
= MODE0_COLUMN_COUNT
;
418 *Rows
= MODE0_ROW_COUNT
;
420 } else if (ModeNumber
== 1) {
421 *Columns
= MODE1_COLUMN_COUNT
;
422 *Rows
= MODE1_ROW_COUNT
;
424 } else if (ModeNumber
== 2) {
425 *Columns
= MODE2_COLUMN_COUNT
;
426 *Rows
= MODE2_ROW_COUNT
;
430 return EFI_UNSUPPORTED
;
435 Implements EFI_SIMPLE_TEXT_OUT.SetMode().
436 Set the terminal to a specified display mode.
437 In this driver, we only support mode 0.
439 @param This Indicates the calling context.
440 @param ModeNumber The text mode to set.
442 @return EFI_SUCCESS The requested text mode is set.
443 @return EFI_DEVICE_ERROR The requested text mode cannot be set
444 because of serial device error.
445 @return EFI_UNSUPPORTED The text mode number is not valid.
450 TerminalConOutSetMode (
451 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
456 TERMINAL_DEV
*TerminalDevice
;
459 // get Terminal device data structure pointer.
461 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
463 if (ModeNumber
> 2) {
464 return EFI_UNSUPPORTED
;
468 // Set the current mode
470 This
->Mode
->Mode
= (INT32
) ModeNumber
;
472 This
->ClearScreen (This
);
474 TerminalDevice
->OutputEscChar
= TRUE
;
475 Status
= This
->OutputString (This
, mSetModeString
);
476 TerminalDevice
->OutputEscChar
= FALSE
;
478 if (EFI_ERROR (Status
)) {
479 return EFI_DEVICE_ERROR
;
482 This
->Mode
->Mode
= (INT32
) ModeNumber
;
484 Status
= This
->ClearScreen (This
);
485 if (EFI_ERROR (Status
)) {
486 return EFI_DEVICE_ERROR
;
495 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute().
497 @param This Indicates the calling context.
498 @param Attribute The attribute to set. Only bit0..6 are valid, all other bits
499 are undefined and must be zero.
501 @return EFI_SUCCESS The requested attribute is set.
502 @return EFI_DEVICE_ERROR The requested attribute cannot be set due to serial port error.
503 @return EFI_UNSUPPORTED The attribute requested is not defined by EFI spec.
508 TerminalConOutSetAttribute (
509 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
513 UINT8 ForegroundControl
;
514 UINT8 BackgroundControl
;
519 TERMINAL_DEV
*TerminalDevice
;
525 // get Terminal device data structure pointer.
527 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
530 // only the bit0..6 of the Attribute is valid
532 if ((Attribute
| 0x7f) != 0x7f) {
533 return EFI_UNSUPPORTED
;
537 // Skip outputting the command string for the same attribute
538 // It improves the terminal performance siginificantly
540 if (This
->Mode
->Attribute
== (INT32
) Attribute
) {
545 // convert Attribute value to terminal emulator
546 // understandable foreground color
548 switch (Attribute
& 0x07) {
551 ForegroundControl
= 30;
555 ForegroundControl
= 34;
559 ForegroundControl
= 32;
563 ForegroundControl
= 36;
567 ForegroundControl
= 31;
571 ForegroundControl
= 35;
575 ForegroundControl
= 33;
581 ForegroundControl
= 37;
586 // bit4 of the Attribute indicates bright control
587 // of terminal emulator.
589 BrightControl
= (UINT8
) ((Attribute
>> 3) & 1);
592 // convert Attribute value to terminal emulator
593 // understandable background color.
595 switch ((Attribute
>> 4) & 0x07) {
598 BackgroundControl
= 40;
602 BackgroundControl
= 44;
606 BackgroundControl
= 42;
610 BackgroundControl
= 46;
614 BackgroundControl
= 41;
618 BackgroundControl
= 45;
622 BackgroundControl
= 43;
628 BackgroundControl
= 47;
632 // terminal emulator's control sequence to set attributes
634 mSetAttributeString
[BRIGHT_CONTROL_OFFSET
] = (CHAR16
) ('0' + BrightControl
);
635 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (ForegroundControl
/ 10));
636 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (ForegroundControl
% 10));
637 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (BackgroundControl
/ 10));
638 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (BackgroundControl
% 10));
641 // save current column and row
642 // for future scrolling back use.
644 SavedColumn
= This
->Mode
->CursorColumn
;
645 SavedRow
= This
->Mode
->CursorRow
;
647 TerminalDevice
->OutputEscChar
= TRUE
;
648 Status
= This
->OutputString (This
, mSetAttributeString
);
649 TerminalDevice
->OutputEscChar
= FALSE
;
651 if (EFI_ERROR (Status
)) {
652 return EFI_DEVICE_ERROR
;
655 // scroll back to saved cursor position.
657 This
->Mode
->CursorColumn
= SavedColumn
;
658 This
->Mode
->CursorRow
= SavedRow
;
660 This
->Mode
->Attribute
= (INT32
) Attribute
;
668 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen().
669 It clears the ANSI terminal's display to the
670 currently selected background color.
672 @param This Indicates the calling context.
674 @return EFI_SUCCESS The operation completed successfully.
675 @return EFI_DEVICE_ERROR The terminal screen cannot be cleared due to serial port error.
676 @return EFI_UNSUPPORTED The terminal is not in a valid display mode.
681 TerminalConOutClearScreen (
682 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
686 TERMINAL_DEV
*TerminalDevice
;
688 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
691 // control sequence for clear screen request
693 TerminalDevice
->OutputEscChar
= TRUE
;
694 Status
= This
->OutputString (This
, mClearScreenString
);
695 TerminalDevice
->OutputEscChar
= FALSE
;
697 if (EFI_ERROR (Status
)) {
698 return EFI_DEVICE_ERROR
;
701 Status
= This
->SetCursorPosition (This
, 0, 0);
708 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition().
710 @param This Indicates the calling context.
711 @param Column The row to set cursor to.
712 @param Row The column to set cursor to.
714 @return EFI_SUCCESS The operation completed successfully.
715 @return EFI_DEVICE_ERROR The request fails due to serial port error.
716 @return EFI_UNSUPPORTED The terminal is not in a valid text mode, or the cursor position
717 is invalid for current mode.
722 TerminalConOutSetCursorPosition (
723 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
728 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
732 TERMINAL_DEV
*TerminalDevice
;
734 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
742 // get geometry of current mode
744 Status
= This
->QueryMode (
750 if (EFI_ERROR (Status
)) {
751 return EFI_UNSUPPORTED
;
754 if (Column
>= MaxColumn
|| Row
>= MaxRow
) {
755 return EFI_UNSUPPORTED
;
758 // control sequence to move the cursor
760 mSetCursorPositionString
[ROW_OFFSET
+ 0] = (CHAR16
) ('0' + ((Row
+ 1) / 10));
761 mSetCursorPositionString
[ROW_OFFSET
+ 1] = (CHAR16
) ('0' + ((Row
+ 1) % 10));
762 mSetCursorPositionString
[COLUMN_OFFSET
+ 0] = (CHAR16
) ('0' + ((Column
+ 1) / 10));
763 mSetCursorPositionString
[COLUMN_OFFSET
+ 1] = (CHAR16
) ('0' + ((Column
+ 1) % 10));
765 TerminalDevice
->OutputEscChar
= TRUE
;
766 Status
= This
->OutputString (This
, mSetCursorPositionString
);
767 TerminalDevice
->OutputEscChar
= FALSE
;
769 if (EFI_ERROR (Status
)) {
770 return EFI_DEVICE_ERROR
;
773 // update current cursor position
774 // in the Mode data structure.
776 Mode
->CursorColumn
= (INT32
) Column
;
777 Mode
->CursorRow
= (INT32
) Row
;
784 Implements SIMPLE_TEXT_OUTPUT.EnableCursor().
785 In this driver, the cursor cannot be hidden.
787 @param This Indicates the calling context.
788 @param Visible If TRUE, the cursor is set to be visible,
789 If FALSE, the cursor is set to be invisible.
791 @return EFI_SUCCESS The request is valid.
792 @return EFI_UNSUPPORTED The terminal does not support cursor hidden.
797 TerminalConOutEnableCursor (
798 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
803 return EFI_UNSUPPORTED
;
811 Detects if a Unicode char is for Box Drawing text graphics.
813 @param Graphic Unicode char to test.
814 @param PcAnsi Optional pointer to return PCANSI equivalent of
816 @param Ascii Optional pointer to return ASCII equivalent of
819 @return TRUE If Graphic is a supported Unicode Box Drawing character.
823 TerminalIsValidTextGraphics (
825 OUT CHAR8
*PcAnsi
, OPTIONAL
826 OUT CHAR8
*Ascii OPTIONAL
829 UNICODE_TO_CHAR
*Table
;
831 if ((((Graphic
& 0xff00) != 0x2500) && ((Graphic
& 0xff00) != 0x2100))) {
833 // Unicode drawing code charts are all in the 0x25xx range,
839 for (Table
= UnicodeToPcAnsiOrAscii
; Table
->Unicode
!= 0x0000; Table
++) {
840 if (Graphic
== Table
->Unicode
) {
841 if (PcAnsi
!= NULL
) {
842 *PcAnsi
= Table
->PcAnsi
;
846 *Ascii
= Table
->Ascii
;
857 Detects if a valid ASCII char.
859 @param Ascii An ASCII character.
861 @retval TRUE If it is a valid ASCII character.
862 @retval FALSE If it is not a valid ASCII character.
866 TerminalIsValidAscii (
871 // valid ascii code lies in the extent of 0x20 ~ 0x7f
873 if ((Ascii
>= 0x20) && (Ascii
<= 0x7f)) {
881 Detects if a valid EFI control character.
883 @param CharC An input EFI Control character.
885 @retval TRUE If it is a valid EFI control character.
886 @retval FALSE If it is not a valid EFI control character.
890 TerminalIsValidEfiCntlChar (
895 // only support four control characters.
897 if (CharC
== CHAR_NULL
||
898 CharC
== CHAR_BACKSPACE
||
899 CharC
== CHAR_LINEFEED
||
900 CharC
== CHAR_CARRIAGE_RETURN
||