1. Sync the tracker for supporting the ModeNumber larger than 2.
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 21 Jan 2008 09:40:59 +0000 (09:40 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 21 Jan 2008 09:40:59 +0000 (09:40 +0000)
2. Fixed one bug in SetMode(), Cursor should not be enabled with mandatory.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4594 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c

index 63be0b1..abf3595 100644 (file)
@@ -2152,12 +2152,20 @@ Returns:
   Mode  = 0;\r
   Index = 0;\r
   while (Mode < MaxMode) {\r
-    TextOut->QueryMode (\r
-              TextOut,\r
-              Mode,\r
-              &Private->TextOutQueryData[Mode].Columns,\r
-              &Private->TextOutQueryData[Mode].Rows\r
-              );\r
+    Status = TextOut->QueryMode (\r
+                  TextOut,\r
+                  Mode,\r
+                  &Private->TextOutQueryData[Mode].Columns,\r
+                  &Private->TextOutQueryData[Mode].Rows\r
+                  );\r
+    //\r
+    // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData\r
+    // is clear to 0x0.\r
+    //\r
+    if ((EFI_ERROR(Status)) && (Mode == 1)) {\r
+      Private->TextOutQueryData[Mode].Columns = 0;\r
+      Private->TextOutQueryData[Mode].Rows = 0;\r
+    }\r
     Private->TextOutModeMap[Index] = Mode;\r
     Mode++;\r
     Index += Private->TextOutListCount;\r
@@ -2166,6 +2174,24 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Reconstruct TextOutModeMap to get intersection of modes\r
+\r
+  This routine reconstruct TextOutModeMap to get the intersection\r
+  of modes for all console out devices. Because EFI/UEFI spec require\r
+  mode 0 is 80x25, mode 1 is 80x50, this routine will not check the\r
+  intersection for mode 0 and mode 1.\r
+\r
+  @parm TextOutModeMap  Current text out mode map, begin with the mode 80x25\r
+  @parm NewlyAddedMap   New text out mode map, begin with the mode 80x25\r
+  @parm MapStepSize     Mode step size for one console device\r
+  @parm NewMapStepSize  Mode step size for one console device\r
+  @parm MaxMode         Current max text mode\r
+  @parm CurrentMode     Current text mode\r
+\r
+  @retval None\r
+\r
+**/\r
 STATIC\r
 VOID\r
 ConSplitterGetIntersection (\r
@@ -2183,9 +2209,16 @@ ConSplitterGetIntersection (
   INT32 CurrentMaxMode;\r
   INT32 Mode;\r
 \r
-  Index           = 0;\r
-  CurrentMapEntry = TextOutModeMap;\r
-  NextMapEntry    = TextOutModeMap;\r
+  //\r
+  // According to EFI/UEFI spec, mode 0 and mode 1 have been reserved\r
+  // for 80x25 and 80x50 in Simple Text Out protocol, so don't make intersection\r
+  // for mode 0 and mode 1, mode number starts from 2.\r
+  //\r
+  Index           = 2;\r
+  CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];\r
+  NextMapEntry    = &TextOutModeMap[MapStepSize * 2];\r
+  NewlyAddedMap   = &NewlyAddedMap[NewMapStepSize * 2];\r
+\r
   CurrentMaxMode  = *MaxMode;\r
   Mode            = *CurrentMode;\r
 \r
@@ -2248,6 +2281,7 @@ Returns:
   UINTN                         Rows;\r
   UINTN                         Columns;\r
   UINTN                         StepSize;\r
+  EFI_STATUS                    Status;\r
 \r
   //\r
   // Must make sure that current mode won't change even if mode number changes\r
@@ -2263,9 +2297,16 @@ Returns:
   Mode      = 0;\r
   MapTable  = TextOutModeMap + Private->CurrentNumberOfConsoles;\r
   while (Mode < TextOut->Mode->MaxMode) {\r
-    TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+    Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+    if (EFI_ERROR(Status)) {\r
+      if (Mode == 1) {\r
         MapTable[StepSize] = Mode;\r
-\r
+        TextOutQueryData[Mode].Columns = 0;\r
+        TextOutQueryData[Mode].Rows = 0;\r
+      }\r
+      Mode++;\r
+      continue;\r
+    }\r
     //\r
     // Search the intersection map and QueryData database to see if they intersects\r
     //\r
index 0f83803..37e816a 100644 (file)
@@ -1157,7 +1157,7 @@ GraphicsConsoleConOutQueryMode (
   GRAPHICS_CONSOLE_DEV  *Private;\r
   EFI_STATUS            Status;\r
   EFI_TPL               OldTpl;\r
-\r
+       \r
   if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -1280,10 +1280,10 @@ GraphicsConsoleConOutSetMode (
       goto Done;\r
     }\r
     //\r
-    // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
-    // so turn off the cursor, and free the LineBuffer for the current mode\r
+    // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,\r
+    // so erase the cursor, and free the LineBuffer for the current mode\r
     //\r
-    This->EnableCursor (This, FALSE);\r
+    EraseCursor (This);\r
 \r
     FreePool (Private->LineBuffer);\r
   }\r
@@ -1377,7 +1377,6 @@ GraphicsConsoleConOutSetMode (
   // Move the text cursor to the upper left hand corner of the displat and enable it\r
   //\r
   This->SetCursorPosition (This, 0, 0);\r
-  This->EnableCursor (This, TRUE);\r
 \r
   Status = EFI_SUCCESS;\r
 \r
index 8a38aa8..06c4f66 100644 (file)
@@ -500,7 +500,7 @@ TerminalDriverBindingStart (
   TerminalDevice->SimpleTextOutput.EnableCursor       = TerminalConOutEnableCursor;\r
   TerminalDevice->SimpleTextOutput.Mode               = &TerminalDevice->SimpleTextOutputMode;\r
 \r
-  TerminalDevice->SimpleTextOutputMode.MaxMode        = 2;\r
+  TerminalDevice->SimpleTextOutputMode.MaxMode        = 3;\r
   //\r
   // For terminal devices, cursor is always visible\r
   //\r
index 103adfb..ba573a6 100644 (file)
@@ -143,8 +143,12 @@ typedef union {
 #define MODE0_COLUMN_COUNT        80\r
 #define MODE0_ROW_COUNT           25\r
 \r
-#define MODE1_COLUMN_COUNT        100\r
-#define MODE1_ROW_COUNT           31\r
+#define MODE1_COLUMN_COUNT        80\r
+#define MODE1_ROW_COUNT           50\r
+\r
+#define MODE2_COLUMN_COUNT        100\r
+#define MODE2_ROW_COUNT           31\r
+\r
 #define BACKSPACE                 8\r
 #define ESC                       27\r
 #define CSI                       0x9B\r
index 74def9e..2be62ff 100644 (file)
@@ -230,7 +230,7 @@ TerminalConOutOutputString (
   //\r
   Mode = This->Mode;\r
   \r
-  if (Mode->Mode > 1) {\r
+  if (Mode->Mode > 2) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
@@ -431,11 +431,11 @@ TerminalConOutQueryMode (
 /*++\r
   Routine Description:\r
   \r
-    Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().\r
+    Implements EFI_SIMPLE_TEXT_OUT_PROTOCOL.QueryMode().\r
     It returns information for an available text mode\r
     that the terminal supports.\r
-    In this driver, we only support text mode 80x25, which is\r
-    defined as mode 0.\r
+    In this driver, we support text mode 80x25 (mode 0),\r
+    80x50 (mode 1), 100x31 (mode 2).\r
         \r
   \r
   Arguments:\r
@@ -464,7 +464,7 @@ TerminalConOutQueryMode (
                 \r
 --*/\r
 {\r
-  if (This->Mode->MaxMode > 2) {\r
+  if (This->Mode->MaxMode > 3) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -476,6 +476,10 @@ TerminalConOutQueryMode (
     *Columns  = MODE1_COLUMN_COUNT;\r
     *Rows     = MODE1_ROW_COUNT;\r
     return EFI_SUCCESS;\r
+  } else if (ModeNumber == 2) {\r
+    *Columns  = MODE2_COLUMN_COUNT;\r
+    *Rows     = MODE2_ROW_COUNT;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   return EFI_UNSUPPORTED;\r
@@ -523,7 +527,7 @@ TerminalConOutSetMode (
   //\r
   TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
 \r
-  if (ModeNumber > 1) {\r
+  if (ModeNumber > 2) {\r
     return EFI_UNSUPPORTED;\r
   }\r
   \r