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.
28 #include <Protocol/SimpleTextOut.h>
29 #include <Protocol/SerialIo.h>
30 #include <Guid/GlobalVariable.h>
31 #include <Protocol/DevicePath.h>
32 #include <Protocol/SimpleTextIn.h>
33 #include <Guid/HotPlugDevice.h>
34 #include <Guid/PcAnsi.h>
35 #include <Library/DebugLib.h>
36 #include <Library/UefiDriverEntryPoint.h>
37 #include <Library/UefiLib.h>
38 #include <Library/ReportStatusCodeLib.h>
39 #include <Library/BaseMemoryLib.h>
40 #include <Library/MemoryAllocationLib.h>
41 #include <Library/UefiBootServicesTableLib.h>
42 #include <Library/UefiRuntimeServicesTableLib.h>
43 #include <Library/DevicePathLib.h>
44 #include <Library/PcdLib.h>
48 #define RAW_FIFO_MAX_NUMBER 256
49 #define FIFO_MAX_NUMBER 128
54 UINT8 Data
[RAW_FIFO_MAX_NUMBER
+ 1];
60 UINT16 Data
[FIFO_MAX_NUMBER
+ 1];
66 EFI_INPUT_KEY Data
[FIFO_MAX_NUMBER
+ 1];
69 #define TERMINAL_DEV_SIGNATURE EFI_SIGNATURE_32 ('t', 'm', 'n', 'l')
75 EFI_SERIAL_IO_PROTOCOL
*SerialIo
;
76 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
77 VENDOR_DEVICE_PATH Node
;
78 EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput
;
79 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput
;
80 EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode
;
81 UINTN SerialInTimeOut
;
82 RAW_DATA_FIFO RawFiFo
;
83 UNICODE_FIFO UnicodeFiFo
;
84 EFI_KEY_FIFO EfiKeyFiFo
;
85 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
86 EFI_EVENT TwoSecondTimeOut
;
91 // Esc could not be output to the screen by user,
92 // but the terminal driver need to output it to
93 // the terminal emulation software to send control sequence.
94 // This boolean is used by the terminal driver only
95 // to indicate whether the Esc could be sent or not.
97 BOOLEAN OutputEscChar
;
100 #define INPUT_STATE_DEFAULT 0x00
101 #define INPUT_STATE_ESC 0x01
102 #define INPUT_STATE_CSI 0x02
103 #define INPUT_STATE_LEFTOPENBRACKET 0x04
104 #define INPUT_STATE_O 0x08
105 #define INPUT_STATE_2 0x10
107 #define RESET_STATE_DEFAULT 0x00
108 #define RESET_STATE_ESC_R 0x01
109 #define RESET_STATE_ESC_R_ESC_r 0x02
111 #define TERMINAL_CON_IN_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE)
112 #define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE)
122 #define VT100PlusType 2
125 #define LEFTOPENBRACKET 0x5b // '['
131 #define MODE0_COLUMN_COUNT 80
132 #define MODE0_ROW_COUNT 25
138 #define BRIGHT_CONTROL_OFFSET 2
139 #define FOREGROUND_CONTROL_OFFSET 6
140 #define BACKGROUND_CONTROL_OFFSET 11
142 #define COLUMN_OFFSET 5
150 #define VarConsoleInpDev L"ConInDev"
151 #define VarConsoleOutDev L"ConOutDev"
152 #define VarErrorOutDev L"ErrOutDev"
157 extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding
;
158 extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName
;
166 IN EFI_HANDLE ImageHandle
,
167 IN EFI_SYSTEM_TABLE
*SystemTable
174 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
175 IN BOOLEAN ExtendedVerification
181 TerminalConInReadKeyStroke (
182 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
183 OUT EFI_INPUT_KEY
*Key
189 TerminalConInWaitForKey (
197 TerminalConOutReset (
198 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
199 IN BOOLEAN ExtendedVerification
205 TerminalConOutOutputString (
206 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
213 TerminalConOutTestString (
214 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
221 TerminalConOutQueryMode (
222 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
231 TerminalConOutSetMode (
232 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
239 TerminalConOutSetAttribute (
240 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
247 TerminalConOutClearScreen (
248 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
254 TerminalConOutSetCursorPosition (
255 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
263 TerminalConOutEnableCursor (
264 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
271 TerminalDriverBindingSupported (
272 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
273 IN EFI_HANDLE Controller
,
274 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
279 TerminalDriverBindingStart (
280 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
281 IN EFI_HANDLE Controller
,
282 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
287 TerminalDriverBindingStop (
288 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
289 IN EFI_HANDLE Controller
,
290 IN UINTN NumberOfChildren
,
291 IN EFI_HANDLE
*ChildHandleBuffer
296 TerminalComponentNameGetDriverName (
297 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
299 OUT CHAR16
**DriverName
304 TerminalComponentNameGetControllerName (
305 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
306 IN EFI_HANDLE ControllerHandle
,
307 IN EFI_HANDLE ChildHandle OPTIONAL
,
309 OUT CHAR16
**ControllerName
313 // internal functions
316 TerminalConInCheckForKey (
317 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
322 TerminalUpdateConsoleDevVariable (
323 IN CHAR16
*VariableName
,
324 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
329 TerminalRemoveConsoleDevVariable (
330 IN CHAR16
*VariableName
,
331 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
336 TerminalGetVariableAndSize (
338 IN EFI_GUID
*VendorGuid
,
339 OUT UINTN
*VariableSize
344 SetTerminalDevicePath (
345 IN UINT8 TerminalType
,
346 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
,
347 OUT EFI_DEVICE_PATH_PROTOCOL
**TerminalDevicePath
353 IN TERMINAL_DEV
*TerminalDevice
358 InitializeUnicodeFiFo (
359 IN TERMINAL_DEV
*TerminalDevice
364 InitializeEfiKeyFiFo (
365 IN TERMINAL_DEV
*TerminalDevice
370 GetOneKeyFromSerial (
371 EFI_SERIAL_IO_PROTOCOL
*SerialIo
,
377 RawFiFoInsertOneKey (
378 TERMINAL_DEV
*TerminalDevice
,
384 RawFiFoRemoveOneKey (
385 TERMINAL_DEV
*TerminalDevice
,
392 TERMINAL_DEV
*TerminalDevice
398 TERMINAL_DEV
*TerminalDevice
403 EfiKeyFiFoInsertOneKey (
404 TERMINAL_DEV
*TerminalDevice
,
410 EfiKeyFiFoRemoveOneKey (
411 TERMINAL_DEV
*TerminalDevice
,
412 EFI_INPUT_KEY
*Output
418 TERMINAL_DEV
*TerminalDevice
424 TERMINAL_DEV
*TerminalDevice
429 UnicodeFiFoInsertOneKey (
430 TERMINAL_DEV
*TerminalDevice
,
436 UnicodeFiFoRemoveOneKey (
437 TERMINAL_DEV
*TerminalDevice
,
444 TERMINAL_DEV
*TerminalDevice
450 TERMINAL_DEV
*TerminalDevice
455 UnicodeFiFoGetKeyCount (
456 TERMINAL_DEV
*TerminalDevice
461 TranslateRawDataToEfiKey (
462 IN TERMINAL_DEV
*TerminalDevice
467 // internal functions for PC ANSI
470 AnsiRawDataToUnicode (
471 IN TERMINAL_DEV
*PcAnsiDevice
477 IN TERMINAL_DEV
*PcAnsiDevice
483 IN TERMINAL_DEV
*TerminalDevice
,
489 // internal functions for VT100
493 IN TERMINAL_DEV
*VT100Device
,
499 // internal functions for VT100Plus
502 VT100PlusTestString (
503 IN TERMINAL_DEV
*TerminalDevice
,
509 // internal functions for VTUTF8
512 VTUTF8RawDataToUnicode (
513 IN TERMINAL_DEV
*VtUtf8Device
519 IN TERMINAL_DEV
*TerminalDevice
,
527 OUT UTF8_CHAR
*Utf8Char
,
528 OUT UINT8
*ValidBytes
533 GetOneValidUtf8Char (
534 IN TERMINAL_DEV
*Utf8Device
,
535 OUT UTF8_CHAR
*Utf8Char
,
536 OUT UINT8
*ValidBytes
542 IN UTF8_CHAR Utf8Char
,
544 OUT CHAR16
*UnicodeChar
549 // functions for boxdraw unicode
552 TerminalIsValidTextGraphics (
554 OUT CHAR8
*PcAnsi
, OPTIONAL
555 OUT CHAR8
*Ascii OPTIONAL
560 TerminalIsValidAscii (
566 TerminalIsValidEfiCntlChar (