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
152 extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding
;
153 extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName
;
161 IN EFI_HANDLE ImageHandle
,
162 IN EFI_SYSTEM_TABLE
*SystemTable
169 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
170 IN BOOLEAN ExtendedVerification
176 TerminalConInReadKeyStroke (
177 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
178 OUT EFI_INPUT_KEY
*Key
184 TerminalConInWaitForKey (
192 TerminalConOutReset (
193 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
194 IN BOOLEAN ExtendedVerification
200 TerminalConOutOutputString (
201 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
208 TerminalConOutTestString (
209 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
216 TerminalConOutQueryMode (
217 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
226 TerminalConOutSetMode (
227 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
234 TerminalConOutSetAttribute (
235 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
242 TerminalConOutClearScreen (
243 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
249 TerminalConOutSetCursorPosition (
250 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
258 TerminalConOutEnableCursor (
259 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*This
,
266 TerminalDriverBindingSupported (
267 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
268 IN EFI_HANDLE Controller
,
269 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
274 TerminalDriverBindingStart (
275 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
276 IN EFI_HANDLE Controller
,
277 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
282 TerminalDriverBindingStop (
283 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
284 IN EFI_HANDLE Controller
,
285 IN UINTN NumberOfChildren
,
286 IN EFI_HANDLE
*ChildHandleBuffer
291 TerminalComponentNameGetDriverName (
292 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
294 OUT CHAR16
**DriverName
299 TerminalComponentNameGetControllerName (
300 IN EFI_COMPONENT_NAME_PROTOCOL
*This
,
301 IN EFI_HANDLE ControllerHandle
,
302 IN EFI_HANDLE ChildHandle OPTIONAL
,
304 OUT CHAR16
**ControllerName
308 // internal functions
311 TerminalConInCheckForKey (
312 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
317 TerminalUpdateConsoleDevVariable (
318 IN CHAR16
*VariableName
,
319 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
324 TerminalRemoveConsoleDevVariable (
325 IN CHAR16
*VariableName
,
326 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
331 TerminalGetVariableAndSize (
333 IN EFI_GUID
*VendorGuid
,
334 OUT UINTN
*VariableSize
339 SetTerminalDevicePath (
340 IN UINT8 TerminalType
,
341 IN EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
,
342 OUT EFI_DEVICE_PATH_PROTOCOL
**TerminalDevicePath
348 IN TERMINAL_DEV
*TerminalDevice
353 InitializeUnicodeFiFo (
354 IN TERMINAL_DEV
*TerminalDevice
359 InitializeEfiKeyFiFo (
360 IN TERMINAL_DEV
*TerminalDevice
365 GetOneKeyFromSerial (
366 EFI_SERIAL_IO_PROTOCOL
*SerialIo
,
372 RawFiFoInsertOneKey (
373 TERMINAL_DEV
*TerminalDevice
,
379 RawFiFoRemoveOneKey (
380 TERMINAL_DEV
*TerminalDevice
,
387 TERMINAL_DEV
*TerminalDevice
393 TERMINAL_DEV
*TerminalDevice
398 EfiKeyFiFoInsertOneKey (
399 TERMINAL_DEV
*TerminalDevice
,
405 EfiKeyFiFoRemoveOneKey (
406 TERMINAL_DEV
*TerminalDevice
,
407 EFI_INPUT_KEY
*Output
413 TERMINAL_DEV
*TerminalDevice
419 TERMINAL_DEV
*TerminalDevice
424 UnicodeFiFoInsertOneKey (
425 TERMINAL_DEV
*TerminalDevice
,
431 UnicodeFiFoRemoveOneKey (
432 TERMINAL_DEV
*TerminalDevice
,
439 TERMINAL_DEV
*TerminalDevice
445 TERMINAL_DEV
*TerminalDevice
450 UnicodeFiFoGetKeyCount (
451 TERMINAL_DEV
*TerminalDevice
456 TranslateRawDataToEfiKey (
457 IN TERMINAL_DEV
*TerminalDevice
462 // internal functions for PC ANSI
465 AnsiRawDataToUnicode (
466 IN TERMINAL_DEV
*PcAnsiDevice
472 IN TERMINAL_DEV
*PcAnsiDevice
478 IN TERMINAL_DEV
*TerminalDevice
,
484 // internal functions for VT100
488 IN TERMINAL_DEV
*VT100Device
,
494 // internal functions for VT100Plus
497 VT100PlusTestString (
498 IN TERMINAL_DEV
*TerminalDevice
,
504 // internal functions for VTUTF8
507 VTUTF8RawDataToUnicode (
508 IN TERMINAL_DEV
*VtUtf8Device
514 IN TERMINAL_DEV
*TerminalDevice
,
522 OUT UTF8_CHAR
*Utf8Char
,
523 OUT UINT8
*ValidBytes
528 GetOneValidUtf8Char (
529 IN TERMINAL_DEV
*Utf8Device
,
530 OUT UTF8_CHAR
*Utf8Char
,
531 OUT UINT8
*ValidBytes
537 IN UTF8_CHAR Utf8Char
,
539 OUT CHAR16
*UnicodeChar
544 // functions for boxdraw unicode
547 TerminalIsValidTextGraphics (
549 OUT CHAR8
*PcAnsi
, OPTIONAL
550 OUT CHAR8
*Ascii OPTIONAL
555 TerminalIsValidAscii (
561 TerminalIsValidEfiCntlChar (