--*/\r
\r
\r
-//\r
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
-\r
#include "Terminal.h"\r
\r
-#include "FrameworkDxe.h"\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
+};\r
+\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingSupported (\r
if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
return Status;\r
}\r
- //\r
- // Report that the remote terminal is being enabled\r
- //\r
- DevicePath = ParentDevicePath;\r
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
- EFI_PROGRESS_CODE,\r
- EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_PC_ENABLE,\r
- DevicePath\r
- );\r
\r
//\r
// Open the Serial I/O Protocol BY_DRIVER. It might already be started.\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
//\r
REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
- EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_CONTROLLER_ERROR,\r
+ PcdGet32 (PcdStatusCodeValueRemoteConsoleError),\r
DevicePath\r
);\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- //\r
- // Report that the remote terminal is being disabled\r
- //\r
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
- EFI_PROGRESS_CODE,\r
- EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_PC_DISABLE,\r
- DevicePath\r
- );\r
\r
//\r
// Complete all outstanding transactions to Controller.\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
//\r
TerminalDevice->EfiKeyFiFo.Head = TerminalDevice->EfiKeyFiFo.Tail;\r
}\r
+\r
+\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] SystemTable A pointer to the EFI System Table.\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
+EFI_STATUS\r
+EFIAPI\r
+InitializeTerminal(\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Install driver model protocol(s).\r
+ //\r
+ Status = EfiLibInstallAllDriverProtocols (\r
+ ImageHandle,\r
+ SystemTable,\r
+ &gTerminalDriverBinding,\r
+ ImageHandle,\r
+ &gTerminalComponentName,\r
+ NULL,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+ return Status;\r
+}\r