2 Implementation for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL protocol.
4 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
5 Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 // This list is used to define the valid extend chars.
20 // It also provides a mapping from Unicode to PCANSI or
21 // ASCII. The ASCII mapping we just made up.
24 UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii
[] = {
25 { BOXDRAW_HORIZONTAL
, 0xc4, L
'-' },
26 { BOXDRAW_VERTICAL
, 0xb3, L
'|' },
27 { BOXDRAW_DOWN_RIGHT
, 0xda, L
'/' },
28 { BOXDRAW_DOWN_LEFT
, 0xbf, L
'\\' },
29 { BOXDRAW_UP_RIGHT
, 0xc0, L
'\\' },
30 { BOXDRAW_UP_LEFT
, 0xd9, L
'/' },
31 { BOXDRAW_VERTICAL_RIGHT
, 0xc3, L
'|' },
32 { BOXDRAW_VERTICAL_LEFT
, 0xb4, L
'|' },
33 { BOXDRAW_DOWN_HORIZONTAL
, 0xc2, L
'+' },
34 { BOXDRAW_UP_HORIZONTAL
, 0xc1, L
'+' },
35 { BOXDRAW_VERTICAL_HORIZONTAL
, 0xc5, L
'+' },
36 { BOXDRAW_DOUBLE_HORIZONTAL
, 0xcd, L
'-' },
37 { BOXDRAW_DOUBLE_VERTICAL
, 0xba, L
'|' },
38 { BOXDRAW_DOWN_RIGHT_DOUBLE
, 0xd5, L
'/' },
39 { BOXDRAW_DOWN_DOUBLE_RIGHT
, 0xd6, L
'/' },
40 { BOXDRAW_DOUBLE_DOWN_RIGHT
, 0xc9, L
'/' },
41 { BOXDRAW_DOWN_LEFT_DOUBLE
, 0xb8, L
'\\' },
42 { BOXDRAW_DOWN_DOUBLE_LEFT
, 0xb7, L
'\\' },
43 { BOXDRAW_DOUBLE_DOWN_LEFT
, 0xbb, L
'\\' },
44 { BOXDRAW_UP_RIGHT_DOUBLE
, 0xd4, L
'\\' },
45 { BOXDRAW_UP_DOUBLE_RIGHT
, 0xd3, L
'\\' },
46 { BOXDRAW_DOUBLE_UP_RIGHT
, 0xc8, L
'\\' },
47 { BOXDRAW_UP_LEFT_DOUBLE
, 0xbe, L
'/' },
48 { BOXDRAW_UP_DOUBLE_LEFT
, 0xbd, L
'/' },
49 { BOXDRAW_DOUBLE_UP_LEFT
, 0xbc, L
'/' },
50 { BOXDRAW_VERTICAL_RIGHT_DOUBLE
, 0xc6, L
'|' },
51 { BOXDRAW_VERTICAL_DOUBLE_RIGHT
, 0xc7, L
'|' },
52 { BOXDRAW_DOUBLE_VERTICAL_RIGHT
, 0xcc, L
'|' },
53 { BOXDRAW_VERTICAL_LEFT_DOUBLE
, 0xb5, L
'|' },
54 { BOXDRAW_VERTICAL_DOUBLE_LEFT
, 0xb6, L
'|' },
55 { BOXDRAW_DOUBLE_VERTICAL_LEFT
, 0xb9, L
'|' },
56 { BOXDRAW_DOWN_HORIZONTAL_DOUBLE
, 0xd1, L
'+' },
57 { BOXDRAW_DOWN_DOUBLE_HORIZONTAL
, 0xd2, L
'+' },
58 { BOXDRAW_DOUBLE_DOWN_HORIZONTAL
, 0xcb, L
'+' },
59 { BOXDRAW_UP_HORIZONTAL_DOUBLE
, 0xcf, L
'+' },
60 { BOXDRAW_UP_DOUBLE_HORIZONTAL
, 0xd0, L
'+' },
61 { BOXDRAW_DOUBLE_UP_HORIZONTAL
, 0xca, L
'+' },
62 { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE
, 0xd8, L
'+' },
63 { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL
, 0xd7, L
'+' },
64 { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL
, 0xce, L
'+' },
66 { BLOCKELEMENT_FULL_BLOCK
, 0xdb, L
'*' },
67 { BLOCKELEMENT_LIGHT_SHADE
, 0xb0, L
'+' },
69 { GEOMETRICSHAPE_UP_TRIANGLE
, '^', L
'^' },
70 { GEOMETRICSHAPE_RIGHT_TRIANGLE
, '>', L
'>' },
71 { GEOMETRICSHAPE_DOWN_TRIANGLE
, 'v', L
'v' },
72 { GEOMETRICSHAPE_LEFT_TRIANGLE
, '<', L
'<' },
74 { ARROW_LEFT
, '<', L
'<' },
75 { ARROW_UP
, '^', L
'^' },
76 { ARROW_RIGHT
, '>', L
'>' },
77 { ARROW_DOWN
, 'v', L
'v' },
79 { 0x0000, 0x00, L
'\0' }
82 CHAR16 mSetModeString
[] = { ESC
, '[', '=', '3', 'h', 0 };
83 CHAR16 mSetAttributeString
[] = { ESC
, '[', '0', 'm', ESC
, '[', '4', '0', 'm', ESC
, '[', '4', '0', 'm', 0 };
84 CHAR16 mClearScreenString
[] = { ESC
, '[', '2', 'J', 0 };
85 CHAR16 mSetCursorPositionString
[] = { ESC
, '[', '0', '0', ';', '0', '0', 'H', 0 };
86 CHAR16 mCursorForwardString
[] = { ESC
, '[', '0', '0', 'C', 0 };
87 CHAR16 mCursorBackwardString
[] = { ESC
, '[', '0', '0', 'D', 0 };
90 // Body of the ConOut functions
94 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset().
96 If ExtendeVerification is TRUE, then perform dependent serial device reset,
97 and set display mode to mode 0.
98 If ExtendedVerification is FALSE, only set display mode to mode 0.
100 @param This Indicates the calling context.
101 @param ExtendedVerification Indicates that the driver may perform a more
102 exhaustive verification operation of the device
105 @retval EFI_SUCCESS The reset operation succeeds.
106 @retval EFI_DEVICE_ERROR The terminal is not functioning correctly or the serial port reset fails.
111 TerminalConOutReset (
112 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
113 IN BOOLEAN ExtendedVerification
117 TERMINAL_DEV
*TerminalDevice
;
119 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
122 // Perform a more exhaustive reset by resetting the serial port.
124 if (ExtendedVerification
) {
126 // Report progress code here
128 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
130 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_PC_RESET
),
131 TerminalDevice
->DevicePath
134 Status
= TerminalDevice
->SerialIo
->Reset (TerminalDevice
->SerialIo
);
135 if (EFI_ERROR (Status
)) {
137 // Report error code here
139 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
140 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
141 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_EC_CONTROLLER_ERROR
),
142 TerminalDevice
->DevicePath
149 This
->SetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BLACK
));
151 Status
= This
->SetMode (This
, 0);
158 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString().
160 The Unicode string will be converted to terminal expressible data stream
161 and send to terminal via serial port.
163 @param This Indicates the calling context.
164 @param WString The Null-terminated Unicode string to be displayed
165 on the terminal screen.
167 @retval EFI_SUCCESS The string is output successfully.
168 @retval EFI_DEVICE_ERROR The serial port fails to send the string out.
169 @retval EFI_WARN_UNKNOWN_GLYPH Indicates that some of the characters in the Unicode string could not
170 be rendered and are skipped.
171 @retval EFI_UNSUPPORTED If current display mode is out of range.
176 TerminalConOutOutputString (
177 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
181 TERMINAL_DEV
*TerminalDevice
;
182 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
193 // flag used to indicate whether condition happens which will cause
194 // return EFI_WARN_UNKNOWN_GLYPH
203 // get Terminal device data structure pointer.
205 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
208 // Get current display mode
212 if (Mode
->Mode
>= Mode
->MaxMode
) {
213 return EFI_UNSUPPORTED
;
223 for (; *WString
!= CHAR_NULL
; WString
++) {
225 switch (TerminalDevice
->TerminalType
) {
227 case TerminalTypePcAnsi
:
228 case TerminalTypeVt100
:
229 case TerminalTypeVt100Plus
:
230 case TerminalTypeTtyTerm
:
232 if (!TerminalIsValidTextGraphics (*WString
, &GraphicChar
, &AsciiChar
)) {
234 // If it's not a graphic character convert Unicode to ASCII.
236 GraphicChar
= (CHAR8
) *WString
;
238 if (!(TerminalIsValidAscii (GraphicChar
) || TerminalIsValidEfiCntlChar (GraphicChar
))) {
240 // when this driver use the OutputString to output control string,
241 // TerminalDevice->OutputEscChar is set to let the Esc char
242 // to be output to the terminal emulation software.
244 if ((GraphicChar
== 27) && TerminalDevice
->OutputEscChar
) {
252 AsciiChar
= GraphicChar
;
256 if (TerminalDevice
->TerminalType
!= TerminalTypePcAnsi
) {
257 GraphicChar
= AsciiChar
;
262 Status
= TerminalDevice
->SerialIo
->Write (
263 TerminalDevice
->SerialIo
,
268 if (EFI_ERROR (Status
)) {
274 case TerminalTypeVtUtf8
:
275 UnicodeToUtf8 (*WString
, &Utf8Char
, &ValidBytes
);
277 Status
= TerminalDevice
->SerialIo
->Write (
278 TerminalDevice
->SerialIo
,
282 if (EFI_ERROR (Status
)) {
288 // Update cursor position.
293 if (Mode
->CursorColumn
> 0) {
294 Mode
->CursorColumn
--;
299 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
304 case CHAR_CARRIAGE_RETURN
:
305 Mode
->CursorColumn
= 0;
309 if (Mode
->CursorColumn
< (INT32
) (MaxColumn
- 1)) {
311 Mode
->CursorColumn
++;
315 Mode
->CursorColumn
= 0;
316 if (Mode
->CursorRow
< (INT32
) (MaxRow
- 1)) {
320 if (TerminalDevice
->TerminalType
== TerminalTypeTtyTerm
&&
321 !TerminalDevice
->OutputEscChar
) {
323 // We've written the last character on the line. The
324 // terminal doesn't actually wrap its cursor until we print
325 // the next character, but the driver thinks it has wrapped
326 // already. Print CR LF to synchronize the terminal with
327 // the driver, but only if we're not in the middle of
328 // printing an escape sequence.
333 Length
= sizeof(CrLfStr
);
335 Status
= TerminalDevice
->SerialIo
->Write (
336 TerminalDevice
->SerialIo
,
341 if (EFI_ERROR (Status
)) {
353 return EFI_WARN_UNKNOWN_GLYPH
;
359 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
360 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
361 (EFI_PERIPHERAL_REMOTE_CONSOLE
| EFI_P_EC_OUTPUT_ERROR
),
362 TerminalDevice
->DevicePath
365 return EFI_DEVICE_ERROR
;
370 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString().
372 If one of the characters in the *Wstring is
373 neither valid Unicode drawing characters,
374 not ASCII code, then this function will return
377 @param This Indicates the calling context.
378 @param WString The Null-terminated Unicode string to be tested.
380 @retval EFI_SUCCESS The terminal is capable of rendering the output string.
381 @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered.
386 TerminalConOutTestString (
387 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
391 TERMINAL_DEV
*TerminalDevice
;
395 // get Terminal device data structure pointer.
397 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
399 switch (TerminalDevice
->TerminalType
) {
401 case TerminalTypePcAnsi
:
402 case TerminalTypeVt100
:
403 case TerminalTypeVt100Plus
:
404 case TerminalTypeTtyTerm
:
405 Status
= AnsiTestString (TerminalDevice
, WString
);
408 case TerminalTypeVtUtf8
:
409 Status
= VTUTF8TestString (TerminalDevice
, WString
);
413 Status
= EFI_UNSUPPORTED
;
422 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().
424 It returns information for an available text mode
425 that the terminal supports.
427 @param This Indicates the calling context.
428 @param ModeNumber The mode number to return information on.
429 @param Columns The returned columns of the requested mode.
430 @param Rows The returned rows of the requested mode.
432 @retval EFI_SUCCESS The requested mode information is returned.
433 @retval EFI_UNSUPPORTED The mode number is not valid.
438 TerminalConOutQueryMode (
439 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
445 TERMINAL_DEV
*TerminalDevice
;
447 if (ModeNumber
>= (UINTN
) This
->Mode
->MaxMode
) {
448 return EFI_UNSUPPORTED
;
452 // Get Terminal device data structure pointer.
454 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
455 *Columns
= TerminalDevice
->TerminalConsoleModeData
[ModeNumber
].Columns
;
456 *Rows
= TerminalDevice
->TerminalConsoleModeData
[ModeNumber
].Rows
;
463 Implements EFI_SIMPLE_TEXT_OUT.SetMode().
465 Set the terminal to a specified display mode.
466 In this driver, we only support mode 0.
468 @param This Indicates the calling context.
469 @param ModeNumber The text mode to set.
471 @retval EFI_SUCCESS The requested text mode is set.
472 @retval EFI_DEVICE_ERROR The requested text mode cannot be set
473 because of serial device error.
474 @retval EFI_UNSUPPORTED The text mode number is not valid.
479 TerminalConOutSetMode (
480 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
485 TERMINAL_DEV
*TerminalDevice
;
488 // get Terminal device data structure pointer.
490 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
492 if (ModeNumber
>= (UINTN
) This
->Mode
->MaxMode
) {
493 return EFI_UNSUPPORTED
;
497 // Set the current mode
499 This
->Mode
->Mode
= (INT32
) ModeNumber
;
501 This
->ClearScreen (This
);
503 TerminalDevice
->OutputEscChar
= TRUE
;
504 Status
= This
->OutputString (This
, mSetModeString
);
505 TerminalDevice
->OutputEscChar
= FALSE
;
507 if (EFI_ERROR (Status
)) {
508 return EFI_DEVICE_ERROR
;
511 This
->Mode
->Mode
= (INT32
) ModeNumber
;
513 Status
= This
->ClearScreen (This
);
514 if (EFI_ERROR (Status
)) {
515 return EFI_DEVICE_ERROR
;
524 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute().
526 @param This Indicates the calling context.
527 @param Attribute The attribute to set. Only bit0..6 are valid, all other bits
528 are undefined and must be zero.
530 @retval EFI_SUCCESS The requested attribute is set.
531 @retval EFI_DEVICE_ERROR The requested attribute cannot be set due to serial port error.
532 @retval EFI_UNSUPPORTED The attribute requested is not defined by EFI spec.
537 TerminalConOutSetAttribute (
538 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
542 UINT8 ForegroundControl
;
543 UINT8 BackgroundControl
;
548 TERMINAL_DEV
*TerminalDevice
;
554 // get Terminal device data structure pointer.
556 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
559 // only the bit0..6 of the Attribute is valid
561 if ((Attribute
| 0x7f) != 0x7f) {
562 return EFI_UNSUPPORTED
;
566 // Skip outputting the command string for the same attribute
567 // It improves the terminal performance significantly
569 if (This
->Mode
->Attribute
== (INT32
) Attribute
) {
574 // convert Attribute value to terminal emulator
575 // understandable foreground color
577 switch (Attribute
& 0x07) {
580 ForegroundControl
= 30;
584 ForegroundControl
= 34;
588 ForegroundControl
= 32;
592 ForegroundControl
= 36;
596 ForegroundControl
= 31;
600 ForegroundControl
= 35;
604 ForegroundControl
= 33;
610 ForegroundControl
= 37;
615 // bit4 of the Attribute indicates bright control
616 // of terminal emulator.
618 BrightControl
= (UINT8
) ((Attribute
>> 3) & 1);
621 // convert Attribute value to terminal emulator
622 // understandable background color.
624 switch ((Attribute
>> 4) & 0x07) {
627 BackgroundControl
= 40;
631 BackgroundControl
= 44;
635 BackgroundControl
= 42;
639 BackgroundControl
= 46;
643 BackgroundControl
= 41;
647 BackgroundControl
= 45;
651 BackgroundControl
= 43;
657 BackgroundControl
= 47;
661 // terminal emulator's control sequence to set attributes
663 mSetAttributeString
[BRIGHT_CONTROL_OFFSET
] = (CHAR16
) ('0' + BrightControl
);
664 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (ForegroundControl
/ 10));
665 mSetAttributeString
[FOREGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (ForegroundControl
% 10));
666 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 0] = (CHAR16
) ('0' + (BackgroundControl
/ 10));
667 mSetAttributeString
[BACKGROUND_CONTROL_OFFSET
+ 1] = (CHAR16
) ('0' + (BackgroundControl
% 10));
670 // save current column and row
671 // for future scrolling back use.
673 SavedColumn
= This
->Mode
->CursorColumn
;
674 SavedRow
= This
->Mode
->CursorRow
;
676 TerminalDevice
->OutputEscChar
= TRUE
;
677 Status
= This
->OutputString (This
, mSetAttributeString
);
678 TerminalDevice
->OutputEscChar
= FALSE
;
680 if (EFI_ERROR (Status
)) {
681 return EFI_DEVICE_ERROR
;
684 // scroll back to saved cursor position.
686 This
->Mode
->CursorColumn
= SavedColumn
;
687 This
->Mode
->CursorRow
= SavedRow
;
689 This
->Mode
->Attribute
= (INT32
) Attribute
;
697 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen().
698 It clears the ANSI terminal's display to the
699 currently selected background color.
701 @param This Indicates the calling context.
703 @retval EFI_SUCCESS The operation completed successfully.
704 @retval EFI_DEVICE_ERROR The terminal screen cannot be cleared due to serial port error.
705 @retval EFI_UNSUPPORTED The terminal is not in a valid display mode.
710 TerminalConOutClearScreen (
711 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
715 TERMINAL_DEV
*TerminalDevice
;
717 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
720 // control sequence for clear screen request
722 TerminalDevice
->OutputEscChar
= TRUE
;
723 Status
= This
->OutputString (This
, mClearScreenString
);
724 TerminalDevice
->OutputEscChar
= FALSE
;
726 if (EFI_ERROR (Status
)) {
727 return EFI_DEVICE_ERROR
;
730 Status
= This
->SetCursorPosition (This
, 0, 0);
737 Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition().
739 @param This Indicates the calling context.
740 @param Column The row to set cursor to.
741 @param Row The column to set cursor to.
743 @retval EFI_SUCCESS The operation completed successfully.
744 @retval EFI_DEVICE_ERROR The request fails due to serial port error.
745 @retval EFI_UNSUPPORTED The terminal is not in a valid text mode, or the cursor position
746 is invalid for current mode.
751 TerminalConOutSetCursorPosition (
752 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
757 EFI_SIMPLE_TEXT_OUTPUT_MODE
*Mode
;
761 TERMINAL_DEV
*TerminalDevice
;
764 TerminalDevice
= TERMINAL_CON_OUT_DEV_FROM_THIS (This
);
772 // get geometry of current mode
774 Status
= This
->QueryMode (
780 if (EFI_ERROR (Status
)) {
781 return EFI_UNSUPPORTED
;
784 if (Column
>= MaxColumn
|| Row
>= MaxRow
) {
785 return EFI_UNSUPPORTED
;
788 // control sequence to move the cursor
790 // Optimize cursor motion control sequences for TtyTerm. Move
791 // within the current line if possible, and don't output anyting if
792 // it isn't necessary.
794 if (TerminalDevice
->TerminalType
== TerminalTypeTtyTerm
&&
795 (UINTN
)Mode
->CursorRow
== Row
) {
796 if ((UINTN
)Mode
->CursorColumn
> Column
) {
797 mCursorBackwardString
[FW_BACK_OFFSET
+ 0] = (CHAR16
) ('0' + ((Mode
->CursorColumn
- Column
) / 10));
798 mCursorBackwardString
[FW_BACK_OFFSET
+ 1] = (CHAR16
) ('0' + ((Mode
->CursorColumn
- Column
) % 10));
799 String
= mCursorBackwardString
;
801 else if (Column
> (UINTN
)Mode
->CursorColumn
) {
802 mCursorForwardString
[FW_BACK_OFFSET
+ 0] = (CHAR16
) ('0' + ((Column
- Mode
->CursorColumn
) / 10));
803 mCursorForwardString
[FW_BACK_OFFSET
+ 1] = (CHAR16
) ('0' + ((Column
- Mode
->CursorColumn
) % 10));
804 String
= mCursorForwardString
;
807 String
= L
""; // No cursor motion necessary
811 mSetCursorPositionString
[ROW_OFFSET
+ 0] = (CHAR16
) ('0' + ((Row
+ 1) / 10));
812 mSetCursorPositionString
[ROW_OFFSET
+ 1] = (CHAR16
) ('0' + ((Row
+ 1) % 10));
813 mSetCursorPositionString
[COLUMN_OFFSET
+ 0] = (CHAR16
) ('0' + ((Column
+ 1) / 10));
814 mSetCursorPositionString
[COLUMN_OFFSET
+ 1] = (CHAR16
) ('0' + ((Column
+ 1) % 10));
815 String
= mSetCursorPositionString
;
818 TerminalDevice
->OutputEscChar
= TRUE
;
819 Status
= This
->OutputString (This
, String
);
820 TerminalDevice
->OutputEscChar
= FALSE
;
822 if (EFI_ERROR (Status
)) {
823 return EFI_DEVICE_ERROR
;
826 // update current cursor position
827 // in the Mode data structure.
829 Mode
->CursorColumn
= (INT32
) Column
;
830 Mode
->CursorRow
= (INT32
) Row
;
837 Implements SIMPLE_TEXT_OUTPUT.EnableCursor().
839 In this driver, the cursor cannot be hidden.
841 @param This Indicates the calling context.
842 @param Visible If TRUE, the cursor is set to be visible,
843 If FALSE, the cursor is set to be invisible.
845 @retval EFI_SUCCESS The request is valid.
846 @retval EFI_UNSUPPORTED The terminal does not support cursor hidden.
851 TerminalConOutEnableCursor (
852 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
857 return EFI_UNSUPPORTED
;
865 Detects if a Unicode char is for Box Drawing text graphics.
867 @param Graphic Unicode char to test.
868 @param PcAnsi Optional pointer to return PCANSI equivalent of
870 @param Ascii Optional pointer to return ASCII equivalent of
873 @retval TRUE If Graphic is a supported Unicode Box Drawing character.
877 TerminalIsValidTextGraphics (
879 OUT CHAR8
*PcAnsi
, OPTIONAL
880 OUT CHAR8
*Ascii OPTIONAL
883 UNICODE_TO_CHAR
*Table
;
885 if ((((Graphic
& 0xff00) != 0x2500) && ((Graphic
& 0xff00) != 0x2100))) {
887 // Unicode drawing code charts are all in the 0x25xx range,
893 for (Table
= UnicodeToPcAnsiOrAscii
; Table
->Unicode
!= 0x0000; Table
++) {
894 if (Graphic
== Table
->Unicode
) {
895 if (PcAnsi
!= NULL
) {
896 *PcAnsi
= Table
->PcAnsi
;
900 *Ascii
= Table
->Ascii
;
911 Detects if a valid ASCII char.
913 @param Ascii An ASCII character.
915 @retval TRUE If it is a valid ASCII character.
916 @retval FALSE If it is not a valid ASCII character.
920 TerminalIsValidAscii (
925 // valid ascii code lies in the extent of 0x20 ~ 0x7f
927 if ((Ascii
>= 0x20) && (Ascii
<= 0x7f)) {
935 Detects if a valid EFI control character.
937 @param CharC An input EFI Control character.
939 @retval TRUE If it is a valid EFI control character.
940 @retval FALSE If it is not a valid EFI control character.
944 TerminalIsValidEfiCntlChar (
949 // only support four control characters.
951 if (CharC
== CHAR_NULL
||
952 CharC
== CHAR_BACKSPACE
||
953 CharC
== CHAR_LINEFEED
||
954 CharC
== CHAR_CARRIAGE_RETURN
||