Updated GraphicsConsole and Terminal driver text mode initialization routine for easy mode extension in future.

Signed-off-by: li-elvin
Reviewed-by: hhtian


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12787 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
li-elvin
2011-11-25 08:35:00 +00:00
parent 13535a3bda
commit 79d07c66d9
5 changed files with 330 additions and 135 deletions

View File

@ -41,16 +41,20 @@ GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = {
0, 0,
TRUE TRUE
}, },
{ (GRAPHICS_CONSOLE_MODE_DATA *) NULL,
{ 80, 25, 0, 0, 0, 0, 0 }, // Mode 0
{ 80, 50, 0, 0, 0, 0, 0 }, // Mode 1
{ 100,31, 0, 0, 0, 0, 0 }, // Mode 2
{ 0, 0, 0, 0, 0, 0, 0 }, // Mode 3
{ 0, 0, 0, 0, 0, 0, 0 } // Mode 4
},
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL
}; };
GRAPHICS_CONSOLE_MODE_DATA mGraphicsConsoleModeData[] = {
{100, 31},
//
// New modes can be added here.
// The last 2 entries are specific for PcdConOutRow x PcdConOutColumn and full screen mode.
//
{0, 0},
{0, 0}
};
EFI_HII_DATABASE_PROTOCOL *mHiiDatabase; EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;
EFI_HII_FONT_PROTOCOL *mHiiFont; EFI_HII_FONT_PROTOCOL *mHiiFont;
EFI_HII_HANDLE mHiiHandle; EFI_HII_HANDLE mHiiHandle;
@ -210,6 +214,159 @@ Error:
return Status; return Status;
} }
/**
Initialize all the text modes which the graphics console supports.
It returns information for available text modes that the graphics can support.
@param[in] HorizontalResolution The size of video screen in pixels in the X dimension.
@param[in] VerticalResolution The size of video screen in pixels in the Y dimension.
@param[in] GopModeNumber The graphics mode number which graphis console is based on.
@param[out] TextModeCount The total number of text modes that graphics console supports.
@param[out] TextModeData The buffer to the text modes column and row information.
Caller is responsible to free it when it's non-NULL.
@retval EFI_SUCCESS The supporting mode information is returned.
@retval EFI_INVALID_PARAMETER The parameters are invalid.
**/
EFI_STATUS
InitializeGraphicsConsoleTextMode (
IN UINT32 HorizontalResolution,
IN UINT32 VerticalResolution,
IN UINT32 GopModeNumber,
OUT UINTN *TextModeCount,
OUT GRAPHICS_CONSOLE_MODE_DATA **TextModeData
)
{
UINTN Index;
UINTN Count;
GRAPHICS_CONSOLE_MODE_DATA *ModeBuffer;
GRAPHICS_CONSOLE_MODE_DATA *NewModeBuffer;
UINTN ValidCount;
UINTN ValidIndex;
UINTN MaxColumns;
UINTN MaxRows;
if ((TextModeCount == NULL) || (TextModeData == NULL)) {
return EFI_INVALID_PARAMETER;
}
//
// Add PcdConOutColumn and PcdConOutRow to the last second entry.
//
Count = sizeof (mGraphicsConsoleModeData) / sizeof (GRAPHICS_CONSOLE_MODE_DATA);
mGraphicsConsoleModeData[Count - 2].Columns = (UINTN) PcdGet32 (PcdConOutColumn);
mGraphicsConsoleModeData[Count - 2].Rows = (UINTN) PcdGet32 (PcdConOutRow);
//
// Compute the maximum number of text Rows and Columns that this current graphics mode can support.
// To make graphics console work well, MaxColumns and MaxRows should not be zero.
//
MaxColumns = HorizontalResolution / EFI_GLYPH_WIDTH;
MaxRows = VerticalResolution / EFI_GLYPH_HEIGHT;
//
// Add full screen mode to the last entry.
//
mGraphicsConsoleModeData[Count - 1].Columns = MaxColumns;
mGraphicsConsoleModeData[Count - 1].Rows = MaxRows;
//
// Get defined mode buffer pointer.
//
ModeBuffer = mGraphicsConsoleModeData;
//
// Here we make sure that the final mode exposed does not include the duplicated modes,
// and does not include the invalid modes which exceed the max column and row.
// Reserve 2 modes for 80x25, 80x50 of graphics console.
//
NewModeBuffer = AllocateZeroPool (sizeof (GRAPHICS_CONSOLE_MODE_DATA) * (Count + 2));
ASSERT (NewModeBuffer != NULL);
//
// Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.
//
ValidCount = 0;
if ((MaxColumns >= 80) && (MaxRows >= 25)) {
//
// 80x25 can be supported.
//
NewModeBuffer[ValidCount].Columns = 80;
NewModeBuffer[ValidCount].Rows = 25;
} else {
//
// 80x25 cannot be supported, set PCD defined mode.
//
NewModeBuffer[ValidCount].Columns = (UINTN) PcdGet32 (PcdConOutColumn);
NewModeBuffer[ValidCount].Rows = (UINTN) PcdGet32 (PcdConOutRow);
}
NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;
NewModeBuffer[ValidCount].GopHeight = VerticalResolution;
NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;
NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;
NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;
ValidCount++;
if ((MaxColumns >= 80) && (MaxRows >= 50)) {
NewModeBuffer[ValidCount].Columns = 80;
NewModeBuffer[ValidCount].Rows = 50;
NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;
NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;
}
NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;
NewModeBuffer[ValidCount].GopHeight = VerticalResolution;
NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;
ValidCount++;
//
// Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.
//
for (Index = 0; Index < Count; Index++) {
if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0) ||
(ModeBuffer[Index].Columns > MaxColumns) || (ModeBuffer[Index].Rows > MaxRows)) {
//
// Skip the pre-defined mode which is invalid or exceeds the max column and row.
//
continue;
}
for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {
if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&
(ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {
//
// Skip the duplicated mode.
//
break;
}
}
if (ValidIndex == ValidCount) {
NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns;
NewModeBuffer[ValidCount].Rows = ModeBuffer[Index].Rows;
NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;
NewModeBuffer[ValidCount].GopHeight = VerticalResolution;
NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;
NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;
NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;
ValidCount++;
}
}
DEBUG_CODE (
for (Index = 0; Index < ValidCount; Index++) {
DEBUG ((EFI_D_INFO, "Graphics - Mode %d, Column = %d, Row = %d\n",
Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));
}
);
//
// Return valid mode count and mode information buffer.
//
*TextModeCount = ValidCount;
*TextModeData = NewModeBuffer;
return EFI_SUCCESS;
}
/** /**
Start this driver on Controller by opening Graphics Output protocol or Start this driver on Controller by opening Graphics Output protocol or
@ -241,14 +398,10 @@ GraphicsConsoleControllerDriverStart (
UINT32 RefreshRate; UINT32 RefreshRate;
UINT32 ModeIndex; UINT32 ModeIndex;
UINTN MaxMode; UINTN MaxMode;
UINTN MaxColumns;
UINTN MaxRows;
UINT32 ModeNumber; UINT32 ModeNumber;
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode; EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
GRAPHICS_CONSOLE_MODE_DATA *ModeData;
UINTN SizeOfInfo; UINTN SizeOfInfo;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
BOOLEAN TextModeFound;
ModeNumber = 0; ModeNumber = 0;
@ -399,80 +552,17 @@ GraphicsConsoleControllerDriverStart (
} }
// //
// Include the existing pre-defined 80x25, 80x50 and 100x31 // Initialize the mode which GraphicsConsole supports.
// in mGraphicsConsoleDevTemplate.
// //
MaxMode = 3; Status = InitializeGraphicsConsoleTextMode (
HorizontalResolution,
VerticalResolution,
ModeNumber,
&MaxMode,
&Private->ModeData
);
// if (EFI_ERROR (Status)) {
// Compute the maximum number of text Rows and Columns that this current graphics mode can support
//
MaxColumns = HorizontalResolution / EFI_GLYPH_WIDTH;
MaxRows = VerticalResolution / EFI_GLYPH_HEIGHT;
//
// Add Mode #3 that uses the entire display for user-defined mode
//
Private->ModeData[MaxMode].Columns = MaxColumns;
Private->ModeData[MaxMode].Rows = MaxRows;
MaxMode++;
//
// Add Mode #4 that uses the PCD values
//
Private->ModeData[MaxMode].Columns = (UINTN) PcdGet32 (PcdConOutColumn);
Private->ModeData[MaxMode].Rows = (UINTN) PcdGet32 (PcdConOutRow);
if ((Private->ModeData[MaxMode].Columns != 0) && (Private->ModeData[MaxMode].Rows != 0)) {
MaxMode++;
}
//
// Here we make sure that mode 0 is valid
//
if (MaxColumns < Private->ModeData[0].Columns ||
MaxRows < Private->ModeData[0].Rows) {
//
// 80x25 cannot be supported.
//
if ((Private->ModeData[4].Columns != 0) && (Private->ModeData[4].Rows != 0)) {
//
// Fallback to using the Mode 4 for mode 0 if PcdConOutColumn and PcdConOutRow
// are not 0. If the PCDs are also too large, then mode 0
// will be shrunk to fit as needed. If the PCDs are all 0,
// then mode 0 will be the entire display.
//
Private->ModeData[0].Columns = MIN (Private->ModeData[4].Columns, MaxColumns);
Private->ModeData[0].Rows = MIN (Private->ModeData[4].Rows, MaxRows);
} else {
Private->ModeData[0].Columns = MaxColumns;
Private->ModeData[0].Rows = MaxRows;
}
}
TextModeFound = FALSE;
for (ModeIndex = 0; ModeIndex < GRAPHICS_MAX_MODE; ModeIndex++) {
ModeData = &Private->ModeData[ModeIndex];
ModeData->GopWidth = HorizontalResolution;
ModeData->GopHeight = VerticalResolution;
ModeData->GopModeNumber = ModeNumber;
if ((ModeData->Columns != 0) && (ModeData->Rows != 0) &&
(MaxColumns >= ModeData->Columns) && (MaxRows >= ModeData->Rows)) {
ModeData->DeltaX = (HorizontalResolution - (ModeData->Columns * EFI_GLYPH_WIDTH)) >> 1;
ModeData->DeltaY = (VerticalResolution - (ModeData->Rows * EFI_GLYPH_HEIGHT)) >> 1;
TextModeFound = TRUE;
} else {
ModeData->Columns = 0;
ModeData->Rows = 0;
ModeData->DeltaX = 0;
ModeData->DeltaY = 0;
}
}
//
// See if the resolution was too small to support any text modes
//
if (!TextModeFound) {
Status = EFI_UNSUPPORTED;
goto Error; goto Error;
} }
@ -528,6 +618,10 @@ Error:
FreePool (Private->LineBuffer); FreePool (Private->LineBuffer);
} }
if (Private->ModeData != NULL) {
FreePool (Private->ModeData);
}
// //
// Free private data // Free private data
// //
@ -612,6 +706,10 @@ GraphicsConsoleControllerDriverStop (
FreePool (Private->LineBuffer); FreePool (Private->LineBuffer);
} }
if (Private->ModeData != NULL) {
FreePool (Private->ModeData);
}
// //
// Free our instance data // Free our instance data
// //
@ -1162,7 +1260,7 @@ GraphicsConsoleConOutQueryMode (
*Columns = Private->ModeData[ModeNumber].Columns; *Columns = Private->ModeData[ModeNumber].Columns;
*Rows = Private->ModeData[ModeNumber].Rows; *Rows = Private->ModeData[ModeNumber].Rows;
if (*Columns <= 0 && *Rows <= 0) { if (*Columns <= 0 || *Rows <= 0) {
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
goto Done; goto Done;

View File

@ -63,15 +63,13 @@ typedef struct {
UINT32 GopModeNumber; UINT32 GopModeNumber;
} GRAPHICS_CONSOLE_MODE_DATA; } GRAPHICS_CONSOLE_MODE_DATA;
#define GRAPHICS_MAX_MODE 5
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_UGA_DRAW_PROTOCOL *UgaDraw;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput;
EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode; EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;
GRAPHICS_CONSOLE_MODE_DATA ModeData[GRAPHICS_MAX_MODE]; GRAPHICS_CONSOLE_MODE_DATA *ModeData;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LineBuffer; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LineBuffer;
} GRAPHICS_CONSOLE_DEV; } GRAPHICS_CONSOLE_DEV;

View File

@ -68,6 +68,7 @@ TERMINAL_DEV mTerminalDevTemplate = {
0, // CursorRow 0, // CursorRow
TRUE // CursorVisible TRUE // CursorVisible
}, },
NULL, // TerminalConsoleModeData
0, // SerialInTimeOut 0, // SerialInTimeOut
NULL, // RawFifo NULL, // RawFifo
@ -94,6 +95,15 @@ TERMINAL_DEV mTerminalDevTemplate = {
} }
}; };
TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {
{100, 31},
//
// New modes can be added here.
// The last entry is specific for PcdConOutRow x PcdConOutColumn.
//
{0, 0}
};
/** /**
Test to see if this driver supports Controller. Test to see if this driver supports Controller.
@ -398,6 +408,109 @@ TerminalFreeNotifyList (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Initialize all the text modes which the terminal console supports.
It returns information for available text modes that the terminal can support.
@param[out] TextModeCount The total number of text modes that terminal console supports.
@param[out] TextModeData The buffer to the text modes column and row information.
Caller is responsible to free it when it's non-NULL.
@retval EFI_SUCCESS The supporting mode information is returned.
@retval EFI_INVALID_PARAMETER The parameters are invalid.
**/
EFI_STATUS
InitializeTerminalConsoleTextMode (
OUT UINTN *TextModeCount,
OUT TERMINAL_CONSOLE_MODE_DATA **TextModeData
)
{
UINTN Index;
UINTN Count;
TERMINAL_CONSOLE_MODE_DATA *ModeBuffer;
TERMINAL_CONSOLE_MODE_DATA *NewModeBuffer;
UINTN ValidCount;
UINTN ValidIndex;
if ((TextModeCount == NULL) || (TextModeData == NULL)) {
return EFI_INVALID_PARAMETER;
}
//
// Assign the last entry as PcdConOutColumn and PcdConOutRow defined.
//
Count = sizeof (mTerminalConsoleModeData) / sizeof (TERMINAL_CONSOLE_MODE_DATA);
mTerminalConsoleModeData[Count - 1].Columns = (UINTN) PcdGet32 (PcdConOutColumn);
mTerminalConsoleModeData[Count - 1].Rows = (UINTN) PcdGet32 (PcdConOutRow);;
//
// Get defined mode buffer pointer.
//
ModeBuffer = mTerminalConsoleModeData;
//
// Here we make sure that the final mode exposed does not include the duplicated modes,
// and does not include the invalid modes which exceed the max column and row.
// Reserve 2 modes for 80x25, 80x50 of terminal console.
//
NewModeBuffer = AllocateZeroPool (sizeof (TERMINAL_CONSOLE_MODE_DATA) * (Count + 2));
ASSERT (NewModeBuffer != NULL);
//
// Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.
//
ValidCount = 0;
NewModeBuffer[ValidCount].Columns = 80;
NewModeBuffer[ValidCount].Rows = 25;
ValidCount++;
NewModeBuffer[ValidCount].Columns = 80;
NewModeBuffer[ValidCount].Rows = 50;
ValidCount++;
//
// Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.
//
for (Index = 0; Index < Count; Index++) {
if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0)) {
//
// Skip the pre-defined mode which is invalid.
//
continue;
}
for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {
if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&
(ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {
//
// Skip the duplicated mode.
//
break;
}
}
if (ValidIndex == ValidCount) {
NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns;
NewModeBuffer[ValidCount].Rows = ModeBuffer[Index].Rows;
ValidCount++;
}
}
DEBUG_CODE (
for (Index = 0; Index < ValidCount; Index++) {
DEBUG ((EFI_D_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n",
Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));
}
);
//
// Return valid mode count and mode information buffer.
//
*TextModeCount = ValidCount;
*TextModeData = NewModeBuffer;
return EFI_SUCCESS;
}
/** /**
Start this driver on Controller by opening a Serial IO protocol, Start this driver on Controller by opening a Serial IO protocol,
@ -444,6 +557,7 @@ TerminalDriverBindingStart (
BOOLEAN SimTxtInInstalled; BOOLEAN SimTxtInInstalled;
BOOLEAN SimTxtOutInstalled; BOOLEAN SimTxtOutInstalled;
BOOLEAN FirstEnter; BOOLEAN FirstEnter;
UINTN ModeCount;
TerminalDevice = NULL; TerminalDevice = NULL;
DefaultNode = NULL; DefaultNode = NULL;
@ -724,8 +838,13 @@ TerminalDriverBindingStart (
sizeof (mTerminalDevTemplate.SimpleTextOutput) sizeof (mTerminalDevTemplate.SimpleTextOutput)
); );
SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode; SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode;
TerminalDevice->SimpleTextOutputMode.MaxMode = TERMINAL_MAX_MODE; Status = InitializeTerminalConsoleTextMode (&ModeCount, &TerminalDevice->TerminalConsoleModeData);
if (EFI_ERROR (Status)) {
goto ReportError;
}
TerminalDevice->SimpleTextOutputMode.MaxMode = (INT32) ModeCount;
// //
// For terminal devices, cursor is always visible // For terminal devices, cursor is always visible
// //
@ -1102,6 +1221,10 @@ Error:
FreePool (TerminalDevice->DevicePath); FreePool (TerminalDevice->DevicePath);
} }
if (TerminalDevice->TerminalConsoleModeData != NULL) {
FreePool (TerminalDevice->TerminalConsoleModeData);
}
FreePool (TerminalDevice); FreePool (TerminalDevice);
} }
} }
@ -1273,6 +1396,9 @@ TerminalDriverBindingStop (
gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx); gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);
TerminalFreeNotifyList (&TerminalDevice->NotifyList); TerminalFreeNotifyList (&TerminalDevice->NotifyList);
FreePool (TerminalDevice->DevicePath); FreePool (TerminalDevice->DevicePath);
if (TerminalDevice->TerminalConsoleModeData != NULL) {
FreePool (TerminalDevice->TerminalConsoleModeData);
}
FreePool (TerminalDevice); FreePool (TerminalDevice);
} }
} }

View File

@ -61,6 +61,11 @@ typedef struct {
EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1]; EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1];
} EFI_KEY_FIFO; } EFI_KEY_FIFO;
typedef struct {
UINTN Columns;
UINTN Rows;
} TERMINAL_CONSOLE_MODE_DATA;
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s #define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
#define TERMINAL_DEV_SIGNATURE SIGNATURE_32 ('t', 'm', 'n', 'l') #define TERMINAL_DEV_SIGNATURE SIGNATURE_32 ('t', 'm', 'n', 'l')
@ -83,6 +88,7 @@ typedef struct {
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput; EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput;
EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode; EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;
TERMINAL_CONSOLE_MODE_DATA *TerminalConsoleModeData;
UINTN SerialInTimeOut; UINTN SerialInTimeOut;
RAW_DATA_FIFO *RawFiFo; RAW_DATA_FIFO *RawFiFo;
UNICODE_FIFO *UnicodeFiFo; UNICODE_FIFO *UnicodeFiFo;
@ -137,21 +143,6 @@ typedef union {
#define CCAP 0x43 #define CCAP 0x43
#define DCAP 0x44 #define DCAP 0x44
#define MODE0_COLUMN_COUNT 80
#define MODE0_ROW_COUNT 25
#define MODE1_COLUMN_COUNT 80
#define MODE1_ROW_COUNT 50
#define MODE2_COLUMN_COUNT 100
#define MODE2_ROW_COUNT 31
//
// MODE3 is defined by PcdConOutColumn & PcdConOutRow
//
#define TERMINAL_MAX_MODE 4
#define BACKSPACE 8 #define BACKSPACE 8
#define ESC 27 #define ESC 27
#define CSI 0x9B #define CSI 0x9B

View File

@ -205,7 +205,7 @@ TerminalConOutOutputString (
// //
Mode = This->Mode; Mode = This->Mode;
if (Mode->Mode >= TERMINAL_MAX_MODE) { if (Mode->Mode >= Mode->MaxMode) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -392,8 +392,6 @@ TerminalConOutTestString (
It returns information for an available text mode It returns information for an available text mode
that the terminal supports. that the terminal supports.
In this driver, we support text mode 80x25 (mode 0),
80x50 (mode 1), 100x31 (mode 2).
@param This Indicates the calling context. @param This Indicates the calling context.
@param ModeNumber The mode number to return information on. @param ModeNumber The mode number to return information on.
@ -402,7 +400,6 @@ TerminalConOutTestString (
@retval EFI_SUCCESS The requested mode information is returned. @retval EFI_SUCCESS The requested mode information is returned.
@retval EFI_UNSUPPORTED The mode number is not valid. @retval EFI_UNSUPPORTED The mode number is not valid.
@retval EFI_DEVICE_ERROR
**/ **/
EFI_STATUS EFI_STATUS
@ -414,35 +411,20 @@ TerminalConOutQueryMode (
OUT UINTN *Rows OUT UINTN *Rows
) )
{ {
if (This->Mode->MaxMode > TERMINAL_MAX_MODE) { TERMINAL_DEV *TerminalDevice;
return EFI_DEVICE_ERROR;
if (ModeNumber >= (UINTN) This->Mode->MaxMode) {
return EFI_UNSUPPORTED;
} }
if (ModeNumber == 0) { //
*Columns = MODE0_COLUMN_COUNT; // Get Terminal device data structure pointer.
*Rows = MODE0_ROW_COUNT; //
return EFI_SUCCESS; TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);
} else if (ModeNumber == 1) { *Columns = TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns;
*Columns = MODE1_COLUMN_COUNT; *Rows = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows;
*Rows = MODE1_ROW_COUNT;
return EFI_SUCCESS;
} else if (ModeNumber == 2) {
*Columns = MODE2_COLUMN_COUNT;
*Rows = MODE2_ROW_COUNT;
return EFI_SUCCESS;
} else if (ModeNumber == 3) {
*Columns = (UINTN) PcdGet32 (PcdConOutColumn);
if (*Columns == 0) {
*Columns = MODE0_COLUMN_COUNT;
}
*Rows = (UINTN) PcdGet32 (PcdConOutRow);
if (*Rows == 0) {
*Rows = MODE0_ROW_COUNT;
}
return EFI_SUCCESS;
}
return EFI_UNSUPPORTED; return EFI_SUCCESS;
} }
@ -476,7 +458,7 @@ TerminalConOutSetMode (
// //
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);
if (ModeNumber >= TERMINAL_MAX_MODE) { if (ModeNumber >= (UINTN) This->Mode->MaxMode) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }