summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/Console/TerminalDxe
diff options
context:
space:
mode:
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>2011-11-25 08:35:00 +0000
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>2011-11-25 08:35:00 +0000
commit79d07c66d98c033883494aff19023a87d09c4045 (patch)
tree32550251f4fa3df7314094bd061569f4e5d969fd /MdeModulePkg/Universal/Console/TerminalDxe
parent13535a3bdace81b201b8f96d2c5830824c70fb3c (diff)
downloadedk2-79d07c66d98c033883494aff19023a87d09c4045.zip
edk2-79d07c66d98c033883494aff19023a87d09c4045.tar.gz
edk2-79d07c66d98c033883494aff19023a87d09c4045.tar.bz2
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
Diffstat (limited to 'MdeModulePkg/Universal/Console/TerminalDxe')
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c130
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h21
-rw-r--r--MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c44
3 files changed, 147 insertions, 48 deletions
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
index 9574390..0934f16 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
@@ -68,6 +68,7 @@ TERMINAL_DEV mTerminalDevTemplate = {
0, // CursorRow
TRUE // CursorVisible
},
+ NULL, // TerminalConsoleModeData
0, // SerialInTimeOut
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.
@@ -398,6 +408,109 @@ TerminalFreeNotifyList (
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,
@@ -444,6 +557,7 @@ TerminalDriverBindingStart (
BOOLEAN SimTxtInInstalled;
BOOLEAN SimTxtOutInstalled;
BOOLEAN FirstEnter;
+ UINTN ModeCount;
TerminalDevice = NULL;
DefaultNode = NULL;
@@ -724,8 +838,13 @@ TerminalDriverBindingStart (
sizeof (mTerminalDevTemplate.SimpleTextOutput)
);
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
//
@@ -1102,6 +1221,10 @@ Error:
FreePool (TerminalDevice->DevicePath);
}
+ if (TerminalDevice->TerminalConsoleModeData != NULL) {
+ FreePool (TerminalDevice->TerminalConsoleModeData);
+ }
+
FreePool (TerminalDevice);
}
}
@@ -1273,6 +1396,9 @@ TerminalDriverBindingStop (
gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);
TerminalFreeNotifyList (&TerminalDevice->NotifyList);
FreePool (TerminalDevice->DevicePath);
+ if (TerminalDevice->TerminalConsoleModeData != NULL) {
+ FreePool (TerminalDevice->TerminalConsoleModeData);
+ }
FreePool (TerminalDevice);
}
}
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
index fe4ce90..9387998 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
@@ -61,6 +61,11 @@ typedef struct {
EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1];
} EFI_KEY_FIFO;
+typedef struct {
+ UINTN Columns;
+ UINTN Rows;
+} TERMINAL_CONSOLE_MODE_DATA;
+
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
#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_OUTPUT_PROTOCOL SimpleTextOutput;
EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;
+ TERMINAL_CONSOLE_MODE_DATA *TerminalConsoleModeData;
UINTN SerialInTimeOut;
RAW_DATA_FIFO *RawFiFo;
UNICODE_FIFO *UnicodeFiFo;
@@ -137,21 +143,6 @@ typedef union {
#define CCAP 0x43
#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 ESC 27
#define CSI 0x9B
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
index 8f26752..affb3ae 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
@@ -205,7 +205,7 @@ TerminalConOutOutputString (
//
Mode = This->Mode;
- if (Mode->Mode >= TERMINAL_MAX_MODE) {
+ if (Mode->Mode >= Mode->MaxMode) {
return EFI_UNSUPPORTED;
}
@@ -392,8 +392,6 @@ TerminalConOutTestString (
It returns information for an available text mode
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 ModeNumber The mode number to return information on.
@@ -402,7 +400,6 @@ TerminalConOutTestString (
@retval EFI_SUCCESS The requested mode information is returned.
@retval EFI_UNSUPPORTED The mode number is not valid.
- @retval EFI_DEVICE_ERROR
**/
EFI_STATUS
@@ -414,35 +411,20 @@ TerminalConOutQueryMode (
OUT UINTN *Rows
)
{
- if (This->Mode->MaxMode > TERMINAL_MAX_MODE) {
- return EFI_DEVICE_ERROR;
- }
+ TERMINAL_DEV *TerminalDevice;
- if (ModeNumber == 0) {
- *Columns = MODE0_COLUMN_COUNT;
- *Rows = MODE0_ROW_COUNT;
- return EFI_SUCCESS;
- } else if (ModeNumber == 1) {
- *Columns = MODE1_COLUMN_COUNT;
- *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;
+ if (ModeNumber >= (UINTN) This->Mode->MaxMode) {
+ return EFI_UNSUPPORTED;
}
- return EFI_UNSUPPORTED;
+ //
+ // Get Terminal device data structure pointer.
+ //
+ TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);
+ *Columns = TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns;
+ *Rows = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows;
+
+ return EFI_SUCCESS;
}
@@ -476,7 +458,7 @@ TerminalConOutSetMode (
//
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);
- if (ModeNumber >= TERMINAL_MAX_MODE) {
+ if (ModeNumber >= (UINTN) This->Mode->MaxMode) {
return EFI_UNSUPPORTED;
}