]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
apply for doxgen format.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / Terminal.c
index 812756d551d1f6d8c61ea50533160a7b8ce0992a..76b603c3a3db006f74d7ae44b3ba354a7cf7d120 100644 (file)
@@ -1,6 +1,8 @@
-/*++\r
+/** @file\r
+  Produces Simple Text Input Protocl, Simple Text Input Extended Protocol and\r
+  Simple Text Output Protocol upon Serial IO Protocol.\r
 \r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
 All rights reserved. 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
@@ -9,19 +11,17 @@ http://opensource.org/licenses/bsd-license.php
 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
 \r
-Module Name:\r
-\r
-    Terminal.c\r
-\r
-Abstract:\r
-\r
-Revision History:\r
-\r
---*/\r
+**/\r
 \r
 \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
@@ -88,13 +88,25 @@ TERMINAL_DEV  gTerminalDevTemplate = {
   {\r
     0,\r
     0,\r
-    { 0 }\r
+    { {0} }\r
   },\r
   NULL, // ControllerNameTable\r
-  NULL, \r
+  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 +393,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 +416,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 +429,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
@@ -458,8 +483,30 @@ TerminalDriverBindingStart (
   //\r
   // Simple Text Output Protocol\r
   //\r
+  TerminalDevice->SimpleTextOutput.Reset              = TerminalConOutReset;\r
+  TerminalDevice->SimpleTextOutput.OutputString       = TerminalConOutOutputString;\r
+  TerminalDevice->SimpleTextOutput.TestString         = TerminalConOutTestString;\r
+  TerminalDevice->SimpleTextOutput.QueryMode          = TerminalConOutQueryMode;\r
+  TerminalDevice->SimpleTextOutput.SetMode            = TerminalConOutSetMode;\r
+  TerminalDevice->SimpleTextOutput.SetAttribute       = TerminalConOutSetAttribute;\r
+  TerminalDevice->SimpleTextOutput.ClearScreen        = TerminalConOutClearScreen;\r
+  TerminalDevice->SimpleTextOutput.SetCursorPosition  = TerminalConOutSetCursorPosition;\r
+  TerminalDevice->SimpleTextOutput.EnableCursor       = TerminalConOutEnableCursor;\r
   TerminalDevice->SimpleTextOutput.Mode               = &TerminalDevice->SimpleTextOutputMode;\r
 \r
+  TerminalDevice->SimpleTextOutputMode.MaxMode        = 3;\r
+  //\r
+  // For terminal devices, cursor is always visible\r
+  //\r
+  TerminalDevice->SimpleTextOutputMode.CursorVisible  = TRUE;\r
+  Status = TerminalDevice->SimpleTextOutput.SetAttribute (\r
+                                                      &TerminalDevice->SimpleTextOutput,\r
+                                                      EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)\r
+                                                      );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ReportError;\r
+  }\r
+\r
   Status = TerminalDevice->SimpleTextOutput.Reset (\r
                                               &TerminalDevice->SimpleTextOutput,\r
                                               FALSE\r
@@ -498,39 +545,75 @@ TerminalDriverBindingStart (
   TerminalDevice->ControllerNameTable = NULL;\r
   switch (TerminalDevice->TerminalType) {\r
   case PcAnsiType:\r
-    AddUnicodeString (\r
+    AddUnicodeString2 (\r
       "eng",\r
       gTerminalComponentName.SupportedLanguages,\r
       &TerminalDevice->ControllerNameTable,\r
-      (CHAR16 *)L"PC-ANSI Serial Console"\r
+      (CHAR16 *)L"PC-ANSI Serial Console",\r
+      TRUE\r
       );\r
+    AddUnicodeString2 (\r
+      "en",\r
+      gTerminalComponentName2.SupportedLanguages,\r
+      &TerminalDevice->ControllerNameTable,\r
+      (CHAR16 *)L"PC-ANSI Serial Console",\r
+      FALSE\r
+      );\r
+\r
     break;\r
 \r
   case VT100Type:\r
-    AddUnicodeString (\r
+    AddUnicodeString2 (\r
       "eng",\r
       gTerminalComponentName.SupportedLanguages,\r
       &TerminalDevice->ControllerNameTable,\r
-      (CHAR16 *)L"VT-100 Serial Console"\r
+      (CHAR16 *)L"VT-100 Serial Console",\r
+      TRUE\r
+      );\r
+    AddUnicodeString2 (\r
+      "en",\r
+      gTerminalComponentName2.SupportedLanguages,\r
+      &TerminalDevice->ControllerNameTable,\r
+      (CHAR16 *)L"VT-100 Serial Console",\r
+      FALSE\r
       );\r
+\r
     break;\r
 \r
   case VT100PlusType:\r
-    AddUnicodeString (\r
+    AddUnicodeString2 (\r
       "eng",\r
       gTerminalComponentName.SupportedLanguages,\r
       &TerminalDevice->ControllerNameTable,\r
-      (CHAR16 *)L"VT-100+ Serial Console"\r
+      (CHAR16 *)L"VT-100+ Serial Console",\r
+      TRUE\r
       );\r
+    AddUnicodeString2 (\r
+      "en",\r
+      gTerminalComponentName2.SupportedLanguages,\r
+      &TerminalDevice->ControllerNameTable,\r
+      (CHAR16 *)L"VT-100+ Serial Console",\r
+      FALSE\r
+      );\r
+\r
     break;\r
 \r
   case VTUTF8Type:\r
-    AddUnicodeString (\r
+    AddUnicodeString2 (\r
       "eng",\r
       gTerminalComponentName.SupportedLanguages,\r
       &TerminalDevice->ControllerNameTable,\r
-      (CHAR16 *)L"VT-UTF8 Serial Console"\r
+      (CHAR16 *)L"VT-UTF8 Serial Console",\r
+      TRUE\r
       );\r
+    AddUnicodeString2 (\r
+      "en",\r
+      gTerminalComponentName2.SupportedLanguages,\r
+      &TerminalDevice->ControllerNameTable,\r
+      (CHAR16 *)L"VT-UTF8 Serial Console",\r
+      FALSE\r
+      );\r
+\r
     break;\r
   }\r
   //\r
@@ -542,6 +625,8 @@ TerminalDriverBindingStart (
                   TerminalDevice->DevicePath,\r
                   &gEfiSimpleTextInProtocolGuid,\r
                   &TerminalDevice->SimpleInput,\r
+                  &gEfiSimpleTextInputExProtocolGuid,\r
+                  &TerminalDevice->SimpleInputEx,\r
                   &gEfiSimpleTextOutProtocolGuid,\r
                   &TerminalDevice->SimpleTextOutput,\r
                   NULL\r
@@ -619,6 +704,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
@@ -773,6 +864,8 @@ TerminalDriverBindingStop (
                       ChildHandleBuffer[Index],\r
                       &gEfiSimpleTextInProtocolGuid,\r
                       &TerminalDevice->SimpleInput,\r
+                      &gEfiSimpleTextInputExProtocolGuid,\r
+                      &TerminalDevice->SimpleInputEx,\r
                       &gEfiSimpleTextOutProtocolGuid,\r
                       &TerminalDevice->SimpleTextOutput,\r
                       &gEfiDevicePathProtocolGuid,\r
@@ -815,6 +908,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
@@ -832,6 +927,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
@@ -1202,9 +1338,9 @@ InitializeEfiKeyFiFo (
 /**\r
   The user Entry Point for module Terminal. The user code starts with this function.\r
 \r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS       The entry point is executed successfully.\r
   @retval other             Some error occurs when executing this entry point.\r
 \r
@@ -1221,14 +1357,13 @@ InitializeTerminal(
   //\r
   // Install driver model protocol(s).\r
   //\r
-  Status = EfiLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &gTerminalDriverBinding,\r
              ImageHandle,\r
              &gTerminalComponentName,\r
-             NULL,\r
-             NULL\r
+             &gTerminalComponentName2\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r