]> 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 4860a4b21041a0cf220b77164a76ae97d4834567..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,20 +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
 \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
@@ -36,6 +35,82 @@ EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = {
 };\r
 \r
 \r
+EFI_GUID  *gTerminalType[] = {\r
+  &gEfiPcAnsiGuid,\r
+  &gEfiVT100Guid,\r
+  &gEfiVT100PlusGuid,\r
+  &gEfiVTUTF8Guid\r
+};\r
+\r
+\r
+TERMINAL_DEV  gTerminalDevTemplate = {\r
+  TERMINAL_DEV_SIGNATURE,\r
+  NULL,\r
+  0,\r
+  NULL,\r
+  NULL,\r
+  {   // SimpleTextInput\r
+    TerminalConInReset,\r
+    TerminalConInReadKeyStroke,\r
+    NULL\r
+  },\r
+  {   // SimpleTextOutput\r
+    TerminalConOutReset,\r
+    TerminalConOutOutputString,\r
+    TerminalConOutTestString,\r
+    TerminalConOutQueryMode,\r
+    TerminalConOutSetMode,\r
+    TerminalConOutSetAttribute,\r
+    TerminalConOutClearScreen,\r
+    TerminalConOutSetCursorPosition,\r
+    TerminalConOutEnableCursor,\r
+    NULL\r
+  },\r
+  {   // SimpleTextOutputMode\r
+    1,                                           // MaxMode\r
+    0,                                           // Mode?\r
+    EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK),    // Attribute\r
+    0,                                           // CursorColumn\r
+    0,                                           // CursorRow\r
+    TRUE                                         // CursorVisible\r
+  },\r
+  0,\r
+  {\r
+    0,\r
+    0,\r
+    { 0 }\r
+  },\r
+  {\r
+    0,\r
+    0,\r
+    { 0 }\r
+  },\r
+  {\r
+    0,\r
+    0,\r
+    { {0} }\r
+  },\r
+  NULL, // ControllerNameTable\r
+  NULL,\r
+  INPUT_STATE_DEFAULT,\r
+  RESET_STATE_DEFAULT,\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
+\r
 EFI_STATUS\r
 EFIAPI\r
 TerminalDriverBindingSupported (\r
@@ -243,9 +318,9 @@ TerminalDriverBindingStart (
                       EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
                       );\r
       if (EFI_ERROR (Status)) {\r
-        TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath);\r
-        TerminalUpdateConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath);\r
-        TerminalUpdateConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath);\r
+        TerminalUpdateConsoleDevVariable (L"ConInDev", ParentDevicePath);\r
+        TerminalUpdateConsoleDevVariable (L"ConOutDev", ParentDevicePath);\r
+        TerminalUpdateConsoleDevVariable (L"ErrOutDev", ParentDevicePath);\r
       }\r
     }\r
   }\r
@@ -276,61 +351,60 @@ TerminalDriverBindingStart (
   // If RemainingDevicePath is NULL, then create default device path node\r
   //\r
   if (RemainingDevicePath == NULL) {\r
-    DefaultNode = AllocatePool (sizeof (VENDOR_DEVICE_PATH));\r
+    DefaultNode = AllocateZeroPool (sizeof (VENDOR_DEVICE_PATH));\r
     if (DefaultNode == NULL) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
       goto Error;\r
     }\r
 \r
-    CopyMem (&DefaultNode->Guid, &gEfiPcAnsiGuid, sizeof (EFI_GUID));\r
-    RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) DefaultNode;\r
-  }\r
-  //\r
-  // Use the RemainingDevicePath to determine the terminal type\r
-  //\r
-  Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath;\r
-\r
-  if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
-\r
-    TerminalType = PcAnsiType;\r
-\r
-  } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
-\r
-    TerminalType = VT100Type;\r
-\r
-  } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
-\r
-    TerminalType = VT100PlusType;\r
-\r
-  } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
-\r
-    TerminalType = VTUTF8Type;\r
+    TerminalType = FixedPcdGet8 (PcdDefaultTerminalType);\r
+    // must be between PcAnsiType (0) and VTUTF8Type (3)\r
+    ASSERT (TerminalType <= VTUTF8Type);\r
 \r
