Add "TtyTerm" terminal type to TerminalDxe

This patch a adds new terminal type, TtyTerm, to TerminalDxe.  This terminal
type provides a place to add support for various *nix terminals that don't
behave like standard VT terminals.  The goal is to 'just work' with as many
terminals as possible, rather than properly emulating any one specific
terminal.

Signed-off-by: Roy Franz <roy.franz@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Feng Tian <feng.tian@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17895 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Roy Franz 2015-07-09 06:24:11 +00:00 committed by lersek
parent 4dc0d578b8
commit 6e3227c88c
7 changed files with 73 additions and 8 deletions

View File

@ -0,0 +1,25 @@
/** @file
GUID definition for TtyTerm terminal type. The TtyTerm terminal aims to
provide support for modern *nix terminals.
Copyright (c) 2015 Linaro Ltd.
This program and the accompanying materials are licensed and made
available under the terms and conditions of the BSD License that
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 __TTYTERM_H__
#define __TTYTERM_H__
#define EFI_TTY_TERM_GUID \
{0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 } }
extern EFI_GUID gEfiTtyTermGuid;
#endif

View File

@ -308,6 +308,9 @@
gLzmaCustomDecompressGuid = { 0xEE4E5898, 0x3914, 0x4259, { 0x9D, 0x6E, 0xDC, 0x7B, 0xD7, 0x94, 0x03, 0xCF }} gLzmaCustomDecompressGuid = { 0xEE4E5898, 0x3914, 0x4259, { 0x9D, 0x6E, 0xDC, 0x7B, 0xD7, 0x94, 0x03, 0xCF }}
gLzmaF86CustomDecompressGuid = { 0xD42AE6BD, 0x1352, 0x4bfb, { 0x90, 0x9A, 0xCA, 0x72, 0xA6, 0xEA, 0xE8, 0x89 }} gLzmaF86CustomDecompressGuid = { 0xD42AE6BD, 0x1352, 0x4bfb, { 0x90, 0x9A, 0xCA, 0x72, 0xA6, 0xEA, 0xE8, 0x89 }}
## Include/Guid/TtyTerm.h
gEfiTtyTermGuid = { 0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 }}
[Ppis] [Ppis]
## Include/Ppi/AtaController.h ## Include/Ppi/AtaController.h
gPeiAtaControllerPpiGuid = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }} gPeiAtaControllerPpiGuid = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}

View File

@ -33,7 +33,8 @@ EFI_GUID *gTerminalType[] = {
&gEfiPcAnsiGuid, &gEfiPcAnsiGuid,
&gEfiVT100Guid, &gEfiVT100Guid,
&gEfiVT100PlusGuid, &gEfiVT100PlusGuid,
&gEfiVTUTF8Guid &gEfiVTUTF8Guid,
&gEfiTtyTermGuid
}; };
@ -152,12 +153,13 @@ TerminalDriverBindingSupported (
} }
// //
// only supports PC ANSI, VT100, VT100+ and VT-UTF8 terminal types // only supports PC ANSI, VT100, VT100+, VT-UTF8, and TtyTerm terminal types
// //
if (!CompareGuid (&Node->Guid, &gEfiPcAnsiGuid) && if (!CompareGuid (&Node->Guid, &gEfiPcAnsiGuid) &&
!CompareGuid (&Node->Guid, &gEfiVT100Guid) && !CompareGuid (&Node->Guid, &gEfiVT100Guid) &&
!CompareGuid (&Node->Guid, &gEfiVT100PlusGuid) && !CompareGuid (&Node->Guid, &gEfiVT100PlusGuid) &&
!CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) { !CompareGuid (&Node->Guid, &gEfiVTUTF8Guid) &&
!CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -275,6 +277,10 @@ BuildTerminalDevpath (
TerminalType = VTUTF8TYPE; TerminalType = VTUTF8TYPE;
} else if (CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) {
TerminalType = TTYTERMTYPE;
} else { } else {
return NULL; return NULL;
} }
@ -708,9 +714,9 @@ TerminalDriverBindingStart (
TerminalType = PcdGet8 (PcdDefaultTerminalType); TerminalType = PcdGet8 (PcdDefaultTerminalType);
// //
// Must be between PCANSITYPE (0) and VTUTF8TYPE (3) // Must be between PCANSITYPE (0) and TTYTERMTYPE (4)
// //
ASSERT (TerminalType <= VTUTF8TYPE); ASSERT (TerminalType <= TTYTERMTYPE);
CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID)); CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));
RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DefaultNode; RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DefaultNode;
@ -728,6 +734,8 @@ TerminalDriverBindingStart (
TerminalType = VT100PLUSTYPE; TerminalType = VT100PLUSTYPE;
} else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) { } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {
TerminalType = VTUTF8TYPE; TerminalType = VTUTF8TYPE;
} else if (CompareGuid (&Node->Guid, &gEfiTtyTermGuid)) {
TerminalType = TTYTERMTYPE;
} else { } else {
goto Error; goto Error;
} }
@ -926,6 +934,24 @@ TerminalDriverBindingStart (
); );
break; 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;
} }
// //
@ -1441,7 +1467,7 @@ TerminalUpdateConsoleDevVariable (
// //
// Append terminal device path onto the variable. // Append terminal device path onto the variable.
// //
for (TerminalType = PCANSITYPE; TerminalType <= VTUTF8TYPE; TerminalType++) { for (TerminalType = PCANSITYPE; TerminalType <= TTYTERMTYPE; TerminalType++) {
SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath); SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);
NewVariable = AppendDevicePathInstance (Variable, TempDevicePath); NewVariable = AppendDevicePathInstance (Variable, TempDevicePath);
ASSERT (NewVariable != NULL); ASSERT (NewVariable != NULL);
@ -1554,7 +1580,7 @@ TerminalRemoveConsoleDevVariable (
// Loop through all the terminal types that this driver supports // Loop through all the terminal types that this driver supports
// //
Match = FALSE; Match = FALSE;
for (TerminalType = PCANSITYPE; TerminalType <= VTUTF8TYPE; TerminalType++) { for (TerminalType = PCANSITYPE; TerminalType <= TTYTERMTYPE; TerminalType++) {
SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath); SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);
@ -1658,6 +1684,10 @@ SetTerminalDevicePath (
CopyGuid (&Node.Guid, &gEfiVTUTF8Guid); CopyGuid (&Node.Guid, &gEfiVTUTF8Guid);
break; break;
case TTYTERMTYPE:
CopyGuid (&Node.Guid, &gEfiTtyTermGuid);
break;
default: default:
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }

View File

@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Guid/GlobalVariable.h> #include <Guid/GlobalVariable.h>
#include <Guid/PcAnsi.h> #include <Guid/PcAnsi.h>
#include <Guid/TtyTerm.h>
#include <Guid/StatusCodeDataTypeVariable.h> #include <Guid/StatusCodeDataTypeVariable.h>
#include <Protocol/SimpleTextOut.h> #include <Protocol/SimpleTextOut.h>
@ -136,6 +137,7 @@ typedef union {
#define VT100TYPE 1 #define VT100TYPE 1
#define VT100PLUSTYPE 2 #define VT100PLUSTYPE 2
#define VTUTF8TYPE 3 #define VTUTF8TYPE 3
#define TTYTERMTYPE 4
#define LEFTOPENBRACKET 0x5b // '[' #define LEFTOPENBRACKET 0x5b // '['
#define ACAP 0x41 #define ACAP 0x41

View File

@ -454,6 +454,7 @@ TranslateRawDataToEfiKey (
case PCANSITYPE: case PCANSITYPE:
case VT100TYPE: case VT100TYPE:
case VT100PLUSTYPE: case VT100PLUSTYPE:
case TTYTERMTYPE:
AnsiRawDataToUnicode (TerminalDevice); AnsiRawDataToUnicode (TerminalDevice);
UnicodeToEfiKey (TerminalDevice); UnicodeToEfiKey (TerminalDevice);
break; break;
@ -1393,7 +1394,8 @@ UnicodeToEfiKey (
if (TerminalDevice->TerminalType == PCANSITYPE || if (TerminalDevice->TerminalType == PCANSITYPE ||
TerminalDevice->TerminalType == VT100TYPE || TerminalDevice->TerminalType == VT100TYPE ||
TerminalDevice->TerminalType == VT100PLUSTYPE || TerminalDevice->TerminalType == VT100PLUSTYPE ||
TerminalDevice->TerminalType == VTUTF8TYPE) { TerminalDevice->TerminalType == VTUTF8TYPE ||
TerminalDevice->TerminalType == TTYTERMTYPE) {
switch (UnicodeChar) { switch (UnicodeChar) {
case 'A': case 'A':
Key.ScanCode = SCAN_UP; Key.ScanCode = SCAN_UP;

View File

@ -223,6 +223,7 @@ TerminalConOutOutputString (
case PCANSITYPE: case PCANSITYPE:
case VT100TYPE: case VT100TYPE:
case VT100PLUSTYPE: case VT100PLUSTYPE:
case TTYTERMTYPE:
if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) { if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {
// //
@ -371,6 +372,7 @@ TerminalConOutTestString (
case PCANSITYPE: case PCANSITYPE:
case VT100TYPE: case VT100TYPE:
case VT100PLUSTYPE: case VT100PLUSTYPE:
case TTYTERMTYPE:
Status = AnsiTestString (TerminalDevice, WString); Status = AnsiTestString (TerminalDevice, WString);
break; break;

View File

@ -73,6 +73,7 @@
gEfiVT100Guid ## 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 gEfiVT100PlusGuid ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path
gEfiPcAnsiGuid ## 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 gEdkiiStatusCodeDataTypeVariableGuid ## SOMETIMES_CONSUMES ## GUID
[Protocols] [Protocols]