]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / TerminalConIn.c
index 016241017a42693ec05ab57fa4d84953256cdd84..4ede41677493da9c72af5a37ac8cb175cb3b4567 100644 (file)
@@ -2,15 +2,9 @@
   Implementation for EFI_SIMPLE_TEXT_INPUT_PROTOCOL protocol.\r
 \r
 (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -41,13 +35,12 @@ ReadKeyStrokeWorker (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!EfiKeyFiFoRemoveOneKey (TerminalDevice, &KeyData->Key)) {\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
   KeyData->KeyState.KeyShiftState  = 0;\r
   KeyData->KeyState.KeyToggleState = 0;\r
 \r
+  if (!EfiKeyFiFoRemoveOneKey (TerminalDevice, &KeyData->Key)) {\r
+    return EFI_NOT_READY;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 \r
@@ -310,11 +303,14 @@ TerminalConInSetState (
   Register a notification function for a particular keystroke for the input device.\r
 \r
   @param  This                     Protocol instance pointer.\r
-  @param  KeyData                  A pointer to a buffer that is filled in with the\r
-                                   keystroke information data for the key that was\r
-                                   pressed.\r
+  @param  KeyData                  A pointer to a buffer that is filled in with\r
+                                   the keystroke information for the key that was\r
+                                   pressed. If KeyData.Key, KeyData.KeyState.KeyToggleState\r
+                                   and KeyData.KeyState.KeyShiftState are 0, then any incomplete\r
+                                   keystroke will trigger a notification of the KeyNotificationFunction.\r
   @param  KeyNotificationFunction  Points to the function to be called when the key\r
-                                   sequence is typed specified by KeyData.\r
+                                   sequence is typed specified by KeyData. This notification function\r
+                                   should be called at <=TPL_CALLBACK.\r
   @param  NotifyHandle             Points to the unique handle assigned to the\r
                                    registered notification.\r
 \r
@@ -453,15 +449,15 @@ TranslateRawDataToEfiKey (
 {\r
   switch (TerminalDevice->TerminalType) {\r
 \r
-  case PCANSITYPE:\r
-  case VT100TYPE:\r
-  case VT100PLUSTYPE:\r
-  case TTYTERMTYPE:\r
+  case TerminalTypePcAnsi:\r
+  case TerminalTypeVt100:\r
+  case TerminalTypeVt100Plus:\r
+  case TerminalTypeTtyTerm:\r
     AnsiRawDataToUnicode (TerminalDevice);\r
     UnicodeToEfiKey (TerminalDevice);\r
     break;\r
 \r
-  case VTUTF8TYPE:\r
+  case TerminalTypeVtUtf8:\r
     //\r
     // Process all the raw data in the RawFIFO,\r
     // put the processed key into UnicodeFIFO.\r
@@ -630,7 +626,7 @@ KeyNotifyProcessHandler (
   while (TRUE) {\r
     //\r
     // Enter critical section\r
-    //  \r
+    //\r
     OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
     HasKey = EfiKeyFiFoForNotifyRemoveOneKey (TerminalDevice->EfiKeyFiFoForNotify, &Key);\r
     CopyMem (&KeyData.Key, &Key, sizeof (EFI_INPUT_KEY));\r
@@ -985,6 +981,7 @@ EfiKeyFiFoInsertOneKey (
       //\r
       EfiKeyFiFoForNotifyInsertOneKey (TerminalDevice->EfiKeyFiFoForNotify, Key);\r
       gBS->SignalEvent (TerminalDevice->KeyNotifyProcessEvent);\r
+      break;\r
     }\r
   }\r
   if (IsEfiKeyFiFoFull (TerminalDevice)) {\r
@@ -1126,7 +1123,7 @@ UnicodeFiFoInsertOneKey (
 \r
 /**\r
   Remove one pre-fetched key out of the Unicode FIFO buffer.\r
-  The caller should guarantee that Unicode FIFO buffer is not empty \r
+  The caller should guarantee that Unicode FIFO buffer is not empty\r
   by IsUnicodeFiFoEmpty ().\r
 \r
   @param  TerminalDevice       Terminal driver private structure.\r
@@ -1198,31 +1195,6 @@ IsUnicodeFiFoFull (
   return FALSE;\r
 }\r
 \r
-/**\r
-  Count Unicode FIFO buffer.\r
-\r
-  @param  TerminalDevice       Terminal driver private structure\r
-\r
-  @return The count in bytes of Unicode FIFO.\r
-\r
-**/\r
-UINT8\r
-UnicodeFiFoGetKeyCount (\r
-  TERMINAL_DEV    *TerminalDevice\r
-  )\r
-{\r
-  UINT8 Tail;\r
-  UINT8 Head;\r
-\r
-  Tail  = TerminalDevice->UnicodeFiFo->Tail;\r
-  Head  = TerminalDevice->UnicodeFiFo->Head;\r
-\r
-  if (Tail >= Head) {\r
-    return (UINT8) (Tail - Head);\r
-  } else {\r
-    return (UINT8) (Tail + FIFO_MAX_NUMBER + 1 - Head);\r
-  }\r
-}\r
 \r
 /**\r
   Update the Unicode characters from a terminal input device into EFI Keys FIFO.\r
@@ -1302,10 +1274,10 @@ UnicodeToEfiKeyFlushState (
   There is one special input sequence that will force the system to reset.\r
   This is ESC R ESC r ESC R.\r
 \r
-  Note: current implementation support terminal types include: PC ANSI, VT100+/VTUTF8, VT100. \r
+  Note: current implementation support terminal types include: PC ANSI, VT100+/VTUTF8, VT100.\r
         The table below is not same with UEFI Spec 2.3 Appendix B Table 201(not support ANSI X3.64 /\r
         DEC VT200-500 and extra support PC ANSI, VT100)since UEFI Table 201 is just an example.\r
-        \r
+\r
   Symbols used in table below\r
   ===========================\r
     ESC = 0x1B\r
@@ -1405,8 +1377,8 @@ UnicodeToEfiKey (
         continue;\r
       }\r
 \r
-      if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == VT100TYPE ||\r
-                                 TerminalDevice->TerminalType == TTYTERMTYPE)) {\r
+      if (UnicodeChar == 'O' && (TerminalDevice->TerminalType == TerminalTypeVt100 ||\r
+                                 TerminalDevice->TerminalType == TerminalTypeTtyTerm)) {\r
         TerminalDevice->InputState |= INPUT_STATE_O;\r
         TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
         continue;\r
@@ -1414,8 +1386,8 @@ UnicodeToEfiKey (
 \r
       Key.ScanCode = SCAN_NULL;\r
 \r
-      if (TerminalDevice->TerminalType == VT100PLUSTYPE ||\r
-          TerminalDevice->TerminalType == VTUTF8TYPE) {\r
+      if (TerminalDevice->TerminalType == TerminalTypeVt100Plus ||\r
+          TerminalDevice->TerminalType == TerminalTypeVtUtf8) {\r
         switch (UnicodeChar) {\r
         case '1':\r
           Key.ScanCode = SCAN_F1;\r
@@ -1519,7 +1491,7 @@ UnicodeToEfiKey (
 \r
       Key.ScanCode = SCAN_NULL;\r
 \r
-      if (TerminalDevice->TerminalType == VT100TYPE) {\r
+      if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
         switch (UnicodeChar) {\r
         case 'P':\r
           Key.ScanCode = SCAN_F1;\r
@@ -1554,7 +1526,7 @@ UnicodeToEfiKey (
         default :\r
           break;\r
         }\r
-      } else if (TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+      } else if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
         /* Also accept VT100 escape codes for F1-F4, HOME and END for TTY term */\r
         switch (UnicodeChar) {\r
         case 'P':\r
@@ -1596,11 +1568,11 @@ UnicodeToEfiKey (
 \r
       Key.ScanCode = SCAN_NULL;\r
 \r
-      if (TerminalDevice->TerminalType == PCANSITYPE    ||\r
-          TerminalDevice->TerminalType == VT100TYPE     ||\r
-          TerminalDevice->TerminalType == VT100PLUSTYPE ||\r
-          TerminalDevice->TerminalType == VTUTF8TYPE    ||\r
-          TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+      if (TerminalDevice->TerminalType == TerminalTypePcAnsi    ||\r
+          TerminalDevice->TerminalType == TerminalTypeVt100     ||\r
+          TerminalDevice->TerminalType == TerminalTypeVt100Plus ||\r
+          TerminalDevice->TerminalType == TerminalTypeVtUtf8    ||\r
+          TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
         switch (UnicodeChar) {\r
         case 'A':\r
           Key.ScanCode = SCAN_UP;\r
@@ -1615,104 +1587,104 @@ UnicodeToEfiKey (
           Key.ScanCode = SCAN_LEFT;\r
           break;\r
         case 'H':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE ||\r
-              TerminalDevice->TerminalType == VT100TYPE  ||\r
-              TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeVt100  ||\r
+              TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
             Key.ScanCode = SCAN_HOME;\r
           }\r
           break;\r
         case 'F':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE ||\r
-              TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
             Key.ScanCode = SCAN_END;\r
           }\r
           break;\r
         case 'K':\r
-          if (TerminalDevice->TerminalType == VT100TYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_END;\r
           }\r
           break;\r
         case 'L':\r
         case '@':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE ||\r
-              TerminalDevice->TerminalType == VT100TYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi ||\r
+              TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_INSERT;\r
           }\r
           break;\r
         case 'X':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_DELETE;\r
           }\r
           break;\r
         case 'P':\r
-          if (TerminalDevice->TerminalType == VT100TYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_DELETE;\r
-          } else if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          } else if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F4;\r
           }\r
           break;\r
         case 'I':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_PAGE_UP;\r
           }\r
           break;\r
         case 'V':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F10;\r
           }\r
           break;\r
         case '?':\r
-          if (TerminalDevice->TerminalType == VT100TYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_PAGE_UP;\r
           }\r
           break;\r
         case 'G':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_PAGE_DOWN;\r
           }\r
           break;\r
         case 'U':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F9;\r
           }\r
           break;\r
         case '/':\r
-          if (TerminalDevice->TerminalType == VT100TYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypeVt100) {\r
             Key.ScanCode = SCAN_PAGE_DOWN;\r
           }\r
           break;\r
         case 'M':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F1;\r
           }\r
           break;\r
         case 'N':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F2;\r
           }\r
           break;\r
         case 'O':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F3;\r
           }\r
           break;\r
         case 'Q':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F5;\r
           }\r
           break;\r
         case 'R':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F6;\r
           }\r
           break;\r
         case 'S':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F7;\r
           }\r
           break;\r
         case 'T':\r
