]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOut.c
ARM Packages: Fixed missing braces (the warning was disabled by GCC)
[mirror_edk2.git] / EmbeddedPkg / SimpleTextInOutSerial / SimpleTextInOut.c
index f491de6e9523312f486ad51dd71f2ebb88a6c349..5905a108b1650d0b0dcec8f3ace79791f47bed98 100644 (file)
@@ -1,9 +1,9 @@
 /** @file\r
   Simple Console that sits on a SerialLib. \r
 \r
-  Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
+  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
   \r
-  All rights reserved. This program and the accompanying materials\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
   http://opensource.org/licenses/bsd-license.php\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/SerialPortLib.h>\r
+#include <Library/PcdLib.h>\r
 \r
 #include <Protocol/SerialIo.h>\r
 #include <Protocol/SimpleTextIn.h>\r
 #include <Protocol/SimpleTextOut.h>\r
+#include <Protocol/DevicePath.h>\r
 \r
 \r
 #define MODE0_COLUMN_COUNT        80\r
@@ -198,7 +200,30 @@ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mSimpleTextOut = {
   &mSimpleTextOutMode\r
 };\r
 \r
- EFI_HANDLE           mInstallHandle = NULL;\r
+EFI_HANDLE           mInstallHandle = NULL;\r
+\r
+typedef struct {\r
+  VENDOR_DEVICE_PATH        Guid;\r
+  UART_DEVICE_PATH          Uart;\r
+  EFI_DEVICE_PATH_PROTOCOL  End;\r
+} SIMPLE_TEXT_OUT_DEVICE_PATH;\r
+\r
+SIMPLE_TEXT_OUT_DEVICE_PATH mDevicePath = {\r
+  {\r
+    { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0} },\r
+    EFI_CALLER_ID_GUID\r
+  },\r
+  {\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
+};\r
+\r
 \r
 \r
 \r
@@ -271,6 +296,10 @@ ReadKeyStroke (
 {\r
   CHAR8             Char;\r
   \r
+  if (!SerialPortPoll ()) {\r
+    return EFI_NOT_READY;\r
+  }\r
+  \r
   SerialPortRead ((UINT8 *)&Char, 1);\r
   \r
   //\r
@@ -488,14 +517,72 @@ OutputString (
   IN CHAR16                           *String\r
   )\r
 {\r
-  UINTN Size          = StrLen(String) + 1;\r
-  CHAR8 *OutputString = AllocatePool(Size);\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
   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
@@ -660,7 +747,8 @@ SimpleTextInOutEntryPoint (
                   &mInstallHandle,\r
                   &gEfiSimpleTextInProtocolGuid,   &mSimpleTextIn,\r
                   &gEfiSimpleTextOutProtocolGuid,  &mSimpleTextOut,\r
-                  NULL \r
+                  &gEfiDevicePathProtocolGuid,     &mDevicePath,\r
+                  NULL\r
                   );\r
   if (!EFI_ERROR (Status)) {\r
     gST->ConOut = &mSimpleTextOut;\r