--*/\r
\r
\r
-\r
#include "Terminal.h"\r
\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
+};\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
-\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 = 1;\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
-\r
Status = TerminalDevice->SimpleTextOutput.Reset (\r
&TerminalDevice->SimpleTextOutput,\r
FALSE\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
// 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