diff options
6 files changed, 176 insertions, 115 deletions
diff --git a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf index 7604092a81..fb2727f717 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf +++ b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf @@ -65,7 +65,14 @@ gEfiSerialIoProtocolGuid # PROTOCOL BY_START
gEfiDevicePathProtocolGuid # PROTOCOL TO_START
-
[PcdsFeatureFlag.common]
PcdNtEmulatorEnable|gEfiMdeModulePkgTokenSpaceGuid
+
+[PcdsFixedAtBuild.common]
+ PcdUartDefaultBaudRate|gEfiMdePkgTokenSpaceGuid|115200
+ PcdUartDefaultDataBits|gEfiMdePkgTokenSpaceGuid|8
+ PcdUartDefaultParity|gEfiMdePkgTokenSpaceGuid|1
+ PcdUartDefaultStopBits|gEfiMdePkgTokenSpaceGuid|1
+
+
diff --git a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c index 1de6fde50a..3eeb1d4d0d 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c +++ b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c @@ -27,6 +27,63 @@ EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver = { };
+SERIAL_DEV gSerialDevTempate = {
+ SERIAL_DEV_SIGNATURE,
+ NULL,
+ { // SerialIo
+ SERIAL_IO_INTERFACE_REVISION,
+ IsaSerialReset,
+ IsaSerialSetAttributes,
+ IsaSerialSetControl,
+ IsaSerialGetControl,
+ IsaSerialWrite,
+ IsaSerialRead,
+ NULL
+ },
+ { // SerialMode
+ SERIAL_PORT_DEFAULT_CONTROL_MASK,
+ SERIAL_PORT_DEFAULT_TIMEOUT,
+ FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate
+ SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH,
+ FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits
+ FixedPcdGet8 (PcdUartDefaultParity), // Parity
+ FixedPcdGet8 (PcdUartDefaultStopBits) // StopBits
+ },
+ NULL,
+ NULL,
+ { // UartDevicePath
+ {
+ MESSAGING_DEVICE_PATH,
+ MSG_UART_DP,
+ (UINT8) (sizeof (UART_DEVICE_PATH)),
+ (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8),
+ },
+ 0,
+ FixedPcdGet64 (PcdUartDefaultBaudRate),
+ FixedPcdGet8 (PcdUartDefaultDataBits),
+ FixedPcdGet8 (PcdUartDefaultParity),
+ FixedPcdGet8 (PcdUartDefaultStopBits)
+ },
+ NULL,
+ 0, //BaseAddress
+ {
+ 0,
+ 0,
+ SERIAL_MAX_BUFFER_SIZE,
+ { 0 }
+ },
+ {
+ 0,
+ 0,
+ SERIAL_MAX_BUFFER_SIZE,
+ { 0 }
+ },
+ FALSE,
+ FALSE,
+ UART16550A,
+ NULL
+};
+
/**
The user Entry Point for module IsaSerial. The user code starts with this function.
@@ -39,7 +96,7 @@ EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver = { **/
EFI_STATUS
EFIAPI
-InitializeIsaSerial(
+InitializeIsaSerial (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
@@ -333,17 +390,15 @@ SerialControllerDriverStart ( //
// Initialize the serial device instance
//
- SerialDevice = AllocatePool (sizeof (SERIAL_DEV));
+ SerialDevice = AllocateCopyPool (sizeof (SERIAL_DEV), &gSerialDevTempate);
if (SerialDevice == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Error;
}
- ZeroMem (SerialDevice, sizeof (SERIAL_DEV));
-
+ SerialDevice->SerialIo.Mode = &(SerialDevice->SerialMode);
SerialDevice->IsaIo = IsaIo;
SerialDevice->ParentDevicePath = ParentDevicePath;
- SerialDevice->ControllerNameTable = NULL;
ADD_SERIAL_NAME (SerialDevice, IsaIo);
@@ -371,30 +426,6 @@ SerialControllerDriverStart ( goto Error;
}
- SerialDevice->Signature = SERIAL_DEV_SIGNATURE;
- SerialDevice->Type = UART16550A;
- SerialDevice->SoftwareLoopbackEnable = FALSE;
- SerialDevice->HardwareFlowControl = FALSE;
- SerialDevice->Handle = NULL;
- SerialDevice->Receive.First = 0;
- SerialDevice->Receive.Last = 0;
- SerialDevice->Receive.Surplus = SERIAL_MAX_BUFFER_SIZE;
- SerialDevice->Transmit.First = 0;
- SerialDevice->Transmit.Last = 0;
- SerialDevice->Transmit.Surplus = SERIAL_MAX_BUFFER_SIZE;
-
- //
- // Serial I/O
- //
- SerialDevice->SerialIo.Revision = SERIAL_IO_INTERFACE_REVISION;
- SerialDevice->SerialIo.Reset = IsaSerialReset;
- SerialDevice->SerialIo.SetAttributes = IsaSerialSetAttributes;
- SerialDevice->SerialIo.SetControl = IsaSerialSetControl;
- SerialDevice->SerialIo.GetControl = IsaSerialGetControl;
- SerialDevice->SerialIo.Write = IsaSerialWrite;
- SerialDevice->SerialIo.Read = IsaSerialRead;
- SerialDevice->SerialIo.Mode = &(SerialDevice->SerialMode);
-
if (RemainingDevicePath != NULL) {
//
// Match the configuration of the RemainingDevicePath. IsHandleSupported()
@@ -404,14 +435,9 @@ SerialControllerDriverStart ( CopyMem (&SerialDevice->UartDevicePath, RemainingDevicePath, sizeof (UART_DEVICE_PATH));
} else {
//
- // Build the device path by appending the UART node to the ParentDevicePath
- // from the WinNtIo handle. The Uart setings are zero here, since
- // SetAttribute() will update them to match the default setings.
+ // Use the values from the gSerialDevTempate as no remaining device path was
+ // passed in.
//
- ZeroMem (&SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH));
- SerialDevice->UartDevicePath.Header.Type = MESSAGING_DEVICE_PATH;
- SerialDevice->UartDevicePath.Header.SubType = MSG_UART_DP;
- SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH));
}
//
// Build the device path by appending the UART node to the ParentDevicePath
@@ -420,20 +446,17 @@ SerialControllerDriverStart ( //
SerialDevice->DevicePath = AppendDevicePathNode (
ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath
+ (EFI_DEVICE_PATH_PROTOCOL *)&SerialDevice->UartDevicePath
);
-
if (SerialDevice->DevicePath == NULL) {
Status = EFI_DEVICE_ERROR;
goto Error;
}
+
//
// Fill in Serial I/O Mode structure based on either the RemainingDevicePath or defaults.
//
- SerialDevice->SerialMode.ControlMask = SERIAL_PORT_DEFAULT_CONTROL_MASK;
- SerialDevice->SerialMode.Timeout = SERIAL_PORT_DEFAULT_TIMEOUT;
SerialDevice->SerialMode.BaudRate = SerialDevice->UartDevicePath.BaudRate;
- SerialDevice->SerialMode.ReceiveFifoDepth = SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH;
SerialDevice->SerialMode.DataBits = SerialDevice->UartDevicePath.DataBits;
SerialDevice->SerialMode.Parity = SerialDevice->UartDevicePath.Parity;
SerialDevice->SerialMode.StopBits = SerialDevice->UartDevicePath.StopBits;
@@ -1132,7 +1155,7 @@ IsaSerialSetAttributes ( // Check for default settings and fill in actual values.
//
if (BaudRate == 0) {
- BaudRate = SERIAL_PORT_DEFAULT_BAUD_RATE;
+ BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);
}
if (ReceiveFifoDepth == 0) {
@@ -1144,15 +1167,15 @@ IsaSerialSetAttributes ( }
if (Parity == DefaultParity) {
- Parity = SERIAL_PORT_DEFAULT_PARITY;
+ Parity = FixedPcdGet8 (PcdUartDefaultParity);
}
if (DataBits == 0) {
- DataBits = SERIAL_PORT_DEFAULT_DATA_BITS;
+ DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
}
if (StopBits == DefaultStopBits) {
- StopBits = (EFI_STOP_BITS_TYPE) SERIAL_PORT_DEFAULT_STOP_BITS;
+ StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);
}
//
// 5 and 6 data bits can not be verified on a 16550A UART
@@ -1801,8 +1824,7 @@ IsaSerialPortPresent ( Temp = READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);
WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0xAA);
- if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0xAA)
- {
+ if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0xAA) {
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {
Status = FALSE;
}
@@ -1810,8 +1832,7 @@ IsaSerialPortPresent ( WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0x55);
- if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0x55)
- {
+ if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0x55) {
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {
Status = FALSE;
}
diff --git a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h index bf78094ac4..0fcc4f3fb0 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h +++ b/IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h @@ -121,14 +121,18 @@ extern EFI_DRIVER_BINDING_PROTOCOL gSerialControllerDriver; //
// Serial Driver Defaults
//
-#define SERIAL_PORT_DEFAULT_BAUD_RATE 115200
#define SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH 1
#define SERIAL_PORT_DEFAULT_TIMEOUT 1000000
+
+/*
+#define SERIAL_PORT_DEFAULT_BAUD_RATE 115200
#define SERIAL_PORT_DEFAULT_PARITY NoParity
#define SERIAL_PORT_DEFAULT_DATA_BITS 8
#define SERIAL_PORT_DEFAULT_STOP_BITS 1
+*/
#define SERIAL_PORT_DEFAULT_CONTROL_MASK 0
+
//
// (24000000/13)MHz input clock
//
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c index 4860a4b210..5b8cb8da0b 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c @@ -20,7 +20,6 @@ Revision History: --*/
-
#include "Terminal.h"
//
@@ -36,6 +35,70 @@ EFI_DRIVER_BINDING_PROTOCOL gTerminalDriverBinding = { };
+EFI_GUID *gTerminalType[] = {
+ &gEfiPcAnsiGuid,
+ &gEfiVT100Guid,
+ &gEfiVT100PlusGuid,
+ &gEfiVTUTF8Guid
+};
+
+
+TERMINAL_DEV gTerminalDevTemplate = {
+ TERMINAL_DEV_SIGNATURE,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ { // SimpleTextInput
+ TerminalConInReset,
+ TerminalConInReadKeyStroke,
+ NULL
+ },
+ { // SimpleTextOutput
+ TerminalConOutReset,
+ TerminalConOutOutputString,
+ TerminalConOutTestString,
+ TerminalConOutQueryMode,
+ TerminalConOutSetMode,
+ TerminalConOutSetAttribute,
+ TerminalConOutClearScreen,
+ TerminalConOutSetCursorPosition,
+ TerminalConOutEnableCursor,
+ NULL
+ },
+ { // SimpleTextOutputMode
+ 1, // MaxMode
+ 0, // Mode?
+ EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute
+ 0, // CursorColumn
+ 0, // CursorRow
+ TRUE // CursorVisible
+ },
+ 0,
+ {
+ 0,
+ 0,
+ { 0 }
+ },
+ {
+ 0,
+ 0,
+ { 0 }
+ },
+ {
+ 0,
+ 0,
+ { 0 }
+ },
+ NULL, // ControllerNameTable
+ NULL,
+ INPUT_STATE_DEFAULT,
+ RESET_STATE_DEFAULT,
+ FALSE
+};
+
+
+
EFI_STATUS
EFIAPI
TerminalDriverBindingSupported (
@@ -276,62 +339,48 @@ TerminalDriverBindingStart ( // If RemainingDevicePath is NULL, then create default device path node
//
if (RemainingDevicePath == NULL) {
- DefaultNode = AllocatePool (sizeof (VENDOR_DEVICE_PATH));
+ DefaultNode = AllocateZeroPool (sizeof (VENDOR_DEVICE_PATH));
if (DefaultNode == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Error;
}
- CopyMem (&DefaultNode->Guid, &gEfiPcAnsiGuid, sizeof (EFI_GUID));
- RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) DefaultNode;
- }
- //
- // Use the RemainingDevicePath to determine the terminal type
- //
- Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath;
-
- if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {
-
- TerminalType = PcAnsiType;
-
- } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {
-
- TerminalType = VT100Type;
-
- } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {
-
- TerminalType = VT100PlusType;
-
- } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {
-
- TerminalType = VTUTF8Type;
+ TerminalType = FixedPcdGet8 (PcdDefaultTerminalType);
+ // must be between PcAnsiType (0) and VTUTF8Type (3)
+ ASSERT (TerminalType <= VTUTF8Type);
+ CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));
+ RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*)DefaultNode;
} else {
- goto Error;
+ //
+ // Use the RemainingDevicePath to determine the terminal type
+ //
+ Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath;
+ if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {
+ TerminalType = PcAnsiType;
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {
+ TerminalType = VT100Type;
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {
+ TerminalType = VT100PlusType;
+ } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {
+ TerminalType = VTUTF8Type;
+ } else {
+ goto Error;
+ }
}
+
//
// Initialize the Terminal Dev
//
- TerminalDevice = AllocatePool (sizeof (TERMINAL_DEV));
+ TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &gTerminalDevTemplate);
if (TerminalDevice == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Error;
}
- ZeroMem (TerminalDevice, sizeof (TERMINAL_DEV));
-
- TerminalDevice->Signature = TERMINAL_DEV_SIGNATURE;
-
TerminalDevice->TerminalType = TerminalType;
-
TerminalDevice->SerialIo = SerialIo;
- //
- // Simple Input Protocol
- //
- TerminalDevice->SimpleInput.Reset = TerminalConInReset;
- TerminalDevice->SimpleInput.ReadKeyStroke = TerminalConInReadKeyStroke;
-
Status = gBS->CreateEvent (
EVT_NOTIFY_WAIT,
TPL_NOTIFY,
@@ -342,6 +391,7 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) {
goto Error;
}
+
//
// initialize the FIFO buffer used for accommodating
// the pre-read pending characters
@@ -355,7 +405,6 @@ TerminalDriverBindingStart ( // keystroke response performance issue
//
Mode = TerminalDevice->SerialIo->Mode;
-
SerialInTimeOut = 0;
if (Mode->BaudRate != 0) {
SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;
@@ -409,24 +458,8 @@ TerminalDriverBindingStart ( //
// Simple Text Output Protocol
//
- TerminalDevice->SimpleTextOutput.Reset = TerminalConOutReset;
- TerminalDevice->SimpleTextOutput.OutputString = TerminalConOutOutputString;
- TerminalDevice->SimpleTextOutput.TestString = TerminalConOutTestString;
- TerminalDevice->SimpleTextOutput.QueryMode = TerminalConOutQueryMode;
- TerminalDevice->SimpleTextOutput.SetMode = TerminalConOutSetMode;
- TerminalDevice->SimpleTextOutput.SetAttribute = TerminalConOutSetAttribute;
- TerminalDevice->SimpleTextOutput.ClearScreen = TerminalConOutClearScreen;
- TerminalDevice->SimpleTextOutput.SetCursorPosition = TerminalConOutSetCursorPosition;
- TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor;
TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode;
- TerminalDevice->SimpleTextOutputMode.MaxMode = 1;
- //
- // For terminal devices, cursor is always visible
- //
- TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE;
- TerminalDevice->SimpleTextOutputMode.Attribute = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK);
-
Status = TerminalDevice->SimpleTextOutput.Reset (
&TerminalDevice->SimpleTextOutput,
FALSE
@@ -450,11 +483,6 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) {
goto ReportError;
}
- //
- //
- //
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;
Status = gBS->CreateEvent (
EVT_TIMER,
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h index 5a7dc0e3e7..c4f5ac19f3 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -74,7 +74,6 @@ typedef struct { UINT8 TerminalType;
EFI_SERIAL_IO_PROTOCOL *SerialIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- VENDOR_DEVICE_PATH Node;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput;
EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;
@@ -85,7 +84,7 @@ typedef struct { EFI_UNICODE_STRING_TABLE *ControllerNameTable;
EFI_EVENT TwoSecondTimeOut;
UINT32 InputState;
- UINT32 ResetState;
+ UINT32 ResetState;
//
// Esc could not be output to the screen by user,
@@ -94,7 +93,7 @@ typedef struct { // This boolean is used by the terminal driver only
// to indicate whether the Esc could be sent or not.
//
- BOOLEAN OutputEscChar;
+ BOOLEAN OutputEscChar;
} TERMINAL_DEV;
#define INPUT_STATE_DEFAULT 0x00
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf index 9368bf4377..ad0177ebbb 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf @@ -73,8 +73,10 @@ gEfiSimpleTextInProtocolGuid # PROTOCOL BY_START
gEfiSimpleTextOutProtocolGuid # PROTOCOL BY_START
-[PcdsFixedAtBuild]
+[PcdsDynamic]
PcdStatusCodeValueRemoteConsoleError|gEfiMdePkgTokenSpaceGuid
PcdStatusCodeValueRemoteConsoleReset|gEfiMdePkgTokenSpaceGuid
PcdStatusCodeValueRemoteConsoleInputError|gEfiMdePkgTokenSpaceGuid
PcdStatusCodeValueRemoteConsoleOutputError|gEfiMdePkgTokenSpaceGuid
+ PcdDefaultTerminalType|gEfiMdePkgTokenSpaceGuid
+
|