From 6c128c65b5ec0e5b8b5a0ccb165f3afd29e485f8 Mon Sep 17 00:00:00 2001 From: Guo Mang Date: Wed, 2 Aug 2017 09:54:47 +0800 Subject: Remove core packages since we can get them from edk2 repository Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang --- MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c | 79 - .../Universal/Console/TerminalDxe/ComponentName.c | 237 --- .../Universal/Console/TerminalDxe/Terminal.c | 1786 -------------------- .../Universal/Console/TerminalDxe/Terminal.h | 1361 --------------- .../Universal/Console/TerminalDxe/TerminalConIn.c | 1670 ------------------ .../Universal/Console/TerminalDxe/TerminalConOut.c | 908 ---------- .../Universal/Console/TerminalDxe/TerminalDxe.inf | 99 -- .../Universal/Console/TerminalDxe/TerminalDxe.uni | Bin 2376 -> 0 bytes .../Console/TerminalDxe/TerminalDxeExtra.uni | Bin 1334 -> 0 bytes .../Universal/Console/TerminalDxe/Vtutf8.c | 328 ---- 10 files changed, 6468 deletions(-) delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.uni delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Console/TerminalDxe/Vtutf8.c (limited to 'MdeModulePkg/Universal/Console/TerminalDxe') diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c deleted file mode 100644 index 15147c1f2c..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c +++ /dev/null @@ -1,79 +0,0 @@ -/** @file - Implementation of translation upon PC ANSI. - -Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Terminal.h" - -/** - Translate all raw data in the Raw FIFO into unicode, and insert - them into Unicode FIFO. - - @param TerminalDevice The terminal device. - -**/ -VOID -AnsiRawDataToUnicode ( - IN TERMINAL_DEV *TerminalDevice - ) -{ - UINT8 RawData; - - // - // pop the raw data out from the raw fifo, - // and translate it into unicode, then push - // the unicode into unicode fifo, until the raw fifo is empty. - // - while (!IsRawFiFoEmpty (TerminalDevice) && !IsUnicodeFiFoFull (TerminalDevice)) { - - RawFiFoRemoveOneKey (TerminalDevice, &RawData); - - UnicodeFiFoInsertOneKey (TerminalDevice, (UINT16) RawData); - } -} - -/** - Check if input string is valid Ascii string, valid EFI control characters - or valid text graphics. - - @param TerminalDevice The terminal device. - @param WString The input string. - - @retval EFI_UNSUPPORTED If not all input characters are valid. - @retval EFI_SUCCESS If all input characters are valid. - -**/ -EFI_STATUS -AnsiTestString ( - IN TERMINAL_DEV *TerminalDevice, - IN CHAR16 *WString - ) -{ - CHAR8 GraphicChar; - - // - // support three kind of character: - // valid ascii, valid efi control char, valid text graphics. - // - for (; *WString != CHAR_NULL; WString++) { - - if ( !(TerminalIsValidAscii (*WString) || - TerminalIsValidEfiCntlChar (*WString) || - TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL) )) { - - return EFI_UNSUPPORTED; - } - } - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/ComponentName.c b/MdeModulePkg/Universal/Console/TerminalDxe/ComponentName.c deleted file mode 100644 index 41812bb04f..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/ComponentName.c +++ /dev/null @@ -1,237 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for Terminal driver. - -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Terminal.h" - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName = { - TerminalComponentNameGetDriverName, - TerminalComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTerminalComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TerminalComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TerminalComponentNameGetControllerName, - "en" -}; - - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTerminalDriverNameTable[] = { - { - "eng;en", - (CHAR16 *) L"Serial Terminal Driver" - }, - { - NULL, - NULL - } -}; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TerminalComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mTerminalDriverNameTable, - DriverName, - (BOOLEAN)(This == &gTerminalComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TerminalComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOutput; - TERMINAL_DEV *TerminalDevice; - - // - // Make sure this driver is currently managing ControllHandle - // - Status = EfiTestManagedDevice ( - ControllerHandle, - gTerminalDriverBinding.DriverBindingHandle, - &gEfiSerialIoProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // This is a bus driver, so ChildHandle can not be NULL. - // - if (ChildHandle == NULL) { - return EFI_UNSUPPORTED; - } - - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - &gEfiSerialIoProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get our context back - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID **) &SimpleTextOutput, - gTerminalDriverBinding.DriverBindingHandle, - ChildHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (SimpleTextOutput); - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - TerminalDevice->ControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gTerminalComponentName) - ); -} diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c deleted file mode 100644 index 6fde3b2c7a..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ /dev/null @@ -1,1786 +0,0 @@ -/** @file - Produces Simple Text Input Protocol, Simple Text Input Extended Protocol and - Simple Text Output Protocol upon Serial IO Protocol. - -Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Terminal.h" - -// -// Globals -// -EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = { - TerminalDriverBindingSupported, - TerminalDriverBindingStart, - TerminalDriverBindingStop, - 0xa, - NULL, - NULL -}; - - -EFI_GUID *gTerminalType[] = { - &gEfiPcAnsiGuid, - &gEfiVT100Guid, - &gEfiVT100PlusGuid, - &gEfiVTUTF8Guid, - &gEfiTtyTermGuid -}; - - -TERMINAL_DEV mTerminalDevTemplate = { - 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 - }, - NULL, // TerminalConsoleModeData - 0, // SerialInTimeOut - - NULL, // RawFifo - NULL, // UnicodeFiFo - NULL, // EfiKeyFiFo - - NULL, // ControllerNameTable - NULL, // TimerEvent - NULL, // TwoSecondTimeOut - INPUT_STATE_DEFAULT, - RESET_STATE_DEFAULT, - { - 0, - 0, - 0 - }, - 0, - FALSE, - { // SimpleTextInputEx - TerminalConInResetEx, - TerminalConInReadKeyStrokeEx, - NULL, - TerminalConInSetState, - TerminalConInRegisterKeyNotify, - TerminalConInUnregisterKeyNotify, - }, - { // NotifyList - NULL, - NULL, - } -}; - -TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = { - {100, 31}, - // - // New modes can be added here. - // -}; - -/** - Test to see if this driver supports Controller. - - @param This Protocol instance pointer. - @param Controller Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - VENDOR_DEVICE_PATH *Node; - - // - // If remaining device path is not NULL, then make sure it is a - // device path that describes a terminal communications protocol. - // - if (RemainingDevicePath != NULL) { - // - // Check if RemainingDevicePath is the End of Device Path Node, - // if yes, go on checking other conditions - // - if (!IsDevicePathEnd (RemainingDevicePath)) { - // - // If RemainingDevicePath isn't the End of Device Path Node, - // check its validation - // - Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath; - - if (Node->Header.Type != MESSAGING_DEVICE_PATH || - Node->Header.SubType != MSG_VENDOR_DP || - DevicePathNodeLength(&Node->Header) != sizeof(VENDOR_DEVICE_PATH)) { - - return EFI_UNSUPPORTED; - - } - // - // only supports PC ANSI, VT100, VT100+, VT-UTF8, and TtyTerm terminal types - // - if (!CompareGuid (&Node->Guid, &gEfiPcAnsiGuid) && - !CompareGuid (&Node->Guid, &gEfiVT100Guid) && - !CompareGuid (&Node->Guid, &gEfiVT100PlusGuid) && - !CompareGuid (&Node->Guid, &gEfiVTUTF8Guid) && - !CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) { - - return EFI_UNSUPPORTED; - } - } - } - // - // Open the IO Abstraction(s) needed to perform the supported test - // The Controller must support the Serial I/O Protocol. - // This driver is a bus driver with at most 1 child device, so it is - // ok for it to be already started. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Close the I/O Abstraction(s) used to perform the supported test - // - gBS->CloseProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - // - // Open the EFI Device Path protocol needed to perform the supported test - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &ParentDevicePath, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Close protocol, don't use device path protocol in the Support() function - // - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - return Status; -} - -/** - Build the terminal device path for the child device according to the - terminal type. - - @param ParentDevicePath Parent device path. - @param RemainingDevicePath A specific child device. - - @return The child device path built. - -**/ -EFI_DEVICE_PATH_PROTOCOL* -EFIAPI -BuildTerminalDevpath ( - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath; - UINT8 TerminalType; - VENDOR_DEVICE_PATH *Node; - EFI_STATUS Status; - - TerminalDevicePath = NULL; - - // - // Use the RemainingDevicePath to determine the terminal type - // - Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath; - if (Node == NULL) { - TerminalType = PcdGet8 (PcdDefaultTerminalType); - - } else 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 if (CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) { - - TerminalType = TTYTERMTYPE; - - } else { - return NULL; - } - - // - // Build the device path for the child device - // - Status = SetTerminalDevicePath ( - TerminalType, - ParentDevicePath, - &TerminalDevicePath - ); - if (EFI_ERROR (Status)) { - return NULL; - } - return TerminalDevicePath; -} - -/** - Compare a device path data structure to that of all the nodes of a - second device path instance. - - @param Multi A pointer to a multi-instance device path data structure. - @param Single A pointer to a single-instance device path data structure. - - @retval TRUE If the Single is contained within Multi. - @retval FALSE The Single is not match within Multi. - -**/ -BOOLEAN -MatchDevicePaths ( - IN EFI_DEVICE_PATH_PROTOCOL *Multi, - IN EFI_DEVICE_PATH_PROTOCOL *Single - ) -{ - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePathInst; - UINTN Size; - - DevicePath = Multi; - DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size); - // - // Search for the match of 'Single' in 'Multi' - // - while (DevicePathInst != NULL) { - // - // If the single device path is found in multiple device paths, - // return success - // - if (CompareMem (Single, DevicePathInst, Size) == 0) { - FreePool (DevicePathInst); - return TRUE; - } - - FreePool (DevicePathInst); - DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size); - } - - return FALSE; -} - -/** - Check whether the terminal device path is in the global variable. - - @param VariableName Pointer to one global variable. - @param TerminalDevicePath Pointer to the terminal device's device path. - - @retval TRUE The devcie is in the global variable. - @retval FALSE The devcie is not in the global variable. - -**/ -BOOLEAN -IsTerminalInConsoleVariable ( - IN CHAR16 *VariableName, - IN EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *Variable; - BOOLEAN ReturnFlag; - - // - // Get global variable and its size according to the name given. - // - GetEfiGlobalVariable2 (VariableName, (VOID**)&Variable, NULL); - if (Variable == NULL) { - return FALSE; - } - - // - // Check whether the terminal device path is one of the variable instances. - // - ReturnFlag = MatchDevicePaths (Variable, TerminalDevicePath); - - FreePool (Variable); - - return ReturnFlag; -} - -/** - Free notify functions list. - - @param ListHead The list head - - @retval EFI_SUCCESS Free the notify list successfully. - @retval EFI_INVALID_PARAMETER ListHead is NULL. - -**/ -EFI_STATUS -TerminalFreeNotifyList ( - IN OUT LIST_ENTRY *ListHead - ) -{ - TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode; - - if (ListHead == NULL) { - return EFI_INVALID_PARAMETER; - } - while (!IsListEmpty (ListHead)) { - NotifyNode = CR ( - ListHead->ForwardLink, - TERMINAL_CONSOLE_IN_EX_NOTIFY, - NotifyEntry, - TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE - ); - RemoveEntryList (ListHead->ForwardLink); - FreePool (NotifyNode); - } - - return EFI_SUCCESS; -} - -/** - Initialize all the text modes which the terminal console supports. - - It returns information for available text modes that the terminal can support. - - @param[out] TextModeCount The total number of text modes that terminal console supports. - @param[out] TextModeData The buffer to the text modes column and row information. - Caller is responsible to free it when it's non-NULL. - - @retval EFI_SUCCESS The supporting mode information is returned. - @retval EFI_INVALID_PARAMETER The parameters are invalid. - -**/ -EFI_STATUS -InitializeTerminalConsoleTextMode ( - OUT UINTN *TextModeCount, - OUT TERMINAL_CONSOLE_MODE_DATA **TextModeData - ) -{ - UINTN Index; - UINTN Count; - TERMINAL_CONSOLE_MODE_DATA *ModeBuffer; - TERMINAL_CONSOLE_MODE_DATA *NewModeBuffer; - UINTN ValidCount; - UINTN ValidIndex; - - if ((TextModeCount == NULL) || (TextModeData == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Count = sizeof (mTerminalConsoleModeData) / sizeof (TERMINAL_CONSOLE_MODE_DATA); - - // - // Get defined mode buffer pointer. - // - ModeBuffer = mTerminalConsoleModeData; - - // - // Here we make sure that the final mode exposed does not include the duplicated modes, - // and does not include the invalid modes which exceed the max column and row. - // Reserve 2 modes for 80x25, 80x50 of terminal console. - // - NewModeBuffer = AllocateZeroPool (sizeof (TERMINAL_CONSOLE_MODE_DATA) * (Count + 2)); - ASSERT (NewModeBuffer != NULL); - - // - // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec. - // - ValidCount = 0; - - NewModeBuffer[ValidCount].Columns = 80; - NewModeBuffer[ValidCount].Rows = 25; - ValidCount++; - - NewModeBuffer[ValidCount].Columns = 80; - NewModeBuffer[ValidCount].Rows = 50; - ValidCount++; - - // - // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer. - // - for (Index = 0; Index < Count; Index++) { - if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0)) { - // - // Skip the pre-defined mode which is invalid. - // - continue; - } - for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) { - if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) && - (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) { - // - // Skip the duplicated mode. - // - break; - } - } - if (ValidIndex == ValidCount) { - NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns; - NewModeBuffer[ValidCount].Rows = ModeBuffer[Index].Rows; - ValidCount++; - } - } - - DEBUG_CODE ( - for (Index = 0; Index < ValidCount; Index++) { - DEBUG ((EFI_D_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n", - Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows)); - } - ); - - // - // Return valid mode count and mode information buffer. - // - *TextModeCount = ValidCount; - *TextModeData = NewModeBuffer; - return EFI_SUCCESS; -} - -/** - Start this driver on Controller by opening a Serial IO protocol, - reading Device Path, and creating a child handle with a Simple Text In, - Simple Text In Ex and Simple Text Out protocol, and device path protocol. - And store Console Device Environment Variables. - - @param This Protocol instance pointer. - @param Controller Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to Controller. - @retval EFI_ALREADY_STARTED This driver is already running on Controller. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - VENDOR_DEVICE_PATH *Node; - EFI_SERIAL_IO_MODE *Mode; - UINTN SerialInTimeOut; - TERMINAL_DEV *TerminalDevice; - UINT8 TerminalType; - EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer; - UINTN EntryCount; - UINTN Index; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOutput; - EFI_SIMPLE_TEXT_INPUT_PROTOCOL *SimpleTextInput; - BOOLEAN ConInSelected; - BOOLEAN ConOutSelected; - BOOLEAN NullRemaining; - BOOLEAN SimTxtInInstalled; - BOOLEAN SimTxtOutInstalled; - BOOLEAN FirstEnter; - UINTN ModeCount; - - TerminalDevice = NULL; - ConInSelected = FALSE; - ConOutSelected = FALSE; - NullRemaining = FALSE; - SimTxtInInstalled = FALSE; - SimTxtOutInstalled = FALSE; - FirstEnter = FALSE; - // - // Get the Device Path Protocol to build the device path of the child device - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &ParentDevicePath, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - return Status; - } - - // - // Open the Serial I/O Protocol BY_DRIVER. It might already be started. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - return Status; - } - - if (Status != EFI_ALREADY_STARTED) { - // - // the serial I/O protocol never be opened before, it is the first - // time to start the serial Io controller - // - FirstEnter = TRUE; - } - - // - // Serial I/O is not already open by this driver, then tag the handle - // with the Terminal Driver GUID and update the ConInDev, ConOutDev, and - // StdErrDev variables with the list of possible terminal types on this - // serial port. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiCallerIdGuid, - NULL, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &Controller, - &gEfiCallerIdGuid, - DuplicateDevicePath (ParentDevicePath), - NULL - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - if (!IsHotPlugDevice (ParentDevicePath)) { - // - // if the serial device is a hot plug device, do not update the - // ConInDev, ConOutDev, and StdErrDev variables. - // - TerminalUpdateConsoleDevVariable (L"ConInDev", ParentDevicePath); - TerminalUpdateConsoleDevVariable (L"ConOutDev", ParentDevicePath); - TerminalUpdateConsoleDevVariable (L"ErrOutDev", ParentDevicePath); - } - } - - // - // Check the requirement for the SimpleTxtIn and SimpleTxtOut protocols - // - // Simple In/Out Protocol will not be installed onto the handle if the - // device path to the handle is not present in the ConIn/ConOut - // environment variable. But If RemainingDevicePath is NULL, then always - // produce both Simple In and Simple Text Output Protocols. This is required - // for the connect all sequences to make sure all possible consoles are - // produced no matter what the current values of ConIn, ConOut, or StdErr are. - // - if (RemainingDevicePath == NULL) { - NullRemaining = TRUE; - } - - DevicePath = BuildTerminalDevpath (ParentDevicePath, RemainingDevicePath); - if (DevicePath != NULL) { - ConInSelected = IsTerminalInConsoleVariable (L"ConIn", DevicePath); - ConOutSelected = IsTerminalInConsoleVariable (L"ConOut", DevicePath); - FreePool (DevicePath); - } else { - goto Error; - } - // - // Not create the child terminal handle if both Simple In/In Ex and - // Simple text Out protocols are not required to be published - // - if ((!ConInSelected)&&(!ConOutSelected)&&(!NullRemaining)) { - goto Error; - } - - // - // create the child terminal handle during first entry - // - if (FirstEnter) { - // - // First enther the start funciton - // - FirstEnter = FALSE; - // - // Make sure a child handle does not already exist. This driver can only - // produce one child per serial port. - // - Status = gBS->OpenProtocolInformation ( - Controller, - &gEfiSerialIoProtocolGuid, - &OpenInfoBuffer, - &EntryCount - ); - if (!EFI_ERROR (Status)) { - Status = EFI_SUCCESS; - for (Index = 0; Index < EntryCount; Index++) { - if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { - Status = EFI_ALREADY_STARTED; - } - } - - FreePool (OpenInfoBuffer); - if (EFI_ERROR (Status)) { - goto Error; - } - } - - // - // If RemainingDevicePath is NULL, use default terminal type - // - if (RemainingDevicePath == NULL) { - TerminalType = PcdGet8 (PcdDefaultTerminalType); - // - // Must be between PCANSITYPE (0) and TTYTERMTYPE (4) - // - ASSERT (TerminalType <= TTYTERMTYPE); - } else if (!IsDevicePathEnd (RemainingDevicePath)) { - // - // If RemainingDevicePath isn't the End of Device Path Node, - // 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 if (CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) { - TerminalType = TTYTERMTYPE; - } else { - goto Error; - } - } else { - // - // If RemainingDevicePath is the End of Device Path Node, - // skip enumerate any device and return EFI_SUCESSS - // - return EFI_SUCCESS; - } - - // - // Initialize the Terminal Dev - // - TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &mTerminalDevTemplate); - if (TerminalDevice == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Error; - } - - TerminalDevice->TerminalType = TerminalType; - TerminalDevice->SerialIo = SerialIo; - - InitializeListHead (&TerminalDevice->NotifyList); - Status = gBS->CreateEvent ( - EVT_NOTIFY_WAIT, - TPL_NOTIFY, - TerminalConInWaitForKeyEx, - TerminalDevice, - &TerminalDevice->SimpleInputEx.WaitForKeyEx - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_WAIT, - TPL_NOTIFY, - TerminalConInWaitForKey, - TerminalDevice, - &TerminalDevice->SimpleInput.WaitForKey - ); - if (EFI_ERROR (Status)) { - goto Error; - } - // - // Allocates and initializes the FIFO buffer to be zero, used for accommodating - // the pre-read pending characters. - // - TerminalDevice->RawFiFo = AllocateZeroPool (sizeof (RAW_DATA_FIFO)); - if (TerminalDevice->RawFiFo == NULL) { - goto Error; - } - TerminalDevice->UnicodeFiFo = AllocateZeroPool (sizeof (UNICODE_FIFO)); - if (TerminalDevice->UnicodeFiFo == NULL) { - goto Error; - } - TerminalDevice->EfiKeyFiFo = AllocateZeroPool (sizeof (EFI_KEY_FIFO)); - if (TerminalDevice->EfiKeyFiFo == NULL) { - goto Error; - } - - // - // Set the timeout value of serial buffer for - // 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; - } - - Status = TerminalDevice->SerialIo->SetAttributes ( - TerminalDevice->SerialIo, - Mode->BaudRate, - Mode->ReceiveFifoDepth, - (UINT32) SerialInTimeOut, - (EFI_PARITY_TYPE) (Mode->Parity), - (UINT8) Mode->DataBits, - (EFI_STOP_BITS_TYPE) (Mode->StopBits) - ); - if (EFI_ERROR (Status)) { - // - // if set attributes operation fails, invalidate - // the value of SerialInTimeOut,thus make it - // inconsistent with the default timeout value - // of serial buffer. This will invoke the recalculation - // in the readkeystroke routine. - // - TerminalDevice->SerialInTimeOut = 0; - } else { - TerminalDevice->SerialInTimeOut = SerialInTimeOut; - } - // - // Set Simple Text Output Protocol from template. - // - SimpleTextOutput = CopyMem ( - &TerminalDevice->SimpleTextOutput, - &mTerminalDevTemplate.SimpleTextOutput, - sizeof (mTerminalDevTemplate.SimpleTextOutput) - ); - SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode; - - Status = InitializeTerminalConsoleTextMode (&ModeCount, &TerminalDevice->TerminalConsoleModeData); - if (EFI_ERROR (Status)) { - goto ReportError; - } - TerminalDevice->SimpleTextOutputMode.MaxMode = (INT32) ModeCount; - - // - // For terminal devices, cursor is always visible - // - TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE; - Status = TerminalConOutSetAttribute ( - SimpleTextOutput, - EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK) - ); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - // - // Build the component name for the child device - // - TerminalDevice->ControllerNameTable = NULL; - switch (TerminalDevice->TerminalType) { - case PCANSITYPE: - AddUnicodeString2 ( - "eng", - gTerminalComponentName.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"PC-ANSI Serial Console", - TRUE - ); - AddUnicodeString2 ( - "en", - gTerminalComponentName2.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"PC-ANSI Serial Console", - FALSE - ); - - break; - - case VT100TYPE: - AddUnicodeString2 ( - "eng", - gTerminalComponentName.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-100 Serial Console", - TRUE - ); - AddUnicodeString2 ( - "en", - gTerminalComponentName2.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-100 Serial Console", - FALSE - ); - - break; - - case VT100PLUSTYPE: - AddUnicodeString2 ( - "eng", - gTerminalComponentName.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-100+ Serial Console", - TRUE - ); - AddUnicodeString2 ( - "en", - gTerminalComponentName2.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-100+ Serial Console", - FALSE - ); - - break; - - case VTUTF8TYPE: - AddUnicodeString2 ( - "eng", - gTerminalComponentName.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-UTF8 Serial Console", - TRUE - ); - AddUnicodeString2 ( - "en", - gTerminalComponentName2.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"VT-UTF8 Serial Console", - FALSE - ); - - break; - - case TTYTERMTYPE: - AddUnicodeString2 ( - "eng", - gTerminalComponentName.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"Tty Terminal Serial Console", - TRUE - ); - AddUnicodeString2 ( - "en", - gTerminalComponentName2.SupportedLanguages, - &TerminalDevice->ControllerNameTable, - (CHAR16 *)L"Tty Terminal Serial Console", - FALSE - ); - - break; - } - - // - // Build the device path for the child device - // - Status = SetTerminalDevicePath ( - TerminalDevice->TerminalType, - ParentDevicePath, - &TerminalDevice->DevicePath - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - Status = TerminalConOutReset (SimpleTextOutput, FALSE); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = TerminalConOutSetMode (SimpleTextOutput, 0); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = TerminalConOutEnableCursor (SimpleTextOutput, TRUE); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - TerminalConInTimerHandler, - TerminalDevice, - &TerminalDevice->TimerEvent - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->SetTimer ( - TerminalDevice->TimerEvent, - TimerPeriodic, - KEYBOARD_TIMER_INTERVAL - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &TerminalDevice->TwoSecondTimeOut - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->InstallProtocolInterface ( - &TerminalDevice->Handle, - &gEfiDevicePathProtocolGuid, - EFI_NATIVE_INTERFACE, - TerminalDevice->DevicePath - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - // - // Register the Parent-Child relationship via - // EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - (VOID **) &TerminalDevice->SerialIo, - This->DriverBindingHandle, - TerminalDevice->Handle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - goto Error; - } - } - - // - // Find the child handle, and get its TerminalDevice private data - // - Status = gBS->OpenProtocolInformation ( - Controller, - &gEfiSerialIoProtocolGuid, - &OpenInfoBuffer, - &EntryCount - ); - if (!EFI_ERROR (Status)) { - Status = EFI_NOT_FOUND; - ASSERT (OpenInfoBuffer != NULL); - for (Index = 0; Index < EntryCount; Index++) { - if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { - // - // Find the child terminal handle. - // Test whether the SimpleTxtIn and SimpleTxtOut have been published - // - Status = gBS->OpenProtocol ( - OpenInfoBuffer[Index].ControllerHandle, - &gEfiSimpleTextInProtocolGuid, - (VOID **) &SimpleTextInput, - This->DriverBindingHandle, - OpenInfoBuffer[Index].ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - SimTxtInInstalled = TRUE; - TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (SimpleTextInput); - } - - Status = gBS->OpenProtocol ( - OpenInfoBuffer[Index].ControllerHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID **) &SimpleTextOutput, - This->DriverBindingHandle, - OpenInfoBuffer[Index].ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - SimTxtOutInstalled = TRUE; - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (SimpleTextOutput); - } - Status = EFI_SUCCESS; - break; - } - } - - FreePool (OpenInfoBuffer); - if (EFI_ERROR (Status)) { - goto ReportError; - } - } else { - goto ReportError; - } - - ASSERT (TerminalDevice != NULL); - // - // Only do the reset if the device path is in the Conout variable - // - if (ConInSelected && !SimTxtInInstalled) { - Status = TerminalDevice->SimpleInput.Reset ( - &TerminalDevice->SimpleInput, - FALSE - ); - if (EFI_ERROR (Status)) { - // - // Need to report Error Code first - // - goto ReportError; - } - } - - // - // Only output the configure string to remote terminal if the device path - // is in the Conout variable - // - if (ConOutSelected && !SimTxtOutInstalled) { - Status = TerminalDevice->SimpleTextOutput.SetAttribute ( - &TerminalDevice->SimpleTextOutput, - EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK) - ); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = TerminalDevice->SimpleTextOutput.Reset ( - &TerminalDevice->SimpleTextOutput, - FALSE - ); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = TerminalDevice->SimpleTextOutput.SetMode ( - &TerminalDevice->SimpleTextOutput, - 0 - ); - if (EFI_ERROR (Status)) { - goto ReportError; - } - - Status = TerminalDevice->SimpleTextOutput.EnableCursor ( - &TerminalDevice->SimpleTextOutput, - TRUE - ); - if (EFI_ERROR (Status)) { - goto ReportError; - } - } - - // - // Simple In/Out Protocol will not be installed onto the handle if the - // device path to the handle is not present in the ConIn/ConOut - // environment variable. But If RemainingDevicePath is NULL, then always - // produce both Simple In and Simple Text Output Protocols. This is required - // for the connect all sequences to make sure all possible consoles are - // produced no matter what the current values of ConIn, ConOut, or StdErr are. - // - if (!SimTxtInInstalled && (ConInSelected || NullRemaining)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &TerminalDevice->Handle, - &gEfiSimpleTextInProtocolGuid, - &TerminalDevice->SimpleInput, - &gEfiSimpleTextInputExProtocolGuid, - &TerminalDevice->SimpleInputEx, - NULL - ); - if (EFI_ERROR (Status)) { - goto Error; - } - } - - if (!SimTxtOutInstalled && (ConOutSelected || NullRemaining)) { - Status = gBS->InstallProtocolInterface ( - &TerminalDevice->Handle, - &gEfiSimpleTextOutProtocolGuid, - EFI_NATIVE_INTERFACE, - &TerminalDevice->SimpleTextOutput - ); - if (EFI_ERROR (Status)) { - goto Error; - } - } - - return EFI_SUCCESS; - -ReportError: - // - // Report error code before exiting - // - DevicePath = ParentDevicePath; - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE | EFI_ERROR_MINOR, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_CONTROLLER_ERROR), - DevicePath - ); - -Error: - // - // Use the Stop() function to free all resources allocated in Start() - // - if (TerminalDevice != NULL) { - - if (TerminalDevice->Handle != NULL) { - This->Stop (This, Controller, 1, &TerminalDevice->Handle); - } else { - - if (TerminalDevice->TwoSecondTimeOut != NULL) { - gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut); - } - - if (TerminalDevice->TimerEvent != NULL) { - gBS->CloseEvent (TerminalDevice->TimerEvent); - } - - if (TerminalDevice->SimpleInput.WaitForKey != NULL) { - gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey); - } - - if (TerminalDevice->SimpleInputEx.WaitForKeyEx != NULL) { - gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx); - } - - TerminalFreeNotifyList (&TerminalDevice->NotifyList); - - if (TerminalDevice->RawFiFo != NULL) { - FreePool (TerminalDevice->RawFiFo); - } - if (TerminalDevice->UnicodeFiFo != NULL) { - FreePool (TerminalDevice->UnicodeFiFo); - } - if (TerminalDevice->EfiKeyFiFo != NULL) { - FreePool (TerminalDevice->EfiKeyFiFo); - } - - if (TerminalDevice->ControllerNameTable != NULL) { - FreeUnicodeStringTable (TerminalDevice->ControllerNameTable); - } - - if (TerminalDevice->DevicePath != NULL) { - FreePool (TerminalDevice->DevicePath); - } - - if (TerminalDevice->TerminalConsoleModeData != NULL) { - FreePool (TerminalDevice->TerminalConsoleModeData); - } - - FreePool (TerminalDevice); - } - } - - This->Stop (This, Controller, 0, NULL); - - return Status; -} - -/** - Stop this driver on Controller by closing Simple Text In, Simple Text - In Ex, Simple Text Out protocol, and removing parent device path from - Console Device Environment Variables. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed Controller. - @retval other This driver could not be removed from this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - EFI_STATUS Status; - UINTN Index; - BOOLEAN AllChildrenStopped; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOutput; - TERMINAL_DEV *TerminalDevice; - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - Status = gBS->HandleProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Complete all outstanding transactions to Controller. - // Don't allow any new transaction to Controller to be started. - // - if (NumberOfChildren == 0) { - // - // Close the bus driver - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiCallerIdGuid, - (VOID **) &ParentDevicePath, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - // - // Remove Parent Device Path from - // the Console Device Environment Variables - // - TerminalRemoveConsoleDevVariable (L"ConInDev", ParentDevicePath); - TerminalRemoveConsoleDevVariable (L"ConOutDev", ParentDevicePath); - TerminalRemoveConsoleDevVariable (L"ErrOutDev", ParentDevicePath); - - // - // Uninstall the Terminal Driver's GUID Tag from the Serial controller - // - Status = gBS->UninstallMultipleProtocolInterfaces ( - Controller, - &gEfiCallerIdGuid, - ParentDevicePath, - NULL - ); - - // - // Free the ParentDevicePath that was duplicated in Start() - // - if (!EFI_ERROR (Status)) { - FreePool (ParentDevicePath); - } - } - - gBS->CloseProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - return EFI_SUCCESS; - } - - AllChildrenStopped = TRUE; - - for (Index = 0; Index < NumberOfChildren; Index++) { - - Status = gBS->OpenProtocol ( - ChildHandleBuffer[Index], - &gEfiSimpleTextOutProtocolGuid, - (VOID **) &SimpleTextOutput, - This->DriverBindingHandle, - ChildHandleBuffer[Index], - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (SimpleTextOutput); - - gBS->CloseProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - This->DriverBindingHandle, - ChildHandleBuffer[Index] - ); - - Status = gBS->UninstallMultipleProtocolInterfaces ( - ChildHandleBuffer[Index], - &gEfiSimpleTextInProtocolGuid, - &TerminalDevice->SimpleInput, - &gEfiSimpleTextInputExProtocolGuid, - &TerminalDevice->SimpleInputEx, - &gEfiSimpleTextOutProtocolGuid, - &TerminalDevice->SimpleTextOutput, - &gEfiDevicePathProtocolGuid, - TerminalDevice->DevicePath, - NULL - ); - if (EFI_ERROR (Status)) { - gBS->OpenProtocol ( - Controller, - &gEfiSerialIoProtocolGuid, - (VOID **) &SerialIo, - This->DriverBindingHandle, - ChildHandleBuffer[Index], - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } else { - - if (TerminalDevice->ControllerNameTable != NULL) { - FreeUnicodeStringTable (TerminalDevice->ControllerNameTable); - } - - gBS->CloseEvent (TerminalDevice->TimerEvent); - gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut); - gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey); - gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx); - TerminalFreeNotifyList (&TerminalDevice->NotifyList); - FreePool (TerminalDevice->DevicePath); - if (TerminalDevice->TerminalConsoleModeData != NULL) { - FreePool (TerminalDevice->TerminalConsoleModeData); - } - FreePool (TerminalDevice); - } - } - - if (EFI_ERROR (Status)) { - AllChildrenStopped = FALSE; - } - } - - if (!AllChildrenStopped) { - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; -} - -/** - Update terminal device path in Console Device Environment Variables. - - @param VariableName The Console Device Environment Variable. - @param ParentDevicePath The terminal device path to be updated. - -**/ -VOID -TerminalUpdateConsoleDevVariable ( - IN CHAR16 *VariableName, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath - ) -{ - EFI_STATUS Status; - UINTN NameSize; - UINTN VariableSize; - UINT8 TerminalType; - EFI_DEVICE_PATH_PROTOCOL *Variable; - EFI_DEVICE_PATH_PROTOCOL *NewVariable; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EDKII_SET_VARIABLE_STATUS *SetVariableStatus; - - // - // Get global variable and its size according to the name given. - // - GetEfiGlobalVariable2 (VariableName, (VOID**)&Variable, NULL); - if (Variable == NULL) { - return; - } - - // - // Append terminal device path onto the variable. - // - for (TerminalType = PCANSITYPE; TerminalType <= TTYTERMTYPE; TerminalType++) { - SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath); - NewVariable = AppendDevicePathInstance (Variable, TempDevicePath); - ASSERT (NewVariable != NULL); - if (Variable != NULL) { - FreePool (Variable); - } - - if (TempDevicePath != NULL) { - FreePool (TempDevicePath); - } - - Variable = NewVariable; - } - - VariableSize = GetDevicePathSize (Variable); - - Status = gRT->SetVariable ( - VariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - VariableSize, - Variable - ); - - if (EFI_ERROR (Status)) { - NameSize = StrSize (VariableName); - SetVariableStatus = AllocatePool (sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + VariableSize); - if (SetVariableStatus != NULL) { - CopyGuid (&SetVariableStatus->Guid, &gEfiGlobalVariableGuid); - SetVariableStatus->NameSize = NameSize; - SetVariableStatus->DataSize = VariableSize; - SetVariableStatus->SetStatus = Status; - SetVariableStatus->Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; - CopyMem (SetVariableStatus + 1, VariableName, NameSize); - CopyMem (((UINT8 *) (SetVariableStatus + 1)) + NameSize, Variable, VariableSize); - - REPORT_STATUS_CODE_EX ( - EFI_ERROR_CODE, - PcdGet32 (PcdErrorCodeSetVariable), - 0, - NULL, - &gEdkiiStatusCodeDataTypeVariableGuid, - SetVariableStatus, - sizeof (EDKII_SET_VARIABLE_STATUS) + NameSize + VariableSize - ); - - FreePool (SetVariableStatus); - } - } - - FreePool (Variable); - - return ; -} - - -/** - Remove terminal device path from Console Device Environment Variables. - - @param VariableName Console Device Environment Variables. - @param ParentDevicePath The terminal device path to be updated. - -**/ -VOID -TerminalRemoveConsoleDevVariable ( - IN CHAR16 *VariableName, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath - ) -{ - EFI_STATUS Status; - BOOLEAN FoundOne; - BOOLEAN Match; - UINTN VariableSize; - UINTN InstanceSize; - UINT8 TerminalType; - EFI_DEVICE_PATH_PROTOCOL *Instance; - EFI_DEVICE_PATH_PROTOCOL *Variable; - EFI_DEVICE_PATH_PROTOCOL *OriginalVariable; - EFI_DEVICE_PATH_PROTOCOL *NewVariable; - EFI_DEVICE_PATH_PROTOCOL *SavedNewVariable; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - - Instance = NULL; - - // - // Get global variable and its size according to the name given. - // - GetEfiGlobalVariable2 (VariableName, (VOID**)&Variable, NULL); - if (Variable == NULL) { - return ; - } - - FoundOne = FALSE; - OriginalVariable = Variable; - NewVariable = NULL; - - // - // Get first device path instance from Variable - // - Instance = GetNextDevicePathInstance (&Variable, &InstanceSize); - if (Instance == NULL) { - FreePool (OriginalVariable); - return ; - } - // - // Loop through all the device path instances of Variable - // - do { - // - // Loop through all the terminal types that this driver supports - // - Match = FALSE; - for (TerminalType = PCANSITYPE; TerminalType <= TTYTERMTYPE; TerminalType++) { - - SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath); - - // - // Compare the generated device path to the current device path instance - // - if (TempDevicePath != NULL) { - if (CompareMem (Instance, TempDevicePath, InstanceSize) == 0) { - Match = TRUE; - FoundOne = TRUE; - } - - FreePool (TempDevicePath); - } - } - // - // If a match was not found, then keep the current device path instance - // - if (!Match) { - SavedNewVariable = NewVariable; - NewVariable = AppendDevicePathInstance (NewVariable, Instance); - if (SavedNewVariable != NULL) { - FreePool (SavedNewVariable); - } - } - // - // Get next device path instance from Variable - // - FreePool (Instance); - Instance = GetNextDevicePathInstance (&Variable, &InstanceSize); - } while (Instance != NULL); - - FreePool (OriginalVariable); - - if (FoundOne) { - VariableSize = GetDevicePathSize (NewVariable); - - Status = gRT->SetVariable ( - VariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - VariableSize, - NewVariable - ); - // - // Shrinking variable with existing variable driver implementation shouldn't fail. - // - ASSERT_EFI_ERROR (Status); - } - - if (NewVariable != NULL) { - FreePool (NewVariable); - } - - return ; -} - -/** - Build terminal device path according to terminal type. - - @param TerminalType The terminal type is PC ANSI, VT100, VT100+ or VT-UTF8. - @param ParentDevicePath Parent device path. - @param TerminalDevicePath Returned terminal device path, if building successfully. - - @retval EFI_UNSUPPORTED Terminal does not belong to the supported type. - @retval EFI_OUT_OF_RESOURCES Generate terminal device path failed. - @retval EFI_SUCCESS Build terminal device path successfully. - -**/ -EFI_STATUS -SetTerminalDevicePath ( - IN UINT8 TerminalType, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, - OUT EFI_DEVICE_PATH_PROTOCOL **TerminalDevicePath - ) -{ - VENDOR_DEVICE_PATH Node; - - *TerminalDevicePath = NULL; - Node.Header.Type = MESSAGING_DEVICE_PATH; - Node.Header.SubType = MSG_VENDOR_DP; - - // - // Generate terminal device path node according to terminal type. - // - switch (TerminalType) { - - case PCANSITYPE: - CopyGuid (&Node.Guid, &gEfiPcAnsiGuid); - break; - - case VT100TYPE: - CopyGuid (&Node.Guid, &gEfiVT100Guid); - break; - - case VT100PLUSTYPE: - CopyGuid (&Node.Guid, &gEfiVT100PlusGuid); - break; - - case VTUTF8TYPE: - CopyGuid (&Node.Guid, &gEfiVTUTF8Guid); - break; - - case TTYTERMTYPE: - CopyGuid (&Node.Guid, &gEfiTtyTermGuid); - break; - - default: - return EFI_UNSUPPORTED; - } - - // - // Get VENDOR_DEVCIE_PATH size and put into Node.Header - // - SetDevicePathNodeLength ( - &Node.Header, - sizeof (VENDOR_DEVICE_PATH) - ); - - // - // Append the terminal node onto parent device path - // to generate a complete terminal device path. - // - *TerminalDevicePath = AppendDevicePathNode ( - ParentDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &Node - ); - if (*TerminalDevicePath == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - return EFI_SUCCESS; -} - -/** - The user Entry Point for module Terminal. The user code starts with this function. - - @param ImageHandle The firmware allocated handle for the EFI image. - @param SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The entry point is executed successfully. - @retval other Some error occurs when executing this entry point. - -**/ -EFI_STATUS -EFIAPI -InitializeTerminal( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - // - // Install driver model protocol(s). - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gTerminalDriverBinding, - ImageHandle, - &gTerminalComponentName, - &gTerminalComponentName2 - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -/** - Check if the device supports hot-plug through its device path. - - This function could be updated to check more types of Hot Plug devices. - Currently, it checks USB and PCCard device. - - @param DevicePath Pointer to device's device path. - - @retval TRUE The devcie is a hot-plug device - @retval FALSE The devcie is not a hot-plug device. - -**/ -BOOLEAN -IsHotPlugDevice ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *CheckDevicePath; - - CheckDevicePath = DevicePath; - while (!IsDevicePathEnd (CheckDevicePath)) { - // - // Check device whether is hot plug device or not throught Device Path - // - if ((DevicePathType (CheckDevicePath) == MESSAGING_DEVICE_PATH) && - (DevicePathSubType (CheckDevicePath) == MSG_USB_DP || - DevicePathSubType (CheckDevicePath) == MSG_USB_CLASS_DP || - DevicePathSubType (CheckDevicePath) == MSG_USB_WWID_DP)) { - // - // If Device is USB device - // - return TRUE; - } - if ((DevicePathType (CheckDevicePath) == HARDWARE_DEVICE_PATH) && - (DevicePathSubType (CheckDevicePath) == HW_PCCARD_DP)) { - // - // If Device is PCCard - // - return TRUE; - } - - CheckDevicePath = NextDevicePathNode (CheckDevicePath); - } - - return FALSE; -} - diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h deleted file mode 100644 index 269d2aeb5a..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ /dev/null @@ -1,1361 +0,0 @@ -/** @file - Header file for Terminal driver. - -Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TERMINAL_H_ -#define _TERMINAL_H_ - - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define RAW_FIFO_MAX_NUMBER 256 -#define FIFO_MAX_NUMBER 128 - -typedef struct { - UINT8 Head; - UINT8 Tail; - UINT8 Data[RAW_FIFO_MAX_NUMBER + 1]; -} RAW_DATA_FIFO; - -typedef struct { - UINT8 Head; - UINT8 Tail; - UINT16 Data[FIFO_MAX_NUMBER + 1]; -} UNICODE_FIFO; - -typedef struct { - UINT8 Head; - UINT8 Tail; - EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1]; -} EFI_KEY_FIFO; - -typedef struct { - UINTN Columns; - UINTN Rows; -} TERMINAL_CONSOLE_MODE_DATA; - -#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s - -#define TERMINAL_DEV_SIGNATURE SIGNATURE_32 ('t', 'm', 'n', 'l') - -#define TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('t', 'm', 'e', 'n') - -typedef struct _TERMINAL_CONSOLE_IN_EX_NOTIFY { - UINTN Signature; - EFI_KEY_DATA KeyData; - EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; - LIST_ENTRY NotifyEntry; -} TERMINAL_CONSOLE_IN_EX_NOTIFY; -typedef struct { - UINTN Signature; - EFI_HANDLE Handle; - UINT8 TerminalType; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput; - EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode; - TERMINAL_CONSOLE_MODE_DATA *TerminalConsoleModeData; - UINTN SerialInTimeOut; - RAW_DATA_FIFO *RawFiFo; - UNICODE_FIFO *UnicodeFiFo; - EFI_KEY_FIFO *EfiKeyFiFo; - EFI_UNICODE_STRING_TABLE *ControllerNameTable; - EFI_EVENT TimerEvent; - EFI_EVENT TwoSecondTimeOut; - UINT32 InputState; - UINT32 ResetState; - UINT16 TtyEscapeStr[3]; - INTN TtyEscapeIndex; - - // - // Esc could not be output to the screen by user, - // but the terminal driver need to output it to - // the terminal emulation software to send control sequence. - // This boolean is used by the terminal driver only - // to indicate whether the Esc could be sent or not. - // - BOOLEAN OutputEscChar; - EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleInputEx; - LIST_ENTRY NotifyList; -} TERMINAL_DEV; - -#define INPUT_STATE_DEFAULT 0x00 -#define INPUT_STATE_ESC 0x01 -#define INPUT_STATE_CSI 0x02 -#define INPUT_STATE_LEFTOPENBRACKET 0x04 -#define INPUT_STATE_O 0x08 -#define INPUT_STATE_2 0x10 -#define INPUT_STATE_LEFTOPENBRACKET_2 0x20 - -#define RESET_STATE_DEFAULT 0x00 -#define RESET_STATE_ESC_R 0x01 -#define RESET_STATE_ESC_R_ESC_R 0x02 - -#define TERMINAL_CON_IN_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInput, TERMINAL_DEV_SIGNATURE) -#define TERMINAL_CON_OUT_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleTextOutput, TERMINAL_DEV_SIGNATURE) -#define TERMINAL_CON_IN_EX_DEV_FROM_THIS(a) CR (a, TERMINAL_DEV, SimpleInputEx, TERMINAL_DEV_SIGNATURE) - -typedef union { - UINT8 Utf8_1; - UINT8 Utf8_2[2]; - UINT8 Utf8_3[3]; -} UTF8_CHAR; - -#define PCANSITYPE 0 -#define VT100TYPE 1 -#define VT100PLUSTYPE 2 -#define VTUTF8TYPE 3 -#define TTYTERMTYPE 4 - -#define LEFTOPENBRACKET 0x5b // '[' -#define ACAP 0x41 -#define BCAP 0x42 -#define CCAP 0x43 -#define DCAP 0x44 - -#define BACKSPACE 8 -#define ESC 27 -#define CSI 0x9B -#define DEL 127 -#define BRIGHT_CONTROL_OFFSET 2 -#define FOREGROUND_CONTROL_OFFSET 6 -#define BACKGROUND_CONTROL_OFFSET 11 -#define ROW_OFFSET 2 -#define COLUMN_OFFSET 5 - -typedef struct { - UINT16 Unicode; - CHAR8 PcAnsi; - CHAR8 Ascii; -} UNICODE_TO_CHAR; - -// -// Global Variables -// -extern EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gTerminalComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gTerminalComponentName2; - -/** - The user Entry Point for module Terminal. The user code starts with this function. - - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The entry point is executed successfully. - @retval other Some error occurs when executing this entry point. - -**/ -EFI_STATUS -EFIAPI -InitializeTerminal ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -/** - Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.Reset(). - This driver only perform dependent serial device reset regardless of - the value of ExtendeVerification - - @param This Indicates the calling context. - @param ExtendedVerification Skip by this driver. - - @retval EFI_SUCCESS The reset operation succeeds. - @retval EFI_DEVICE_ERROR The dependent serial port reset fails. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReset ( - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ); - - -/** - Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.ReadKeyStroke(). - - @param This Indicates the calling context. - @param Key A pointer to a buffer that is filled in with the - keystroke information for the key that was sent - from terminal. - - @retval EFI_SUCCESS The keystroke information is returned successfully. - @retval EFI_NOT_READY There is no keystroke data available. - @retval EFI_DEVICE_ERROR The dependent serial device encounters error. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReadKeyStroke ( - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, - OUT EFI_INPUT_KEY *Key - ); - -/** - Check if the key already has been registered. - - @param RegsiteredData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - registered. - @param InputData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - pressed. - - @retval TRUE Key be pressed matches a registered key. - @retval FALSE Match failed. - -**/ -BOOLEAN -IsKeyRegistered ( - IN EFI_KEY_DATA *RegsiteredData, - IN EFI_KEY_DATA *InputData - ); - -/** - Event notification function for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.WaitForKeyEx event - Signal the event if there is key available - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. - -**/ -VOID -EFIAPI -TerminalConInWaitForKeyEx ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -// -// Simple Text Input Ex protocol prototypes -// - -/** - Reset the input device and optionally run diagnostics - - @param This Protocol instance pointer. - @param ExtendedVerification Driver may perform diagnostics on reset. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The device is not functioning properly and could - not be reset. - -**/ -EFI_STATUS -EFIAPI -TerminalConInResetEx ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ); - -/** - Reads the next keystroke from the input device. The WaitForKey Event can - be used to test for existence of a keystroke via WaitForEvent () call. - - @param This Protocol instance pointer. - @param KeyData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - pressed. - - @retval EFI_SUCCESS The keystroke information was returned. - @retval EFI_NOT_READY There was no keystroke data available. - @retval EFI_DEVICE_ERROR The keystroke information was not returned due - to hardware errors. - @retval EFI_INVALID_PARAMETER KeyData is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReadKeyStrokeEx ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - OUT EFI_KEY_DATA *KeyData - ); - -/** - Set certain state for the input device. - - @param This Protocol instance pointer. - @param KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the - state for the input device. - - @retval EFI_SUCCESS The device state was set successfully. - @retval EFI_DEVICE_ERROR The device is not functioning correctly and - could not have the setting adjusted. - @retval EFI_UNSUPPORTED The device does not have the ability to set its - state. - @retval EFI_INVALID_PARAMETER KeyToggleState is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInSetState ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN EFI_KEY_TOGGLE_STATE *KeyToggleState - ); - -/** - Register a notification function for a particular keystroke for the input device. - - @param This Protocol instance pointer. - @param KeyData A pointer to a buffer that is filled in with the - keystroke information data for the key that was - pressed. - @param KeyNotificationFunction Points to the function to be called when the key - sequence is typed specified by KeyData. - @param NotifyHandle Points to the unique handle assigned to the - registered notification. - - @retval EFI_SUCCESS The notification function was registered - successfully. - @retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necesssary data - structures. - @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInRegisterKeyNotify ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN EFI_KEY_DATA *KeyData, - IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, - OUT VOID **NotifyHandle - ); - -/** - Remove a registered notification function from a particular keystroke. - - @param This Protocol instance pointer. - @param NotificationHandle The handle of the notification function being - unregistered. - - @retval EFI_SUCCESS The notification function was unregistered - successfully. - @retval EFI_INVALID_PARAMETER The NotificationHandle is invalid. - @retval EFI_NOT_FOUND Can not find the matching entry in database. - -**/ -EFI_STATUS -EFIAPI -TerminalConInUnregisterKeyNotify ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN VOID *NotificationHandle - ); - -/** - Event notification function for EFI_SIMPLE_TEXT_INPUT_PROTOCOL.WaitForKey event - Signal the event if there is key available - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. - -**/ -VOID -EFIAPI -TerminalConInWaitForKey ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset(). - If ExtendeVerification is TRUE, then perform dependent serial device reset, - and set display mode to mode 0. - If ExtendedVerification is FALSE, only set display mode to mode 0. - - @param This Indicates the calling context. - @param ExtendedVerification Indicates that the driver may perform a more - exhaustive verification operation of the device - during reset. - - @retval EFI_SUCCESS The reset operation succeeds. - @retval EFI_DEVICE_ERROR The terminal is not functioning correctly or the serial port reset fails. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutReset ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString(). - The Unicode string will be converted to terminal expressible data stream - and send to terminal via serial port. - - @param This Indicates the calling context. - @param WString The Null-terminated Unicode string to be displayed - on the terminal screen. - - @retval EFI_SUCCESS The string is output successfully. - @retval EFI_DEVICE_ERROR The serial port fails to send the string out. - @retval EFI_WARN_UNKNOWN_GLYPH Indicates that some of the characters in the Unicode string could not - be rendered and are skipped. - @retval EFI_UNSUPPORTED If current display mode is out of range. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutOutputString ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN CHAR16 *WString - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString(). - If one of the characters in the *Wstring is - neither valid Unicode drawing characters, - not ASCII code, then this function will return - EFI_UNSUPPORTED. - - @param This Indicates the calling context. - @param WString The Null-terminated Unicode string to be tested. - - @retval EFI_SUCCESS The terminal is capable of rendering the output string. - @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutTestString ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN CHAR16 *WString - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode(). - It returns information for an available text mode - that the terminal supports. - In this driver, we support text mode 80x25 (mode 0), - 80x50 (mode 1), 100x31 (mode 2). - - @param This Indicates the calling context. - @param ModeNumber The mode number to return information on. - @param Columns The returned columns of the requested mode. - @param Rows The returned rows of the requested mode. - - @retval EFI_SUCCESS The requested mode information is returned. - @retval EFI_UNSUPPORTED The mode number is not valid. - @retval EFI_DEVICE_ERROR - -**/ -EFI_STATUS -EFIAPI -TerminalConOutQueryMode ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN ModeNumber, - OUT UINTN *Columns, - OUT UINTN *Rows - ); - -/** - Implements EFI_SIMPLE_TEXT_OUT.SetMode(). - Set the terminal to a specified display mode. - In this driver, we only support mode 0. - - @param This Indicates the calling context. - @param ModeNumber The text mode to set. - - @retval EFI_SUCCESS The requested text mode is set. - @retval EFI_DEVICE_ERROR The requested text mode cannot be set - because of serial device error. - @retval EFI_UNSUPPORTED The text mode number is not valid. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetMode ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN ModeNumber - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute(). - - @param This Indicates the calling context. - @param Attribute The attribute to set. Only bit0..6 are valid, all other bits - are undefined and must be zero. - - @retval EFI_SUCCESS The requested attribute is set. - @retval EFI_DEVICE_ERROR The requested attribute cannot be set due to serial port error. - @retval EFI_UNSUPPORTED The attribute requested is not defined by EFI spec. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetAttribute ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN Attribute - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen(). - It clears the ANSI terminal's display to the - currently selected background color. - - @param This Indicates the calling context. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_DEVICE_ERROR The terminal screen cannot be cleared due to serial port error. - @retval EFI_UNSUPPORTED The terminal is not in a valid display mode. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutClearScreen ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This - ); - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition(). - - @param This Indicates the calling context. - @param Column The row to set cursor to. - @param Row The column to set cursor to. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_DEVICE_ERROR The request fails due to serial port error. - @retval EFI_UNSUPPORTED The terminal is not in a valid text mode, or the cursor position - is invalid for current mode. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetCursorPosition ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN Column, - IN UINTN Row - ); - -/** - Implements SIMPLE_TEXT_OUTPUT.EnableCursor(). - In this driver, the cursor cannot be hidden. - - @param This Indicates the calling context. - @param Visible If TRUE, the cursor is set to be visible, - If FALSE, the cursor is set to be invisible. - - @retval EFI_SUCCESS The request is valid. - @retval EFI_UNSUPPORTED The terminal does not support cursor hidden. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutEnableCursor ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN BOOLEAN Visible - ); - -/** - Test to see if this driver supports Controller. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -/** - Start this driver on Controller by opening a Serial IO protocol, - reading Device Path, and creating a child handle with a Simple Text In, - Simple Text In Ex and Simple Text Out protocol, and device path protocol. - And store Console Device Environment Variables. - - @param This Protocol instance pointer. - @param Controller Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to Controller. - @retval EFI_ALREADY_STARTED This driver is already running on Controller. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - - -/** - Stop this driver on Controller by closing Simple Text In, Simple Text - In Ex, Simple Text Out protocol, and removing parent device path from - Console Device Environment Variables. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed Controller. - @retval other This driver could not be removed from this device. - -**/ -EFI_STATUS -EFIAPI -TerminalDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -/** - Free notify functions list. - - @param ListHead The list head - - @retval EFI_SUCCESS Free the notify list successfully. - @retval EFI_INVALID_PARAMETER ListHead is NULL. - -**/ -EFI_STATUS -TerminalFreeNotifyList ( - IN OUT LIST_ENTRY *ListHead - ); - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TerminalComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TerminalComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - - -// -// internal functions -// - -/** - Check for a pending key in the Efi Key FIFO or Serial device buffer. - - @param This Indicates the calling context. - - @retval EFI_SUCCESS There is key pending. - @retval EFI_NOT_READY There is no key pending. - @retval EFI_DEVICE_ERROR If Serial IO is not attached to serial device. - -**/ -EFI_STATUS -TerminalConInCheckForKey ( - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This - ); - -/** - Update terminal device path in Console Device Environment Variables. - - @param VariableName The Console Device Environment Variable. - @param ParentDevicePath The terminal device path to be updated. - - @return None. - -**/ -VOID -TerminalUpdateConsoleDevVariable ( - IN CHAR16 *VariableName, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath - ); - -/** - Remove console device variable. - - @param VariableName A pointer to the variable name. - @param ParentDevicePath A pointer to the parent device path. - -**/ -VOID -TerminalRemoveConsoleDevVariable ( - IN CHAR16 *VariableName, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath - ); - -/** - Build termial device path according to terminal type. - - @param TerminalType The terminal type is PC ANSI, VT100, VT100+ or VT-UTF8. - @param ParentDevicePath Parent device path. - @param TerminalDevicePath Returned terminal device path, if building successfully. - - @retval EFI_UNSUPPORTED Terminal does not belong to the supported type. - @retval EFI_OUT_OF_RESOURCES Generate terminal device path failed. - @retval EFI_SUCCESS Build terminal device path successfully. - -**/ -EFI_STATUS -SetTerminalDevicePath ( - IN UINT8 TerminalType, - IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, - OUT EFI_DEVICE_PATH_PROTOCOL **TerminalDevicePath - ); - -/** - Get one key out of serial buffer. - - @param SerialIo Serial I/O protocl attached to the serial device. - @param Input The fetched key. - - @retval EFI_NOT_READY If serial buffer is empty. - @retval EFI_DEVICE_ERROR If reading serial buffer encounter error. - @retval EFI_SUCCESS If reading serial buffer successfully, put - the fetched key to the parameter output. - -**/ -EFI_STATUS -GetOneKeyFromSerial ( - EFI_SERIAL_IO_PROTOCOL *SerialIo, - UINT8 *Input - ); - -/** - Insert one byte raw data into the Raw Data FIFO. - - @param TerminalDevice Terminal driver private structure. - @param Input The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If Raw Data buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -RawFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT8 Input - ); - -/** - Remove one pre-fetched key out of the Raw Data FIFO. - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - - @retval TRUE If insert successfully. - @retval FALSE If Raw Data FIFO buffer is empty before remove operation. - -**/ -BOOLEAN -RawFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT8 *Output - ); - -/** - Clarify whether Raw Data FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Raw Data FIFO buffer is empty. - @retval FALSE If Raw Data FIFO buffer is not empty. - -**/ -BOOLEAN -IsRawFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Clarify whether Raw Data FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Raw Data FIFO buffer is full. - @retval FALSE If Raw Data FIFO buffer is not full. - -**/ -BOOLEAN -IsRawFiFoFull ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Insert one pre-fetched key into the FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Key The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If FIFO buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -EfiKeyFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - EFI_INPUT_KEY *Key - ); - -/** - Remove one pre-fetched key out of the FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - - @retval TRUE If insert successfully. - @retval FALSE If FIFO buffer is empty before remove operation. - -**/ -BOOLEAN -EfiKeyFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - EFI_INPUT_KEY *Output - ); - -/** - Clarify whether FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If FIFO buffer is empty. - @retval FALSE If FIFO buffer is not empty. - -**/ -BOOLEAN -IsEfiKeyFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Clarify whether FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If FIFO buffer is full. - @retval FALSE If FIFO buffer is not full. - -**/ -BOOLEAN -IsEfiKeyFiFoFull ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Insert one pre-fetched key into the Unicode FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Input The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If Unicode FIFO buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -UnicodeFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT16 Input - ); - -/** - Remove one pre-fetched key out of the Unicode FIFO buffer. - The caller should guarantee that Unicode FIFO buffer is not empty - by IsUnicodeFiFoEmpty (). - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - -**/ -VOID -UnicodeFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT16 *Output - ); - -/** - Clarify whether Unicode FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Unicode FIFO buffer is empty. - @retval FALSE If Unicode FIFO buffer is not empty. - -**/ -BOOLEAN -IsUnicodeFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Clarify whether Unicode FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Unicode FIFO buffer is full. - @retval FALSE If Unicode FIFO buffer is not full. - -**/ -BOOLEAN -IsUnicodeFiFoFull ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Count Unicode FIFO buffer. - - @param TerminalDevice Terminal driver private structure - - @return The count in bytes of Unicode FIFO. - -**/ -UINT8 -UnicodeFiFoGetKeyCount ( - TERMINAL_DEV *TerminalDevice - ); - -/** - Translate raw data into Unicode (according to different encode), and - translate Unicode into key information. (according to different standard). - - @param TerminalDevice Terminal driver private structure. - -**/ -VOID -TranslateRawDataToEfiKey ( - IN TERMINAL_DEV *TerminalDevice - ); - -// -// internal functions for PC ANSI -// - -/** - Translate all raw data in the Raw FIFI into unicode, and insert - them into Unicode FIFO. - - @param TerminalDevice The terminal device. - -**/ -VOID -AnsiRawDataToUnicode ( - IN TERMINAL_DEV *TerminalDevice - ); - -/** - Converts a stream of Unicode characters from a terminal input device into EFI Keys that - can be read through the Simple Input Protocol. - - The table below shows the keyboard input mappings that this function supports. - If the ESC sequence listed in one of the columns is presented, then it is translated - into the coorespoding EFI Scan Code. If a matching sequence is not found, then the raw - key strokes are converted into EFI Keys. - - 2 seconds are allowed for an ESC sequence to be completed. If the ESC sequence is not - completed in 2 seconds, then the raw key strokes of the partial ESC sequence are - converted into EFI Keys. - There is one special input sequence that will force the system to reset. - This is ESC R ESC r ESC R. - - Symbols used in table below - =========================== - ESC = 0x1B - CSI = 0x9B - DEL = 0x7f - ^ = CTRL - +=========+======+===========+==========+==========+ - | | EFI | UEFI 2.0 | | | - | | Scan | | VT100+ | | - | KEY | Code | PC ANSI | VTUTF8 | VT100 | - +=========+======+===========+==========+==========+ - | NULL | 0x00 | | | | - | UP | 0x01 | ESC [ A | ESC [ A | ESC [ A | - | DOWN | 0x02 | ESC [ B | ESC [ B | ESC [ B | - | RIGHT | 0x03 | ESC [ C | ESC [ C | ESC [ C | - | LEFT | 0x04 | ESC [ D | ESC [ D | ESC [ D | - | HOME | 0x05 | ESC [ H | ESC h | ESC [ H | - | END | 0x06 | ESC [ F | ESC k | ESC [ K | - | INSERT | 0x07 | ESC [ @ | ESC + | ESC [ @ | - | | | ESC [ L | | ESC [ L | - | DELETE | 0x08 | ESC [ X | ESC - | ESC [ P | - | PG UP | 0x09 | ESC [ I | ESC ? | ESC [ V | - | | | | | ESC [ ? | - | PG DOWN | 0x0A | ESC [ G | ESC / | ESC [ U | - | | | | | ESC [ / | - | F1 | 0x0B | ESC [ M | ESC 1 | ESC O P | - | F2 | 0x0C | ESC [ N | ESC 2 | ESC O Q | - | F3 | 0x0D | ESC [ O | ESC 3 | ESC O w | - | F4 | 0x0E | ESC [ P | ESC 4 | ESC O x | - | F5 | 0x0F | ESC [ Q | ESC 5 | ESC O t | - | F6 | 0x10 | ESC [ R | ESC 6 | ESC O u | - | F7 | 0x11 | ESC [ S | ESC 7 | ESC O q | - | F8 | 0x12 | ESC [ T | ESC 8 | ESC O r | - | F9 | 0x13 | ESC [ U | ESC 9 | ESC O p | - | F10 | 0x14 | ESC [ V | ESC 0 | ESC O M | - | Escape | 0x17 | ESC | ESC | ESC | - | F11 | 0x15 | | ESC ! | | - | F12 | 0x16 | | ESC @ | | - +=========+======+===========+==========+==========+ - - Special Mappings - ================ - ESC R ESC r ESC R = Reset System - - - @param TerminalDevice The terminal device to use to translate raw input into EFI Keys - -**/ -VOID -UnicodeToEfiKey ( - IN TERMINAL_DEV *TerminalDevice - ); - -/** - Check if input string is valid Ascii string, valid EFI control characters - or valid text graphics. - - @param TerminalDevice The terminal device. - @param WString The input string. - - @retval EFI_UNSUPPORTED If not all input characters are valid. - @retval EFI_SUCCESS If all input characters are valid. - -**/ -EFI_STATUS -AnsiTestString ( - IN TERMINAL_DEV *TerminalDevice, - IN CHAR16 *WString - ); - -// -// internal functions for VTUTF8 -// - -/** - Translate all VT-UTF8 characters in the Raw FIFI into unicode characters, - and insert them into Unicode FIFO. - - @param VtUtf8Device The terminal device. - -**/ -VOID -VTUTF8RawDataToUnicode ( - IN TERMINAL_DEV *VtUtf8Device - ); - -/** - Check if input string is valid VT-UTF8 string. - - @param TerminalDevice The terminal device. - @param WString The input string. - - @retval EFI_SUCCESS If all input characters are valid. - -**/ -EFI_STATUS -VTUTF8TestString ( - IN TERMINAL_DEV *TerminalDevice, - IN CHAR16 *WString - ); - -/** - Translate one Unicode character into VT-UTF8 characters. - - UTF8 Encoding Table - Bits per Character | Unicode Character Range | Unicode Binary Encoding | UTF8 Binary Encoding - 0-7 | 0x0000 - 0x007F | 00000000 0xxxxxxx | 0xxxxxxx - 8-11 | 0x0080 - 0x07FF | 00000xxx xxxxxxxx | 110xxxxx 10xxxxxx - 12-16 | 0x0800 - 0xFFFF | xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx - - - @param Unicode Unicode character need translating. - @param Utf8Char Return VT-UTF8 character set. - @param ValidBytes The count of valid VT-UTF8 characters. If - ValidBytes is zero, no valid VT-UTF8 returned. - -**/ -VOID -UnicodeToUtf8 ( - IN CHAR16 Unicode, - OUT UTF8_CHAR *Utf8Char, - OUT UINT8 *ValidBytes - ); - -/** - Get one valid VT-UTF8 characters set from Raw Data FIFO. - - @param Utf8Device The terminal device. - @param Utf8Char Returned valid VT-UTF8 characters set. - @param ValidBytes The count of returned VT-VTF8 characters. - If ValidBytes is zero, no valid VT-UTF8 returned. - -**/ -VOID -GetOneValidUtf8Char ( - IN TERMINAL_DEV *Utf8Device, - OUT UTF8_CHAR *Utf8Char, - OUT UINT8 *ValidBytes - ); - -/** - Translate VT-UTF8 characters into one Unicode character. - - UTF8 Encoding Table - Bits per Character | Unicode Character Range | Unicode Binary Encoding | UTF8 Binary Encoding - 0-7 | 0x0000 - 0x007F | 00000000 0xxxxxxx | 0xxxxxxx - 8-11 | 0x0080 - 0x07FF | 00000xxx xxxxxxxx | 110xxxxx 10xxxxxx - 12-16 | 0x0800 - 0xFFFF | xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx - - - @param Utf8Char VT-UTF8 character set needs translating. - @param ValidBytes The count of valid VT-UTF8 characters. - @param UnicodeChar Returned unicode character. - -**/ -VOID -Utf8ToUnicode ( - IN UTF8_CHAR Utf8Char, - IN UINT8 ValidBytes, - OUT CHAR16 *UnicodeChar - ); - -// -// functions for boxdraw unicode -// - -/** - Detects if a Unicode char is for Box Drawing text graphics. - - @param Graphic Unicode char to test. - @param PcAnsi Optional pointer to return PCANSI equivalent of - Graphic. - @param Ascii Optional pointer to return ASCII equivalent of - Graphic. - - @retval TRUE If Graphic is a supported Unicode Box Drawing character. - -**/ -BOOLEAN -TerminalIsValidTextGraphics ( - IN CHAR16 Graphic, - OUT CHAR8 *PcAnsi, OPTIONAL - OUT CHAR8 *Ascii OPTIONAL - ); - -/** - Detects if a valid ASCII char. - - @param Ascii An ASCII character. - - @retval TRUE If it is a valid ASCII character. - @retval FALSE If it is not a valid ASCII character. - -**/ -BOOLEAN -TerminalIsValidAscii ( - IN CHAR16 Ascii - ); - -/** - Detects if a valid EFI control character. - - @param CharC An input EFI Control character. - - @retval TRUE If it is a valid EFI control character. - @retval FALSE If it is not a valid EFI control character. - -**/ -BOOLEAN -TerminalIsValidEfiCntlChar ( - IN CHAR16 CharC - ); - -/** - Check if the device supports hot-plug through its device path. - - This function could be updated to check more types of Hot Plug devices. - Currently, it checks USB and PCCard device. - - @param DevicePath Pointer to device's device path. - - @retval TRUE The devcie is a hot-plug device - @retval FALSE The devcie is not a hot-plug device. - -**/ -BOOLEAN -IsHotPlugDevice ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ); - -/** - Timer handler to poll the key from serial. - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. -**/ -VOID -EFIAPI -TerminalConInTimerHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ); -#endif diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c deleted file mode 100644 index c216ed900f..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c +++ /dev/null @@ -1,1670 +0,0 @@ -/** @file - Implementation for EFI_SIMPLE_TEXT_INPUT_PROTOCOL protocol. - -(C) Copyright 2014 Hewlett-Packard Development Company, L.P.
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Terminal.h" - - -/** - Reads the next keystroke from the input device. The WaitForKey Event can - be used to test for existence of a keystroke via WaitForEvent () call. - - @param TerminalDevice Terminal driver private structure - @param KeyData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - pressed. - - @retval EFI_SUCCESS The keystroke information was returned. - @retval EFI_NOT_READY There was no keystroke data available. - @retval EFI_INVALID_PARAMETER KeyData is NULL. - -**/ -EFI_STATUS -ReadKeyStrokeWorker ( - IN TERMINAL_DEV *TerminalDevice, - OUT EFI_KEY_DATA *KeyData - ) -{ - if (KeyData == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (!EfiKeyFiFoRemoveOneKey (TerminalDevice, &KeyData->Key)) { - return EFI_NOT_READY; - } - - KeyData->KeyState.KeyShiftState = 0; - KeyData->KeyState.KeyToggleState = 0; - - - return EFI_SUCCESS; - -} - -/** - Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.Reset(). - This driver only perform dependent serial device reset regardless of - the value of ExtendeVerification - - @param This Indicates the calling context. - @param ExtendedVerification Skip by this driver. - - @retval EFI_SUCCESS The reset operation succeeds. - @retval EFI_DEVICE_ERROR The dependent serial port reset fails. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReset ( - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This); - - // - // Report progress code here - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_PC_RESET), - TerminalDevice->DevicePath - ); - - Status = TerminalDevice->SerialIo->Reset (TerminalDevice->SerialIo); - - // - // Make all the internal buffer empty for keys - // - TerminalDevice->RawFiFo->Head = TerminalDevice->RawFiFo->Tail; - TerminalDevice->UnicodeFiFo->Head = TerminalDevice->UnicodeFiFo->Tail; - TerminalDevice->EfiKeyFiFo->Head = TerminalDevice->EfiKeyFiFo->Tail; - - if (EFI_ERROR (Status)) { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE | EFI_ERROR_MINOR, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_CONTROLLER_ERROR), - TerminalDevice->DevicePath - ); - } - - return Status; -} - -/** - Implements EFI_SIMPLE_TEXT_INPUT_PROTOCOL.ReadKeyStroke(). - - @param This Indicates the calling context. - @param Key A pointer to a buffer that is filled in with the - keystroke information for the key that was sent - from terminal. - - @retval EFI_SUCCESS The keystroke information is returned successfully. - @retval EFI_NOT_READY There is no keystroke data available. - @retval EFI_DEVICE_ERROR The dependent serial device encounters error. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReadKeyStroke ( - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, - OUT EFI_INPUT_KEY *Key - ) -{ - TERMINAL_DEV *TerminalDevice; - EFI_STATUS Status; - EFI_KEY_DATA KeyData; - - // - // get TERMINAL_DEV from "This" parameter. - // - TerminalDevice = TERMINAL_CON_IN_DEV_FROM_THIS (This); - - Status = ReadKeyStrokeWorker (TerminalDevice, &KeyData); - if (EFI_ERROR (Status)) { - return Status; - } - - CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY)); - - return EFI_SUCCESS; - -} - -/** - Check if the key already has been registered. - - If both RegsiteredData and InputData is NULL, then ASSERT(). - - @param RegsiteredData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - registered. - @param InputData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - pressed. - - @retval TRUE Key be pressed matches a registered key. - @retval FALSE Match failed. - -**/ -BOOLEAN -IsKeyRegistered ( - IN EFI_KEY_DATA *RegsiteredData, - IN EFI_KEY_DATA *InputData - ) -{ - ASSERT (RegsiteredData != NULL && InputData != NULL); - - if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) || - (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) { - return FALSE; - } - - return TRUE; -} - - - -/** - Event notification function for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.WaitForKeyEx event - Signal the event if there is key available - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. - -**/ -VOID -EFIAPI -TerminalConInWaitForKeyEx ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - TerminalConInWaitForKey (Event, Context); -} - -// -// Simple Text Input Ex protocol functions -// - -/** - Reset the input device and optionally run diagnostics - - @param This Protocol instance pointer. - @param ExtendedVerification Driver may perform diagnostics on reset. - - @retval EFI_SUCCESS The device was reset. - @retval EFI_DEVICE_ERROR The device is not functioning properly and could - not be reset. - -**/ -EFI_STATUS -EFIAPI -TerminalConInResetEx ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This); - - Status = TerminalDevice->SimpleInput.Reset (&TerminalDevice->SimpleInput, ExtendedVerification); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; - -} - - -/** - Reads the next keystroke from the input device. The WaitForKey Event can - be used to test for existence of a keystroke via WaitForEvent () call. - - @param This Protocol instance pointer. - @param KeyData A pointer to a buffer that is filled in with the - keystroke state data for the key that was - pressed. - - @retval EFI_SUCCESS The keystroke information was returned. - @retval EFI_NOT_READY There was no keystroke data available. - @retval EFI_DEVICE_ERROR The keystroke information was not returned due - to hardware errors. - @retval EFI_INVALID_PARAMETER KeyData is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInReadKeyStrokeEx ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - OUT EFI_KEY_DATA *KeyData - ) -{ - TERMINAL_DEV *TerminalDevice; - - if (KeyData == NULL) { - return EFI_INVALID_PARAMETER; - } - - TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This); - - return ReadKeyStrokeWorker (TerminalDevice, KeyData); - -} - - -/** - Set certain state for the input device. - - @param This Protocol instance pointer. - @param KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the - state for the input device. - - @retval EFI_SUCCESS The device state was set successfully. - @retval EFI_DEVICE_ERROR The device is not functioning correctly and - could not have the setting adjusted. - @retval EFI_UNSUPPORTED The device does not have the ability to set its - state. - @retval EFI_INVALID_PARAMETER KeyToggleState is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInSetState ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN EFI_KEY_TOGGLE_STATE *KeyToggleState - ) -{ - if (KeyToggleState == NULL) { - return EFI_INVALID_PARAMETER; - } - - if ((*KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - - -/** - Register a notification function for a particular keystroke for the input device. - - @param This Protocol instance pointer. - @param KeyData A pointer to a buffer that is filled in with the - keystroke information data for the key that was - pressed. - @param KeyNotificationFunction Points to the function to be called when the key - sequence is typed specified by KeyData. - @param NotifyHandle Points to the unique handle assigned to the - registered notification. - - @retval EFI_SUCCESS The notification function was registered - successfully. - @retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necessary data - structures. - @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle is NULL. - -**/ -EFI_STATUS -EFIAPI -TerminalConInRegisterKeyNotify ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN EFI_KEY_DATA *KeyData, - IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, - OUT VOID **NotifyHandle - ) -{ - TERMINAL_DEV *TerminalDevice; - TERMINAL_CONSOLE_IN_EX_NOTIFY *NewNotify; - LIST_ENTRY *Link; - LIST_ENTRY *NotifyList; - TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify; - - if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) { - return EFI_INVALID_PARAMETER; - } - - TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This); - - // - // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered. - // - NotifyList = &TerminalDevice->NotifyList; - for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) { - CurrentNotify = CR ( - Link, - TERMINAL_CONSOLE_IN_EX_NOTIFY, - NotifyEntry, - TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE - ); - if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { - if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) { - *NotifyHandle = CurrentNotify; - return EFI_SUCCESS; - } - } - } - - // - // Allocate resource to save the notification function - // - NewNotify = (TERMINAL_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (TERMINAL_CONSOLE_IN_EX_NOTIFY)); - if (NewNotify == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NewNotify->Signature = TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE; - NewNotify->KeyNotificationFn = KeyNotificationFunction; - CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA)); - InsertTailList (&TerminalDevice->NotifyList, &NewNotify->NotifyEntry); - - *NotifyHandle = NewNotify; - - return EFI_SUCCESS; -} - - -/** - Remove a registered notification function from a particular keystroke. - - @param This Protocol instance pointer. - @param NotificationHandle The handle of the notification function being - unregistered. - - @retval EFI_SUCCESS The notification function was unregistered - successfully. - @retval EFI_INVALID_PARAMETER The NotificationHandle is invalid. - -**/ -EFI_STATUS -EFIAPI -TerminalConInUnregisterKeyNotify ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - IN VOID *NotificationHandle - ) -{ - TERMINAL_DEV *TerminalDevice; - LIST_ENTRY *Link; - TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify; - LIST_ENTRY *NotifyList; - - if (NotificationHandle == NULL) { - return EFI_INVALID_PARAMETER; - } - - TerminalDevice = TERMINAL_CON_IN_EX_DEV_FROM_THIS (This); - - NotifyList = &TerminalDevice->NotifyList; - for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) { - CurrentNotify = CR ( - Link, - TERMINAL_CONSOLE_IN_EX_NOTIFY, - NotifyEntry, - TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE - ); - if (CurrentNotify == NotificationHandle) { - // - // Remove the notification function from NotifyList and free resources - // - RemoveEntryList (&CurrentNotify->NotifyEntry); - - gBS->FreePool (CurrentNotify); - return EFI_SUCCESS; - } - } - - // - // Can not find the matching entry in database. - // - return EFI_INVALID_PARAMETER; -} - -/** - Translate raw data into Unicode (according to different encode), and - translate Unicode into key information. (according to different standard). - - @param TerminalDevice Terminal driver private structure. - -**/ -VOID -TranslateRawDataToEfiKey ( - IN TERMINAL_DEV *TerminalDevice - ) -{ - switch (TerminalDevice->TerminalType) { - - case PCANSITYPE: - case VT100TYPE: - case VT100PLUSTYPE: - case TTYTERMTYPE: - AnsiRawDataToUnicode (TerminalDevice); - UnicodeToEfiKey (TerminalDevice); - break; - - case VTUTF8TYPE: - // - // Process all the raw data in the RawFIFO, - // put the processed key into UnicodeFIFO. - // - VTUTF8RawDataToUnicode (TerminalDevice); - - // - // Translate all the Unicode data in the UnicodeFIFO to Efi key, - // then put into EfiKeyFIFO. - // - UnicodeToEfiKey (TerminalDevice); - - break; - } -} - -/** - Event notification function for EFI_SIMPLE_TEXT_INPUT_PROTOCOL.WaitForKey event - Signal the event if there is key available - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. - -**/ -VOID -EFIAPI -TerminalConInWaitForKey ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - // - // Someone is waiting on the keystroke event, if there's - // a key pending, signal the event - // - if (!IsEfiKeyFiFoEmpty ((TERMINAL_DEV *) Context)) { - - gBS->SignalEvent (Event); - } -} - -/** - Timer handler to poll the key from serial. - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. -**/ -VOID -EFIAPI -TerminalConInTimerHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - UINT32 Control; - UINT8 Input; - EFI_SERIAL_IO_MODE *Mode; - EFI_SERIAL_IO_PROTOCOL *SerialIo; - UINTN SerialInTimeOut; - - TerminalDevice = (TERMINAL_DEV *) Context; - - SerialIo = TerminalDevice->SerialIo; - if (SerialIo == NULL) { - return ; - } - // - // if current timeout value for serial device is not identical with - // the value saved in TERMINAL_DEV structure, then recalculate the - // timeout value again and set serial attribute according to this value. - // - Mode = SerialIo->Mode; - if (Mode->Timeout != TerminalDevice->SerialInTimeOut) { - - SerialInTimeOut = 0; - if (Mode->BaudRate != 0) { - // - // According to BAUD rate to calculate the timeout value. - // - SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate; - } - - Status = SerialIo->SetAttributes ( - SerialIo, - Mode->BaudRate, - Mode->ReceiveFifoDepth, - (UINT32) SerialInTimeOut, - (EFI_PARITY_TYPE) (Mode->Parity), - (UINT8) Mode->DataBits, - (EFI_STOP_BITS_TYPE) (Mode->StopBits) - ); - - if (EFI_ERROR (Status)) { - TerminalDevice->SerialInTimeOut = 0; - } else { - TerminalDevice->SerialInTimeOut = SerialInTimeOut; - } - } - // - // Check whether serial buffer is empty. - // - Status = SerialIo->GetControl (SerialIo, &Control); - - if ((Control & EFI_SERIAL_INPUT_BUFFER_EMPTY) == 0) { - // - // Fetch all the keys in the serial buffer, - // and insert the byte stream into RawFIFO. - // - while (!IsRawFiFoFull (TerminalDevice)) { - - Status = GetOneKeyFromSerial (TerminalDevice->SerialIo, &Input); - - if (EFI_ERROR (Status)) { - if (Status == EFI_DEVICE_ERROR) { - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE | EFI_ERROR_MINOR, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_INPUT_ERROR), - TerminalDevice->DevicePath - ); - } - break; - } - - RawFiFoInsertOneKey (TerminalDevice, Input); - } - } - - // - // Translate all the raw data in RawFIFO into EFI Key, - // according to different terminal type supported. - // - TranslateRawDataToEfiKey (TerminalDevice); -} - -/** - Get one key out of serial buffer. - - @param SerialIo Serial I/O protocol attached to the serial device. - @param Output The fetched key. - - @retval EFI_NOT_READY If serial buffer is empty. - @retval EFI_DEVICE_ERROR If reading serial buffer encounter error. - @retval EFI_SUCCESS If reading serial buffer successfully, put - the fetched key to the parameter output. - -**/ -EFI_STATUS -GetOneKeyFromSerial ( - EFI_SERIAL_IO_PROTOCOL *SerialIo, - UINT8 *Output - ) -{ - EFI_STATUS Status; - UINTN Size; - - Size = 1; - *Output = 0; - - // - // Read one key from serial I/O device. - // - Status = SerialIo->Read (SerialIo, &Size, Output); - - if (EFI_ERROR (Status)) { - - if (Status == EFI_TIMEOUT) { - return EFI_NOT_READY; - } - - return EFI_DEVICE_ERROR; - - } - - if (*Output == 0) { - return EFI_NOT_READY; - } - - return EFI_SUCCESS; -} - -/** - Insert one byte raw data into the Raw Data FIFO. - - @param TerminalDevice Terminal driver private structure. - @param Input The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If Raw Data buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -RawFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT8 Input - ) -{ - UINT8 Tail; - - Tail = TerminalDevice->RawFiFo->Tail; - - if (IsRawFiFoFull (TerminalDevice)) { - // - // Raw FIFO is full - // - return FALSE; - } - - TerminalDevice->RawFiFo->Data[Tail] = Input; - - TerminalDevice->RawFiFo->Tail = (UINT8) ((Tail + 1) % (RAW_FIFO_MAX_NUMBER + 1)); - - return TRUE; -} - -/** - Remove one pre-fetched key out of the Raw Data FIFO. - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - - @retval TRUE If insert successfully. - @retval FALSE If Raw Data FIFO buffer is empty before remove operation. - -**/ -BOOLEAN -RawFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT8 *Output - ) -{ - UINT8 Head; - - Head = TerminalDevice->RawFiFo->Head; - - if (IsRawFiFoEmpty (TerminalDevice)) { - // - // FIFO is empty - // - *Output = 0; - return FALSE; - } - - *Output = TerminalDevice->RawFiFo->Data[Head]; - - TerminalDevice->RawFiFo->Head = (UINT8) ((Head + 1) % (RAW_FIFO_MAX_NUMBER + 1)); - - return TRUE; -} - -/** - Clarify whether Raw Data FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Raw Data FIFO buffer is empty. - @retval FALSE If Raw Data FIFO buffer is not empty. - -**/ -BOOLEAN -IsRawFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ) -{ - if (TerminalDevice->RawFiFo->Head == TerminalDevice->RawFiFo->Tail) { - return TRUE; - } else { - return FALSE; - } -} - -/** - Clarify whether Raw Data FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Raw Data FIFO buffer is full. - @retval FALSE If Raw Data FIFO buffer is not full. - -**/ -BOOLEAN -IsRawFiFoFull ( - TERMINAL_DEV *TerminalDevice - ) -{ - UINT8 Tail; - UINT8 Head; - - Tail = TerminalDevice->RawFiFo->Tail; - Head = TerminalDevice->RawFiFo->Head; - - if (((Tail + 1) % (RAW_FIFO_MAX_NUMBER + 1)) == Head) { - - return TRUE; - } - - return FALSE; -} - -/** - Insert one pre-fetched key into the FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Key The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If FIFO buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -EfiKeyFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - EFI_INPUT_KEY *Key - ) -{ - UINT8 Tail; - LIST_ENTRY *Link; - LIST_ENTRY *NotifyList; - TERMINAL_CONSOLE_IN_EX_NOTIFY *CurrentNotify; - EFI_KEY_DATA KeyData; - - Tail = TerminalDevice->EfiKeyFiFo->Tail; - - CopyMem (&KeyData.Key, Key, sizeof (EFI_INPUT_KEY)); - KeyData.KeyState.KeyShiftState = 0; - KeyData.KeyState.KeyToggleState = 0; - - // - // Invoke notification functions if exist - // - NotifyList = &TerminalDevice->NotifyList; - for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList,Link); Link = GetNextNode (NotifyList,Link)) { - CurrentNotify = CR ( - Link, - TERMINAL_CONSOLE_IN_EX_NOTIFY, - NotifyEntry, - TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE - ); - if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) { - CurrentNotify->KeyNotificationFn (&KeyData); - } - } - if (IsEfiKeyFiFoFull (TerminalDevice)) { - // - // Efi Key FIFO is full - // - return FALSE; - } - - CopyMem (&TerminalDevice->EfiKeyFiFo->Data[Tail], Key, sizeof (EFI_INPUT_KEY)); - - TerminalDevice->EfiKeyFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1)); - - return TRUE; -} - -/** - Remove one pre-fetched key out of the FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - - @retval TRUE If insert successfully. - @retval FALSE If FIFO buffer is empty before remove operation. - -**/ -BOOLEAN -EfiKeyFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - EFI_INPUT_KEY *Output - ) -{ - UINT8 Head; - - Head = TerminalDevice->EfiKeyFiFo->Head; - ASSERT (Head < FIFO_MAX_NUMBER + 1); - - if (IsEfiKeyFiFoEmpty (TerminalDevice)) { - // - // FIFO is empty - // - Output->ScanCode = SCAN_NULL; - Output->UnicodeChar = 0; - return FALSE; - } - - CopyMem (Output, &TerminalDevice->EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY)); - - TerminalDevice->EfiKeyFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1)); - - return TRUE; -} - -/** - Clarify whether FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If FIFO buffer is empty. - @retval FALSE If FIFO buffer is not empty. - -**/ -BOOLEAN -IsEfiKeyFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ) -{ - if (TerminalDevice->EfiKeyFiFo->Head == TerminalDevice->EfiKeyFiFo->Tail) { - return TRUE; - } else { - return FALSE; - } -} - -/** - Clarify whether FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If FIFO buffer is full. - @retval FALSE If FIFO buffer is not full. - -**/ -BOOLEAN -IsEfiKeyFiFoFull ( - TERMINAL_DEV *TerminalDevice - ) -{ - UINT8 Tail; - UINT8 Head; - - Tail = TerminalDevice->EfiKeyFiFo->Tail; - Head = TerminalDevice->EfiKeyFiFo->Head; - - if (((Tail + 1) % (FIFO_MAX_NUMBER + 1)) == Head) { - - return TRUE; - } - - return FALSE; -} - -/** - Insert one pre-fetched key into the Unicode FIFO buffer. - - @param TerminalDevice Terminal driver private structure. - @param Input The key will be input. - - @retval TRUE If insert successfully. - @retval FALSE If Unicode FIFO buffer is full before key insertion, - and the key is lost. - -**/ -BOOLEAN -UnicodeFiFoInsertOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT16 Input - ) -{ - UINT8 Tail; - - Tail = TerminalDevice->UnicodeFiFo->Tail; - ASSERT (Tail < FIFO_MAX_NUMBER + 1); - - - if (IsUnicodeFiFoFull (TerminalDevice)) { - // - // Unicode FIFO is full - // - return FALSE; - } - - TerminalDevice->UnicodeFiFo->Data[Tail] = Input; - - TerminalDevice->UnicodeFiFo->Tail = (UINT8) ((Tail + 1) % (FIFO_MAX_NUMBER + 1)); - - return TRUE; -} - -/** - Remove one pre-fetched key out of the Unicode FIFO buffer. - The caller should guarantee that Unicode FIFO buffer is not empty - by IsUnicodeFiFoEmpty (). - - @param TerminalDevice Terminal driver private structure. - @param Output The key will be removed. - -**/ -VOID -UnicodeFiFoRemoveOneKey ( - TERMINAL_DEV *TerminalDevice, - UINT16 *Output - ) -{ - UINT8 Head; - - Head = TerminalDevice->UnicodeFiFo->Head; - ASSERT (Head < FIFO_MAX_NUMBER + 1); - - *Output = TerminalDevice->UnicodeFiFo->Data[Head]; - - TerminalDevice->UnicodeFiFo->Head = (UINT8) ((Head + 1) % (FIFO_MAX_NUMBER + 1)); -} - -/** - Clarify whether Unicode FIFO buffer is empty. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Unicode FIFO buffer is empty. - @retval FALSE If Unicode FIFO buffer is not empty. - -**/ -BOOLEAN -IsUnicodeFiFoEmpty ( - TERMINAL_DEV *TerminalDevice - ) -{ - if (TerminalDevice->UnicodeFiFo->Head == TerminalDevice->UnicodeFiFo->Tail) { - return TRUE; - } else { - return FALSE; - } -} - -/** - Clarify whether Unicode FIFO buffer is full. - - @param TerminalDevice Terminal driver private structure - - @retval TRUE If Unicode FIFO buffer is full. - @retval FALSE If Unicode FIFO buffer is not full. - -**/ -BOOLEAN -IsUnicodeFiFoFull ( - TERMINAL_DEV *TerminalDevice - ) -{ - UINT8 Tail; - UINT8 Head; - - Tail = TerminalDevice->UnicodeFiFo->Tail; - Head = TerminalDevice->UnicodeFiFo->Head; - - if (((Tail + 1) % (FIFO_MAX_NUMBER + 1)) == Head) { - - return TRUE; - } - - return FALSE; -} - -/** - Count Unicode FIFO buffer. - - @param TerminalDevice Terminal driver private structure - - @return The count in bytes of Unicode FIFO. - -**/ -UINT8 -UnicodeFiFoGetKeyCount ( - TERMINAL_DEV *TerminalDevice - ) -{ - UINT8 Tail; - UINT8 Head; - - Tail = TerminalDevice->UnicodeFiFo->Tail; - Head = TerminalDevice->UnicodeFiFo->Head; - - if (Tail >= Head) { - return (UINT8) (Tail - Head); - } else { - return (UINT8) (Tail + FIFO_MAX_NUMBER + 1 - Head); - } -} - -/** - Update the Unicode characters from a terminal input device into EFI Keys FIFO. - - @param TerminalDevice The terminal device to use to translate raw input into EFI Keys - -**/ -VOID -UnicodeToEfiKeyFlushState ( - IN TERMINAL_DEV *TerminalDevice - ) -{ - EFI_INPUT_KEY Key; - UINT32 InputState; - - InputState = TerminalDevice->InputState; - - if (IsEfiKeyFiFoFull (TerminalDevice)) { - return; - } - - if ((InputState & INPUT_STATE_ESC) != 0) { - Key.ScanCode = SCAN_ESC; - Key.UnicodeChar = 0; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } - - if ((InputState & INPUT_STATE_CSI) != 0) { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = CSI; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } - - if ((InputState & INPUT_STATE_LEFTOPENBRACKET) != 0) { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = LEFTOPENBRACKET; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } - - if ((InputState & INPUT_STATE_O) != 0) { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = 'O'; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } - - if ((InputState & INPUT_STATE_2) != 0) { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = '2'; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } - - // - // Cancel the timer. - // - gBS->SetTimer ( - TerminalDevice->TwoSecondTimeOut, - TimerCancel, - 0 - ); - - TerminalDevice->InputState = INPUT_STATE_DEFAULT; -} - - -/** - Converts a stream of Unicode characters from a terminal input device into EFI Keys that - can be read through the Simple Input Protocol. - - The table below shows the keyboard input mappings that this function supports. - If the ESC sequence listed in one of the columns is presented, then it is translated - into the corresponding EFI Scan Code. If a matching sequence is not found, then the raw - key strokes are converted into EFI Keys. - - 2 seconds are allowed for an ESC sequence to be completed. If the ESC sequence is not - completed in 2 seconds, then the raw key strokes of the partial ESC sequence are - converted into EFI Keys. - There is one special input sequence that will force the system to reset. - This is ESC R ESC r ESC R. - - Note: current implementation support terminal types include: PC ANSI, VT100+/VTUTF8, VT100. - The table below is not same with UEFI Spec 2.3 Appendix B Table 201(not support ANSI X3.64 / - DEC VT200-500 and extra support PC ANSI, VT100)since UEFI Table 201 is just an example. - - Symbols used in table below - =========================== - ESC = 0x1B - CSI = 0x9B - DEL = 0x7f - ^ = CTRL - - +=========+======+===========+==========+==========+ - | | EFI | UEFI 2.0 | | | - | | Scan | | VT100+ | | - | KEY | Code | PC ANSI | VTUTF8 | VT100 | - +=========+======+===========+==========+==========+ - | NULL | 0x00 | | | | - | UP | 0x01 | ESC [ A | ESC [ A | ESC [ A | - | DOWN | 0x02 | ESC [ B | ESC [ B | ESC [ B | - | RIGHT | 0x03 | ESC [ C | ESC [ C | ESC [ C | - | LEFT | 0x04 | ESC [ D | ESC [ D | ESC [ D | - | HOME | 0x05 | ESC [ H | ESC h | ESC [ H | - | END | 0x06 | ESC [ F | ESC k | ESC [ K | - | INSERT | 0x07 | ESC [ @ | ESC + | ESC [ @ | - | | | ESC [ L | | ESC [ L | - | DELETE | 0x08 | ESC [ X | ESC - | ESC [ P | - | PG UP | 0x09 | ESC [ I | ESC ? | ESC [ V | - | | | | | ESC [ ? | - | PG DOWN | 0x0A | ESC [ G | ESC / | ESC [ U | - | | | | | ESC [ / | - | F1 | 0x0B | ESC [ M | ESC 1 | ESC O P | - | F2 | 0x0C | ESC [ N | ESC 2 | ESC O Q | - | F3 | 0x0D | ESC [ O | ESC 3 | ESC O w | - | F4 | 0x0E | ESC [ P | ESC 4 | ESC O x | - | F5 | 0x0F | ESC [ Q | ESC 5 | ESC O t | - | F6 | 0x10 | ESC [ R | ESC 6 | ESC O u | - | F7 | 0x11 | ESC [ S | ESC 7 | ESC O q | - | F8 | 0x12 | ESC [ T | ESC 8 | ESC O r | - | F9 | 0x13 | ESC [ U | ESC 9 | ESC O p | - | F10 | 0x14 | ESC [ V | ESC 0 | ESC O M | - | Escape | 0x17 | ESC | ESC | ESC | - | F11 | 0x15 | | ESC ! | | - | F12 | 0x16 | | ESC @ | | - +=========+======+===========+==========+==========+ - - Special Mappings - ================ - ESC R ESC r ESC R = Reset System - - @param TerminalDevice The terminal device to use to translate raw input into EFI Keys - -**/ -VOID -UnicodeToEfiKey ( - IN TERMINAL_DEV *TerminalDevice - ) -{ - EFI_STATUS Status; - EFI_STATUS TimerStatus; - UINT16 UnicodeChar; - EFI_INPUT_KEY Key; - BOOLEAN SetDefaultResetState; - - TimerStatus = gBS->CheckEvent (TerminalDevice->TwoSecondTimeOut); - - if (!EFI_ERROR (TimerStatus)) { - UnicodeToEfiKeyFlushState (TerminalDevice); - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - } - - while (!IsUnicodeFiFoEmpty (TerminalDevice) && !IsEfiKeyFiFoFull (TerminalDevice)) { - - if (TerminalDevice->InputState != INPUT_STATE_DEFAULT) { - // - // Check to see if the 2 seconds timer has expired - // - TimerStatus = gBS->CheckEvent (TerminalDevice->TwoSecondTimeOut); - if (!EFI_ERROR (TimerStatus)) { - UnicodeToEfiKeyFlushState (TerminalDevice); - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - } - } - - // - // Fetch one Unicode character from the Unicode FIFO - // - UnicodeFiFoRemoveOneKey (TerminalDevice, &UnicodeChar); - - SetDefaultResetState = TRUE; - - switch (TerminalDevice->InputState) { - case INPUT_STATE_DEFAULT: - - break; - - case INPUT_STATE_ESC: - - if (UnicodeChar == LEFTOPENBRACKET) { - TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET; - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - continue; - } - - if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == VT100TYPE || - TerminalDevice->TerminalType == TTYTERMTYPE)) { - TerminalDevice->InputState |= INPUT_STATE_O; - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - continue; - } - - Key.ScanCode = SCAN_NULL; - - if (TerminalDevice->TerminalType == VT100PLUSTYPE || - TerminalDevice->TerminalType == VTUTF8TYPE) { - switch (UnicodeChar) { - case '1': - Key.ScanCode = SCAN_F1; - break; - case '2': - Key.ScanCode = SCAN_F2; - break; - case '3': - Key.ScanCode = SCAN_F3; - break; - case '4': - Key.ScanCode = SCAN_F4; - break; - case '5': - Key.ScanCode = SCAN_F5; - break; - case '6': - Key.ScanCode = SCAN_F6; - break; - case '7': - Key.ScanCode = SCAN_F7; - break; - case '8': - Key.ScanCode = SCAN_F8; - break; - case '9': - Key.ScanCode = SCAN_F9; - break; - case '0': - Key.ScanCode = SCAN_F10; - break; - case '!': - Key.ScanCode = SCAN_F11; - break; - case '@': - Key.ScanCode = SCAN_F12; - break; - case 'h': - Key.ScanCode = SCAN_HOME; - break; - case 'k': - Key.ScanCode = SCAN_END; - break; - case '+': - Key.ScanCode = SCAN_INSERT; - break; - case '-': - Key.ScanCode = SCAN_DELETE; - break; - case '/': - Key.ScanCode = SCAN_PAGE_DOWN; - break; - case '?': - Key.ScanCode = SCAN_PAGE_UP; - break; - default : - break; - } - } - - switch (UnicodeChar) { - case 'R': - if (TerminalDevice->ResetState == RESET_STATE_DEFAULT) { - TerminalDevice->ResetState = RESET_STATE_ESC_R; - SetDefaultResetState = FALSE; - } else if (TerminalDevice->ResetState == RESET_STATE_ESC_R_ESC_R) { - gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); - } - Key.ScanCode = SCAN_NULL; - break; - case 'r': - if (TerminalDevice->ResetState == RESET_STATE_ESC_R) { - TerminalDevice->ResetState = RESET_STATE_ESC_R_ESC_R; - SetDefaultResetState = FALSE; - } - Key.ScanCode = SCAN_NULL; - break; - default : - break; - } - - if (SetDefaultResetState) { - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - } - - if (Key.ScanCode != SCAN_NULL) { - Key.UnicodeChar = 0; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - TerminalDevice->InputState = INPUT_STATE_DEFAULT; - UnicodeToEfiKeyFlushState (TerminalDevice); - continue; - } - - UnicodeToEfiKeyFlushState (TerminalDevice); - - break; - - case INPUT_STATE_ESC | INPUT_STATE_O: - - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - - Key.ScanCode = SCAN_NULL; - - if (TerminalDevice->TerminalType == VT100TYPE) { - switch (UnicodeChar) { - case 'P': - Key.ScanCode = SCAN_F1; - break; - case 'Q': - Key.ScanCode = SCAN_F2; - break; - case 'w': - Key.ScanCode = SCAN_F3; - break; - case 'x': - Key.ScanCode = SCAN_F4; - break; - case 't': - Key.ScanCode = SCAN_F5; - break; - case 'u': - Key.ScanCode = SCAN_F6; - break; - case 'q': - Key.ScanCode = SCAN_F7; - break; - case 'r': - Key.ScanCode = SCAN_F8; - break; - case 'p': - Key.ScanCode = SCAN_F9; - break; - case 'M': - Key.ScanCode = SCAN_F10; - break; - default : - break; - } - } else if (TerminalDevice->TerminalType == TTYTERMTYPE) { - /* Also accept VT100 escape codes for F1-F4 for TTY term */ - switch (UnicodeChar) { - case 'P': - Key.ScanCode = SCAN_F1; - break; - case 'Q': - Key.ScanCode = SCAN_F2; - break; - case 'R': - Key.ScanCode = SCAN_F3; - break; - case 'S': - Key.ScanCode = SCAN_F4; - break; - } - } - - if (Key.ScanCode != SCAN_NULL) { - Key.UnicodeChar = 0; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - TerminalDevice->InputState = INPUT_STATE_DEFAULT; - UnicodeToEfiKeyFlushState (TerminalDevice); - continue; - } - - UnicodeToEfiKeyFlushState (TerminalDevice); - - break; - - case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET: - - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - - Key.ScanCode = SCAN_NULL; - - if (TerminalDevice->TerminalType == PCANSITYPE || - TerminalDevice->TerminalType == VT100TYPE || - TerminalDevice->TerminalType == VT100PLUSTYPE || - TerminalDevice->TerminalType == VTUTF8TYPE || - TerminalDevice->TerminalType == TTYTERMTYPE) { - switch (UnicodeChar) { - case 'A': - Key.ScanCode = SCAN_UP; - break; - case 'B': - Key.ScanCode = SCAN_DOWN; - break; - case 'C': - Key.ScanCode = SCAN_RIGHT; - break; - case 'D': - Key.ScanCode = SCAN_LEFT; - break; - case 'H': - if (TerminalDevice->TerminalType == PCANSITYPE || - TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_HOME; - } - break; - case 'F': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_END; - } - break; - case 'K': - if (TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_END; - } - break; - case 'L': - case '@': - if (TerminalDevice->TerminalType == PCANSITYPE || - TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_INSERT; - } - break; - case 'X': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_DELETE; - } - break; - case 'P': - if (TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_DELETE; - } else if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F4; - } - break; - case 'I': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_PAGE_UP; - } - break; - case 'V': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F10; - } - break; - case '?': - if (TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_PAGE_UP; - } - break; - case 'G': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_PAGE_DOWN; - } - break; - case 'U': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F9; - } - break; - case '/': - if (TerminalDevice->TerminalType == VT100TYPE) { - Key.ScanCode = SCAN_PAGE_DOWN; - } - break; - case 'M': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F1; - } - break; - case 'N': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F2; - } - break; - case 'O': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F3; - } - break; - case 'Q': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F5; - } - break; - case 'R': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F6; - } - break; - case 'S': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F7; - } - break; - case 'T': - if (TerminalDevice->TerminalType == PCANSITYPE) { - Key.ScanCode = SCAN_F8; - } - break; - default : - break; - } - } - - /* - * The VT220 escape codes that the TTY terminal accepts all have - * numeric codes, and there are no ambiguous prefixes shared with - * other terminal types. - */ - if (TerminalDevice->TerminalType == TTYTERMTYPE && - Key.ScanCode == SCAN_NULL && - UnicodeChar >= '0' && - UnicodeChar <= '9') { - TerminalDevice->TtyEscapeStr[0] = UnicodeChar; - TerminalDevice->TtyEscapeIndex = 1; - TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2; - continue; - } - - if (Key.ScanCode != SCAN_NULL) { - Key.UnicodeChar = 0; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - TerminalDevice->InputState = INPUT_STATE_DEFAULT; - UnicodeToEfiKeyFlushState (TerminalDevice); - continue; - } - - UnicodeToEfiKeyFlushState (TerminalDevice); - - break; - - - case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2: - /* - * Here we handle the VT220 escape codes that we accept. This - * state is only used by the TTY terminal type. - */ - Key.ScanCode = SCAN_NULL; - if (TerminalDevice->TerminalType == TTYTERMTYPE) { - - if (UnicodeChar == '~' && TerminalDevice->TtyEscapeIndex <= 2) { - UINT16 EscCode; - TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex] = 0; /* Terminate string */ - EscCode = (UINT16) StrDecimalToUintn(TerminalDevice->TtyEscapeStr); - switch (EscCode) { - case 3: - Key.ScanCode = SCAN_DELETE; - break; - case 11: - case 12: - case 13: - case 14: - case 15: - Key.ScanCode = SCAN_F1 + EscCode - 11; - break; - case 17: - case 18: - case 19: - case 20: - case 21: - Key.ScanCode = SCAN_F6 + EscCode - 17; - break; - case 23: - case 24: - Key.ScanCode = SCAN_F11 + EscCode - 23; - break; - default: - break; - } - } else if (TerminalDevice->TtyEscapeIndex == 1){ - /* 2 character escape code */ - TerminalDevice->TtyEscapeStr[TerminalDevice->TtyEscapeIndex++] = UnicodeChar; - continue; - } - else { - DEBUG ((EFI_D_ERROR, "Unexpected state in escape2\n")); - } - } - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - - if (Key.ScanCode != SCAN_NULL) { - Key.UnicodeChar = 0; - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - TerminalDevice->InputState = INPUT_STATE_DEFAULT; - UnicodeToEfiKeyFlushState (TerminalDevice); - continue; - } - - UnicodeToEfiKeyFlushState (TerminalDevice); - break; - - default: - // - // Invalid state. This should never happen. - // - ASSERT (FALSE); - - UnicodeToEfiKeyFlushState (TerminalDevice); - - break; - } - - if (UnicodeChar == ESC) { - TerminalDevice->InputState = INPUT_STATE_ESC; - } - - if (UnicodeChar == CSI) { - TerminalDevice->InputState = INPUT_STATE_CSI; - } - - if (TerminalDevice->InputState != INPUT_STATE_DEFAULT) { - Status = gBS->SetTimer( - TerminalDevice->TwoSecondTimeOut, - TimerRelative, - (UINT64)20000000 - ); - ASSERT_EFI_ERROR (Status); - continue; - } - - if (SetDefaultResetState) { - TerminalDevice->ResetState = RESET_STATE_DEFAULT; - } - - if (UnicodeChar == DEL) { - if (TerminalDevice->TerminalType == TTYTERMTYPE) { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = CHAR_BACKSPACE; - } - else { - Key.ScanCode = SCAN_DELETE; - Key.UnicodeChar = 0; - } - } else { - Key.ScanCode = SCAN_NULL; - Key.UnicodeChar = UnicodeChar; - } - - EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); - } -} diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c deleted file mode 100644 index 9fa952ad2a..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ /dev/null @@ -1,908 +0,0 @@ -/** @file - Implementation for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL protocol. - -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Terminal.h" - -// -// This list is used to define the valid extend chars. -// It also provides a mapping from Unicode to PCANSI or -// ASCII. The ASCII mapping we just made up. -// -// -UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { - { BOXDRAW_HORIZONTAL, 0xc4, L'-' }, - { BOXDRAW_VERTICAL, 0xb3, L'|' }, - { BOXDRAW_DOWN_RIGHT, 0xda, L'/' }, - { BOXDRAW_DOWN_LEFT, 0xbf, L'\\' }, - { BOXDRAW_UP_RIGHT, 0xc0, L'\\' }, - { BOXDRAW_UP_LEFT, 0xd9, L'/' }, - { BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|' }, - { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|' }, - { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+' }, - { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+' }, - { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+' }, - { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-' }, - { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|' }, - { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/' }, - { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/' }, - { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/' }, - { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\' }, - { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\' }, - { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\' }, - { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\' }, - { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\' }, - { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\' }, - { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/' }, - { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/' }, - { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/' }, - { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|' }, - { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|' }, - { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|' }, - { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|' }, - { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|' }, - { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|' }, - { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+' }, - { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+' }, - { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+' }, - { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+' }, - { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+' }, - { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+' }, - { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+' }, - { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+' }, - { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+' }, - - { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*' }, - { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+' }, - - { GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^' }, - { GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>' }, - { GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v' }, - { GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<' }, - - { ARROW_LEFT, 0x3c, L'<' }, - { ARROW_UP, 0x18, L'^' }, - { ARROW_RIGHT, 0x3e, L'>' }, - { ARROW_DOWN, 0x19, L'v' }, - - { 0x0000, 0x00, L'\0' } -}; - -CHAR16 mSetModeString[] = { ESC, '[', '=', '3', 'h', 0 }; -CHAR16 mSetAttributeString[] = { ESC, '[', '0', 'm', ESC, '[', '4', '0', 'm', ESC, '[', '4', '0', 'm', 0 }; -CHAR16 mClearScreenString[] = { ESC, '[', '2', 'J', 0 }; -CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 }; - -// -// Body of the ConOut functions -// - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset(). - - If ExtendeVerification is TRUE, then perform dependent serial device reset, - and set display mode to mode 0. - If ExtendedVerification is FALSE, only set display mode to mode 0. - - @param This Indicates the calling context. - @param ExtendedVerification Indicates that the driver may perform a more - exhaustive verification operation of the device - during reset. - - @retval EFI_SUCCESS The reset operation succeeds. - @retval EFI_DEVICE_ERROR The terminal is not functioning correctly or the serial port reset fails. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutReset ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN BOOLEAN ExtendedVerification - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - // - // Perform a more exhaustive reset by resetting the serial port. - // - if (ExtendedVerification) { - // - // Report progress code here - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_PROGRESS_CODE, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_PC_RESET), - TerminalDevice->DevicePath - ); - - Status = TerminalDevice->SerialIo->Reset (TerminalDevice->SerialIo); - if (EFI_ERROR (Status)) { - // - // Report error code here - // - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE | EFI_ERROR_MINOR, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_CONTROLLER_ERROR), - TerminalDevice->DevicePath - ); - - return Status; - } - } - - This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BLACK)); - - Status = This->SetMode (This, 0); - - return Status; -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString(). - - The Unicode string will be converted to terminal expressible data stream - and send to terminal via serial port. - - @param This Indicates the calling context. - @param WString The Null-terminated Unicode string to be displayed - on the terminal screen. - - @retval EFI_SUCCESS The string is output successfully. - @retval EFI_DEVICE_ERROR The serial port fails to send the string out. - @retval EFI_WARN_UNKNOWN_GLYPH Indicates that some of the characters in the Unicode string could not - be rendered and are skipped. - @retval EFI_UNSUPPORTED If current display mode is out of range. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutOutputString ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN CHAR16 *WString - ) -{ - TERMINAL_DEV *TerminalDevice; - EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; - UINTN MaxColumn; - UINTN MaxRow; - UINTN Length; - UTF8_CHAR Utf8Char; - CHAR8 GraphicChar; - CHAR8 AsciiChar; - EFI_STATUS Status; - UINT8 ValidBytes; - // - // flag used to indicate whether condition happens which will cause - // return EFI_WARN_UNKNOWN_GLYPH - // - BOOLEAN Warning; - - ValidBytes = 0; - Warning = FALSE; - AsciiChar = 0; - - // - // get Terminal device data structure pointer. - // - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - // - // Get current display mode - // - Mode = This->Mode; - - if (Mode->Mode >= Mode->MaxMode) { - return EFI_UNSUPPORTED; - } - - This->QueryMode ( - This, - Mode->Mode, - &MaxColumn, - &MaxRow - ); - - for (; *WString != CHAR_NULL; WString++) { - - switch (TerminalDevice->TerminalType) { - - case PCANSITYPE: - case VT100TYPE: - case VT100PLUSTYPE: - case TTYTERMTYPE: - - if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) { - // - // If it's not a graphic character convert Unicode to ASCII. - // - GraphicChar = (CHAR8) *WString; - - if (!(TerminalIsValidAscii (GraphicChar) || TerminalIsValidEfiCntlChar (GraphicChar))) { - // - // when this driver use the OutputString to output control string, - // TerminalDevice->OutputEscChar is set to let the Esc char - // to be output to the terminal emulation software. - // - if ((GraphicChar == 27) && TerminalDevice->OutputEscChar) { - GraphicChar = 27; - } else { - GraphicChar = '?'; - Warning = TRUE; - } - } - - AsciiChar = GraphicChar; - - } - - if (TerminalDevice->TerminalType != PCANSITYPE) { - GraphicChar = AsciiChar; - } - - Length = 1; - - Status = TerminalDevice->SerialIo->Write ( - TerminalDevice->SerialIo, - &Length, - &GraphicChar - ); - - if (EFI_ERROR (Status)) { - goto OutputError; - } - - break; - - case VTUTF8TYPE: - UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); - Length = ValidBytes; - Status = TerminalDevice->SerialIo->Write ( - TerminalDevice->SerialIo, - &Length, - (UINT8 *) &Utf8Char - ); - if (EFI_ERROR (Status)) { - goto OutputError; - } - break; - } - // - // Update cursor position. - // - switch (*WString) { - - case CHAR_BACKSPACE: - if (Mode->CursorColumn > 0) { - Mode->CursorColumn--; - } - break; - - case CHAR_LINEFEED: - if (Mode->CursorRow < (INT32) (MaxRow - 1)) { - Mode->CursorRow++; - } - break; - - case CHAR_CARRIAGE_RETURN: - Mode->CursorColumn = 0; - break; - - default: - if (Mode->CursorColumn < (INT32) (MaxColumn - 1)) { - - Mode->CursorColumn++; - - } else { - - Mode->CursorColumn = 0; - if (Mode->CursorRow < (INT32) (MaxRow - 1)) { - Mode->CursorRow++; - } - - } - break; - - }; - - } - - if (Warning) { - return EFI_WARN_UNKNOWN_GLYPH; - } - - return EFI_SUCCESS; - -OutputError: - REPORT_STATUS_CODE_WITH_DEVICE_PATH ( - EFI_ERROR_CODE | EFI_ERROR_MINOR, - (EFI_PERIPHERAL_REMOTE_CONSOLE | EFI_P_EC_OUTPUT_ERROR), - TerminalDevice->DevicePath - ); - - return EFI_DEVICE_ERROR; -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString(). - - If one of the characters in the *Wstring is - neither valid Unicode drawing characters, - not ASCII code, then this function will return - EFI_UNSUPPORTED. - - @param This Indicates the calling context. - @param WString The Null-terminated Unicode string to be tested. - - @retval EFI_SUCCESS The terminal is capable of rendering the output string. - @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be rendered. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutTestString ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN CHAR16 *WString - ) -{ - TERMINAL_DEV *TerminalDevice; - EFI_STATUS Status; - - // - // get Terminal device data structure pointer. - // - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - switch (TerminalDevice->TerminalType) { - - case PCANSITYPE: - case VT100TYPE: - case VT100PLUSTYPE: - case TTYTERMTYPE: - Status = AnsiTestString (TerminalDevice, WString); - break; - - case VTUTF8TYPE: - Status = VTUTF8TestString (TerminalDevice, WString); - break; - - default: - Status = EFI_UNSUPPORTED; - break; - } - - return Status; -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode(). - - It returns information for an available text mode - that the terminal supports. - - @param This Indicates the calling context. - @param ModeNumber The mode number to return information on. - @param Columns The returned columns of the requested mode. - @param Rows The returned rows of the requested mode. - - @retval EFI_SUCCESS The requested mode information is returned. - @retval EFI_UNSUPPORTED The mode number is not valid. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutQueryMode ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN ModeNumber, - OUT UINTN *Columns, - OUT UINTN *Rows - ) -{ - TERMINAL_DEV *TerminalDevice; - - if (ModeNumber >= (UINTN) This->Mode->MaxMode) { - return EFI_UNSUPPORTED; - } - - // - // Get Terminal device data structure pointer. - // - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - *Columns = TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns; - *Rows = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows; - - return EFI_SUCCESS; -} - - -/** - Implements EFI_SIMPLE_TEXT_OUT.SetMode(). - - Set the terminal to a specified display mode. - In this driver, we only support mode 0. - - @param This Indicates the calling context. - @param ModeNumber The text mode to set. - - @retval EFI_SUCCESS The requested text mode is set. - @retval EFI_DEVICE_ERROR The requested text mode cannot be set - because of serial device error. - @retval EFI_UNSUPPORTED The text mode number is not valid. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetMode ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN ModeNumber - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - // - // get Terminal device data structure pointer. - // - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - if (ModeNumber >= (UINTN) This->Mode->MaxMode) { - return EFI_UNSUPPORTED; - } - - // - // Set the current mode - // - This->Mode->Mode = (INT32) ModeNumber; - - This->ClearScreen (This); - - TerminalDevice->OutputEscChar = TRUE; - Status = This->OutputString (This, mSetModeString); - TerminalDevice->OutputEscChar = FALSE; - - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - This->Mode->Mode = (INT32) ModeNumber; - - Status = This->ClearScreen (This); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; - -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute(). - - @param This Indicates the calling context. - @param Attribute The attribute to set. Only bit0..6 are valid, all other bits - are undefined and must be zero. - - @retval EFI_SUCCESS The requested attribute is set. - @retval EFI_DEVICE_ERROR The requested attribute cannot be set due to serial port error. - @retval EFI_UNSUPPORTED The attribute requested is not defined by EFI spec. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetAttribute ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN Attribute - ) -{ - UINT8 ForegroundControl; - UINT8 BackgroundControl; - UINT8 BrightControl; - INT32 SavedColumn; - INT32 SavedRow; - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - SavedColumn = 0; - SavedRow = 0; - - // - // get Terminal device data structure pointer. - // - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - // - // only the bit0..6 of the Attribute is valid - // - if ((Attribute | 0x7f) != 0x7f) { - return EFI_UNSUPPORTED; - } - - // - // Skip outputting the command string for the same attribute - // It improves the terminal performance significantly - // - if (This->Mode->Attribute == (INT32) Attribute) { - return EFI_SUCCESS; - } - - // - // convert Attribute value to terminal emulator - // understandable foreground color - // - switch (Attribute & 0x07) { - - case EFI_BLACK: - ForegroundControl = 30; - break; - - case EFI_BLUE: - ForegroundControl = 34; - break; - - case EFI_GREEN: - ForegroundControl = 32; - break; - - case EFI_CYAN: - ForegroundControl = 36; - break; - - case EFI_RED: - ForegroundControl = 31; - break; - - case EFI_MAGENTA: - ForegroundControl = 35; - break; - - case EFI_BROWN: - ForegroundControl = 33; - break; - - default: - - case EFI_LIGHTGRAY: - ForegroundControl = 37; - break; - - } - // - // bit4 of the Attribute indicates bright control - // of terminal emulator. - // - BrightControl = (UINT8) ((Attribute >> 3) & 1); - - // - // convert Attribute value to terminal emulator - // understandable background color. - // - switch ((Attribute >> 4) & 0x07) { - - case EFI_BLACK: - BackgroundControl = 40; - break; - - case EFI_BLUE: - BackgroundControl = 44; - break; - - case EFI_GREEN: - BackgroundControl = 42; - break; - - case EFI_CYAN: - BackgroundControl = 46; - break; - - case EFI_RED: - BackgroundControl = 41; - break; - - case EFI_MAGENTA: - BackgroundControl = 45; - break; - - case EFI_BROWN: - BackgroundControl = 43; - break; - - default: - - case EFI_LIGHTGRAY: - BackgroundControl = 47; - break; - } - // - // terminal emulator's control sequence to set attributes - // - mSetAttributeString[BRIGHT_CONTROL_OFFSET] = (CHAR16) ('0' + BrightControl); - mSetAttributeString[FOREGROUND_CONTROL_OFFSET + 0] = (CHAR16) ('0' + (ForegroundControl / 10)); - mSetAttributeString[FOREGROUND_CONTROL_OFFSET + 1] = (CHAR16) ('0' + (ForegroundControl % 10)); - mSetAttributeString[BACKGROUND_CONTROL_OFFSET + 0] = (CHAR16) ('0' + (BackgroundControl / 10)); - mSetAttributeString[BACKGROUND_CONTROL_OFFSET + 1] = (CHAR16) ('0' + (BackgroundControl % 10)); - - // - // save current column and row - // for future scrolling back use. - // - SavedColumn = This->Mode->CursorColumn; - SavedRow = This->Mode->CursorRow; - - TerminalDevice->OutputEscChar = TRUE; - Status = This->OutputString (This, mSetAttributeString); - TerminalDevice->OutputEscChar = FALSE; - - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - // - // scroll back to saved cursor position. - // - This->Mode->CursorColumn = SavedColumn; - This->Mode->CursorRow = SavedRow; - - This->Mode->Attribute = (INT32) Attribute; - - return EFI_SUCCESS; - -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen(). - It clears the ANSI terminal's display to the - currently selected background color. - - @param This Indicates the calling context. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_DEVICE_ERROR The terminal screen cannot be cleared due to serial port error. - @retval EFI_UNSUPPORTED The terminal is not in a valid display mode. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutClearScreen ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This - ) -{ - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - // - // control sequence for clear screen request - // - TerminalDevice->OutputEscChar = TRUE; - Status = This->OutputString (This, mClearScreenString); - TerminalDevice->OutputEscChar = FALSE; - - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Status = This->SetCursorPosition (This, 0, 0); - - return Status; -} - - -/** - Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition(). - - @param This Indicates the calling context. - @param Column The row to set cursor to. - @param Row The column to set cursor to. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_DEVICE_ERROR The request fails due to serial port error. - @retval EFI_UNSUPPORTED The terminal is not in a valid text mode, or the cursor position - is invalid for current mode. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutSetCursorPosition ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN UINTN Column, - IN UINTN Row - ) -{ - EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; - UINTN MaxColumn; - UINTN MaxRow; - EFI_STATUS Status; - TERMINAL_DEV *TerminalDevice; - - TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); - - // - // get current mode - // - Mode = This->Mode; - - // - // get geometry of current mode - // - Status = This->QueryMode ( - This, - Mode->Mode, - &MaxColumn, - &MaxRow - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - if (Column >= MaxColumn || Row >= MaxRow) { - return EFI_UNSUPPORTED; - } - // - // control sequence to move the cursor - // - mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16) ('0' + ((Row + 1) / 10)); - mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16) ('0' + ((Row + 1) % 10)); - mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16) ('0' + ((Column + 1) / 10)); - mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16) ('0' + ((Column + 1) % 10)); - - TerminalDevice->OutputEscChar = TRUE; - Status = This->OutputString (This, mSetCursorPositionString); - TerminalDevice->OutputEscChar = FALSE; - - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - // - // update current cursor position - // in the Mode data structure. - // - Mode->CursorColumn = (INT32) Column; - Mode->CursorRow = (INT32) Row; - - return EFI_SUCCESS; -} - - -/** - Implements SIMPLE_TEXT_OUTPUT.EnableCursor(). - - In this driver, the cursor cannot be hidden. - - @param This Indicates the calling context. - @param Visible If TRUE, the cursor is set to be visible, - If FALSE, the cursor is set to be invisible. - - @retval EFI_SUCCESS The request is valid. - @retval EFI_UNSUPPORTED The terminal does not support cursor hidden. - -**/ -EFI_STATUS -EFIAPI -TerminalConOutEnableCursor ( - IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, - IN BOOLEAN Visible - ) -{ - if (!Visible) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - - -/** - Detects if a Unicode char is for Box Drawing text graphics. - - @param Graphic Unicode char to test. - @param PcAnsi Optional pointer to return PCANSI equivalent of - Graphic. - @param Ascii Optional pointer to return ASCII equivalent of - Graphic. - - @retval TRUE If Graphic is a supported Unicode Box Drawing character. - -**/ -BOOLEAN -TerminalIsValidTextGraphics ( - IN CHAR16 Graphic, - OUT CHAR8 *PcAnsi, OPTIONAL - OUT CHAR8 *Ascii OPTIONAL - ) -{ - UNICODE_TO_CHAR *Table; - - if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { - // - // Unicode drawing code charts are all in the 0x25xx range, - // arrows are 0x21xx - // - return FALSE; - } - - for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { - if (Graphic == Table->Unicode) { - if (PcAnsi != NULL) { - *PcAnsi = Table->PcAnsi; - } - - if (Ascii != NULL) { - *Ascii = Table->Ascii; - } - - return TRUE; - } - } - - return FALSE; -} - -/** - Detects if a valid ASCII char. - - @param Ascii An ASCII character. - - @retval TRUE If it is a valid ASCII character. - @retval FALSE If it is not a valid ASCII character. - -**/ -BOOLEAN -TerminalIsValidAscii ( - IN CHAR16 Ascii - ) -{ - // - // valid ascii code lies in the extent of 0x20 ~ 0x7f - // - if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { - return TRUE; - } - - return FALSE; -} - -/** - Detects if a valid EFI control character. - - @param CharC An input EFI Control character. - - @retval TRUE If it is a valid EFI control character. - @retval FALSE If it is not a valid EFI control character. - -**/ -BOOLEAN -TerminalIsValidEfiCntlChar ( - IN CHAR16 CharC - ) -{ - // - // only support four control characters. - // - if (CharC == CHAR_NULL || - CharC == CHAR_BACKSPACE || - CharC == CHAR_LINEFEED || - CharC == CHAR_CARRIAGE_RETURN || - CharC == CHAR_TAB - ) { - return TRUE; - } - - return FALSE; -} diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf deleted file mode 100644 index 0780296798..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf +++ /dev/null @@ -1,99 +0,0 @@ -## @file -# Terminal module installs Simple Text Input(ex)/Out protocols for serial devices. -# -# This module will install Simple Text Input (Ex) protocol and Simple Test Output -# protocols based on Serial I/O protocol for serial devices including hotplug serial -# devices. -# -# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
-# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = TerminalDxe - MODULE_UNI_FILE = TerminalDxe.uni - FILE_GUID = 9E863906-A40F-4875-977F-5B93FF237FC6 - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = InitializeTerminal - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# -# DRIVER_BINDING = gTerminalDriverBinding -# COMPONENT_NAME = gTerminalComponentName -# COMPONENT_NAME2 = gTerminalComponentName2 -# - -[Sources] - ComponentName.c - Vtutf8.c - Ansi.c - TerminalConOut.c - TerminalConIn.c - Terminal.c - Terminal.h - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - DevicePathLib - UefiRuntimeServicesTableLib - UefiBootServicesTableLib - MemoryAllocationLib - BaseMemoryLib - ReportStatusCodeLib - UefiLib - UefiDriverEntryPoint - DebugLib - PcdLib - BaseLib - -[Guids] - ## SOMETIMES_PRODUCES ## Variable:L"ConInDev" - ## SOMETIMES_CONSUMES ## Variable:L"ConInDev" - ## SOMETIMES_PRODUCES ## Variable:L"ConOutDev" - ## SOMETIMES_CONSUMES ## Variable:L"ConOutDev" - ## SOMETIMES_PRODUCES ## Variable:L"ErrOutDev" - ## SOMETIMES_CONSUMES ## Variable:L"ErrOutDev" - gEfiGlobalVariableGuid - gEfiVTUTF8Guid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path - gEfiVT100Guid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path - gEfiVT100PlusGuid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path - gEfiPcAnsiGuid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path - gEfiTtyTermGuid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path - gEdkiiStatusCodeDataTypeVariableGuid ## SOMETIMES_CONSUMES ## GUID - -[Protocols] - gEfiSerialIoProtocolGuid ## TO_START - ## BY_START - ## TO_START - gEfiDevicePathProtocolGuid - gEfiSimpleTextInProtocolGuid ## BY_START - gEfiSimpleTextInputExProtocolGuid ## BY_START - gEfiSimpleTextOutProtocolGuid ## BY_START - -[Pcd] - gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType ## SOMETIMES_CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## CONSUMES - -# [Event] -# # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout. -# EVENT_TYPE_RELATIVE_TIMER ## CONSUMES -# # Period timer event to invoke TerminalConInTimerHandler(), period value is KEYBOARD_TIMER_INTERVAL and used to poll the key from serial -# EVENT_TYPE_PERIODIC_TIMER ## CONSUMES - -[UserExtensions.TianoCore."ExtraFiles"] - TerminalDxeExtra.uni diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.uni b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.uni deleted file mode 100644 index 667ec097de..0000000000 Binary files a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.uni and /dev/null differ diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxeExtra.uni b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxeExtra.uni deleted file mode 100644 index c26e92b060..0000000000 Binary files a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxeExtra.uni and /dev/null differ diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Vtutf8.c b/MdeModulePkg/Universal/Console/TerminalDxe/Vtutf8.c deleted file mode 100644 index 586e8ab769..0000000000 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Vtutf8.c +++ /dev/null @@ -1,328 +0,0 @@ -/** @file - Implementation of translation upon VT-UTF8. - -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Terminal.h" - -/** - Translate all VT-UTF8 characters in the Raw FIFI into unicode characters, - and insert them into Unicode FIFO. - - @param TerminalDevice The terminal device. - -**/ -VOID -VTUTF8RawDataToUnicode ( - IN TERMINAL_DEV *TerminalDevice - ) -{ - UTF8_CHAR Utf8Char; - UINT8 ValidBytes; - UINT16 UnicodeChar; - - ValidBytes = 0; - // - // pop the raw data out from the raw fifo, - // and translate it into unicode, then push - // the unicode into unicode fifo, until the raw fifo is empty. - // - while (!IsRawFiFoEmpty (TerminalDevice) && !IsUnicodeFiFoFull (TerminalDevice)) { - - GetOneValidUtf8Char (TerminalDevice, &Utf8Char, &ValidBytes); - - if (ValidBytes < 1 || ValidBytes > 3) { - continue; - } - - Utf8ToUnicode (Utf8Char, ValidBytes, (CHAR16 *) &UnicodeChar); - - UnicodeFiFoInsertOneKey (TerminalDevice, UnicodeChar); - } -} - -/** - Get one valid VT-UTF8 characters set from Raw Data FIFO. - - @param Utf8Device The terminal device. - @param Utf8Char Returned valid VT-UTF8 characters set. - @param ValidBytes The count of returned VT-VTF8 characters. - If ValidBytes is zero, no valid VT-UTF8 returned. - -**/ -VOID -GetOneValidUtf8Char ( - IN TERMINAL_DEV *Utf8Device, - OUT UTF8_CHAR *Utf8Char, - OUT UINT8 *ValidBytes - ) -{ - UINT8 Temp; - UINT8 Index; - BOOLEAN FetchFlag; - - Temp = 0; - Index = 0; - FetchFlag = TRUE; - - // - // if no valid Utf8 char is found in the RawFiFo, - // then *ValidBytes will be zero. - // - *ValidBytes = 0; - - while (!IsRawFiFoEmpty (Utf8Device)) { - - RawFiFoRemoveOneKey (Utf8Device, &Temp); - - switch (*ValidBytes) { - - case 0: - if ((Temp & 0x80) == 0) { - // - // one-byte utf8 char - // - *ValidBytes = 1; - - Utf8Char->Utf8_1 = Temp; - - FetchFlag = FALSE; - - } else if ((Temp & 0xe0) == 0xc0) { - // - // two-byte utf8 char - // - *ValidBytes = 2; - - Utf8Char->Utf8_2[1] = Temp; - - } else if ((Temp & 0xf0) == 0xe0) { - // - // three-byte utf8 char - // - *ValidBytes = 3; - - Utf8Char->Utf8_3[2] = Temp; - - Index++; - - } else { - // - // reset *ValidBytes to zero, let valid utf8 char search restart - // - *ValidBytes = 0; - } - - break; - - case 2: - // - // two-byte utf8 char go on - // - if ((Temp & 0xc0) == 0x80) { - - Utf8Char->Utf8_2[0] = Temp; - - FetchFlag = FALSE; - - } else { - - *ValidBytes = 0; - } - break; - - case 3: - // - // three-byte utf8 char go on - // - if ((Temp & 0xc0) == 0x80) { - if (Index == 1) { - Utf8Char->Utf8_3[1] = Temp; - Index++; - } else { - Utf8Char->Utf8_3[0] = Temp; - FetchFlag = FALSE; - } - } else { - // - // reset *ValidBytes and Index to zero, let valid utf8 char search restart - // - *ValidBytes = 0; - Index = 0; - } - break; - - default: - break; - } - - if (!FetchFlag) { - break; - } - } - - return ; -} - -/** - Translate VT-UTF8 characters into one Unicode character. - - UTF8 Encoding Table - Bits per Character | Unicode Character Range | Unicode Binary Encoding | UTF8 Binary Encoding - 0-7 | 0x0000 - 0x007F | 00000000 0xxxxxxx | 0xxxxxxx - 8-11 | 0x0080 - 0x07FF | 00000xxx xxxxxxxx | 110xxxxx 10xxxxxx - 12-16 | 0x0800 - 0xFFFF | xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx - - - @param Utf8Char VT-UTF8 character set needs translating. - @param ValidBytes The count of valid VT-UTF8 characters. - @param UnicodeChar Returned unicode character. - -**/ -VOID -Utf8ToUnicode ( - IN UTF8_CHAR Utf8Char, - IN UINT8 ValidBytes, - OUT CHAR16 *UnicodeChar - ) -{ - UINT8 UnicodeByte0; - UINT8 UnicodeByte1; - UINT8 Byte0; - UINT8 Byte1; - UINT8 Byte2; - - *UnicodeChar = 0; - - // - // translate utf8 code to unicode, in terminal standard, - // up to 3 bytes utf8 code is supported. - // - switch (ValidBytes) { - case 1: - // - // one-byte utf8 code - // - *UnicodeChar = (UINT16) Utf8Char.Utf8_1; - break; - - case 2: - // - // two-byte utf8 code - // - Byte0 = Utf8Char.Utf8_2[0]; - Byte1 = Utf8Char.Utf8_2[1]; - - UnicodeByte0 = (UINT8) ((Byte1 << 6) | (Byte0 & 0x3f)); - UnicodeByte1 = (UINT8) ((Byte1 >> 2) & 0x07); - *UnicodeChar = (UINT16) (UnicodeByte0 | (UnicodeByte1 << 8)); - break; - - case 3: - // - // three-byte utf8 code - // - Byte0 = Utf8Char.Utf8_3[0]; - Byte1 = Utf8Char.Utf8_3[1]; - Byte2 = Utf8Char.Utf8_3[2]; - - UnicodeByte0 = (UINT8) ((Byte1 << 6) | (Byte0 & 0x3f)); - UnicodeByte1 = (UINT8) ((Byte2 << 4) | ((Byte1 >> 2) & 0x0f)); - *UnicodeChar = (UINT16) (UnicodeByte0 | (UnicodeByte1 << 8)); - - default: - break; - } - - return ; -} - -/** - Translate one Unicode character into VT-UTF8 characters. - - UTF8 Encoding Table - Bits per Character | Unicode Character Range | Unicode Binary Encoding | UTF8 Binary Encoding - 0-7 | 0x0000 - 0x007F | 00000000 0xxxxxxx | 0xxxxxxx - 8-11 | 0x0080 - 0x07FF | 00000xxx xxxxxxxx | 110xxxxx 10xxxxxx - 12-16 | 0x0800 - 0xFFFF | xxxxxxxx xxxxxxxx | 1110xxxx 10xxxxxx 10xxxxxx - - - @param Unicode Unicode character need translating. - @param Utf8Char Return VT-UTF8 character set. - @param ValidBytes The count of valid VT-UTF8 characters. If - ValidBytes is zero, no valid VT-UTF8 returned. - -**/ -VOID -UnicodeToUtf8 ( - IN CHAR16 Unicode, - OUT UTF8_CHAR *Utf8Char, - OUT UINT8 *ValidBytes - ) -{ - UINT8 UnicodeByte0; - UINT8 UnicodeByte1; - // - // translate unicode to utf8 code - // - UnicodeByte0 = (UINT8) Unicode; - UnicodeByte1 = (UINT8) (Unicode >> 8); - - if (Unicode < 0x0080) { - - Utf8Char->Utf8_1 = (UINT8) (UnicodeByte0 & 0x7f); - *ValidBytes = 1; - - } else if (Unicode < 0x0800) { - // - // byte sequence: high -> low - // Utf8_2[0], Utf8_2[1] - // - Utf8Char->Utf8_2[1] = (UINT8) ((UnicodeByte0 & 0x3f) + 0x80); - Utf8Char->Utf8_2[0] = (UINT8) ((((UnicodeByte1 << 2) + (UnicodeByte0 >> 6)) & 0x1f) + 0xc0); - - *ValidBytes = 2; - - } else { - // - // byte sequence: high -> low - // Utf8_3[0], Utf8_3[1], Utf8_3[2] - // - Utf8Char->Utf8_3[2] = (UINT8) ((UnicodeByte0 & 0x3f) + 0x80); - Utf8Char->Utf8_3[1] = (UINT8) ((((UnicodeByte1 << 2) + (UnicodeByte0 >> 6)) & 0x3f) + 0x80); - Utf8Char->Utf8_3[0] = (UINT8) (((UnicodeByte1 >> 4) & 0x0f) + 0xe0); - - *ValidBytes = 3; - } -} - - -/** - Check if input string is valid VT-UTF8 string. - - @param TerminalDevice The terminal device. - @param WString The input string. - - @retval EFI_SUCCESS If all input characters are valid. - -**/ -EFI_STATUS -VTUTF8TestString ( - IN TERMINAL_DEV *TerminalDevice, - IN CHAR16 *WString - ) -{ - // - // to utf8, all kind of characters are supported. - // - return EFI_SUCCESS; -} -- cgit v1.2.3