From nobody Tue Feb 10 05:45:14 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+47342+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+47342+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1568701346; cv=none; d=zoho.com; s=zohoarc; b=DJaKUvX0+maa+3cpz6KY7ITNbf+9hRNGyGJYPIm4FX7nUxR1j2B4yCms6Xc6aT2bhN5S1Ur5jgMrRxsDjm5GZB6sLqVlzBabhSoSLJwfL1VREgGYH6AbaYC4uTt0IMj0NQJcUjOzXBeNAv4j8Eh1YxhmMdhAHVFlzzvUqjQyBCc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568701346; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To:ARC-Authentication-Results; bh=ZMkbQpYMCjbUVqDFme/FnQk0gGqqTOLejw+4fm4sIZY=; b=T9HoQ17heaZwz30SNBK5YUwf2h4LcHxUl+1AJjNVlxX/hP3OjYkuVCe4DtiwcoHuBTYQ+VEEa9oolEwgx1lq3AhdfVPL0ezcP/GUhJMcBcY9BLFeXiHuN7kgTXi1SboLLM71RLxi7ch31BvaBhwf91B7pK0IEM2mSGxxZ4TmMK8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+47342+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1568701346139502.2237366882629; Mon, 16 Sep 2019 23:22:26 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id EMDkYY1788612xgk7rBbgNI1; Mon, 16 Sep 2019 23:22:25 -0700 X-Received: from mga04.intel.com (mga04.intel.com []) by groups.io with SMTP; Mon, 16 Sep 2019 23:22:24 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Sep 2019 23:22:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,515,1559545200"; d="scan'208";a="201768396" X-Received: from fieedk001.ccr.corp.intel.com ([10.239.33.119]) by fmsmga001.fm.intel.com with ESMTP; 16 Sep 2019 23:22:22 -0700 From: "Gao, Zhichao" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Ray Ni , Liming Gao Subject: [edk2-devel] [PATCH V2 2/3] MdeModulePkg/TerminalDxe: Extend the terminal console support types Date: Tue, 17 Sep 2019 14:19:11 +0800 Message-Id: <20190917061912.17420-3-zhichao.gao@intel.com> In-Reply-To: <20190917061912.17420-1-zhichao.gao@intel.com> References: <20190917061912.17420-1-zhichao.gao@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhichao.gao@intel.com X-Gm-Message-State: 4tq8m7Ujq9O3qOof2Cxt6d5yx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1568701345; bh=Cltvp1uPcgKN8HD6mVqg7ATe8M1gdv7McYvahw75QPs=; h=Cc:Date:From:Reply-To:Subject:To; b=b7+UeqIm84xUHn7wK23kLU747+/ke968ptM2MwQoifArHVIDt62ARzOXNDO01fsd3Nz VsLlxtYqOf2wBur6MDXcmQDXONV+ikCkxot0cZQbks/jkjkm/IpE3NZn/FPc3ruNktwir IO/P13HxkvqUMrKuqssRtCO3zhUDIV6l/NY= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2186 Extend the support types of terminal console driver. New added types are Linux, XtermR6, VT400 and SCO. Refer to https://www.ssh.com/ssh/putty/putty-manuals/0.68/Chapter4.html#config-funke= ys Add the missing VT100+ function keys map. Add F1-F12 function keys map for Linux, XtermR6, VT400 and SCO. Cc: Jian J Wang Cc: Hao A Wu Cc: Ray Ni Cc: Liming Gao Signed-off-by: Zhichao Gao --- .../Universal/Console/TerminalDxe/Terminal.c | 17 +- .../Universal/Console/TerminalDxe/Terminal.h | 37 ++- .../Console/TerminalDxe/TerminalConIn.c | 281 ++++++++++++++++-- .../Console/TerminalDxe/TerminalConOut.c | 4 + .../Console/TerminalDxe/TerminalDxe.inf | 6 +- 5 files changed, 319 insertions(+), 26 deletions(-) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeMod= ulePkg/Universal/Console/TerminalDxe/Terminal.c index c76b2c5100..526067d023 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c @@ -2,7 +2,7 @@ Produces Simple Text Input Protocol, Simple Text Input Extended Protocol= and Simple Text Output Protocol upon Serial IO Protocol. =20 -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -28,7 +28,11 @@ EFI_GUID *mTerminalType[] =3D { &gEfiVT100Guid, &gEfiVT100PlusGuid, &gEfiVTUTF8Guid, - &gEfiTtyTermGuid + &gEfiTtyTermGuid, + &gEdkiiLinuxModeGuid, + &gEdkiiXtermR6Guid, + &gEdkiiVT400Guid, + &gEdkiiSCOGuid }; =20 =20 @@ -37,7 +41,11 @@ CHAR16 *mSerialConsoleNames[] =3D { L"VT-100 Serial Console", L"VT-100+ Serial Console", L"VT-UTF8 Serial Console", - L"Tty Terminal Serial Console" + L"Tty Terminal Serial Console", + L"Linux Mode Terminal Serial Console", + L"Xterm R6 Terminal Serial Console", + L"VT400 Terminal Serial Console", + L"SCO Terminal Serial Console" }; =20 TERMINAL_DEV mTerminalDevTemplate =3D { @@ -187,7 +195,8 @@ TerminalDriverBindingSupported ( =20 } // - // only supports PC ANSI, VT100, VT100+, VT-UTF8, and TtyTerm termin= al types + // only supports PC ANSI, VT100, VT100+, VT-UTF8, TtyTerm + // Linux, XtermR6, VT400 and SCO terminal types // if (TerminalTypeFromGuid (&Node->Guid) =3D=3D ARRAY_SIZE (mTerminalT= ype)) { return EFI_UNSUPPORTED; diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeMod= ulePkg/Universal/Console/TerminalDxe/Terminal.h index b2f0901fc1..d683aa792f 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -1,7 +1,7 @@ /** @file Header file for Terminal driver. =20 -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -81,7 +81,11 @@ typedef enum { TerminalTypeVt100, TerminalTypeVt100Plus, TerminalTypeVtUtf8, - TerminalTypeTtyTerm + TerminalTypeTtyTerm, + TerminalTypeLinux, + TerminalTypeXtermR6, + TerminalTypeVt400, + TerminalTypeSCO } TERMINAL_TYPE; =20 typedef struct { @@ -126,7 +130,9 @@ typedef struct { #define INPUT_STATE_LEFTOPENBRACKET 0x04 #define INPUT_STATE_O 0x08 #define INPUT_STATE_2 0x10 -#define INPUT_STATE_LEFTOPENBRACKET_2 0x20 +#define INPUT_STATE_LEFTOPENBRACKET_TTY 0x20 +#define INPUT_STATE_1 0x40 +#define INPUT_STATE_LEFTOPENBRACKET_2ND 0x80 =20 #define RESET_STATE_DEFAULT 0x00 #define RESET_STATE_ESC_R 0x01 @@ -848,7 +854,8 @@ TerminalRemoveConsoleDevVariable ( /** Build termial device path according to terminal type. =20 - @param TerminalType The terminal type is PC ANSI, VT100, VT10= 0+ or VT-UTF8. + @param TerminalType The terminal type is PC ANSI, VT100, VT10= 0+, VT-UTF8, TTY-Term, + Linux, XtermR6 or VT400. @param ParentDevicePath Parent device path. @param TerminalDevicePath Returned terminal device path, if buildin= g successfully. =20 @@ -1209,6 +1216,28 @@ AnsiRawDataToUnicode ( | F12 | 0x16 | | ESC @ | | +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ =20 +Putty function key map: + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + | | EFI | | | | |= | + | | Scan | | | Normal | |= | + | KEY | Code | VT100+ | Xterm R6 | VT400 | Linux |= SCO | + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + | F1 | 0x0B | ESC O P | ESC O P | ESC [ 1 1 ~ | ESC [ [ A |= ESC [ M | + | F2 | 0x0C | ESC O Q | ESC O Q | ESC [ 1 2 ~ | ESC [ [ B |= ESC [ N | + | F3 | 0x0D | ESC O R | ESC O R | ESC [ 1 3 ~ | ESC [ [ C |= ESC [ O | + | F4 | 0x0E | ESC O S | ESC O S | ESC [ 1 4 ~ | ESC [ [ D |= ESC [ P | + | F5 | 0x0F | ESC O T | ESC [ 1 5 ~ | ESC [ 1 5 ~ | ESC [ [ E |= ESC [ Q | + | F6 | 0x10 | ESC O U | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ 1 7 ~ |= ESC [ R | + | F7 | 0x11 | ESC O V | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ 1 8 ~ |= ESC [ S | + | F8 | 0x12 | ESC O W | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ 1 9 ~ |= ESC [ T | + | F9 | 0x13 | ESC O X | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ 2 0 ~ |= ESC [ U | + | F10 | 0x14 | ESC O Y | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ 2 1 ~ |= ESC [ V | + | Escape | 0x17 | ESC | ESC | ESC | ESC |= ESC | + | F11 | 0x15 | ESC O Z | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ 2 3 ~ |= ESC [ W | + | F12 | 0x16 | ESC O [ | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ 2 4 ~ |= ESC [ X | + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + + Special Mappings =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ESC R ESC r ESC R =3D Reset System diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/M= deModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c index 4ede416774..fb2eda01e7 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c @@ -2,7 +2,7 @@ Implementation for EFI_SIMPLE_TEXT_INPUT_PROTOCOL protocol. =20 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -453,6 +453,10 @@ TranslateRawDataToEfiKey ( case TerminalTypeVt100: case TerminalTypeVt100Plus: case TerminalTypeTtyTerm: + case TerminalTypeLinux: + case TerminalTypeXtermR6: + case TerminalTypeVt400: + case TerminalTypeSCO: AnsiRawDataToUnicode (TerminalDevice); UnicodeToEfiKey (TerminalDevice); break; @@ -1319,6 +1323,27 @@ UnicodeToEfiKeyFlushState ( | F12 | 0x16 | | ESC @ | | +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ =20 +Putty function key map: + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + | | EFI | | | | |= | + | | Scan | | | Normal | |= | + | KEY | Code | VT100+ | Xterm R6 | VT400 | Linux |= SCO | + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + | F1 | 0x0B | ESC O P | ESC O P | ESC [ 1 1 ~ | ESC [ [ A |= ESC [ M | + | F2 | 0x0C | ESC O Q | ESC O Q | ESC [ 1 2 ~ | ESC [ [ B |= ESC [ N | + | F3 | 0x0D | ESC O R | ESC O R | ESC [ 1 3 ~ | ESC [ [ C |= ESC [ O | + | F4 | 0x0E | ESC O S | ESC O S | ESC [ 1 4 ~ | ESC [ [ D |= ESC [ P | + | F5 | 0x0F | ESC O T | ESC [ 1 5 ~ | ESC [ 1 5 ~ | ESC [ [ E |= ESC [ Q | + | F6 | 0x10 | ESC O U | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ 1 7 ~ |= ESC [ R | + | F7 | 0x11 | ESC O V | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ 1 8 ~ |= ESC [ S | + | F8 | 0x12 | ESC O W | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ 1 9 ~ |= ESC [ T | + | F9 | 0x13 | ESC O X | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ 2 0 ~ |= ESC [ U | + | F10 | 0x14 | ESC O Y | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ 2 1 ~ |= ESC [ V | + | Escape | 0x17 | ESC | ESC | ESC | ESC |= ESC | + | F11 | 0x15 | ESC O Z | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ 2 3 ~ |= ESC [ W | + | F12 | 0x16 | ESC O [ | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ 2 4 ~ |= ESC [ X | + +=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ + Special Mappings =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ESC R ESC r ESC R =3D Reset System @@ -1378,7 +1403,9 @@ UnicodeToEfiKey ( } =20 if (UnicodeChar =3D=3D 'O' && (TerminalDevice->TerminalType =3D=3D T= erminalTypeVt100 || - TerminalDevice->TerminalType =3D=3D Termi= nalTypeTtyTerm)) { + TerminalDevice->TerminalType =3D=3D Termi= nalTypeTtyTerm || + TerminalDevice->TerminalType =3D=3D Termi= nalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D Termi= nalTypeVt100Plus)) { TerminalDevice->InputState |=3D INPUT_STATE_O; TerminalDevice->ResetState =3D RESET_STATE_DEFAULT; continue; @@ -1548,6 +1575,60 @@ UnicodeToEfiKey ( Key.ScanCode =3D SCAN_END; break; } + } else if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt100Plus= ) { + switch (UnicodeChar) { + case 'P': + Key.ScanCode =3D SCAN_F1; + break; + case 'Q': + Key.ScanCode =3D SCAN_F2; + break; + case 'R': + Key.ScanCode =3D SCAN_F3; + break; + case 'S': + Key.ScanCode =3D SCAN_F4; + break; + case 'T': + Key.ScanCode =3D SCAN_F5; + break; + case 'U': + Key.ScanCode =3D SCAN_F6; + break; + case 'V': + Key.ScanCode =3D SCAN_F7; + break; + case 'W': + Key.ScanCode =3D SCAN_F8; + break; + case 'X': + Key.ScanCode =3D SCAN_F9; + break; + case 'Y': + Key.ScanCode =3D SCAN_F10; + break; + case 'Z': + Key.ScanCode =3D SCAN_F11; + break; + case '[': + Key.ScanCode =3D SCAN_F12; + break; + } + } else if (TerminalDevice->TerminalType =3D=3D TerminalTypeXtermR6) { + switch (UnicodeChar) { + case 'P': + Key.ScanCode =3D SCAN_F1; + break; + case 'Q': + Key.ScanCode =3D SCAN_F2; + break; + case 'R': + Key.ScanCode =3D SCAN_F3; + break; + case 'S': + Key.ScanCode =3D SCAN_F4; + break; + } } =20 if (Key.ScanCode !=3D SCAN_NULL) { @@ -1564,15 +1645,33 @@ UnicodeToEfiKey ( =20 case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET: =20 + if (UnicodeChar =3D=3D '1' && (TerminalDevice->TerminalType =3D=3D T= erminalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D Term= inalTypeVt400 || + TerminalDevice->TerminalType =3D=3D Term= inalTypeLinux)) { + TerminalDevice->InputState |=3D INPUT_STATE_1; + continue; + } + + if (UnicodeChar =3D=3D '2' && (TerminalDevice->TerminalType =3D=3D T= erminalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D Term= inalTypeVt400 || + TerminalDevice->TerminalType =3D=3D Term= inalTypeLinux)) { + TerminalDevice->InputState |=3D INPUT_STATE_2; + continue; + } + + if (UnicodeChar =3D=3D LEFTOPENBRACKET && TerminalDevice->TerminalTy= pe =3D=3D TerminalTypeLinux) { + TerminalDevice->InputState |=3D INPUT_STATE_LEFTOPENBRACKET_2ND; + continue; + } + TerminalDevice->ResetState =3D RESET_STATE_DEFAULT; =20 Key.ScanCode =3D SCAN_NULL; =20 if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || TerminalDevice->TerminalType =3D=3D TerminalTypeVt100 || - TerminalDevice->TerminalType =3D=3D TerminalTypeVt100Plus || - TerminalDevice->TerminalType =3D=3D TerminalTypeVtUtf8 || - TerminalDevice->TerminalType =3D=3D TerminalTypeTtyTerm) { + TerminalDevice->TerminalType =3D=3D TerminalTypeVtUtf8 || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { switch (UnicodeChar) { case 'A': Key.ScanCode =3D SCAN_UP; @@ -1614,12 +1713,15 @@ UnicodeToEfiKey ( case 'X': if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { Key.ScanCode =3D SCAN_DELETE; + } else if (TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { + Key.ScanCode =3D SCAN_F12; } break; case 'P': if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt100) { Key.ScanCode =3D SCAN_DELETE; - } else if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAns= i) { + } else if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAns= i || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO)= { Key.ScanCode =3D SCAN_F4; } break; @@ -1629,7 +1731,8 @@ UnicodeToEfiKey ( } break; case 'V': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F10; } break; @@ -1644,7 +1747,8 @@ UnicodeToEfiKey ( } break; case 'U': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F9; } break; @@ -1654,40 +1758,52 @@ UnicodeToEfiKey ( } break; case 'M': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F1; } break; case 'N': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F2; } break; case 'O': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F3; } break; case 'Q': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F5; } break; case 'R': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F6; } break; case 'S': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F7; } break; case 'T': - if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi) { + if (TerminalDevice->TerminalType =3D=3D TerminalTypePcAnsi || + TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { Key.ScanCode =3D SCAN_F8; } break; + case 'W': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeSCO) { + Key.ScanCode =3D SCAN_F11; + } + break; default : break; } @@ -1704,10 +1820,105 @@ UnicodeToEfiKey ( UnicodeChar <=3D '9') { TerminalDevice->TtyEscapeStr[0] =3D UnicodeChar; TerminalDevice->TtyEscapeIndex =3D 1; - TerminalDevice->InputState |=3D INPUT_STATE_LEFTOPENBRACKET_2; + TerminalDevice->InputState |=3D INPUT_STATE_LEFTOPENBRACKET_TTY; + continue; + } + + if (Key.ScanCode !=3D SCAN_NULL) { + Key.UnicodeChar =3D 0; + EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); + TerminalDevice->InputState =3D INPUT_STATE_DEFAULT; + UnicodeToEfiKeyFlushState (TerminalDevice); + continue; + } + + UnicodeToEfiKeyFlushState (TerminalDevice); + + break; + + case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_1: + + TerminalDevice->ResetState =3D RESET_STATE_DEFAULT; + + Key.ScanCode =3D SCAN_NULL; + + if (TerminalDevice->TerminalType =3D=3D TerminalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D TerminalTypeVt400 || + TerminalDevice->TerminalType =3D=3D TerminalTypeLinux) { + switch (UnicodeChar) { + case '1': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt400) { + Key.ScanCode =3D SCAN_F1; + } + break; + case '2': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt400) { + Key.ScanCode =3D SCAN_F2; + } + break; + case '3': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt400) { + Key.ScanCode =3D SCAN_F3; + } + break; + case '4': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeVt400) { + Key.ScanCode =3D SCAN_F4; + } + break; + case '5': + if (TerminalDevice->TerminalType =3D=3D TerminalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D TerminalTypeVt400) { + Key.ScanCode =3D SCAN_F5; + } + break; + case '7': + Key.ScanCode =3D SCAN_F6; + break; + case '8': + Key.ScanCode =3D SCAN_F7; + break; + case '9': + Key.ScanCode =3D SCAN_F8; + break; + } + } + + if (Key.ScanCode !=3D SCAN_NULL) { + Key.UnicodeChar =3D 0; + EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); + TerminalDevice->InputState =3D INPUT_STATE_DEFAULT; + UnicodeToEfiKeyFlushState (TerminalDevice); continue; } =20 + UnicodeToEfiKeyFlushState (TerminalDevice); + + break; + + case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_2: + + TerminalDevice->InputState =3D INPUT_STATE_DEFAULT; + Key.ScanCode =3D SCAN_NULL; + if (TerminalDevice->TerminalType =3D=3D TerminalTypeXtermR6 || + TerminalDevice->TerminalType =3D=3D TerminalTypeVt400 || + TerminalDevice->TerminalType =3D=3D TerminalTypeLinux) { + switch (UnicodeChar) { + case '0': + Key.ScanCode =3D SCAN_F9; + break; + case '1': + Key.ScanCode =3D SCAN_F10; + break; + case '3': + Key.ScanCode =3D SCAN_F11; + break; + case '4': + Key.ScanCode =3D SCAN_F12; + break; + } + } + if (Key.ScanCode !=3D SCAN_NULL) { Key.UnicodeChar =3D 0; EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); @@ -1720,8 +1931,44 @@ UnicodeToEfiKey ( =20 break; =20 + case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTO= PENBRACKET_2ND: + + TerminalDevice->InputState =3D INPUT_STATE_DEFAULT; + Key.ScanCode =3D SCAN_NULL; + + if (TerminalDevice->TerminalType =3D=3D TerminalTypeLinux) { + switch (UnicodeChar) { + case 'A': + Key.ScanCode =3D SCAN_F1; + break; + case 'B': + Key.ScanCode =3D SCAN_F2; + break; + case 'C': + Key.ScanCode =3D SCAN_F3; + break; + case 'D': + Key.ScanCode =3D SCAN_F4; + break; + case 'E': + Key.ScanCode =3D SCAN_F5; + break; + } + } + + if (Key.ScanCode !=3D SCAN_NULL) { + Key.UnicodeChar =3D 0; + EfiKeyFiFoInsertOneKey (TerminalDevice, &Key); + TerminalDevice->InputState =3D INPUT_STATE_DEFAULT; + UnicodeToEfiKeyFlushState (TerminalDevice); + continue; + } + + UnicodeToEfiKeyFlushState (TerminalDevice); + + break; =20 - case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTO= PENBRACKET_2: + case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTO= PENBRACKET_TTY: /* * Here we handle the VT220 escape codes that we accept. This * state is only used by the TTY terminal type. diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/= MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index 7ef655cca5..aae470e956 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c @@ -222,6 +222,10 @@ TerminalConOutOutputString ( case TerminalTypeVt100: case TerminalTypeVt100Plus: case TerminalTypeTtyTerm: + case TerminalTypeLinux: + case TerminalTypeXtermR6: + case TerminalTypeVt400: + case TerminalTypeSCO: =20 if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= )) { // diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/M= deModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf index 24e164ef4d..e3785c3436 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf @@ -5,7 +5,7 @@ # protocols based on Serial I/O protocol for serial devices including hot= plug serial # devices. # -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # # @@ -69,6 +69,10 @@ gEfiVT100PlusGuid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path gEfiPcAnsiGuid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path gEfiTtyTermGuid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path + gEdkiiLinuxModeGuid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path + gEdkiiXtermR6Guid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path + gEdkiiVT400Guid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path + gEdkiiSCOGuid ## SOMETIMES_CONSUMES ## G= UID # used with a Vendor-Defined Messaging Device Path gEdkiiStatusCodeDataTypeVariableGuid ## SOMETIMES_CONSUMES ## G= UID =20 [Protocols] --=20 2.21.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#47342): https://edk2.groups.io/g/devel/message/47342 Mute This Topic: https://groups.io/mt/34173531/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-