3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
27 // Include common header file for this module.
29 #include "CommonHeader.h"
31 #define RAW_FIFO_MAX_NUMBER 256
32 #define FIFO_MAX_NUMBER 128
37 UINT8 Data
[RAW_FIFO_MAX_NUMBER
+ 1];
43 UINT16 Data
[FIFO_MAX_NUMBER
+ 1];
49 EFI_INPUT_KEY Data
[FIFO_MAX_NUMBER
+ 1];
52 #define TERMINAL_DEV_SIGNATURE EFI_SIGNATURE_32 ('t', 'm', 'n', 'l')
58 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
59 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
60 VENDOR_DEVICE_PATH Node
;
61 EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput
;
62 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput
;
63 EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode
;
64 UINTN SerialInTimeOut
;
65 RAW_DATA_FIFO RawFiFo
;
66 UNICODE_FIFO UnicodeFiFo
;
67 EFI_KEY_FIFO EfiKeyFiFo
;
68 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
69 EFI_EVENT TwoSecondTimeOut
;
74 // Esc could not be output to the screen by user,
75 // but the terminal driver need to output it to
76 // the terminal emulation software to send control sequence.
77 // This boolean is used by the terminal driver only
78 // to indicate whether the Esc could be sent or not.
80 BOOLEAN OutputEscChar
;
83 #define INPUT_STATE_DEFAULT 0x00
84 #define INPUT_STATE_ESC 0x01
85 #define INPUT_STATE_CSI 0x02
86 #define INPUT_STATE_LEFTOPENBRACKET 0x04
87 #define INPUT_STATE_O 0x08
88 #define INPUT_STATE_2 0x10
90 #define RESET_STATE_DEFAULT 0x00
91 #define RESET_STATE_ESC_R 0x01
92 #define RESET_STATE_ESC_R_ESC_r 0x02
94 #define TERMINAL_CON_IN_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE)
95 #define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE)
105 #define VT100PlusType 2
108 #define LEFTOPENBRACKET 0x5b // '['
114 #define MODE0_COLUMN_COUNT 80
115 #define MODE0_ROW_COUNT 25
121 #define BRIGHT_CONTROL_OFFSET 2
122 #define FOREGROUND_CONTROL_OFFSET 6
123 #define BACKGROUND_CONTROL_OFFSET 11
125 #define COLUMN_OFFSET 5
133 #define VarConsoleInpDev L"ConInDev"
134 #define VarConsoleOutDev L"ConOutDev"
135 #define VarErrorOutDev L"ErrOutDev"
140 extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding
;
141 extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName
;
149 IN EFI_HANDLE ImageHandle
,
150 IN EFI_SYSTEM_TABLE
*SystemTable
157 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
158 IN BOOLEAN ExtendedVerification
164 TerminalConInReadKeyStroke (
165 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
166 OUT EFI_INPUT_KEY
*Key
172 TerminalConInWaitForKey (
180 TerminalConOutReset (
181 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
182 IN BOOLEAN ExtendedVerification
188 TerminalConOutOutputString (
189 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
196 TerminalConOutTestString (
197 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
204 TerminalConOutQueryMode (
205 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
214 TerminalConOutSetMode (
215 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
222 TerminalConOutSetAttribute (
223 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
230 TerminalConOutClearScreen (
231 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
237 TerminalConOutSetCursorPosition (
238 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
246 TerminalConOutEnableCursor (
247 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
254 TerminalDriverBindingSupported (
255 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
256 IN EFI_HANDLE Controller
,
257 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
262 TerminalDriverBindingStart (
263 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
264 IN EFI_HANDLE Controller
,
265 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
270 TerminalDriverBindingStop (
271 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
272 IN EFI_HANDLE Controller
,
273 IN UINTN NumberOfChildren
,
274 IN EFI_HANDLE
*ChildHandleBuffer
279 TerminalComponentNameGetDriverName (
280 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
282 OUT CHAR16
**DriverName
287 TerminalComponentNameGetControllerName (
288 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
289 IN EFI_HANDLE ControllerHandle
,
290 IN EFI_HANDLE ChildHandle OPTIONAL
,
292 OUT CHAR16
**ControllerName
296 // internal functions
299 TerminalConInCheckForKey (
300 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
305 TerminalUpdateConsoleDevVariable (
306 IN CHAR16
*VariableName
,
307 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
312 TerminalRemoveConsoleDevVariable (
313 IN CHAR16
*VariableName
,
314 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
319 TerminalGetVariableAndSize (
321 IN EFI_GUID
*VendorGuid
,
322 OUT UINTN
*VariableSize
327 SetTerminalDevicePath (
328 IN UINT8 TerminalType
,
329 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
,
330 OUT EFI_DEVICE_PATH_PROTOCOL
**TerminalDevicePath
336 IN TERMINAL_DEV
*TerminalDevice
341 InitializeUnicodeFiFo (
342 IN TERMINAL_DEV
*TerminalDevice
347 InitializeEfiKeyFiFo (
348 IN TERMINAL_DEV
*TerminalDevice
353 GetOneKeyFromSerial (
354 EFI_SERIAL_IO_PROTOCOL
*SerialIo
,
360 RawFiFoInsertOneKey (
361 TERMINAL_DEV
*TerminalDevice
,
367 RawFiFoRemoveOneKey (
368 TERMINAL_DEV
*TerminalDevice
,
375 TERMINAL_DEV
*TerminalDevice
381 TERMINAL_DEV
*TerminalDevice
386 EfiKeyFiFoInsertOneKey (
387 TERMINAL_DEV
*TerminalDevice
,
393 EfiKeyFiFoRemoveOneKey (
394 TERMINAL_DEV
*TerminalDevice
,
395 EFI_INPUT_KEY
*Output
401 TERMINAL_DEV
*TerminalDevice
407 TERMINAL_DEV
*TerminalDevice
412 UnicodeFiFoInsertOneKey (
413 TERMINAL_DEV
*TerminalDevice
,
419 UnicodeFiFoRemoveOneKey (
420 TERMINAL_DEV
*TerminalDevice
,
427 TERMINAL_DEV
*TerminalDevice
433 TERMINAL_DEV
*TerminalDevice
438 UnicodeFiFoGetKeyCount (
439 TERMINAL_DEV
*TerminalDevice
444 TranslateRawDataToEfiKey (
445 IN TERMINAL_DEV
*TerminalDevice
450 // internal functions for PC ANSI
453 AnsiRawDataToUnicode (
454 IN TERMINAL_DEV
*PcAnsiDevice
460 IN TERMINAL_DEV
*PcAnsiDevice
466 IN TERMINAL_DEV
*TerminalDevice
,
472 // internal functions for VT100
476 IN TERMINAL_DEV
*VT100Device
,
482 // internal functions for VT100Plus
485 VT100PlusTestString (
486 IN TERMINAL_DEV
*TerminalDevice
,
492 // internal functions for VTUTF8
495 VTUTF8RawDataToUnicode (
496 IN TERMINAL_DEV
*VtUtf8Device
502 IN TERMINAL_DEV
*TerminalDevice
,
510 OUT UTF8_CHAR
*Utf8Char
,
511 OUT UINT8
*ValidBytes
516 GetOneValidUtf8Char (
517 IN TERMINAL_DEV
*Utf8Device
,
518 OUT UTF8_CHAR
*Utf8Char
,
519 OUT UINT8
*ValidBytes
525 IN UTF8_CHAR Utf8Char
,
527 OUT CHAR16
*UnicodeChar
532 // functions for boxdraw unicode
535 TerminalIsValidTextGraphics (
537 OUT CHAR8
*PcAnsi
, OPTIONAL
538 OUT CHAR8
*Ascii OPTIONAL
543 TerminalIsValidAscii (
549 TerminalIsValidEfiCntlChar (