-/*++\r
+/** @file\r
+ Produces Simple Text Input Protocl, Simple Text Input Extended Protocol and\r
+ Simple Text Output Protocol upon Serial IO Protocol.\r
\r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-Module Name:\r
-\r
- Terminal.c\r
-\r
-Abstract:\r
-\r
-Revision History:\r
-\r
---*/\r
+**/\r
\r
\r
#include "Terminal.h"\r
\r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+ IN OUT LIST_ENTRY *ListHead\r
+ );\r
+\r
//\r
// Globals\r
//\r
{\r
0,\r
0,\r
- { 0 }\r
+ { {0} }\r
},\r
NULL, // ControllerNameTable\r
- NULL, \r
+ NULL,\r
INPUT_STATE_DEFAULT,\r
RESET_STATE_DEFAULT,\r
- FALSE\r
+ FALSE,\r
+ { // SimpleTextInputEx\r
+ TerminalConInResetEx,\r
+ TerminalConInReadKeyStrokeEx,\r
+ NULL,\r
+ TerminalConInSetState,\r
+ TerminalConInRegisterKeyNotify,\r
+ TerminalConInUnregisterKeyNotify,\r
+ },\r
+ {\r
+ NULL,\r
+ NULL,\r
+ }\r
};\r
\r
\r
TerminalDevice->TerminalType = TerminalType;\r
TerminalDevice->SerialIo = SerialIo;\r
\r
+ InitializeListHead (&TerminalDevice->NotifyList);\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ TerminalConInWaitForKeyEx,\r
+ &TerminalDevice->SimpleInputEx,\r
+ &TerminalDevice->SimpleInputEx.WaitForKeyEx\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
+\r
+\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
if (EFI_ERROR (Status)) {\r
goto Error;\r
}\r
-\r
//\r
// initialize the FIFO buffer used for accommodating\r
// the pre-read pending characters\r
// keystroke response performance issue\r
//\r
Mode = TerminalDevice->SerialIo->Mode;\r
+\r
SerialInTimeOut = 0;\r
if (Mode->BaudRate != 0) {\r
SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;\r
//\r
// Simple Text Output Protocol\r
//\r
+ TerminalDevice->SimpleTextOutput.Reset = TerminalConOutReset;\r
+ TerminalDevice->SimpleTextOutput.OutputString = TerminalConOutOutputString;\r
+ TerminalDevice->SimpleTextOutput.TestString = TerminalConOutTestString;\r
+ TerminalDevice->SimpleTextOutput.QueryMode = TerminalConOutQueryMode;\r
+ TerminalDevice->SimpleTextOutput.SetMode = TerminalConOutSetMode;\r
+ TerminalDevice->SimpleTextOutput.SetAttribute = TerminalConOutSetAttribute;\r
+ TerminalDevice->SimpleTextOutput.ClearScreen = TerminalConOutClearScreen;\r
+ TerminalDevice->SimpleTextOutput.SetCursorPosition = TerminalConOutSetCursorPosition;\r
+ TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor;\r
TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode;\r
\r
+ TerminalDevice->SimpleTextOutputMode.MaxMode = 3;\r
+ //\r
+ // For terminal devices, cursor is always visible\r
+ //\r
+ TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE;\r
+ Status = TerminalDevice->SimpleTextOutput.SetAttribute (\r
+ &TerminalDevice->SimpleTextOutput,\r
+ EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ReportError;\r
+ }\r
+\r
Status = TerminalDevice->SimpleTextOutput.Reset (\r
&TerminalDevice->SimpleTextOutput,\r
FALSE\r
TerminalDevice->ControllerNameTable = NULL;\r
switch (TerminalDevice->TerminalType) {\r
case PcAnsiType:\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gTerminalComponentName.SupportedLanguages,\r
&TerminalDevice->ControllerNameTable,\r
- (CHAR16 *)L"PC-ANSI Serial Console"\r
+ (CHAR16 *)L"PC-ANSI Serial Console",\r
+ TRUE\r
);\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gTerminalComponentName2.SupportedLanguages,\r
+ &TerminalDevice->ControllerNameTable,\r
+ (CHAR16 *)L"PC-ANSI Serial Console",\r
+ FALSE\r
+ );\r
+\r
break;\r
\r
case VT100Type:\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gTerminalComponentName.SupportedLanguages,\r
&TerminalDevice->ControllerNameTable,\r
- (CHAR16 *)L"VT-100 Serial Console"\r
+ (CHAR16 *)L"VT-100 Serial Console",\r
+ TRUE\r
+ );\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gTerminalComponentName2.SupportedLanguages,\r
+ &TerminalDevice->ControllerNameTable,\r
+ (CHAR16 *)L"VT-100 Serial Console",\r
+ FALSE\r
);\r
+\r
break;\r
\r
case VT100PlusType:\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gTerminalComponentName.SupportedLanguages,\r
&TerminalDevice->ControllerNameTable,\r
- (CHAR16 *)L"VT-100+ Serial Console"\r
+ (CHAR16 *)L"VT-100+ Serial Console",\r
+ TRUE\r
);\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gTerminalComponentName2.SupportedLanguages,\r
+ &TerminalDevice->ControllerNameTable,\r
+ (CHAR16 *)L"VT-100+ Serial Console",\r
+ FALSE\r
+ );\r
+\r
break;\r
\r
case VTUTF8Type:\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gTerminalComponentName.SupportedLanguages,\r
&TerminalDevice->ControllerNameTable,\r
- (CHAR16 *)L"VT-UTF8 Serial Console"\r
+ (CHAR16 *)L"VT-UTF8 Serial Console",\r
+ TRUE\r
);\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gTerminalComponentName2.SupportedLanguages,\r
+ &TerminalDevice->ControllerNameTable,\r
+ (CHAR16 *)L"VT-UTF8 Serial Console",\r
+ FALSE\r
+ );\r
+\r
break;\r
}\r
//\r
TerminalDevice->DevicePath,\r
&gEfiSimpleTextInProtocolGuid,\r
&TerminalDevice->SimpleInput,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ &TerminalDevice->SimpleInputEx,\r
&gEfiSimpleTextOutProtocolGuid,\r
&TerminalDevice->SimpleTextOutput,\r
NULL\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
}\r
\r
+ if (TerminalDevice->SimpleInputEx.WaitForKeyEx != NULL) {\r
+ gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+ }\r
+\r
+ TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
+\r
if (TerminalDevice->ControllerNameTable != NULL) {\r
FreeUnicodeStringTable (TerminalDevice->ControllerNameTable);\r
}\r
ChildHandleBuffer[Index],\r
&gEfiSimpleTextInProtocolGuid,\r
&TerminalDevice->SimpleInput,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ &TerminalDevice->SimpleInputEx,\r
&gEfiSimpleTextOutProtocolGuid,\r
&TerminalDevice->SimpleTextOutput,\r
&gEfiDevicePathProtocolGuid,\r
\r
gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut);\r
gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
+ gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+ TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
FreePool (TerminalDevice->DevicePath);\r
FreePool (TerminalDevice);\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+ IN OUT LIST_ENTRY *ListHead\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+ ListHead - The list head\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS - Free the notify list successfully\r
+ EFI_INVALID_PARAMETER - ListHead is invalid.\r
+\r
+--*/\r
+{\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
+\r
+ if (ListHead == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ while (!IsListEmpty (ListHead)) {\r
+ NotifyNode = CR (\r
+ ListHead->ForwardLink,\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY,\r
+ NotifyEntry,\r
+ TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
+ );\r
+ RemoveEntryList (ListHead->ForwardLink);\r
+ gBS->FreePool (NotifyNode);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
VOID\r
TerminalUpdateConsoleDevVariable (\r
IN CHAR16 *VariableName,\r
/**\r
The user Entry Point for module Terminal. The user code starts with this function.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
- \r
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r
//\r
// Install driver model protocol(s).\r
//\r
- Status = EfiLibInstallAllDriverProtocols (\r
+ Status = EfiLibInstallDriverBindingComponentName2 (\r
ImageHandle,\r
SystemTable,\r
&gTerminalDriverBinding,\r
ImageHandle,\r
&gTerminalComponentName,\r
- NULL,\r
- NULL\r
+ &gTerminalComponentName2\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r