]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg GraphicsConsole: Add text mode for PcdConOutColumn/Row
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 23 Mar 2011 02:11:14 +0000 (02:11 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 23 Mar 2011 02:11:14 +0000 (02:11 +0000)
Add a new text mode with a resolution of PcdConOutColumn x PcdConOutRow.

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

MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf

index e6f732db8b582cc48870904b9d8eda0da210db45..bed16ac4fa1f46c5d79bbe51fcff6244ec3364e5 100644 (file)
@@ -42,10 +42,11 @@ GRAPHICS_CONSOLE_DEV    mGraphicsConsoleDevTemplate = {
     TRUE\r
   },\r
   {\r
-    { 80, 25, 0, 0, 0, 0 },  // Mode 0\r
-    { 80, 50, 0, 0, 0, 0 },  // Mode 1\r
-    { 100,31, 0, 0, 0, 0 },  // Mode 2\r
-    {  0,  0, 0, 0, 0, 0 }   // Mode 3\r
+    { 80, 25, 0, 0, 0, 0, 0 },  // Mode 0\r
+    { 80, 50, 0, 0, 0, 0, 0 },  // Mode 1\r
+    { 100,31, 0, 0, 0, 0, 0 },  // Mode 2\r
+    {  0,  0, 0, 0, 0, 0, 0 },  // Mode 3\r
+    {  0,  0, 0, 0, 0, 0, 0 }   // Mode 4\r
   },\r
   (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL\r
 };\r
@@ -238,11 +239,13 @@ GraphicsConsoleControllerDriverStart (
   UINT32                               VerticalResolution;\r
   UINT32                               ColorDepth;\r
   UINT32                               RefreshRate;\r
+  UINTN                                ModeIndex;\r
   UINTN                                MaxMode;\r
   UINTN                                Columns;\r
   UINTN                                Rows;\r
   UINT32                               ModeNumber;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE    *Mode;\r
+  GRAPHICS_CONSOLE_MODE_DATA           *ModeData;\r
   ModeNumber = 0;\r
 \r
   //\r
@@ -375,78 +378,63 @@ GraphicsConsoleControllerDriverStart (
   }\r
 \r
   //\r
-  // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
+  // Add Mode #3 that uses the entire display for user-defined mode\r
   //\r
-  Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
-  Rows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
+  Private->ModeData[3].Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+  Private->ModeData[3].Rows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
 \r
   //\r
-  // See if the mode is too small to support the required 80x25 text mode\r
+  // Add Mode #4 that uses the PCD values\r
   //\r
-  if (Columns < 80 || Rows < 25) {\r
-    goto Error;\r
-  }\r
+  Private->ModeData[4].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
+  Private->ModeData[4].Rows    = (UINTN) PcdGet32 (PcdConOutRow);\r
+\r
   //\r
-  // Add Mode #0 that must be 80x25\r
+  // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
   //\r
-  MaxMode = 0;\r
-  Private->ModeData[MaxMode].GopWidth      = HorizontalResolution;\r
-  Private->ModeData[MaxMode].GopHeight     = VerticalResolution;\r
-  Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-  Private->ModeData[MaxMode].DeltaX        = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
-  Private->ModeData[MaxMode].DeltaY        = (VerticalResolution - (25 * EFI_GLYPH_HEIGHT)) >> 1;\r
-  MaxMode++;\r
-\r
-  //\r
-  // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
-  //\r
-  if (Rows >= 50) {\r
-    Private->ModeData[MaxMode].GopWidth      = HorizontalResolution;\r
-    Private->ModeData[MaxMode].GopHeight     = VerticalResolution;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX        = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY        = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
-    MaxMode++;\r
-  }\r
+  Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+  Rows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
 \r
   //\r
-  // If it is not to support Mode #1 - 80x50, then skip it\r
+  // Here we make sure that mode 0 is valid\r
   //\r
-  if (MaxMode < 2) {\r
-    Private->ModeData[MaxMode].Columns       = 0;\r
-    Private->ModeData[MaxMode].Rows          = 0;\r
-    Private->ModeData[MaxMode].GopWidth      = HorizontalResolution;\r
-    Private->ModeData[MaxMode].GopHeight     = VerticalResolution;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX        = 0;\r
-    Private->ModeData[MaxMode].DeltaY        = 0;\r
-    MaxMode++;\r
+  if (Columns < Private->ModeData[0].Columns ||\r
+      Rows < Private->ModeData[0].Rows) {\r
+    //\r
+    // 80x25 cannot be supported.\r
+    //\r
+    // Fallback to using the PcdConOutColumn and PcdConOutRow\r
+    // for mode 0.  If the PCDs are also to large, then mode 0\r
+    // will be shrunk to fit as needed.\r
+    //\r
+    Private->ModeData[0].Columns = MIN (Private->ModeData[4].Columns, Columns);\r
+    Private->ModeData[0].Rows    = MIN (Private->ModeData[4].Rows, Rows);\r
   }\r
 \r
-  //\r
-  // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
-  //\r
-  if (Columns >= 100 && Rows >= 31) {\r
-    Private->ModeData[MaxMode].GopWidth      = HorizontalResolution;\r
-    Private->ModeData[MaxMode].GopHeight     = VerticalResolution;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX        = (HorizontalResolution - (100 * EFI_GLYPH_WIDTH)) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY        = (VerticalResolution - (31 * EFI_GLYPH_HEIGHT)) >> 1;\r
-    MaxMode++;\r
+  MaxMode = 0;\r
+  for (ModeIndex = 0; ModeIndex < GRAPHICS_MAX_MODE; ModeIndex++) {\r
+    ModeData = &Private->ModeData[ModeIndex];\r
+    ModeData->GopWidth      = HorizontalResolution;\r
+    ModeData->GopHeight     = VerticalResolution;\r
+    ModeData->GopModeNumber = ModeNumber;\r
+    if (Columns >= ModeData->Columns &&\r
+        Rows >= ModeData->Rows) {\r
+      ModeData->DeltaX        = (HorizontalResolution - (ModeData->Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+      ModeData->DeltaY        = (VerticalResolution - (ModeData->Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
+      MaxMode = ModeIndex + 1;\r
+    } else {\r
+      ModeData->Columns       = 0;\r
+      ModeData->Rows          = 0;\r
+      ModeData->DeltaX        = 0;\r
+      ModeData->DeltaY        = 0;\r
+    }\r
   }\r
 \r
   //\r
-  // Add Mode #3 that uses the entire display for user-defined mode\r
+  // See if the resolution was too small to support any text modes\r
   //\r
-  if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
-    Private->ModeData[MaxMode].Columns       = HorizontalResolution/EFI_GLYPH_WIDTH;\r
-    Private->ModeData[MaxMode].Rows          = VerticalResolution/EFI_GLYPH_HEIGHT;\r
-    Private->ModeData[MaxMode].GopWidth      = HorizontalResolution;\r
-    Private->ModeData[MaxMode].GopHeight     = VerticalResolution;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX        = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY        = (VerticalResolution % EFI_GLYPH_HEIGHT) >> 1;\r
-    MaxMode++;\r
+  if (MaxMode == 0) {\r
+    goto Error;\r
   }\r
 \r
   //\r
index 4d909a443f1578ffffd16f4a4627f44a92bb5526..24285a9adbba6834c4d455f0491842f6e601c257 100644 (file)
@@ -69,7 +69,7 @@ typedef struct {
   UINT32  GopModeNumber;\r
 } GRAPHICS_CONSOLE_MODE_DATA;\r
 \r
-#define GRAPHICS_MAX_MODE 4\r
+#define GRAPHICS_MAX_MODE 5\r
 \r
 typedef struct {\r
   UINTN                            Signature;\r
index 59c8f2d634bd3de89832ddcae1fc7b558b804a0d..169e15a46fa8b59bf17b3da98ebcb6c2aa147edd 100644 (file)
@@ -51,6 +51,7 @@
   UefiDriverEntryPoint\r
   DebugLib\r
   HiiLib\r
+  PcdLib\r
 \r
 [Protocols]\r
   gEfiDevicePathProtocolGuid                    ## CONSUMES\r
@@ -61,4 +62,9 @@
   gEfiHiiDatabaseProtocolGuid                   ## TO_START   \r
 \r
 [FeaturePcd]\r
-  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
\ No newline at end of file
+  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport\r
+\r
+[Pcd]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow\r
+\r