-          if (TerminalDevice->TerminalType == PCANSITYPE) {\r
+          if (TerminalDevice->TerminalType == TerminalTypePcAnsi) {\r
             Key.ScanCode = SCAN_F8;\r
           }\r
           break;\r
@@ -1726,7 +1698,7 @@ UnicodeToEfiKey (
        * numeric codes, and there are no ambiguous prefixes shared with\r
        * other terminal types.\r
        */\r
-      if (TerminalDevice->TerminalType == TTYTERMTYPE &&\r
+      if (TerminalDevice->TerminalType == TerminalTypeTtyTerm &&\r
           Key.ScanCode == SCAN_NULL &&\r
           UnicodeChar >= '0' &&\r
           UnicodeChar <= '9') {\r
@@ -1755,7 +1727,7 @@ UnicodeToEfiKey (
        * state is only used by the TTY terminal type.\r
        */\r
       Key.ScanCode = SCAN_NULL;\r
-      if (TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+      if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
 \r
         if (UnicodeChar == '~' && TerminalDevice->TtyEscapeIndex <= 2) {\r
           UINT16 EscCode;\r
@@ -1851,7 +1823,7 @@ UnicodeToEfiKey (
     }\r
 \r
     if (UnicodeChar == DEL) {\r
-      if (TerminalDevice->TerminalType == TTYTERMTYPE) {\r
+      if (TerminalDevice->TerminalType == TerminalTypeTtyTerm) {\r
         Key.ScanCode    = SCAN_NULL;\r
         Key.UnicodeChar = CHAR_BACKSPACE;\r
       }\r