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 EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput
;
78 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput
;
79 EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode
;
80 UINTN SerialInTimeOut
;
81 RAW_DATA_FIFO RawFiFo
;
82 UNICODE_FIFO UnicodeFiFo
;
83 EFI_KEY_FIFO EfiKeyFiFo
;
84 EFI_UNICODE_STRING_TABLE
*ControllerNameTable
;
85 EFI_EVENT TwoSecondTimeOut
;
90 // Esc could not be output to the screen by user,
91 // but the terminal driver need to output it to
92 // the terminal emulation software to send control sequence.
93 // This boolean is used by the terminal driver only
94 // to indicate whether the Esc could be sent or not.
96 BOOLEAN OutputEscChar
;
99 #define INPUT_STATE_DEFAULT 0x00
100 #define INPUT_STATE_ESC 0x01
101 #define INPUT_STATE_CSI 0x02
102 #define INPUT_STATE_LEFTOPENBRACKET 0x04
103 #define INPUT_STATE_O 0x08
104 #define INPUT_STATE_2 0x10
106 #define RESET_STATE_DEFAULT 0x00
107 #define RESET_STATE_ESC_R 0x01
108 #define RESET_STATE_ESC_R_ESC_r 0x02
110 #define TERMINAL_CON_IN_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE)
111 #define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE)
121 #define VT100PlusType 2
124 #define LEFTOPENBRACKET 0x5b // '['
130 #define MODE0_COLUMN_COUNT 80
131 #define MODE0_ROW_COUNT 25
137 #define BRIGHT_CONTROL_OFFSET 2
138 #define FOREGROUND_CONTROL_OFFSET 6
139 #define BACKGROUND_CONTROL_OFFSET 11
141 #define COLUMN_OFFSET 5
149 #define VarConsoleInpDev L"ConInDev"
150 #define VarConsoleOutDev L"ConOutDev"
151 #define VarErrorOutDev L"ErrOutDev"
156 extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding
;
157 extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName
;
165 IN EFI_HANDLE ImageHandle
,
166 IN EFI_SYSTEM_TABLE
*SystemTable
173 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
174 IN BOOLEAN ExtendedVerification
180 TerminalConInReadKeyStroke (
181 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
182 OUT EFI_INPUT_KEY
*Key
188 TerminalConInWaitForKey (
196 TerminalConOutReset (
197 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
198 IN BOOLEAN ExtendedVerification
204 TerminalConOutOutputString (
205 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
212 TerminalConOutTestString (
213 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
220 TerminalConOutQueryMode (
221 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
230 TerminalConOutSetMode (
231 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
238 TerminalConOutSetAttribute (
239 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
246 TerminalConOutClearScreen (
247 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
253 TerminalConOutSetCursorPosition (
254 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
262 TerminalConOutEnableCursor (
263 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
270 TerminalDriverBindingSupported (
271 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
272 IN EFI_HANDLE Controller
,
273 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
278 TerminalDriverBindingStart (
279 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
280 IN EFI_HANDLE Controller
,
281 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
286 TerminalDriverBindingStop (
287 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
288 IN EFI_HANDLE Controller
,
289 IN UINTN NumberOfChildren
,
290 IN EFI_HANDLE
*ChildHandleBuffer
295 TerminalComponentNameGetDriverName (
296 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
298 OUT CHAR16
**DriverName
303 TerminalComponentNameGetControllerName (
304 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
305 IN EFI_HANDLE ControllerHandle
,
306 IN EFI_HANDLE ChildHandle OPTIONAL
,
308 OUT CHAR16
**ControllerName
312 // internal functions
315 TerminalConInCheckForKey (
316 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
321 TerminalUpdateConsoleDevVariable (
322 IN CHAR16
*VariableName
,
323 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
328 TerminalRemoveConsoleDevVariable (
329 IN CHAR16
*VariableName
,
330 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
335 TerminalGetVariableAndSize (
337 IN EFI_GUID
*VendorGuid
,
338 OUT UINTN
*VariableSize
343 SetTerminalDevicePath (
344 IN UINT8 TerminalType
,
345 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
,
346 OUT EFI_DEVICE_PATH_PROTOCOL
**TerminalDevicePath
352 IN TERMINAL_DEV
*TerminalDevice
357 InitializeUnicodeFiFo (
358 IN TERMINAL_DEV
*TerminalDevice
363 InitializeEfiKeyFiFo (
364 IN TERMINAL_DEV
*TerminalDevice
369 GetOneKeyFromSerial (
370 EFI_SERIAL_IO_PROTOCOL
*SerialIo
,
376 RawFiFoInsertOneKey (
377 TERMINAL_DEV
*TerminalDevice
,
383 RawFiFoRemoveOneKey (
384 TERMINAL_DEV
*TerminalDevice
,
391 TERMINAL_DEV
*TerminalDevice
397 TERMINAL_DEV
*TerminalDevice
402 EfiKeyFiFoInsertOneKey (
403 TERMINAL_DEV
*TerminalDevice
,
409 EfiKeyFiFoRemoveOneKey (
410 TERMINAL_DEV
*TerminalDevice
,
411 EFI_INPUT_KEY
*Output
417 TERMINAL_DEV
*TerminalDevice
423 TERMINAL_DEV
*TerminalDevice
428 UnicodeFiFoInsertOneKey (
429 TERMINAL_DEV
*TerminalDevice
,
435 UnicodeFiFoRemoveOneKey (
436 TERMINAL_DEV
*TerminalDevice
,
443 TERMINAL_DEV
*TerminalDevice
449 TERMINAL_DEV
*TerminalDevice
454 UnicodeFiFoGetKeyCount (
455 TERMINAL_DEV
*TerminalDevice
460 TranslateRawDataToEfiKey (
461 IN TERMINAL_DEV
*TerminalDevice
466 // internal functions for PC ANSI
469 AnsiRawDataToUnicode (
470 IN TERMINAL_DEV
*PcAnsiDevice
476 IN TERMINAL_DEV
*PcAnsiDevice
482 IN TERMINAL_DEV
*TerminalDevice
,
488 // internal functions for VT100
492 IN TERMINAL_DEV
*VT100Device
,
498 // internal functions for VT100Plus
501 VT100PlusTestString (
502 IN TERMINAL_DEV
*TerminalDevice
,
508 // internal functions for VTUTF8
511 VTUTF8RawDataToUnicode (
512 IN TERMINAL_DEV
*VtUtf8Device
518 IN TERMINAL_DEV
*TerminalDevice
,
526 OUT UTF8_CHAR
*Utf8Char
,
527 OUT UINT8
*ValidBytes
532 GetOneValidUtf8Char (
533 IN TERMINAL_DEV
*Utf8Device
,
534 OUT UTF8_CHAR
*Utf8Char
,
535 OUT UINT8
*ValidBytes
541 IN UTF8_CHAR Utf8Char
,
543 OUT CHAR16
*UnicodeChar
548 // functions for boxdraw unicode
551 TerminalIsValidTextGraphics (
553 OUT CHAR8
*PcAnsi
, OPTIONAL
554 OUT CHAR8
*Ascii OPTIONAL
559 TerminalIsValidAscii (
565 TerminalIsValidEfiCntlChar (