gEfiSerialIoProtocolGuid # PROTOCOL BY_START\r
gEfiDevicePathProtocolGuid # PROTOCOL TO_START\r
\r
-\r
[PcdsFeatureFlag.common]\r
PcdNtEmulatorEnable|gEfiMdeModulePkgTokenSpaceGuid\r
\r
+\r
+[PcdsFixedAtBuild.common]\r
+ PcdUartDefaultBaudRate|gEfiMdePkgTokenSpaceGuid|115200\r
+ PcdUartDefaultDataBits|gEfiMdePkgTokenSpaceGuid|8\r
+ PcdUartDefaultParity|gEfiMdePkgTokenSpaceGuid|1\r
+ PcdUartDefaultStopBits|gEfiMdePkgTokenSpaceGuid|1\r
+\r
+ \r
};\r
\r
\r
+SERIAL_DEV gSerialDevTempate = {\r
+ SERIAL_DEV_SIGNATURE,\r
+ NULL,\r
+ { // SerialIo\r
+ SERIAL_IO_INTERFACE_REVISION,\r
+ IsaSerialReset,\r
+ IsaSerialSetAttributes,\r
+ IsaSerialSetControl,\r
+ IsaSerialGetControl,\r
+ IsaSerialWrite,\r
+ IsaSerialRead,\r
+ NULL\r
+ },\r
+ { // SerialMode\r
+ SERIAL_PORT_DEFAULT_CONTROL_MASK,\r
+ SERIAL_PORT_DEFAULT_TIMEOUT,\r
+ FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate\r
+ SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH,\r
+ FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits\r
+ FixedPcdGet8 (PcdUartDefaultParity), // Parity\r
+ FixedPcdGet8 (PcdUartDefaultStopBits) // StopBits\r
+ },\r
+ NULL,\r
+ NULL,\r
+ { // UartDevicePath\r
+ {\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_UART_DP,\r
+ (UINT8) (sizeof (UART_DEVICE_PATH)),\r
+ (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8),\r
+ },\r
+ 0,\r
+ FixedPcdGet64 (PcdUartDefaultBaudRate), \r
+ FixedPcdGet8 (PcdUartDefaultDataBits),\r
+ FixedPcdGet8 (PcdUartDefaultParity),\r
+ FixedPcdGet8 (PcdUartDefaultStopBits)\r
+ },\r
+ NULL,\r
+ 0, //BaseAddress\r
+ {\r
+ 0,\r
+ 0,\r
+ SERIAL_MAX_BUFFER_SIZE,\r
+ { 0 }\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ SERIAL_MAX_BUFFER_SIZE,\r
+ { 0 }\r
+ },\r
+ FALSE,\r
+ FALSE,\r
+ UART16550A,\r
+ NULL\r
+};\r
+\r
/**\r
The user Entry Point for module IsaSerial. The user code starts with this function.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeIsaSerial(\r
+InitializeIsaSerial (\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
//\r
// Initialize the serial device instance\r
//\r
- SerialDevice = AllocatePool (sizeof (SERIAL_DEV));\r
+ SerialDevice = AllocateCopyPool (sizeof (SERIAL_DEV), &gSerialDevTempate);\r
if (SerialDevice == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
\r
- ZeroMem (SerialDevice, sizeof (SERIAL_DEV));\r
-\r
+ SerialDevice->SerialIo.Mode = &(SerialDevice->SerialMode);\r
SerialDevice->IsaIo = IsaIo;\r
SerialDevice->ParentDevicePath = ParentDevicePath;\r
- SerialDevice->ControllerNameTable = NULL;\r
\r
ADD_SERIAL_NAME (SerialDevice, IsaIo);\r
\r
goto Error;\r
}\r
\r
- SerialDevice->Signature = SERIAL_DEV_SIGNATURE;\r
- SerialDevice->Type = UART16550A;\r
- SerialDevice->SoftwareLoopbackEnable = FALSE;\r
- SerialDevice->HardwareFlowControl = FALSE;\r
- SerialDevice->Handle = NULL;\r
- SerialDevice->Receive.First = 0;\r
- SerialDevice->Receive.Last = 0;\r
- SerialDevice->Receive.Surplus = SERIAL_MAX_BUFFER_SIZE;\r
- SerialDevice->Transmit.First = 0;\r
- SerialDevice->Transmit.Last = 0;\r
- SerialDevice->Transmit.Surplus = SERIAL_MAX_BUFFER_SIZE;\r
-\r
- //\r
- // Serial I/O\r
- //\r
- SerialDevice->SerialIo.Revision = SERIAL_IO_INTERFACE_REVISION;\r
- SerialDevice->SerialIo.Reset = IsaSerialReset;\r
- SerialDevice->SerialIo.SetAttributes = IsaSerialSetAttributes;\r
- SerialDevice->SerialIo.SetControl = IsaSerialSetControl;\r
- SerialDevice->SerialIo.GetControl = IsaSerialGetControl;\r
- SerialDevice->SerialIo.Write = IsaSerialWrite;\r
- SerialDevice->SerialIo.Read = IsaSerialRead;\r
- SerialDevice->SerialIo.Mode = &(SerialDevice->SerialMode);\r
-\r
if (RemainingDevicePath != NULL) {\r
//\r
// Match the configuration of the RemainingDevicePath. IsHandleSupported()\r
CopyMem (&SerialDevice->UartDevicePath, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
} else {\r
//\r
- // Build the device path by appending the UART node to the ParentDevicePath\r
- // from the WinNtIo handle. The Uart setings are zero here, since\r
- // SetAttribute() will update them to match the default setings.\r
+ // Use the values from the gSerialDevTempate as no remaining device path was\r
+ // passed in.\r
//\r
- ZeroMem (&SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH));\r
- SerialDevice->UartDevicePath.Header.Type = MESSAGING_DEVICE_PATH;\r
- SerialDevice->UartDevicePath.Header.SubType = MSG_UART_DP;\r
- SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath, sizeof (UART_DEVICE_PATH));\r
}\r
//\r
// Build the device path by appending the UART node to the ParentDevicePath\r
//\r
SerialDevice->DevicePath = AppendDevicePathNode (\r
ParentDevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &SerialDevice->UartDevicePath\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&SerialDevice->UartDevicePath\r
);\r
-\r
if (SerialDevice->DevicePath == NULL) {\r
Status = EFI_DEVICE_ERROR;\r
goto Error;\r
}\r
+\r
//\r
// Fill in Serial I/O Mode structure based on either the RemainingDevicePath or defaults.\r
//\r
- SerialDevice->SerialMode.ControlMask = SERIAL_PORT_DEFAULT_CONTROL_MASK;\r
- SerialDevice->SerialMode.Timeout = SERIAL_PORT_DEFAULT_TIMEOUT;\r
SerialDevice->SerialMode.BaudRate = SerialDevice->UartDevicePath.BaudRate;\r
- SerialDevice->SerialMode.ReceiveFifoDepth = SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH;\r
SerialDevice->SerialMode.DataBits = SerialDevice->UartDevicePath.DataBits;\r
SerialDevice->SerialMode.Parity = SerialDevice->UartDevicePath.Parity;\r
SerialDevice->SerialMode.StopBits = SerialDevice->UartDevicePath.StopBits;\r
// Check for default settings and fill in actual values.\r
//\r
if (BaudRate == 0) {\r
- BaudRate = SERIAL_PORT_DEFAULT_BAUD_RATE;\r
+ BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);\r
}\r
\r
if (ReceiveFifoDepth == 0) {\r
}\r
\r
if (Parity == DefaultParity) {\r
- Parity = SERIAL_PORT_DEFAULT_PARITY;\r
+ Parity = FixedPcdGet8 (PcdUartDefaultParity);\r
}\r
\r
if (DataBits == 0) {\r
- DataBits = SERIAL_PORT_DEFAULT_DATA_BITS;\r
+ DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
}\r
\r
if (StopBits == DefaultStopBits) {\r
- StopBits = (EFI_STOP_BITS_TYPE) SERIAL_PORT_DEFAULT_STOP_BITS;\r
+ StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);\r
}\r
//\r
// 5 and 6 data bits can not be verified on a 16550A UART\r
Temp = READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0xAA);\r
\r
- if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0xAA)\r
- {\r
+ if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0xAA) {\r
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {\r
Status = FALSE;\r
}\r
\r
WRITE_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, 0x55);\r
\r
- if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0x55)\r
- {\r
+ if (READ_SCR (SerialDevice->IsaIo, SerialDevice->BaseAddress) != 0x55) {\r
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {\r
Status = FALSE;\r
}\r
//\r
// Serial Driver Defaults\r
//\r
-#define SERIAL_PORT_DEFAULT_BAUD_RATE 115200\r
#define SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH 1\r
#define SERIAL_PORT_DEFAULT_TIMEOUT 1000000\r
+\r
+/*\r
+#define SERIAL_PORT_DEFAULT_BAUD_RATE 115200\r
#define SERIAL_PORT_DEFAULT_PARITY NoParity\r
#define SERIAL_PORT_DEFAULT_DATA_BITS 8\r
#define SERIAL_PORT_DEFAULT_STOP_BITS 1\r
+*/\r
#define SERIAL_PORT_DEFAULT_CONTROL_MASK 0\r
\r
+\r
//\r
// (24000000/13)MHz input clock\r
//\r
--*/\r
\r
\r
-\r
#include "Terminal.h"\r
\r
//\r
};\r
\r
\r
+EFI_GUID *gTerminalType[] = {\r
+ &gEfiPcAnsiGuid,\r
+ &gEfiVT100Guid,\r
+ &gEfiVT100PlusGuid,\r
+ &gEfiVTUTF8Guid\r
+};\r
+\r
+\r
+TERMINAL_DEV gTerminalDevTemplate = {\r
+ TERMINAL_DEV_SIGNATURE,\r
+ NULL,\r
+ 0,\r
+ NULL,\r
+ NULL,\r
+ { // SimpleTextInput\r
+ TerminalConInReset,\r
+ TerminalConInReadKeyStroke,\r
+ NULL\r
+ },\r
+ { // SimpleTextOutput\r
+ TerminalConOutReset,\r
+ TerminalConOutOutputString,\r
+ TerminalConOutTestString,\r
+ TerminalConOutQueryMode,\r
+ TerminalConOutSetMode,\r
+ TerminalConOutSetAttribute,\r
+ TerminalConOutClearScreen,\r
+ TerminalConOutSetCursorPosition,\r
+ TerminalConOutEnableCursor,\r
+ NULL\r
+ },\r
+ { // SimpleTextOutputMode\r
+ 1, // MaxMode\r
+ 0, // Mode?\r
+ EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), // Attribute\r
+ 0, // CursorColumn\r
+ 0, // CursorRow\r
+ TRUE // CursorVisible\r
+ },\r
+ 0,\r
+ {\r
+ 0,\r
+ 0,\r
+ { 0 }\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ { 0 }\r
+ },\r
+ {\r
+ 0,\r
+ 0,\r
+ { 0 }\r
+ },\r
+ NULL, // ControllerNameTable\r
+ NULL, \r
+ INPUT_STATE_DEFAULT,\r
+ RESET_STATE_DEFAULT,\r
+ FALSE\r
+};\r
+\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
TerminalDriverBindingSupported (\r
// If RemainingDevicePath is NULL, then create default device path node\r
//\r
if (RemainingDevicePath == NULL) {\r
- DefaultNode = AllocatePool (sizeof (VENDOR_DEVICE_PATH));\r
+ DefaultNode = AllocateZeroPool (sizeof (VENDOR_DEVICE_PATH));\r
if (DefaultNode == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
\r
- CopyMem (&DefaultNode->Guid, &gEfiPcAnsiGuid, sizeof (EFI_GUID));\r
- RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) DefaultNode;\r
- }\r
- //\r
- // Use the RemainingDevicePath to determine the terminal type\r
- //\r
- Node = (VENDOR_DEVICE_PATH *) RemainingDevicePath;\r
-\r
- if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
-\r
- TerminalType = PcAnsiType;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
-\r
- TerminalType = VT100Type;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
-\r
- TerminalType = VT100PlusType;\r
-\r
- } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
-\r
- TerminalType = VTUTF8Type;\r
+ TerminalType = FixedPcdGet8 (PcdDefaultTerminalType);\r
+ // must be between PcAnsiType (0) and VTUTF8Type (3)\r
+ ASSERT (TerminalType <= VTUTF8Type);\r
\r
+ CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));\r
+ RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL*)DefaultNode;\r
} else {\r
- goto Error;\r
+ //\r
+ // Use the RemainingDevicePath to determine the terminal type\r
+ //\r
+ Node = (VENDOR_DEVICE_PATH *)RemainingDevicePath;\r
+ if (CompareGuid (&Node->Guid, &gEfiPcAnsiGuid)) {\r
+ TerminalType = PcAnsiType;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100Guid)) {\r
+ TerminalType = VT100Type;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVT100PlusGuid)) {\r
+ TerminalType = VT100PlusType;\r
+ } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {\r
+ TerminalType = VTUTF8Type;\r
+ } else {\r
+ goto Error;\r
+ }\r
}\r
+\r
//\r
// Initialize the Terminal Dev\r
//\r
- TerminalDevice = AllocatePool (sizeof (TERMINAL_DEV));\r
+ TerminalDevice = AllocateCopyPool (sizeof (TERMINAL_DEV), &gTerminalDevTemplate);\r
if (TerminalDevice == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Error;\r
}\r
\r
- ZeroMem (TerminalDevice, sizeof (TERMINAL_DEV));\r
-\r
- TerminalDevice->Signature = TERMINAL_DEV_SIGNATURE;\r
-\r
TerminalDevice->TerminalType = TerminalType;\r
-\r
TerminalDevice->SerialIo = SerialIo;\r
\r
- //\r
- // Simple Input Protocol\r
- //\r
- TerminalDevice->SimpleInput.Reset = TerminalConInReset;\r
- TerminalDevice->SimpleInput.ReadKeyStroke = TerminalConInReadKeyStroke;\r
-\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
if (EFI_ERROR (Status)) {\r
goto Error;\r
}\r
+\r
//\r
// initialize the FIFO buffer used for accommodating\r
// the pre-read pending characters\r
// keystroke response performance issue\r
//\r
Mode = TerminalDevice->SerialIo->Mode;\r
-\r
SerialInTimeOut = 0;\r
if (Mode->BaudRate != 0) {\r
SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 / (UINTN) Mode->BaudRate;\r
//\r
// Simple Text Output Protocol\r
//\r
- TerminalDevice->SimpleTextOutput.Reset = TerminalConOutReset;\r
- TerminalDevice->SimpleTextOutput.OutputString = TerminalConOutOutputString;\r
- TerminalDevice->SimpleTextOutput.TestString = TerminalConOutTestString;\r
- TerminalDevice->SimpleTextOutput.QueryMode = TerminalConOutQueryMode;\r
- TerminalDevice->SimpleTextOutput.SetMode = TerminalConOutSetMode;\r
- TerminalDevice->SimpleTextOutput.SetAttribute = TerminalConOutSetAttribute;\r
- TerminalDevice->SimpleTextOutput.ClearScreen = TerminalConOutClearScreen;\r
- TerminalDevice->SimpleTextOutput.SetCursorPosition = TerminalConOutSetCursorPosition;\r
- TerminalDevice->SimpleTextOutput.EnableCursor = TerminalConOutEnableCursor;\r
TerminalDevice->SimpleTextOutput.Mode = &TerminalDevice->SimpleTextOutputMode;\r
\r
- TerminalDevice->SimpleTextOutputMode.MaxMode = 1;\r
- //\r
- // For terminal devices, cursor is always visible\r
- //\r
- TerminalDevice->SimpleTextOutputMode.CursorVisible = TRUE;\r
- TerminalDevice->SimpleTextOutputMode.Attribute = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK);\r
-\r
Status = TerminalDevice->SimpleTextOutput.Reset (\r
&TerminalDevice->SimpleTextOutput,\r
FALSE\r
if (EFI_ERROR (Status)) {\r
goto ReportError;\r
}\r
- //\r
- //\r
- //\r
- TerminalDevice->InputState = INPUT_STATE_DEFAULT;\r
- TerminalDevice->ResetState = RESET_STATE_DEFAULT;\r
\r
Status = gBS->CreateEvent (\r
EVT_TIMER,\r
UINT8 TerminalType;\r
EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- VENDOR_DEVICE_PATH Node;\r
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput;\r
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput;\r
EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode;\r
EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
EFI_EVENT TwoSecondTimeOut;\r
UINT32 InputState;\r
- UINT32 ResetState;\r
+ UINT32 ResetState;\r
\r
//\r
// Esc could not be output to the screen by user,\r
// This boolean is used by the terminal driver only\r
// to indicate whether the Esc could be sent or not.\r
//\r
- BOOLEAN OutputEscChar;\r
+ BOOLEAN OutputEscChar;\r
} TERMINAL_DEV;\r
\r
#define INPUT_STATE_DEFAULT 0x00\r
gEfiSimpleTextInProtocolGuid # PROTOCOL BY_START\r
gEfiSimpleTextOutProtocolGuid # PROTOCOL BY_START\r
\r
-[PcdsFixedAtBuild]\r
+[PcdsDynamic]\r
PcdStatusCodeValueRemoteConsoleError|gEfiMdePkgTokenSpaceGuid\r
PcdStatusCodeValueRemoteConsoleReset|gEfiMdePkgTokenSpaceGuid\r
PcdStatusCodeValueRemoteConsoleInputError|gEfiMdePkgTokenSpaceGuid\r
PcdStatusCodeValueRemoteConsoleOutputError|gEfiMdePkgTokenSpaceGuid\r
+ PcdDefaultTerminalType|gEfiMdePkgTokenSpaceGuid\r
+ \r