]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
Update to support EFI_SIMPLE_INPUT_EX protocol
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.c
index 4e2f650964f541d06b6a604da97c23befaf1b99d..aaeca12100f488a632070dfd333caf62d9a150cf 100644 (file)
@@ -22,6 +22,12 @@ Revision History:
 \r
 #include "Terminal.h"\r
 \r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+  IN OUT LIST_ENTRY           *ListHead\r
+  );  \r
+\r
 //\r
 // Globals\r
 //\r
@@ -94,7 +100,19 @@ TERMINAL_DEV  gTerminalDevTemplate = {
   NULL, \r
   INPUT_STATE_DEFAULT,\r
   RESET_STATE_DEFAULT,\r
-  FALSE\r
+  FALSE,\r
+  {   // SimpleTextInputEx\r
+    TerminalConInResetEx,\r
+    TerminalConInReadKeyStrokeEx,\r
+    NULL,\r
+    TerminalConInSetState,\r
+    TerminalConInRegisterKeyNotify,\r
+    TerminalConInUnregisterKeyNotify,\r
+  },\r
+  {\r
+    NULL,\r
+    NULL,\r
+  }\r
 };\r
 \r
 \r
@@ -381,6 +399,19 @@ TerminalDriverBindingStart (
   TerminalDevice->TerminalType  = TerminalType;\r
   TerminalDevice->SerialIo      = SerialIo;\r
 \r
+  InitializeListHead (&TerminalDevice->NotifyList);\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_NOTIFY,\r
+                  TerminalConInWaitForKeyEx,\r
+                  &TerminalDevice->SimpleInputEx,\r
+                  &TerminalDevice->SimpleInputEx.WaitForKeyEx\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
+\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
@@ -391,7 +422,6 @@ TerminalDriverBindingStart (
   if (EFI_ERROR (Status)) {\r
     goto Error;\r
   }\r
-\r
   //\r
   // initialize the FIFO buffer used for accommodating\r
   // the pre-read pending characters\r
@@ -405,6 +435,7 @@ TerminalDriverBindingStart (
   // keystroke response performance issue\r
   //\r
   Mode            = TerminalDevice->SerialIo->Mode;\r
+\r
   SerialInTimeOut = 0;\r
   if (Mode->BaudRate != 0) {\r
     SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;\r
@@ -578,6 +609,8 @@ TerminalDriverBindingStart (
                   TerminalDevice->DevicePath,\r
                   &gEfiSimpleTextInProtocolGuid,\r
                   &TerminalDevice->SimpleInput,\r
+                  &gEfiSimpleTextInputExProtocolGuid,\r
+                  &TerminalDevice->SimpleInputEx,\r
                   &gEfiSimpleTextOutProtocolGuid,\r
                   &TerminalDevice->SimpleTextOutput,\r
                   NULL\r
@@ -655,6 +688,12 @@ Error:
         gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
       }\r
 \r
+      if (TerminalDevice->SimpleInputEx.WaitForKeyEx != NULL) {\r
+        gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+      }\r
+\r
+      TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
+\r
       if (TerminalDevice->ControllerNameTable != NULL) {\r
         FreeUnicodeStringTable (TerminalDevice->ControllerNameTable);\r
       }\r
@@ -809,6 +848,8 @@ TerminalDriverBindingStop (
                       ChildHandleBuffer[Index],\r
                       &gEfiSimpleTextInProtocolGuid,\r
                       &TerminalDevice->SimpleInput,\r
+                      &gEfiSimpleTextInputExProtocolGuid,\r
+                      &TerminalDevice->SimpleInputEx,\r
                       &gEfiSimpleTextOutProtocolGuid,\r
                       &TerminalDevice->SimpleTextOutput,\r
                       &gEfiDevicePathProtocolGuid,\r
@@ -851,6 +892,8 @@ TerminalDriverBindingStop (
 \r
         gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut);\r
         gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
+        gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
+        TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
         FreePool (TerminalDevice->DevicePath);\r
         FreePool (TerminalDevice);\r
       }\r
@@ -868,6 +911,47 @@ TerminalDriverBindingStop (
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+TerminalFreeNotifyList (\r
+  IN OUT LIST_ENTRY           *ListHead\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+  ListHead   - The list head\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Free the notify list successfully\r
+  EFI_INVALID_PARAMETER - ListHead is invalid.\r
+\r
+--*/\r
+{\r
+  TERMINAL_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
+\r
+  if (ListHead == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  while (!IsListEmpty (ListHead)) {\r
+    NotifyNode = CR (\r
+                   ListHead->ForwardLink, \r
+                   TERMINAL_CONSOLE_IN_EX_NOTIFY, \r
+                   NotifyEntry, \r
+                   TERMINAL_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
+                   );\r
+    RemoveEntryList (ListHead->ForwardLink);\r
+    gBS->FreePool (NotifyNode);\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
 VOID\r
 TerminalUpdateConsoleDevVariable (\r
   IN CHAR16                    *VariableName,\r