-/*++\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
\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
\r
\r
+EFI_GUID *gTerminalType[] = {\r
+ &gEfiPcAnsiGuid,\r
+ &gEfiVT100Guid,\r
+ &gEfiVT100PlusGuid,\r
+ &gEfiVTUTF8Guid\r
+};\r
+\r
+\r
+TERMINAL_DEV gTerminalDevTemplate = {\r
+ TERMINAL_DEV_SIGNATURE,\r
+ NULL,\r
+ 0,\r
+ NULL,\r
+ NULL,\r
+ { // SimpleTextInput\r
+ TerminalConInReset,\r
+ TerminalConInReadKeyStroke,\r
+ NULL\r
+ },\r
+ { // SimpleTextOutput\r
+ TerminalConOutReset,\r
+ TerminalConOutOutputString,\r
+ TerminalConOutTestString,\r
+ TerminalConOutQueryMode,\r
+ TerminalConOutSetMode,\r
+ TerminalConOutSetAttribute,\r
+ TerminalConOutClearScreen,\r
+ TerminalConOutSetCursorPosition,\r
+ TerminalConOutEnableCursor,\r
+ NULL\r
+ },\r
+ { // SimpleTextOutputMode\r
+ 1, // MaxMode\r
+ 0, // Mode?\r
+ EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute\r
+ 0, // CursorColumn\r
+ 0, // CursorRow\r
+ TRUE // CursorVisible\r
+ },\r
+ 0,\r
+ {\r
+ 0,\r
+ 0,\r
+ { 0 }\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ { 0 }\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ { {0} }\r
+ },\r
+ NULL, // ControllerNameTable\r
+ NULL,\r
+ INPUT_STATE_DEFAULT,\r
+ RESET_STATE_DEFAULT,\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
+\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingSupported (\r
EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
- TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath);\r
- TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath);\r
- TerminalUpdateConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath);\r
+ TerminalUpdateConsoleDevVariable (L"ConInDev", ParentDevicePath);\r
+ TerminalUpdateConsoleDevVariable (L"ConOutDev", ParentDevicePath);\r
+ TerminalUpdateConsoleDevVariable (L"ErrOutDev", ParentDevicePath);\r
}\r
}\r
}\r
// If RemainingDevicePath is NULL, then create default device path node\r
//\r
if (RemainingDevicePath == NULL) {\r
- DefaultNode = AllocatePool (sizeof (VENDOR_DEVICE_PATH));\r
+ DefaultNode = AllocateZeroPool (sizeof (VENDOR_DEVICE_PATH));\r
if (DefaultNode == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
\r
- CopyMem (&DefaultNode->Guid, &gEfiPcAnsiGuid, sizeof (EFI_GUID));\r
- RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) DefaultNode;\r
- }\r
- //\r
- // Use the RemainingDevicePath to determine the terminal type\r
- //\r
- Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath;\r
-\r
- if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
-\r
- TerminalType = PcAnsiType;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
-\r
- TerminalType = VT100Type;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
-\r
- TerminalType = VT100PlusType;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
-\r
- TerminalType = VTUTF8Type;\r
+ TerminalType = FixedPcdGet8 (PcdDefaultTerminalType);\r
+ // must be between PcAnsiType (0) and VTUTF8Type (3)\r
+ ASSERT (TerminalType <= VTUTF8Type);\r
\r
+ CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));\r
+ RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*)DefaultNode;\r
} else {\r
- goto Error;\r
+ //\r
+ // Use the RemainingDevicePath to determine the terminal type\r
+ //\r
+ Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath;\r
+ if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
+ TerminalType = PcAnsiType;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
+ TerminalType = VT100Type;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
+ TerminalType = VT100PlusType;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
+ TerminalType = VTUTF8Type;\r
+ } else {\r
+ goto Error;\r
+ }\r
}\r
+\r
//\r
// Initialize the Terminal Dev\r
//\r
- TerminalDevice = AllocatePool (sizeof (TERMINAL_DEV));\r
+ TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &gTerminalDevTemplate);\r
if (TerminalDevice == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
\r
- ZeroMem (TerminalDevice, sizeof (TERMINAL_DEV));\r
-\r
- TerminalDevice->Signature = TERMINAL_DEV_SIGNATURE;\r
-\r
TerminalDevice->TerminalType = TerminalType;\r
-\r
TerminalDevice->SerialIo = SerialIo;\r
\r
- //\r
- // Simple Input Protocol\r
- //\r
- TerminalDevice->SimpleInput.Reset = TerminalConInReset;\r
- TerminalDevice->SimpleInput.ReadKeyStroke = TerminalConInReadKeyStroke;\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
TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor;\r
TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode;\r
\r
- TerminalDevice->SimpleTextOutputMode.MaxMode = 1;\r
+ TerminalDevice->SimpleTextOutputMode.MaxMode = 3;\r
//\r
// For terminal devices, cursor is always visible\r
//\r
TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE;\r
- TerminalDevice->SimpleTextOutputMode.Attribute = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK);\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
if (EFI_ERROR (Status)) {\r
goto ReportError;\r
}\r
- //\r
- //\r
- //\r
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
\r
Status = gBS->CreateEvent (\r
EVT_TIMER,\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
// Remove Parent Device Path from\r
// the Console Device Environment Variables\r
//\r
- TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath);\r
- TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath);\r
- TerminalRemoveConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath);\r
+ TerminalRemoveConsoleDevVariable (L"ConInDev", ParentDevicePath);\r
+ TerminalRemoveConsoleDevVariable (L"ConOutDev", ParentDevicePath);\r
+ TerminalRemoveConsoleDevVariable (L"ErrOutDev", ParentDevicePath);\r
\r
//\r
// Uninstall the Terminal Driver's GUID Tag from the Serial controller\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