]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
Fix the terminal driver to call hotkey callback even no one is calling ReadKeyStroke
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.c
index 313092c2c952ea0c8886fa2f2b4935509a7a7c87..9574390eb0908b76f37800315ac5b55b1f76cf8a 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 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2011, Intel Corporation. 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
@@ -75,6 +75,7 @@ TERMINAL_DEV  mTerminalDevTemplate = {
   NULL, // EfiKeyFiFo\r
 \r
   NULL, // ControllerNameTable\r
+  NULL, // TimerEvent\r
   NULL, // TwoSecondTimeOut\r
   INPUT_STATE_DEFAULT,\r
   RESET_STATE_DEFAULT,\r
@@ -648,7 +649,7 @@ TerminalDriverBindingStart (
                     EVT_NOTIFY_WAIT,\r
                     TPL_NOTIFY,\r
                     TerminalConInWaitForKeyEx,\r
-                    &TerminalDevice->SimpleInputEx,\r
+                    TerminalDevice,\r
                     &TerminalDevice->SimpleInputEx.WaitForKeyEx\r
                     );\r
     if (EFI_ERROR (Status)) {\r
@@ -659,7 +660,7 @@ TerminalDriverBindingStart (
                     EVT_NOTIFY_WAIT,\r
                     TPL_NOTIFY,\r
                     TerminalConInWaitForKey,\r
-                    &TerminalDevice->SimpleInput,\r
+                    TerminalDevice,\r
                     &TerminalDevice->SimpleInput.WaitForKey\r
                     );\r
     if (EFI_ERROR (Status)) {\r
@@ -842,6 +843,22 @@ TerminalDriverBindingStart (
       goto ReportError;\r
     }\r
 \r
+    Status = gBS->CreateEvent (\r
+                    EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
+                    TPL_NOTIFY,\r
+                    TerminalConInTimerHandler,\r
+                    TerminalDevice,\r
+                    &TerminalDevice->TimerEvent\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    Status = gBS->SetTimer (\r
+                    TerminalDevice->TimerEvent,\r
+                    TimerPeriodic,\r
+                    KEYBOARD_TIMER_INTERVAL\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
     Status = gBS->CreateEvent (\r
                     EVT_TIMER,\r
                     TPL_CALLBACK,\r
@@ -849,6 +866,7 @@ TerminalDriverBindingStart (
                     NULL,\r
                     &TerminalDevice->TwoSecondTimeOut\r
                     );\r
+    ASSERT_EFI_ERROR (Status);\r
 \r
     Status = gBS->InstallProtocolInterface (\r
                     &TerminalDevice->Handle,\r
@@ -1052,6 +1070,10 @@ Error:
         gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut);\r
       }\r
 \r
+      if (TerminalDevice->TimerEvent != NULL) {\r
+        gBS->CloseEvent (TerminalDevice->TimerEvent);\r
+      }\r
+\r
       if (TerminalDevice->SimpleInput.WaitForKey != NULL) {\r
         gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
       }\r
@@ -1245,6 +1267,7 @@ TerminalDriverBindingStop (
           FreeUnicodeStringTable (TerminalDevice->ControllerNameTable);\r
         }\r
 \r
+        gBS->CloseEvent (TerminalDevice->TimerEvent);\r
         gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut);\r
         gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey);\r
         gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r