]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/TerminalDxe: Extend the terminal console support types
authorZhichao Gao <zhichao.gao@intel.com>
Fri, 6 Sep 2019 07:38:00 +0000 (15:38 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 24 Sep 2019 13:56:46 +0000 (21:56 +0800)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2186

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-funkeys

Add the missing VT100+ function keys map.

Add F1-F12 function keys map for Linux, XtermR6, VT400 and SCO.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf

index c76b2c5100edfc78422461ba47cfb523aaea6ff7..a98b690c8b9584f7905514bb11d95a5ae4aef827 100644 (file)
@@ -2,7 +2,7 @@
   Produces Simple Text Input Protocol, Simple Text Input Extended Protocol and\r
   Simple Text Output Protocol upon Serial IO Protocol.\r
 \r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -28,7 +28,11 @@ EFI_GUID  *mTerminalType[] = {
   &gEfiVT100Guid,\r
   &gEfiVT100PlusGuid,\r
   &gEfiVTUTF8Guid,\r
-  &gEfiTtyTermGuid\r
+  &gEfiTtyTermGuid,\r
+  &gEdkiiLinuxTermGuid,\r
+  &gEdkiiXtermR6Guid,\r
+  &gEdkiiVT400Guid,\r
+  &gEdkiiSCOTermGuid\r
 };\r
 \r
 \r
@@ -37,7 +41,11 @@ CHAR16 *mSerialConsoleNames[] = {
   L"VT-100 Serial Console",\r
   L"VT-100+ Serial Console",\r
   L"VT-UTF8 Serial Console",\r
-  L"Tty Terminal Serial Console"\r
+  L"Tty Terminal Serial Console",\r
+  L"Linux Terminal Serial Console",\r
+  L"Xterm R6 Serial Console",\r
+  L"VT-400 Serial Console",\r
+  L"SCO Terminal Serial Console"\r
 };\r
 \r
 TERMINAL_DEV  mTerminalDevTemplate = {\r
@@ -187,7 +195,8 @@ TerminalDriverBindingSupported (
 \r
       }\r
       //\r
-      // only supports PC ANSI, VT100, VT100+, VT-UTF8, and TtyTerm terminal types\r
+      // only supports PC ANSI, VT100, VT100+, VT-UTF8, TtyTerm\r
+      // Linux, XtermR6, VT400 and SCO terminal types\r
       //\r
       if (TerminalTypeFromGuid (&Node->Guid) == ARRAY_SIZE (mTerminalType)) {\r
         return EFI_UNSUPPORTED;\r
index b2f0901fc167bfa941d61c3ab4517b7f21cb53a7..378ace13ceb30e798cca2189a8d5f68cc5555a3d 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Header file for Terminal driver.\r
 \r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -81,7 +81,11 @@ typedef enum {
   TerminalTypeVt100,\r
   TerminalTypeVt100Plus,\r
   TerminalTypeVtUtf8,\r
-  TerminalTypeTtyTerm\r
+  TerminalTypeTtyTerm,\r
+  TerminalTypeLinux,\r
+  TerminalTypeXtermR6,\r
+  TerminalTypeVt400,\r
+  TerminalTypeSCO\r
 } TERMINAL_TYPE;\r
 \r
 typedef struct {\r
@@ -126,7 +130,9 @@ typedef struct {
 #define INPUT_STATE_LEFTOPENBRACKET       0x04\r
 #define INPUT_STATE_O                     0x08\r
 #define INPUT_STATE_2                     0x10\r
-#define INPUT_STATE_LEFTOPENBRACKET_2     0x20\r
+#define INPUT_STATE_LEFTOPENBRACKET_TTY   0x20\r
+#define INPUT_STATE_1                     0x40\r
+#define INPUT_STATE_LEFTOPENBRACKET_2ND   0x80\r
 \r
 #define RESET_STATE_DEFAULT               0x00\r
 #define RESET_STATE_ESC_R                 0x01\r
@@ -848,7 +854,8 @@ TerminalRemoveConsoleDevVariable (
 /**\r
   Build termial device path according to terminal type.\r
 \r
-  @param  TerminalType           The terminal type is PC ANSI, VT100, VT100+ or VT-UTF8.\r
+  @param  TerminalType           The terminal type is PC ANSI, VT100, VT100+, VT-UTF8, TTY-Term,\r
+                                 Linux, XtermR6, VT400 and SCO.\r
   @param  ParentDevicePath       Parent device path.\r
   @param  TerminalDevicePath     Returned terminal device path, if building successfully.\r
 \r
@@ -1209,6 +1216,28 @@ AnsiRawDataToUnicode (
   | F12     | 0x16 |           | ESC @    |          |\r
   +=========+======+===========+==========+==========+\r
 \r
+Putty function key map:\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+  |         | EFI  |           |             |             |             |         |\r
+  |         | Scan |           |             |  Normal     |             |         |\r
+  |   KEY   | Code |  VT100+   | Xterm R6    |  VT400      | Linux       | SCO     |\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+  | F1      | 0x0B | ESC O P   | ESC O P     | ESC [ 1 1 ~ | ESC [ [ A   | ESC [ M |\r
+  | F2      | 0x0C | ESC O Q   | ESC O Q     | ESC [ 1 2 ~ | ESC [ [ B   | ESC [ N |\r
+  | F3      | 0x0D | ESC O R   | ESC O R     | ESC [ 1 3 ~ | ESC [ [ C   | ESC [ O |\r
+  | F4      | 0x0E | ESC O S   | ESC O S     | ESC [ 1 4 ~ | ESC [ [ D   | ESC [ P |\r
+  | F5      | 0x0F | ESC O T   | ESC [ 1 5 ~ | ESC [ 1 5 ~ | ESC [ [ E   | ESC [ Q |\r
+  | F6      | 0x10 | ESC O U   | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ R |\r
+  | F7      | 0x11 | ESC O V   | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ S |\r
+  | F8      | 0x12 | ESC O W   | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ T |\r
+  | F9      | 0x13 | ESC O X   | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ U |\r
+  | F10     | 0x14 | ESC O Y   | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ V |\r
+  | Escape  | 0x17 | ESC       | ESC         | ESC         | ESC         | ESC     |\r
+  | F11     | 0x15 | ESC O Z   | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ W |\r
+  | F12     | 0x16 | ESC O [   | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ X |\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+\r
+\r
   Special Mappings\r
   ================\r
   ESC R ESC r ESC R = Reset System\r
index 4ede41677493da9c72af5a37ac8cb175cb3b4567..ac31f27984a086c13820b208dff29fd98d912394 100644 (file)
@@ -2,7 +2,7 @@
   Implementation for EFI_SIMPLE_TEXT_INPUT_PROTOCOL protocol.\r
 \r
 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -453,6 +453,10 @@ TranslateRawDataToEfiKey (
   case TerminalTypeVt100:\r
   case TerminalTypeVt100Plus:\r
   case TerminalTypeTtyTerm:\r
+  case TerminalTypeLinux:\r
+  case TerminalTypeXtermR6:\r
+  case TerminalTypeVt400:\r
+  case TerminalTypeSCO:\r
     AnsiRawDataToUnicode (TerminalDevice);\r
     UnicodeToEfiKey (TerminalDevice);\r
     break;\r
@@ -1319,6 +1323,27 @@ UnicodeToEfiKeyFlushState (
   | F12     | 0x16 |           | ESC @    |          |\r
   +=========+======+===========+==========+==========+\r
 \r
+Putty function key map:\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+  |         | EFI  |           |             |             |             |         |\r
+  |         | Scan |           |             |  Normal     |             |         |\r
+  |   KEY   | Code |  VT100+   | Xterm R6    |  VT400      | Linux       | SCO     |\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+  | F1      | 0x0B | ESC O P   | ESC O P     | ESC [ 1 1 ~ | ESC [ [ A   | ESC [ M |\r
+  | F2      | 0x0C | ESC O Q   | ESC O Q     | ESC [ 1 2 ~ | ESC [ [ B   | ESC [ N |\r
+  | F3      | 0x0D | ESC O R   | ESC O R     | ESC [ 1 3 ~ | ESC [ [ C   | ESC [ O |\r
+  | F4      | 0x0E | ESC O S   | ESC O S     | ESC [ 1 4 ~ | ESC [ [ D   | ESC [ P |\r
+  | F5      | 0x0F | ESC O T   | ESC [ 1 5 ~ | ESC [ 1 5 ~ | ESC [ [ E   | ESC [ Q |\r
+  | F6      | 0x10 | ESC O U   | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ 1 7 ~ | ESC [ R |\r
+  | F7      | 0x11 | ESC O V   | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ 1 8 ~ | ESC [ S |\r
+  | F8      | 0x12 | ESC O W   | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ 1 9 ~ | ESC [ T |\r
+  | F9      | 0x13 | ESC O X   | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ 2 0 ~ | ESC [ U |\r
+  | F10     | 0x14 | ESC O Y   | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ 2 1 ~ | ESC [ V |\r
+  | Escape  | 0x17 | ESC       | ESC         | ESC         | ESC         | ESC     |\r
+  | F11     | 0x15 | ESC O Z   | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ 2 3 ~ | ESC [ W |\r
+  | F12     | 0x16 | ESC O [   | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ 2 4 ~ | ESC [ X |\r
+  +=========+======+===========+=============+=============+=============+=========+\r
+\r
   Special Mappings\r
   ================\r
   ESC R ESC r ESC R = Reset System\r
@@ -1378,7 +1403,9 @@ UnicodeToEfiKey (
       }\r
 \r
       if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == TerminalTypeVt100 ||\r
-                                 TerminalDevice->TerminalType == TerminalTypeTtyTerm)) {\r
+                                 TerminalDevice->TerminalType == TerminalTypeTtyTerm ||\r
+                                 TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+                                 TerminalDevice->TerminalType == TerminalTypeVt100Plus)) {\r
         TerminalDevice->InputState |= INPUT_STATE_O;\r
         TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
         continue;\r
@@ -1548,6 +1575,60 @@ UnicodeToEfiKey (
           Key.ScanCode = SCAN_END;\r
           break;\r
         }\r
+      } else if (TerminalDevice->TerminalType == TerminalTypeVt100Plus) {\r
+        switch (UnicodeChar) {\r
+        case 'P':\r
+          Key.ScanCode = SCAN_F1;\r
+          break;\r
+        case 'Q':\r
+          Key.ScanCode = SCAN_F2;\r
+          break;\r
+        case 'R':\r
+          Key.ScanCode = SCAN_F3;\r
+          break;\r
+        case 'S':\r
+          Key.ScanCode = SCAN_F4;\r
+          break;\r
+        case 'T':\r
+          Key.ScanCode = SCAN_F5;\r
+          break;\r
+        case 'U':\r
+          Key.ScanCode = SCAN_F6;\r
+          break;\r
+        case 'V':\r
+          Key.ScanCode = SCAN_F7;\r
+          break;\r
+        case 'W':\r
+          Key.ScanCode = SCAN_F8;\r
+          break;\r
+        case 'X':\r
+          Key.ScanCode = SCAN_F9;\r
+          break;\r
+        case 'Y':\r
+          Key.ScanCode = SCAN_F10;\r
+          break;\r
+        case 'Z':\r
+          Key.ScanCode = SCAN_F11;\r
+          break;\r
+        case '[':\r
+          Key.ScanCode = SCAN_F12;\r
+          break;\r
+        }\r
+      } else if (TerminalDevice->TerminalType == TerminalTypeXtermR6) {\r
+        switch (UnicodeChar) {\r
+        case 'P':\r
+          Key.ScanCode = SCAN_F1;\r
+          break;\r
+        case 'Q':\r
+          Key.ScanCode = SCAN_F2;\r
+          break;\r
+        case 'R':\r
+          Key.ScanCode = SCAN_F3;\r
+          break;\r
+        case 'S':\r
+          Key.ScanCode = SCAN_F4;\r
+          break;\r
+        }\r
       }\r
 \r
       if (Key.ScanCode != SCAN_NULL) {\r
@@ -1564,15 +1645,34 @@ UnicodeToEfiKey (
 \r
     case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET:\r
 \r
+      if (UnicodeChar == '1' && (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+                                  TerminalDevice->TerminalType == TerminalTypeVt400 ||\r
+                                  TerminalDevice->TerminalType == TerminalTypeLinux)) {\r
+        TerminalDevice->InputState |= INPUT_STATE_1;\r
+        continue;\r
+      }\r
+\r
+      if (UnicodeChar == '2' && (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+                                  TerminalDevice->TerminalType == TerminalTypeVt400 ||\r
+                                  TerminalDevice->TerminalType == TerminalTypeLinux)) {\r
+        TerminalDevice->InputState |= INPUT_STATE_2;\r
+        continue;\r
+      }\r
+\r
+      if (UnicodeChar == LEFTOPENBRACKET && TerminalDevice->TerminalType == TerminalTypeLinux) {\r
+        TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2ND;\r
+        continue;\r
+      }\r
+\r
       TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
 \r
       Key.ScanCode = SCAN_NULL;\r
 \r
       if (TerminalDevice->TerminalType == TerminalTypePcAnsi    ||\r
           TerminalDevice->TerminalType == TerminalTypeVt100     ||\r
-          TerminalDevice->TerminalType == TerminalTypeVt100Plus ||\r
-          TerminalDevice->TerminalType == TerminalTypeVtUtf8    ||\r
-          TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
+          TerminalDevice->TerminalType == TerminalTypeVtUtf8 ||\r
+          TerminalDevice->TerminalType == TerminalTypeTtyTerm ||\r
+          TerminalDevice->TerminalType == TerminalTypeSCO) {\r
         switch (UnicodeChar) {\r
         case 'A':\r
           Key.ScanCode = SCAN_UP;\r
@@ -1614,12 +1714,15 @@ UnicodeToEfiKey (
         case 'X':\r
           if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_DELETE;\r
+          } else if (TerminalDevice->TerminalType == TerminalTypeSCO) {\r
+            Key.ScanCode = SCAN_F12;\r
           }\r
           break;\r
         case 'P':\r
           if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_DELETE;\r
-          } else if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          } else if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+                      TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F4;\r
           }\r
           break;\r
@@ -1629,7 +1732,8 @@ UnicodeToEfiKey (
           }\r
           break;\r
         case 'V':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F10;\r
           }\r
           break;\r
@@ -1644,7 +1748,8 @@ UnicodeToEfiKey (
           }\r
           break;\r
         case 'U':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F9;\r
           }\r
           break;\r
@@ -1654,40 +1759,52 @@ UnicodeToEfiKey (
           }\r
           break;\r
         case 'M':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F1;\r
           }\r
           break;\r
         case 'N':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F2;\r
           }\r
           break;\r
         case 'O':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F3;\r
           }\r
           break;\r
         case 'Q':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F5;\r
           }\r
           break;\r
         case 'R':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F6;\r
           }\r
           break;\r
         case 'S':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F7;\r
           }\r
           break;\r
         case 'T':\r
-          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeSCO) {\r
             Key.ScanCode = SCAN_F8;\r
           }\r
           break;\r
+        case 'W':\r
+          if (TerminalDevice->TerminalType == TerminalTypeSCO) {\r
+            Key.ScanCode = SCAN_F11;\r
+          }\r
+          break;\r
         default :\r
           break;\r
         }\r
@@ -1704,10 +1821,105 @@ UnicodeToEfiKey (
           UnicodeChar <= '9') {\r
         TerminalDevice->TtyEscapeStr[0] = UnicodeChar;\r
         TerminalDevice->TtyEscapeIndex = 1;\r
-        TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_2;\r
+        TerminalDevice->InputState |= INPUT_STATE_LEFTOPENBRACKET_TTY;\r
+        continue;\r
+      }\r
+\r
+      if (Key.ScanCode != SCAN_NULL) {\r
+        Key.UnicodeChar = 0;\r
+        EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
+        TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+        UnicodeToEfiKeyFlushState (TerminalDevice);\r
+        continue;\r
+      }\r
+\r
+      UnicodeToEfiKeyFlushState (TerminalDevice);\r
+\r
+      break;\r
+\r
+    case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_1:\r
+\r
+      TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
+\r
+      Key.ScanCode = SCAN_NULL;\r
+\r
+      if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+          TerminalDevice->TerminalType == TerminalTypeVt400 ||\r
+          TerminalDevice->TerminalType == TerminalTypeLinux) {\r
+        switch (UnicodeChar) {\r
+        case '1':\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt400) {\r
+            Key.ScanCode = SCAN_F1;\r
+          }\r
+          break;\r
+        case '2':\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt400) {\r
+            Key.ScanCode = SCAN_F2;\r
+          }\r
+          break;\r
+        case '3':\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt400) {\r
+            Key.ScanCode = SCAN_F3;\r
+          }\r
+          break;\r
+        case '4':\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt400) {\r
+            Key.ScanCode = SCAN_F4;\r
+          }\r
+          break;\r
+        case '5':\r
+          if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+              TerminalDevice->TerminalType == TerminalTypeVt400) {\r
+            Key.ScanCode = SCAN_F5;\r
+          }\r
+          break;\r
+        case '7':\r
+          Key.ScanCode = SCAN_F6;\r
+          break;\r
+        case '8':\r
+          Key.ScanCode = SCAN_F7;\r
+          break;\r
+        case '9':\r
+          Key.ScanCode = SCAN_F8;\r
+          break;\r
+        }\r
+      }\r
+\r
+      if (Key.ScanCode != SCAN_NULL) {\r
+        Key.UnicodeChar = 0;\r
+        EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
+        TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+        UnicodeToEfiKeyFlushState (TerminalDevice);\r
         continue;\r
       }\r
 \r
+      UnicodeToEfiKeyFlushState (TerminalDevice);\r
+\r
+      break;\r
+\r
+    case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_2:\r
+\r
+      TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+      Key.ScanCode = SCAN_NULL;\r
+      if (TerminalDevice->TerminalType == TerminalTypeXtermR6 ||\r
+          TerminalDevice->TerminalType == TerminalTypeVt400 ||\r
+          TerminalDevice->TerminalType == TerminalTypeLinux) {\r
+        switch (UnicodeChar) {\r
+        case '0':\r
+          Key.ScanCode = SCAN_F9;\r
+          break;\r
+        case '1':\r
+          Key.ScanCode = SCAN_F10;\r
+          break;\r
+        case '3':\r
+          Key.ScanCode = SCAN_F11;\r
+          break;\r
+        case '4':\r
+          Key.ScanCode = SCAN_F12;\r
+          break;\r
+        }\r
+      }\r
+\r
       if (Key.ScanCode != SCAN_NULL) {\r
         Key.UnicodeChar = 0;\r
         EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
@@ -1720,8 +1932,44 @@ UnicodeToEfiKey (
 \r
       break;\r
 \r
+    case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2ND:\r
+\r
+      TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+      Key.ScanCode = SCAN_NULL;\r
+\r
+      if (TerminalDevice->TerminalType == TerminalTypeLinux) {\r
+        switch (UnicodeChar) {\r
+        case 'A':\r
+          Key.ScanCode = SCAN_F1;\r
+          break;\r
+        case 'B':\r
+          Key.ScanCode = SCAN_F2;\r
+          break;\r
+        case 'C':\r
+          Key.ScanCode = SCAN_F3;\r
+          break;\r
+        case 'D':\r
+          Key.ScanCode = SCAN_F4;\r
+          break;\r
+        case 'E':\r
+          Key.ScanCode = SCAN_F5;\r
+          break;\r
+        }\r
+      }\r
+\r
+      if (Key.ScanCode != SCAN_NULL) {\r
+        Key.UnicodeChar = 0;\r
+        EfiKeyFiFoInsertOneKey (TerminalDevice, &Key);\r
+        TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
+        UnicodeToEfiKeyFlushState (TerminalDevice);\r
+        continue;\r
+      }\r
+\r
+      UnicodeToEfiKeyFlushState (TerminalDevice);\r
+\r
+      break;\r
 \r
-    case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_2:\r
+    case INPUT_STATE_ESC | INPUT_STATE_LEFTOPENBRACKET | INPUT_STATE_LEFTOPENBRACKET_TTY:\r
       /*\r
        * Here we handle the VT220 escape codes that we accept.  This\r
        * state is only used by the TTY terminal type.\r
index 7ef655cca5bacdf8dda282d6cacdeefb4e9e1a2c..aae470e9562ccd3e585942c007ac1a0d6bb493f3 100644 (file)
@@ -222,6 +222,10 @@ TerminalConOutOutputString (
     case TerminalTypeVt100:\r
     case TerminalTypeVt100Plus:\r
     case TerminalTypeTtyTerm:\r
+    case TerminalTypeLinux:\r
+    case TerminalTypeXtermR6:\r
+    case TerminalTypeVt400:\r
+    case TerminalTypeSCO:\r
 \r
       if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {\r
         //\r
index 24e164ef4daf60b07f2b33d8db91eed443361541..b2a8aeba851027bcb61b18c890391e9068fd54a3 100644 (file)
@@ -5,7 +5,7 @@
 #  protocols based on Serial I/O protocol for serial devices including hotplug serial\r
 #  devices.\r
 #\r
-#  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 #\r
   gEfiVT100PlusGuid                             ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
   gEfiPcAnsiGuid                                ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
   gEfiTtyTermGuid                               ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
+  gEdkiiLinuxTermGuid                           ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
+  gEdkiiXtermR6Guid                             ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
+  gEdkiiVT400Guid                               ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
+  gEdkiiSCOTermGuid                             ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path\r
   gEdkiiStatusCodeDataTypeVariableGuid          ## SOMETIMES_CONSUMES ## GUID\r
 \r
 [Protocols]\r