]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOut.c
BaseTools/Capsule: Do not support -o with --dump-info
[mirror_edk2.git] / EmbeddedPkg / SimpleTextInOutSerial / SimpleTextInOut.c
index 583721b39e9a6d0c800b1325fb7b307497b9b6f1..8df58fce22071a1a6ea3d21039bacce2303f04c6 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
-  Simple Console that sits on a SerialLib. \r
+  Simple Console that sits on a SerialLib.\r
 \r
   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
-  \r
+\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
@@ -13,7 +13,7 @@
 \r
 **/\r
 \r
-/* \r
+/*\r
   Symbols used in table below\r
 ===========================\r
   ESC = 0x1B\r
@@ -210,18 +210,18 @@ typedef struct {
 \r
 SIMPLE_TEXT_OUT_DEVICE_PATH mDevicePath = {\r
   {\r
-    { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, sizeof (VENDOR_DEVICE_PATH), 0},\r
+    { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0} },\r
     EFI_CALLER_ID_GUID\r
   },\r
   {\r
-    { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, sizeof (UART_DEVICE_PATH), 0},\r
+    { MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0} },\r
     0,        // Reserved\r
     FixedPcdGet64 (PcdUartDefaultBaudRate),   // BaudRate\r
     FixedPcdGet8 (PcdUartDefaultDataBits),    // DataBits\r
     FixedPcdGet8 (PcdUartDefaultParity),      // Parity (N)\r
     FixedPcdGet8 (PcdUartDefaultStopBits)     // StopBits\r
   },\r
-  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, sizeof (EFI_DEVICE_PATH_PROTOCOL), 0}\r
+  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} }\r
 };\r
 \r
 \r
@@ -295,17 +295,17 @@ ReadKeyStroke (
   )\r
 {\r
   CHAR8             Char;\r
-  \r
+\r
   if (!SerialPortPoll ()) {\r
     return EFI_NOT_READY;\r
   }\r
-  \r
+\r
   SerialPortRead ((UINT8 *)&Char, 1);\r
-  \r
+\r
   //\r
   // Check for ESC sequence. This code is not techincally correct VT100 code.\r
   // An illegal ESC sequence represents an ESC and the characters that follow.\r
-  // This code will eat one or two chars after an escape. This is done to \r
+  // This code will eat one or two chars after an escape. This is done to\r
   // prevent some complex FIFOing of the data. It is good enough to get\r
   // the arrow and delete keys working\r
   //\r
@@ -332,7 +332,7 @@ ReadKeyStroke (
         Key->ScanCode = SCAN_HOME;\r
         break;\r
       case 'K':\r
-      case 'F': // PC ANSI \r
+      case 'F': // PC ANSI\r
         Key->ScanCode = SCAN_END;\r
         break;\r
       case '@':\r
@@ -340,7 +340,7 @@ ReadKeyStroke (
         Key->ScanCode = SCAN_INSERT;\r
         break;\r
       case 'P':\r
-      case 'X': // PC ANSI \r
+      case 'X': // PC ANSI\r
         Key->ScanCode = SCAN_DELETE;\r
         break;\r
       case 'U':\r
@@ -419,12 +419,12 @@ ReadKeyStroke (
       }\r
     }\r
   } else if (Char < ' ') {\r
-    if ((Char == CHAR_BACKSPACE) || \r
-        (Char == CHAR_TAB)       || \r
-        (Char == CHAR_LINEFEED)  || \r
+    if ((Char == CHAR_BACKSPACE) ||\r
+        (Char == CHAR_TAB)       ||\r
+        (Char == CHAR_LINEFEED)  ||\r
         (Char == CHAR_CARRIAGE_RETURN)) {\r
       // Only let through EFI required control characters\r
-      Key->UnicodeChar = (CHAR16)Char;  \r
+      Key->UnicodeChar = (CHAR16)Char;\r
     }\r
   } else if (Char == 0x7f) {\r
     Key->ScanCode = SCAN_DELETE;\r
@@ -517,14 +517,72 @@ OutputString (
   IN CHAR16                           *String\r
   )\r
 {\r
-  UINTN Size          = StrLen(String) + 1;\r
-  CHAR8 *OutputString = AllocatePool(Size);\r
-  \r
+  UINTN                       Size;\r
+  CHAR8*                      OutputString;\r
+  EFI_STATUS                  Status;\r
+  EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
+  UINTN                       MaxColumn;\r
+  UINTN                       MaxRow;\r
+\r
+  Size = StrLen(String) + 1;\r
+  OutputString = AllocatePool(Size);\r
+\r
   //If there is any non-ascii characters in String buffer then replace it with '?'\r
   //Eventually, UnicodeStrToAsciiStr API should be fixed.\r
-  SafeUnicodeStrToAsciiStr(String, OutputString);  \r
+  SafeUnicodeStrToAsciiStr(String, OutputString);\r
   SerialPortWrite ((UINT8 *)OutputString, Size - 1);\r
 \r
+  //\r
+  // Parse each character of the string to output\r
+  // to update the cursor position information\r
+  //\r
+  Mode = This->Mode;\r
+\r
+  Status = This->QueryMode (\r
+                   This,\r
+                   Mode->Mode,\r
+                   &MaxColumn,\r
+                   &MaxRow\r
+                   );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  for (; *String != CHAR_NULL; String++) {\r
+\r
+    switch (*String) {\r
+    case CHAR_BACKSPACE:\r
+      if (Mode->CursorColumn > 0) {\r
+        Mode->CursorColumn--;\r
+      }\r
+      break;\r
+\r
+    case CHAR_LINEFEED:\r
+      if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
+        Mode->CursorRow++;\r
+      }\r
+      break;\r
+\r
+    case CHAR_CARRIAGE_RETURN:\r
+      Mode->CursorColumn = 0;\r
+      break;\r
+\r
+    default:\r
+      if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {\r
+        // Move the cursor as if we print CHAR_CARRIAGE_RETURN & CHAR_LINE_FEED\r
+        // CHAR_LINEFEED\r
+        if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
+          Mode->CursorRow++;\r
+        }\r
+        // CHAR_CARIAGE_RETURN\r
+        Mode->CursorColumn = 0;\r
+      } else {\r
+        Mode->CursorColumn++;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
   FreePool(OutputString);\r
 \r
   return EFI_SUCCESS;\r
@@ -635,7 +693,7 @@ SetCursorPosition (
                   This,\r
                   Mode->Mode,\r
                   &MaxColumn,\r
-                  &MaxRow \r
+                  &MaxRow\r
                   );\r
   if (EFI_ERROR(Status)) {\r
     return EFI_UNSUPPORTED;\r
@@ -684,7 +742,7 @@ SimpleTextInOutEntryPoint (
                   &mSimpleTextIn.WaitForKey\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
-  \r
+\r
   Status = gBS->InstallMultipleProtocolInterfaces(\r
                   &mInstallHandle,\r
                   &gEfiSimpleTextInProtocolGuid,   &mSimpleTextIn,\r
@@ -696,6 +754,6 @@ SimpleTextInOutEntryPoint (
     gST->ConOut = &mSimpleTextOut;\r
     gST->ConIn = &mSimpleTextIn;\r
   }\r
-  \r
+\r
   return Status;\r
 }\r