+    CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));\r
+    RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*)DefaultNode;\r
   } else {\r
-    goto Error;\r
+    //\r
+    // Use the RemainingDevicePath to determine the terminal type\r
+    //\r
+    Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath;\r
+    if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
+      TerminalType = PcAnsiType;\r
+    } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
+      TerminalType = VT100Type;\r
+    } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
+      TerminalType = VT100PlusType;\r
+    } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
+      TerminalType = VTUTF8Type;\r
+    } else {\r
+      goto Error;\r
+    }\r
   }\r
+\r
   //\r
   // Initialize the Terminal Dev\r
   //\r
-  TerminalDevice = AllocatePool (sizeof (TERMINAL_DEV));\r
+  TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &gTerminalDevTemplate);\r
   if (TerminalDevice == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto Error;\r
   }\r
 \r
-  ZeroMem (TerminalDevice, sizeof (TERMINAL_DEV));\r
-\r
-  TerminalDevice->Signature     = TERMINAL_DEV_SIGNATURE;\r
-\r
   TerminalDevice->TerminalType  = TerminalType;\r
-\r
   TerminalDevice->SerialIo      = SerialIo;\r
 \r
-  //\r
-  // Simple Input Protocol\r
-  //\r
-  TerminalDevice->SimpleInput.Reset         = TerminalConInReset;\r
-  TerminalDevice->SimpleInput.ReadKeyStroke = TerminalConInReadKeyStroke;\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
@@ -420,12 +494,18 @@ TerminalDriverBindingStart (
   TerminalDevice->SimpleTextOutput.EnableCursor       = TerminalConOutEnableCursor;\r
   TerminalDevice->SimpleTextOutput.Mode               = &TerminalDevice->SimpleTextOutputMode;\r
 \r
-  TerminalDevice->SimpleTextOutputMode.MaxMode        = 1;\r
+  TerminalDevice->SimpleTextOutputMode.MaxMode        = 3;\r
   //\r
   // For terminal devices, cursor is always visible\r
   //\r
   TerminalDevice->SimpleTextOutputMode.CursorVisible  = TRUE;\r
-  TerminalDevice->SimpleTextOutputMode.Attribute      = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK);\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
@@ -450,11 +530,6 @@ TerminalDriverBindingStart (
   if (EFI_ERROR (Status)) {\r
     goto ReportError;\r
   }\r
-  //\r
-  //\r
-  //\r
-  TerminalDevice->InputState  = INPUT_STATE_DEFAULT;\r
-  TerminalDevice->ResetState  = RESET_STATE_DEFAULT;\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_TIMER,\r
@@ -470,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
@@ -514,6 +625,8 @@ TerminalDriverBindingStart (
                   TerminalDevice->DevicePath,\r
                   &gEfiSimpleTextInProtocolGuid,\r
                   &TerminalDevice->SimpleInput,\r
+                  &gEfiSimpleTextInputExProtocolGuid,\r
+                  &TerminalDevice->SimpleInputEx,\r
                   &gEfiSimpleTextOutProtocolGuid,\r
                   &TerminalDevice->SimpleTextOutput,\r
                   NULL\r
@@ -591,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
@@ -679,9 +798,9 @@ TerminalDriverBindingStop (
       // Remove Parent Device Path from\r
       // the Console Device Environment Variables\r
       //\r
-      TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleInpDev, ParentDevicePath);\r
-      TerminalRemoveConsoleDevVariable ((CHAR16 *)VarConsoleOutDev, ParentDevicePath);\r
-      TerminalRemoveConsoleDevVariable ((CHAR16 *)VarErrorOutDev, ParentDevicePath);\r
+      TerminalRemoveConsoleDevVariable (L"ConInDev", ParentDevicePath);\r
+      TerminalRemoveConsoleDevVariable (L"ConOutDev", ParentDevicePath);\r
+      TerminalRemoveConsoleDevVariable (L"ErrOutDev", ParentDevicePath);\r
 \r
       //\r
       // Uninstall the Terminal Driver's GUID Tag from the Serial controller\r
@@ -745,6 +864,8 @@ TerminalDriverBindingStop (
                       ChildHandleBuffer[Index],\r
                       &gEfiSimpleTextInProtocolGuid,\r
                       &TerminalDevice->SimpleInput,\r
+                      &gEfiSimpleTextInputExProtocolGuid,\r
+                      &TerminalDevice->SimpleInputEx,\r
                       &gEfiSimpleTextOutProtocolGuid,\r
                       &TerminalDevice->SimpleTextOutput,\r
                       &gEfiDevicePathProtocolGuid,\r
@@ -787,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
@@ -804,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
@@ -1174,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
@@ -1193,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