X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FConsole%2FTerminalDxe%2FTerminal.c;h=e9096a3db929f18a1962e96874856a791a16747b;hp=4860a4b21041a0cf220b77164a76ae97d4834567;hb=ff37790d3d3805b232cecb19867d19f44860112c;hpb=97a079edfb4b6454b31ccd4db3302655d835d98f diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c index 4860a4b210..e9096a3db9 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c @@ -20,7 +20,6 @@ Revision History: --*/ - #include "Terminal.h" // @@ -36,6 +35,70 @@ EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = { }; +EFI_GUID *gTerminalType[] = { + &gEfiPcAnsiGuid, + &gEfiVT100Guid, + &gEfiVT100PlusGuid, + &gEfiVTUTF8Guid +}; + + +TERMINAL_DEV gTerminalDevTemplate = { + TERMINAL_DEV_SIGNATURE, + NULL, + 0, + NULL, + NULL, + { // SimpleTextInput + TerminalConInReset, + TerminalConInReadKeyStroke, + NULL + }, + { // SimpleTextOutput + TerminalConOutReset, + TerminalConOutOutputString, + TerminalConOutTestString, + TerminalConOutQueryMode, + TerminalConOutSetMode, + TerminalConOutSetAttribute, + TerminalConOutClearScreen, + TerminalConOutSetCursorPosition, + TerminalConOutEnableCursor, + NULL + }, + { // SimpleTextOutputMode + 1, // MaxMode + 0, // Mode? + EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute + 0, // CursorColumn + 0, // CursorRow + TRUE // CursorVisible + }, + 0, + { + 0, + 0, + { 0 } + }, + { + 0, + 0, + { 0 } + }, + { + 0, + 0, + { 0 } + }, + NULL, // ControllerNameTable + NULL, + INPUT_STATE_DEFAULT, + RESET_STATE_DEFAULT, + FALSE +}; + + + EFI_STATUS EFIAPI TerminalDriverBindingSupported ( @@ -243,9 +306,9 @@ TerminalDriverBindingStart ( EFI_OPEN_PROTOCOL_TEST_PROTOCOL ); if (EFI_ERROR (Status)) { - TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath); - TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath); - TerminalUpdateConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath); + TerminalUpdateConsoleDevVariable (L"ConInDev", ParentDevicePath); + TerminalUpdateConsoleDevVariable ((L"ConOutDev", ParentDevicePath); + TerminalUpdateConsoleDevVariable (L"ErrOutDev", ParentDevicePath); } } } @@ -276,62 +339,48 @@ TerminalDriverBindingStart ( // If RemainingDevicePath is NULL, then create default device path node // if (RemainingDevicePath == NULL) { - DefaultNode = AllocatePool (sizeof (VENDOR_DEVICE_PATH)); + DefaultNode = AllocateZeroPool (sizeof (VENDOR_DEVICE_PATH)); if (DefaultNode == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Error; } - CopyMem (&DefaultNode->Guid, &gEfiPcAnsiGuid, sizeof (EFI_GUID)); - RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) DefaultNode; - } - // - // Use the RemainingDevicePath to determine the terminal type - // - Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath; - - if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) { - - TerminalType = PcAnsiType; - - } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) { - - TerminalType = VT100Type; - - } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) { - - TerminalType = VT100PlusType; - - } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) { - - TerminalType = VTUTF8Type; + TerminalType = FixedPcdGet8 (PcdDefaultTerminalType); + // must be between PcAnsiType (0) and VTUTF8Type (3) + ASSERT (TerminalType <= VTUTF8Type); + CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID)); + RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*)DefaultNode; } else { - goto Error; + // + // Use the RemainingDevicePath to determine the terminal type + // + Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath; + if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) { + TerminalType = PcAnsiType; + } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) { + TerminalType = VT100Type; + } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) { + TerminalType = VT100PlusType; + } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) { + TerminalType = VTUTF8Type; + } else { + goto Error; + } } + // // Initialize the Terminal Dev // - TerminalDevice = AllocatePool (sizeof (TERMINAL_DEV)); + TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &gTerminalDevTemplate); if (TerminalDevice == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Error; } - ZeroMem (TerminalDevice, sizeof (TERMINAL_DEV)); - - TerminalDevice->Signature = TERMINAL_DEV_SIGNATURE; - TerminalDevice->TerminalType = TerminalType; - TerminalDevice->SerialIo = SerialIo; - // - // Simple Input Protocol - // - TerminalDevice->SimpleInput.Reset = TerminalConInReset; - TerminalDevice->SimpleInput.ReadKeyStroke = TerminalConInReadKeyStroke; - Status = gBS->CreateEvent ( EVT_NOTIFY_WAIT, TPL_NOTIFY, @@ -342,6 +391,7 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) { goto Error; } + // // initialize the FIFO buffer used for accommodating // the pre-read pending characters @@ -355,7 +405,6 @@ TerminalDriverBindingStart ( // keystroke response performance issue // Mode = TerminalDevice->SerialIo->Mode; - SerialInTimeOut = 0; if (Mode->BaudRate != 0) { SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate; @@ -409,24 +458,8 @@ TerminalDriverBindingStart ( // // Simple Text Output Protocol // - TerminalDevice->SimpleTextOutput.Reset = TerminalConOutReset; - TerminalDevice->SimpleTextOutput.OutputString = TerminalConOutOutputString; - TerminalDevice->SimpleTextOutput.TestString = TerminalConOutTestString; - TerminalDevice->SimpleTextOutput.QueryMode = TerminalConOutQueryMode; - TerminalDevice->SimpleTextOutput.SetMode = TerminalConOutSetMode; - TerminalDevice->SimpleTextOutput.SetAttribute = TerminalConOutSetAttribute; - TerminalDevice->SimpleTextOutput.ClearScreen = TerminalConOutClearScreen; - TerminalDevice->SimpleTextOutput.SetCursorPosition = TerminalConOutSetCursorPosition; - TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor; TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode; - TerminalDevice->SimpleTextOutputMode.MaxMode = 1; - // - // For terminal devices, cursor is always visible - // - TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE; - TerminalDevice->SimpleTextOutputMode.Attribute = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK); - Status = TerminalDevice->SimpleTextOutput.Reset ( &TerminalDevice->SimpleTextOutput, FALSE @@ -450,11 +483,6 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) { goto ReportError; } - // - // - // - TerminalDevice->InputState = INPUT_STATE_DEFAULT; - TerminalDevice->ResetState = RESET_STATE_DEFAULT; Status = gBS->CreateEvent ( EVT_TIMER, @@ -679,9 +707,9 @@ TerminalDriverBindingStop ( // Remove Parent Device Path from // the Console Device Environment Variables // - TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath); - TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath); - TerminalRemoveConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath); + TerminalRemoveConsoleDevVariable (L"ConInDev", ParentDevicePath); + TerminalRemoveConsoleDevVariable (L"ConOutDev", ParentDevicePath); + TerminalRemoveConsoleDevVariable (L"ErrOutDev", ParentDevicePath); // // Uninstall the Terminal Driver's GUID Tag from the Serial controller