/** @file\r
- Console Splitter Driver. Any Handle that attatched\r
- EFI_CONSOLE_IDENTIFIER_PROTOCOL can be bound by this driver.\r
+ Console Splitter Driver. Any Handle that attatched console I/O protocols\r
+ (Console In device, Console Out device, Console Error device, Simple Pointer\r
+ protocol, Absolute Pointer protocol) can be bound by this driver.\r
\r
So far it works like any other driver by opening a SimpleTextIn and/or\r
SimpleTextOut protocol with EFI_OPEN_PROTOCOL_BY_DRIVER attributes. The big\r
handle, or construct a child handle like a standard device or bus driver.\r
This driver produces three virtual handles as children, one for console input\r
splitter, one for console output splitter and one for error output splitter.\r
- EFI_CONSOLE_SPLIT_PROTOCOL will be attatched onto each virtual handle to\r
- identify the splitter type.\r
+ These 3 virtual handles would be installed on gST.\r
\r
- Each virtual handle, that supports both the EFI_CONSOLE_SPLIT_PROTOCOL\r
- and Console I/O protocol, will be produced in the driver entry point.\r
- The virtual handle are added on driver entry and never removed.\r
- Such design ensures sytem function well during none console device situation.\r
+ Each virtual handle, that supports the Console I/O protocol, will be produced\r
+ in the driver entry point. The virtual handle are added on driver entry and\r
+ never removed. Such design ensures sytem function well during none console\r
+ device situation.\r
\r
Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
All rights reserved. This program and the accompanying materials\r
#include "ConSplitter.h"\r
\r
//\r
-// Global Variables\r
+// Text In Splitter Private Data template\r
//\r
-STATIC TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = {\r
TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
(EFI_HANDLE) NULL,\r
{\r
},\r
\r
{\r
- 0, //AbsoluteMinX\r
- 0, //AbsoluteMinY\r
- 0, //AbsoluteMinZ\r
- 0x10000, //AbsoluteMaxX\r
- 0x10000, //AbsoluteMaxY\r
- 0x10000, //AbsoluteMaxZ\r
- 0 //Attributes\r
+ 0, // AbsoluteMinX\r
+ 0, // AbsoluteMinY\r
+ 0, // AbsoluteMinZ\r
+ 0x10000, // AbsoluteMaxX\r
+ 0x10000, // AbsoluteMaxY\r
+ 0x10000, // AbsoluteMaxZ\r
+ 0 // Attributes\r
},\r
0,\r
(EFI_ABSOLUTE_POINTER_PROTOCOL **) NULL,\r
FALSE\r
};\r
\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL gUgaDrawProtocolTemplate = {\r
+\r
+//\r
+// Uga Draw Protocol Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL mUgaDrawProtocolTemplate = {\r
ConSpliterUgaDrawGetMode,\r
ConSpliterUgaDrawSetMode,\r
ConSpliterUgaDrawBlt\r
};\r
\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_PROTOCOL gGraphicsOutputProtocolTemplate = {\r
+//\r
+// Graphics Output Protocol Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_PROTOCOL mGraphicsOutputProtocolTemplate = {\r
ConSpliterGraphicsOutputQueryMode,\r
ConSpliterGraphicsOutputSetMode,\r
ConSpliterGraphicsOutputBlt,\r
NULL\r
};\r
\r
-STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {\r
+\r
+//\r
+// Text Out Splitter Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {\r
TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
(EFI_HANDLE) NULL,\r
{\r
(INT32 *) NULL\r
};\r
\r
-STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {\r
+//\r
+// Standard Error Text Out Splitter Data Template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {\r
TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
(EFI_HANDLE) NULL,\r
{\r
(INT32 *) NULL\r
};\r
\r
+//\r
+// Driver binding instance for Console Input Device\r
+//\r
EFI_DRIVER_BINDING_PROTOCOL gConSplitterConInDriverBinding = {\r
ConSplitterConInDriverBindingSupported,\r
ConSplitterConInDriverBindingStart,\r
NULL\r
};\r
\r
-EFI_DRIVER_BINDING_PROTOCOL gConSplitterSimplePointerDriverBinding = {\r
- ConSplitterSimplePointerDriverBindingSupported,\r
- ConSplitterSimplePointerDriverBindingStart,\r
- ConSplitterSimplePointerDriverBindingStop,\r
+//\r
+// Driver binding instance for Console Out device\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL gConSplitterConOutDriverBinding = {\r
+ ConSplitterConOutDriverBindingSupported,\r
+ ConSplitterConOutDriverBindingStart,\r
+ ConSplitterConOutDriverBindingStop,\r
0xa,\r
NULL,\r
NULL\r
};\r
\r
//\r
-// Driver binding instance for Absolute Pointer protocol\r
+// Driver binding instance for Standard Error device\r
//\r
-EFI_DRIVER_BINDING_PROTOCOL gConSplitterAbsolutePointerDriverBinding = {\r
- ConSplitterAbsolutePointerDriverBindingSupported,\r
- ConSplitterAbsolutePointerDriverBindingStart,\r
- ConSplitterAbsolutePointerDriverBindingStop,\r
+EFI_DRIVER_BINDING_PROTOCOL gConSplitterStdErrDriverBinding = {\r
+ ConSplitterStdErrDriverBindingSupported,\r
+ ConSplitterStdErrDriverBindingStart,\r
+ ConSplitterStdErrDriverBindingStop,\r
0xa,\r
NULL,\r
NULL\r
};\r
\r
-EFI_DRIVER_BINDING_PROTOCOL gConSplitterConOutDriverBinding = {\r
- ConSplitterConOutDriverBindingSupported,\r
- ConSplitterConOutDriverBindingStart,\r
- ConSplitterConOutDriverBindingStop,\r
+//\r
+// Driver binding instance for Simple Pointer protocol\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL gConSplitterSimplePointerDriverBinding = {\r
+ ConSplitterSimplePointerDriverBindingSupported,\r
+ ConSplitterSimplePointerDriverBindingStart,\r
+ ConSplitterSimplePointerDriverBindingStop,\r
0xa,\r
NULL,\r
NULL\r
};\r
\r
-EFI_DRIVER_BINDING_PROTOCOL gConSplitterStdErrDriverBinding = {\r
- ConSplitterStdErrDriverBindingSupported,\r
- ConSplitterStdErrDriverBindingStart,\r
- ConSplitterStdErrDriverBindingStop,\r
+//\r
+// Driver binding instance for Absolute Pointer protocol\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL gConSplitterAbsolutePointerDriverBinding = {\r
+ ConSplitterAbsolutePointerDriverBindingSupported,\r
+ ConSplitterAbsolutePointerDriverBindingStart,\r
+ ConSplitterAbsolutePointerDriverBindingStop,\r
0xa,\r
NULL,\r
NULL\r
};\r
\r
/**\r
- The user Entry Point for module ConSplitter. The user code starts with this function.\r
+ The Entry Point for module ConSplitter. The user code starts with this function.\r
+\r
+ Installs driver module protocols and. Creates virtual device handles for ConIn,\r
+ ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol,\r
+ Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers.\r
+ Installs Graphics Output protocol and/or UGA Draw protocol if needed.\r
\r
@param[in] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeConSplitter(\r
+ConSplitterDriverEntry(\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
-\r
//\r
- // Call the original Entry Point\r
+ // Either Graphics Output protocol or UGA Draw protocol must be supported.\r
//\r
- Status = ConSplitterDriverEntry (ImageHandle, SystemTable);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-\r
-/**\r
- Intialize a virtual console device to act as an agrigator of physical console\r
- devices.\r
-\r
- @param ImageHandle (Standard EFI Image entry -\r
- EFI_IMAGE_ENTRY_POINT)\r
- @param SystemTable (Standard EFI Image entry -\r
- EFI_IMAGE_ENTRY_POINT)\r
- EFI_SUCCESS\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConSplitterDriverEntry (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
ASSERT (FeaturePcdGet (PcdConOutGopSupport) ||\r
FeaturePcdGet (PcdConOutUgaSupport));\r
+\r
//\r
// The driver creates virtual handles for ConIn, ConOut, and StdErr.\r
// The virtual handles will always exist even if no console exist in the\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update the EFI System Table with new virtual console\r
+ // and update the pointer to Simple Text Input protocol.\r
//\r
gST->ConsoleInHandle = mConIn.VirtualHandle;\r
gST->ConIn = &mConIn.TextIn;\r
if (!EFI_ERROR (Status)) {\r
if (!FeaturePcdGet (PcdConOutGopSupport)) {\r
//\r
- // In EFI mode, UGA Draw protocol is installed\r
+ // If Graphics Outpurt protocol not supported, UGA Draw protocol is installed\r
+ // on the virtual handle.\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&mConOut.VirtualHandle,\r
);\r
} else if (!FeaturePcdGet (PcdConOutUgaSupport)) {\r
//\r
- // In UEFI mode, Graphics Output Protocol is installed on virtual handle.\r
+ // If UGA Draw protocol not supported, Graphics Output Protocol is installed\r
+ // on virtual handle.\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&mConOut.VirtualHandle,\r
);\r
} else {\r
//\r
- // In EFI and UEFI comptible mode, Graphics Output Protocol and UGA are\r
- // installed on virtual handle.\r
+ // Boot Graphics Output protocol and UGA Draw protocol are supported,\r
+ // both they will be installed on virtual handle.\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&mConOut.VirtualHandle,\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update the EFI System Table with new virtual console\r
+ // and Update the pointer to Text Output protocol.\r
//\r
gST->ConsoleOutHandle = mConOut.VirtualHandle;\r
gST->ConOut = &mConOut.TextOut;\r
);\r
\r
return EFI_SUCCESS;\r
-}\r
\r
+}\r
\r
/**\r
- Construct the ConSplitter.\r
+ Construct console input devices' private data.\r
\r
@param ConInPrivate A pointer to the TEXT_IN_SPLITTER_PRIVATE_DATA\r
structure.\r
\r
@retval EFI_OUT_OF_RESOURCES Out of resources.\r
+ @retval EFI_SUCCESS Text Input Devcie's private data has been constructed.\r
+ @retval other Failed to construct private data.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
\r
//\r
- // Initilize console input splitter's private data.\r
+ // Allocate buffer for Simple Text Input device\r
//\r
Status = ConSplitterGrowBuffer (\r
sizeof (EFI_SIMPLE_TEXT_INPUT_PROTOCOL *),\r
&ConInPrivate->LockEvent\r
);\r
ASSERT_EFI_ERROR (Status);\r
-\r
+ //\r
+ // Create Event to wait for a key\r
+ //\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
- // Buffer for Simple Text Input Ex Protocol\r
+ // Allocate buffer for Simple Text Input Ex device\r
//\r
Status = ConSplitterGrowBuffer (\r
sizeof (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *),\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
+ //\r
+ // Create Event to wait for a key Ex\r
+ //\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
\r
InitializeListHead (&ConInPrivate->NotifyList);\r
\r
+ ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;\r
//\r
- // Allocate Buffer and Create Event for Absolute Pointer and Simple Pointer Protocols\r
+ // Allocate buffer for Absolute Pointer device\r
//\r
- ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;\r
-\r
Status = ConSplitterGrowBuffer (\r
sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),\r
&ConInPrivate->AbsolutePointerListCount,\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
+ //\r
+ // Create Event to wait for device input for Absolute pointer device\r
+ //\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
ASSERT_EFI_ERROR (Status);\r
\r
ConInPrivate->SimplePointer.Mode = &ConInPrivate->SimplePointerMode;\r
-\r
+ //\r
+ // Allocate buffer for Simple Pointer device\r
+ //\r
Status = ConSplitterGrowBuffer (\r
sizeof (EFI_SIMPLE_POINTER_PROTOCOL *),\r
&ConInPrivate->PointerListCount,\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
+ //\r
+ // Create Event to wait for device input for Simple pointer device\r
+ //\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_WAIT,\r
TPL_NOTIFY,\r
return Status;\r
}\r
\r
+/**\r
+ Construct console output devices' private data.\r
+\r
+ @param ConOutPrivate A pointer to the TEXT_OUT_SPLITTER_PRIVATE_DATA\r
+ structure.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Out of resources.\r
+ @retval EFI_SUCCESS Text Input Devcie's private data has been constructed.\r
+\r
+**/\r
EFI_STATUS\r
ConSplitterTextOutConstructor (\r
TEXT_OUT_SPLITTER_PRIVATE_DATA *ConOutPrivate\r
// Copy protocols template\r
//\r
if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
- CopyMem (&ConOutPrivate->UgaDraw, &gUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL));\r
+ CopyMem (&ConOutPrivate->UgaDraw, &mUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL));\r
}\r
-\r
if (FeaturePcdGet (PcdConOutGopSupport)) {\r
- CopyMem (&ConOutPrivate->GraphicsOutput, &gGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL));\r
+ CopyMem (&ConOutPrivate->GraphicsOutput, &mGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL));\r
}\r
\r
//\r
// so put current mode back to init state.\r
//\r
ConOutPrivate->TextOutMode.Mode = 0xFF;\r
-\r
+ //\r
+ // Allocate buffer for Console Out device\r
+ //\r
Status = ConSplitterGrowBuffer (\r
sizeof (TEXT_OUT_AND_GOP_DATA),\r
&ConOutPrivate->TextOutListCount,\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
+ //\r
+ // Allocate buffer for Text Out query data\r
+ //\r
Status = ConSplitterGrowBuffer (\r
sizeof (TEXT_OUT_SPLITTER_QUERY_DATA),\r
&ConOutPrivate->TextOutQueryDataCount,\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
//\r
// Setup the DevNullTextOut console to 80 x 25\r
//\r
\r
if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
//\r
- // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel\r
+ // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel, 60Hz.\r
//\r
ConSpliterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60);\r
}\r
\r
ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1;\r
//\r
- // Initial current mode to unknow state, and then set to mode 0\r
+ // Initial current mode to unknown state, and then set to mode 0\r
//\r
ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff;\r
ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0);\r
}\r
\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
\r
/**\r
- Generic Supported Check\r
+ Test to see if the specified protocol could be supported on the specified device.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller Handle.\r
- @param Guid Guid.\r
+ @param This Driver Binding protocol pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param Guid The specified protocol.\r
\r
- @retval EFI_UNSUPPORTED unsupported.\r
- @retval EFI_SUCCESS operation is OK.\r
+ @retval EFI_SUCCESS The specified protocol is supported on this device.\r
+ @retval EFI_UNSUPPORTED The specified protocol attempts to be installed on virtul handle.\r
+ @retval other Failed to open specified protocol on this device.\r
\r
**/\r
EFI_STATUS\r
//\r
// Make sure the Console Splitter does not attempt to attach to itself\r
//\r
- if (ControllerHandle == mConIn.VirtualHandle) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (ControllerHandle == mConOut.VirtualHandle) {\r
+ if (ControllerHandle == mConIn.VirtualHandle ||\r
+ ControllerHandle == mConOut.VirtualHandle ||\r
+ ControllerHandle == mStdErr.VirtualHandle\r
+ ) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
- if (ControllerHandle == mStdErr.VirtualHandle) {\r
- return EFI_UNSUPPORTED;\r
- }\r
//\r
- // Check to see whether the handle has the ConsoleInDevice GUID on it\r
+ // Check to see whether the specific protocol could be opened BY_DRIVER\r
//\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
- Console In Supported Check\r
+ Test to see if Console In Device could be supported on the Controller.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
);\r
}\r
\r
-\r
/**\r
- Standard Error Supported Check\r
+ Test to see if Simple Pointer protocol could be supported on the Controller.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
);\r
}\r
\r
-\r
/**\r
- Absolute Pointer Supported Check\r
+ Test to see if Absolute Pointer protocol could be supported on the Controller.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
- Console Out Supported Check\r
+ Test to see if Console Out Device could be supported on the Controller.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
);\r
}\r
\r
-\r
/**\r
- Standard Error Supported Check\r
+ Test to see if Standard Error Device could be supported on the Controller.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a SimpleTextIn handle.\r
+ Start ConSplitter on devcie handle by opening Console Device Guid on device handle\r
+ and the console virtual handle. And Get the console interface on controller handle.\r
\r
- (Standard DriverBinding Protocol Start() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device.\r
+ @param ConSplitterVirtualHandle Console virtual Handle.\r
+ @param DeviceGuid The specified Console Device, such as ConInDev,\r
+ ConOutDev.\r
+ @param InterfaceGuid The specified protocol to be opened.\r
+ @param Interface Protocol interface returned.\r
\r
- @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other Failed to open the specified Console Device Guid\r
+ or specified protocol.\r
\r
**/\r
EFI_STATUS\r
-EFIAPI\r
ConSplitterStart (\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE ControllerHandle,\r
IN EFI_HANDLE ConSplitterVirtualHandle,\r
IN EFI_GUID *DeviceGuid,\r
IN EFI_GUID *InterfaceGuid,\r
- IN VOID **Interface\r
+ OUT VOID **Interface\r
)\r
{\r
EFI_STATUS Status;\r
VOID *Instance;\r
\r
//\r
- // Check to see whether the handle has the ConsoleInDevice GUID on it\r
+ // Check to see whether the ControllerHandle has the DeviceGuid on it.\r
//\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
return Status;\r
}\r
\r
+ //\r
+ // Create virtual handle and open DeviceGuid on the virtul handle.\r
+ //\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
DeviceGuid,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Err;\r
}\r
\r
- return gBS->OpenProtocol (\r
+ //\r
+ // Open InterfaceGuid on the virtul handle.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
ControllerHandle,\r
InterfaceGuid,\r
Interface,\r
ConSplitterVirtualHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ //\r
+ // close the DeviceGuid on ConSplitter VirtualHandle.\r
+ //\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ DeviceGuid,\r
+ This->DriverBindingHandle,\r
+ ConSplitterVirtualHandle\r
+ );\r
+\r
+Err:\r
+ //\r
+ // close the DeviceGuid on ControllerHandle.\r
+ //\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ DeviceGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+\r
+ return Status;\r
}\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a SimpleTextIn handle.\r
+ Start Console In Consplitter on device handle.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_STATUS\r
- @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+ @retval EFI_SUCCESS Console In Consplitter is added to ControllerHandle.\r
+ @retval other Console In Consplitter does not support this device.\r
\r
**/\r
EFI_STATUS\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
- EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;\r
+ EFI_STATUS Status;\r
+ EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
+ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;\r
\r
//\r
// Start ConSplitter on ControllerHandle, and create the virtual\r
return Status;\r
}\r
\r
+ //\r
+ // Add this device into Text In devices list.\r
+ //\r
Status = ConSplitterTextInAddDevice (&mConIn, TextIn);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
mConIn.VirtualHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // If Simple Text Input Ex protocol exists,\r
+ // add this device into Text In Ex devices list.\r
+ //\r
+ Status = ConSplitterTextInExAddDevice (&mConIn, TextInEx);\r
}\r
\r
- Status = ConSplitterTextInExAddDevice (&mConIn, TextInEx);\r
-\r
return Status;\r
}\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a SimpleTextIn handle.\r
+ Start Simple Pointer Consplitter on device handle.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+ @retval EFI_SUCCESS Simple Pointer Consplitter is added to ControllerHandle.\r
+ @retval other Simple Pointer Consplitter does not support this device.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer;\r
\r
+ //\r
+ // Start ConSplitter on ControllerHandle, and create the virtual\r
+ // agrogated console device on first call Start for a SimplePointer handle.\r
+ //\r
Status = ConSplitterStart (\r
This,\r
ControllerHandle,\r
return Status;\r
}\r
\r
+ //\r
+ // Add this devcie into Simple Pointer devices list.\r
+ //\r
return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer);\r
}\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a ConIn handle.\r
+ Start Absolute Pointer Consplitter on device handle.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_ERROR if a AbsolutePointer protocol is not started.\r
+ @retval EFI_SUCCESS Absolute Pointer Consplitter is added to ControllerHandle.\r
+ @retval other Absolute Pointer Consplitter does not support this device.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer;\r
\r
+ //\r
+ // Start ConSplitter on ControllerHandle, and create the virtual\r
+ // agrogated console device on first call Start for a AbsolutePointer handle.\r
+ //\r
Status = ConSplitterStart (\r
This,\r
ControllerHandle,\r
return Status;\r
}\r
\r
+ //\r
+ // Add this devcie into Absolute Pointer devices list.\r
+ //\r
return ConSplitterAbsolutePointerAddDevice (&mConIn, AbsolutePointer);\r
}\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a SimpleTextIn handle.\r
+ Start Console Out Consplitter on device handle.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+ @retval EFI_SUCCESS Console Out Consplitter is added to ControllerHandle.\r
+ @retval other Console Out Consplitter does not support this device.\r
\r
**/\r
EFI_STATUS\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
+ EFI_STATUS Status;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
\r
+ //\r
+ // Start ConSplitter on ControllerHandle, and create the virtual\r
+ // agrogated console device on first call Start for a ConsoleOut handle.\r
+ //\r
Status = ConSplitterStart (\r
This,\r
ControllerHandle,\r
\r
if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
- // Open UGA_DRAW protocol\r
+ // Open UGA DRAW protocol\r
//\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &UgaDraw,\r
- This->DriverBindingHandle,\r
- mConOut.VirtualHandle,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
+ gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ (VOID **) &UgaDraw,\r
+ This->DriverBindingHandle,\r
+ mConOut.VirtualHandle,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
}\r
\r
//\r
Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw);\r
ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
\r
- if (FeaturePcdGet (PcdConOutUgaSupport) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
//\r
- // Match the UGA mode data of ConOut with the current mode\r
+ // Get the UGA mode data of ConOut from the current mode\r
//\r
- if (UgaDraw != NULL) {\r
- UgaDraw->GetMode (\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+\r
+ mConOut.UgaHorizontalResolution = Info->HorizontalResolution;\r
+ mConOut.UgaVerticalResolution = Info->VerticalResolution;\r
+ mConOut.UgaColorDepth = 32;\r
+ mConOut.UgaRefreshRate = 60;\r
+\r
+ FreePool (Info);\r
+\r
+ } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ Status = UgaDraw->GetMode (\r
UgaDraw,\r
&mConOut.UgaHorizontalResolution,\r
&mConOut.UgaVerticalResolution,\r
);\r
}\r
}\r
+\r
return Status;\r
}\r
\r
\r
/**\r
- Start ConSplitter on ControllerHandle, and create the virtual\r
- agrogated console device on first call Start for a SimpleTextIn handle.\r
+ Start Standard Error Consplitter on device handle.\r
\r
- @param This Pointer to protocol.\r
- @param ControllerHandle Controller handle.\r
- @param RemainingDevicePath Remaining device path.\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to bind driver to.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
\r
- @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+ @retval EFI_SUCCESS Standard Error Consplitter is added to ControllerHandle.\r
+ @retval other Standard Error Consplitter does not support this device.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;\r
\r
+ //\r
+ // Start ConSplitter on ControllerHandle, and create the virtual\r
+ // agrogated console device on first call Start for a StandardError handle.\r
+ //\r
Status = ConSplitterStart (\r
This,\r
ControllerHandle,\r
\r
\r
/**\r
+ Stop ConSplitter on device handle by closing Console Device Guid on device handle\r
+ and the console virtual handle.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Protocol instance pointer.\r
+ @param ControllerHandle Handle of device.\r
+ @param ConSplitterVirtualHandle Console virtual Handle.\r
+ @param DeviceGuid The specified Console Device, such as ConInDev,\r
+ ConOutDev.\r
+ @param InterfaceGuid The specified protocol to be opened.\r
+ @param Interface Protocol interface returned.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Stop ConSplitter on ControllerHandle successfully.\r
+ @retval other Failed to Stop ConSplitter on ControllerHandle.\r
\r
**/\r
EFI_STATUS\r
-EFIAPI\r
ConSplitterStop (\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
IN EFI_HANDLE ControllerHandle,\r
This->DriverBindingHandle,\r
ConSplitterVirtualHandle\r
);\r
+\r
gBS->CloseProtocol (\r
ControllerHandle,\r
DeviceGuid,\r
\r
\r
/**\r
+ Stop Console In ConSplitter on ControllerHandle by closing Console In Devcice GUID.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
\r
- @return None\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
\r
**/\r
EFI_STATUS\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
-\r
+ EFI_STATUS Status;\r
+ EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;\r
+\r
if (NumberOfChildren == 0) {\r
return EFI_SUCCESS;\r
}\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = ConSplitterTextInExDeleteDevice (&mConIn, TextInEx);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // If Simple Text Input Ex protocol exists,\r
+ // remove device from Text Input Ex devices list.\r
+ //\r
+ Status = ConSplitterTextInExDeleteDevice (&mConIn, TextInEx);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
}\r
\r
-\r
+ //\r
+ // Close Simple Text In protocol on controller handle and virtual handle.\r
+ //\r
Status = ConSplitterStop (\r
This,\r
ControllerHandle,\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
//\r
- // Delete this console input device's data structures.\r
+ // Remove device from Text Input devices list.\r
//\r
return ConSplitterTextInDeleteDevice (&mConIn, TextIn);\r
}\r
\r
\r
/**\r
+ Stop Simple Pointer protocol ConSplitter on ControllerHandle by closing\r
+ Simple Pointer protocol.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
\r
- @return None\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+ //\r
+ // Close Simple Pointer protocol on controller handle and virtual handle.\r
+ //\r
Status = ConSplitterStop (\r
This,\r
ControllerHandle,\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
//\r
- // Delete this console input device's data structures.\r
+ // Remove this device from Simple Pointer device list.\r
//\r
return ConSplitterSimplePointerDeleteDevice (&mConIn, SimplePointer);\r
}\r
\r
\r
/**\r
+ Stop Absolute Pointer protocol ConSplitter on ControllerHandle by closing\r
+ Absolute Pointer protocol.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
\r
- @return None\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+ //\r
+ // Close Absolute Pointer protocol on controller handle and virtual handle.\r
+ //\r
Status = ConSplitterStop (\r
This,\r
ControllerHandle,\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
//\r
- // Delete this console input device's data structures.\r
+ // Remove this device from Absolute Pointer device list.\r
//\r
return ConSplitterAbsolutePointerDeleteDevice (&mConIn, AbsolutePointer);\r
}\r
\r
\r
/**\r
+ Stop Console Out ConSplitter on device handle by closing Console Out Devcice GUID.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
\r
- @return None\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+ //\r
+ // Close Absolute Pointer protocol on controller handle and virtual handle.\r
+ //\r
Status = ConSplitterStop (\r
This,\r
ControllerHandle,\r
}\r
\r
//\r
- // Delete this console output device's data structures.\r
+ // Remove this device from Text Out device list.\r
//\r
return ConSplitterTextOutDeleteDevice (&mConOut, TextOut);\r
}\r
\r
\r
/**\r
+ Stop Standard Error ConSplitter on ControllerHandle by closing Standard Error GUID.\r
\r
- (Standard DriverBinding Protocol Stop() function)\r
+ @param This Driver Binding protocol instance pointer.\r
+ @param ControllerHandle Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
\r
- @retval EFI_SUCCESS Complete successfully.\r
+ @retval EFI_SUCCESS This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+ //\r
+ // Close Standard Error Device on controller handle and virtual handle.\r
+ //\r
Status = ConSplitterStop (\r
This,\r
ControllerHandle,\r
bytes. Copy the current data in Buffer to the new version of Buffer\r
and free the old version of buffer.\r
\r
- @param SizeOfCount Size of element in array\r
- @param Count Current number of elements in array\r
+ @param SizeOfCount Size of element in array.\r
+ @param Count Current number of elements in array.\r
@param Buffer Bigger version of passed in Buffer with all the\r
- data\r
+ data.\r
\r
- @retval EFI_SUCCESS Buffer size has grown\r
- @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size\r
- @return None\r
+ @retval EFI_SUCCESS Buffer size has grown.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
IN OUT VOID **Buffer\r
)\r
{\r
- UINTN NewSize;\r
- UINTN OldSize;\r
VOID *Ptr;\r
\r
//\r
// copy the old buffer's content to the new-size buffer,\r
// then free the old buffer.\r
//\r
- OldSize = *Count * SizeOfCount;\r
*Count += CONSOLE_SPLITTER_CONSOLES_ALLOC_UNIT;\r
- NewSize = *Count * SizeOfCount;\r
-\r
- Ptr = AllocateZeroPool (NewSize);\r
+ Ptr = ReallocatePool (\r
+ SizeOfCount * ((*Count) - CONSOLE_SPLITTER_CONSOLES_ALLOC_UNIT),\r
+ SizeOfCount * (*Count),\r
+ *Buffer\r
+ );\r
if (Ptr == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
-\r
- CopyMem (Ptr, *Buffer, OldSize);\r
-\r
- if (*Buffer != NULL) {\r
- FreePool (*Buffer);\r
- }\r
-\r
*Buffer = Ptr;\r
-\r
return EFI_SUCCESS;\r
}\r
\r
\r
/**\r
+ Add Text Input Device in Consplitter Text Input list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param TextIn Simple Text Input protocol pointer.\r
\r
- @return EFI_SUCCESS\r
- @return EFI_OUT_OF_RESOURCES\r
+ @retval EFI_SUCCESS Text Input Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
\r
//\r
- // If the Text In List is full, enlarge it by calling growbuffer().\r
+ // If the Text In List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
if (Private->CurrentNumberOfConsoles >= Private->TextInListCount) {\r
Status = ConSplitterGrowBuffer (\r
Private->CurrentNumberOfConsoles++;\r
\r
//\r
- // Extra CheckEvent added to reduce the double CheckEvent() in UI.c\r
+ // Extra CheckEvent added to reduce the double CheckEvent().\r
//\r
gBS->CheckEvent (TextIn->WaitForKey);\r
\r
\r
\r
/**\r
+ Remove Text Input Device from Consplitter Text Input list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param TextIn Simple Text protocol pointer.\r
\r
- @return EFI_SUCCESS\r
- @return EFI_NOT_FOUND\r
+ @retval EFI_SUCCESS Simple Text Device removed successfully.\r
+ @retval EFI_NOT_FOUND No Simple Text Device found.\r
\r
**/\r
EFI_STATUS\r
return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
+ Add Text Input Ex Device in Consplitter Text Input Ex list.\r
+\r
+ @param Private Text In Splitter pointer.\r
+ @param TextInEx Simple Text Input Ex Input protocol pointer.\r
+\r
+ @retval EFI_SUCCESS Text Input Ex Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
+\r
+**/\r
EFI_STATUS\r
ConSplitterTextInExAddDevice (\r
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,\r
EFI_STATUS Status;\r
\r
//\r
- // If the TextInEx List is full, enlarge it by calling growbuffer().\r
+ // If the Text Input Ex List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
if (Private->CurrentNumberOfExConsoles >= Private->TextInExListCount) {\r
Status = ConSplitterGrowBuffer (\r
}\r
}\r
//\r
- // Add the new text-in device data structure into the Text In List.\r
+ // Add the new text-in device data structure into the Text Input Ex List.\r
//\r
Private->TextInExList[Private->CurrentNumberOfExConsoles] = TextInEx;\r
Private->CurrentNumberOfExConsoles++;\r
\r
//\r
- // Extra CheckEvent added to reduce the double CheckEvent() in UI.c\r
+ // Extra CheckEvent added to reduce the double CheckEvent().\r
//\r
gBS->CheckEvent (TextInEx->WaitForKeyEx);\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Remove Text Ex Device from Consplitter Text Input Ex list.\r
+\r
+ @param Private Text In Splitter pointer.\r
+ @param TextInEx Simple Text Ex protocol pointer.\r
+\r
+ @retval EFI_SUCCESS Simple Text Input Ex Device removed successfully.\r
+ @retval EFI_NOT_FOUND No Simple Text Input Ex Device found.\r
+\r
+**/\r
EFI_STATUS\r
ConSplitterTextInExDeleteDevice (\r
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,\r
{\r
UINTN Index;\r
//\r
- // Remove the specified text-in device data structure from the Text In List,\r
+ // Remove the specified text-in device data structure from the Text Input Ex List,\r
// and rearrange the remaining data structures in the Text In List.\r
//\r
for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {\r
\r
\r
/**\r
+ Add Simple Pointer Device in Consplitter Simple Pointer list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param SimplePointer Simple Pointer protocol pointer.\r
\r
- @return EFI_OUT_OF_RESOURCES\r
- @return EFI_SUCCESS\r
+ @retval EFI_SUCCESS Simple Pointer Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
\r
//\r
- // If the Text In List is full, enlarge it by calling growbuffer().\r
+ // If the Simple Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
if (Private->CurrentNumberOfPointers >= Private->PointerListCount) {\r
Status = ConSplitterGrowBuffer (\r
}\r
}\r
//\r
- // Add the new text-in device data structure into the Text In List.\r
+ // Add the new text-in device data structure into the Simple Pointer List.\r
//\r
Private->PointerList[Private->CurrentNumberOfPointers] = SimplePointer;\r
Private->CurrentNumberOfPointers++;\r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
/**\r
+ Remove Simple Pointer Device from Consplitter Simple Pointer list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param SimplePointer Simple Pointer protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Simple Pointer Device removed successfully.\r
+ @retval EFI_NOT_FOUND No Simple Pointer Device found.\r
\r
**/\r
EFI_STATUS\r
{\r
UINTN Index;\r
//\r
- // Remove the specified text-in device data structure from the Text In List,\r
+ // Remove the specified text-in device data structure from the Simple Pointer List,\r
// and rearrange the remaining data structures in the Text In List.\r
//\r
for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {\r
\r
\r
/**\r
+ Add Absolute Pointer Device in Consplitter Absolute Pointer list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param AbsolutePointer Absolute Pointer protocol pointer.\r
\r
- @return EFI_OUT_OF_RESOURCES\r
- @return EFI_SUCCESS\r
+ @retval EFI_SUCCESS Absolute Pointer Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
\r
//\r
- // If the Absolute Pointer List is full, enlarge it by calling growbuffer().\r
+ // If the Absolute Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
if (Private->CurrentNumberOfAbsolutePointers >= Private->AbsolutePointerListCount) {\r
Status = ConSplitterGrowBuffer (\r
}\r
}\r
//\r
- // Add the new text-in device data structure into the Text In List.\r
+ // Add the new text-in device data structure into the Absolute Pointer List.\r
//\r
Private->AbsolutePointerList[Private->CurrentNumberOfAbsolutePointers] = AbsolutePointer;\r
Private->CurrentNumberOfAbsolutePointers++;\r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
/**\r
+ Remove Absolute Pointer Device from Consplitter Absolute Pointer list.\r
\r
+ @param Private Text In Splitter pointer.\r
+ @param AbsolutePointer Absolute Pointer protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Absolute Pointer Device removed successfully.\r
+ @retval EFI_NOT_FOUND No Absolute Pointer Device found.\r
\r
**/\r
EFI_STATUS\r
{\r
UINTN Index;\r
//\r
- // Remove the specified text-in device data structure from the Text In List,\r
- // and rearrange the remaining data structures in the Text In List.\r
+ // Remove the specified text-in device data structure from the Absolute Pointer List,\r
+ // and rearrange the remaining data structures from the Absolute Pointer List.\r
//\r
for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {\r
if (Private->AbsolutePointerList[Index] == AbsolutePointer) {\r
return EFI_NOT_FOUND;\r
}\r
\r
-\r
/**\r
+ Reallocate Text Out mode map.\r
\r
+ Allocate new buffer and copy original buffer into the new buffer.\r
\r
- @return None\r
+ @param Private Consplitter Text Out pointer.\r
+\r
+ @retval EFI_SUCCESS Buffer size has grown\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
\r
NewSize = Private->TextOutListCount * sizeof (INT32);\r
OldTextOutModeMap = Private->TextOutModeMap;\r
- TotalSize = NewSize * Private->TextOutQueryDataCount;\r
+ TotalSize = NewSize * (Private->TextOutQueryDataCount);\r
\r
- TextOutModeMap = AllocateZeroPool (TotalSize);\r
+ //\r
+ // Allocate new buffer for Text Out List.\r
+ //\r
+ TextOutModeMap = AllocatePool (TotalSize);\r
if (TextOutModeMap == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
\r
/**\r
+ Add new device's output mode to console splitter's mode list.\r
\r
+ @param Private Text Out Splitter pointer\r
+ @param TextOut Simple Text Output protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
}\r
\r
/**\r
- Reconstruct TextOutModeMap to get intersection of modes\r
+ Reconstruct TextOutModeMap to get intersection of modes.\r
\r
This routine reconstruct TextOutModeMap to get the intersection\r
of modes for all console out devices. Because EFI/UEFI spec require\r
@param TextOutModeMap Current text out mode map, begin with the mode 80x25\r
@param NewlyAddedMap New text out mode map, begin with the mode 80x25\r
@param MapStepSize Mode step size for one console device\r
- @param NewMapStepSize Mode step size for one console device\r
- @param MaxMode Current max text mode\r
- @param CurrentMode Current text mode\r
-\r
- @retval None\r
+ @param NewMapStepSize New Mode step size for one console device\r
+ @param MaxMode IN: Current max text mode, OUT: Updated max text mode.\r
+ @param CurrentMode IN: Current text mode, OUT: Updated current text mode.\r
\r
**/\r
VOID\r
ConSplitterGetIntersection (\r
- IN INT32 *TextOutModeMap,\r
- IN INT32 *NewlyAddedMap,\r
- IN UINTN MapStepSize,\r
- IN UINTN NewMapStepSize,\r
- OUT INT32 *MaxMode,\r
- OUT INT32 *CurrentMode\r
+ IN INT32 *TextOutModeMap,\r
+ IN INT32 *NewlyAddedMap,\r
+ IN UINTN MapStepSize,\r
+ IN UINTN NewMapStepSize,\r
+ IN OUT INT32 *MaxMode,\r
+ IN OUT INT32 *CurrentMode\r
)\r
{\r
INT32 Index;\r
INT32 *CurrentMapEntry;\r
INT32 *NextMapEntry;\r
+ INT32 *NewMapEntry;\r
INT32 CurrentMaxMode;\r
INT32 Mode;\r
\r
//\r
Index = 2;\r
CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];\r
- NextMapEntry = &TextOutModeMap[MapStepSize * 2];\r
- NewlyAddedMap = &NewlyAddedMap[NewMapStepSize * 2];\r
+ NextMapEntry = CurrentMapEntry;\r
+ NewMapEntry = &NewlyAddedMap[NewMapStepSize * 2];\r
\r
CurrentMaxMode = *MaxMode;\r
Mode = *CurrentMode;\r
\r
while (Index < CurrentMaxMode) {\r
- if (*NewlyAddedMap == -1) {\r
+ if (*NewMapEntry == -1) {\r
//\r
// This mode is not supported any more. Remove it. Special care\r
// must be taken as this remove will also affect current mode;\r
}\r
\r
CurrentMapEntry += MapStepSize;\r
- NewlyAddedMap += NewMapStepSize;\r
+ NewMapEntry += NewMapStepSize;\r
Index++;\r
}\r
\r
return ;\r
}\r
\r
-\r
/**\r
+ Sync the device's output mode to console splitter's mode list.\r
\r
- @param Private Private data structure.\r
- @param TextOut Text Out Protocol.\r
-\r
- @return None\r
+ @param Private Text Out Splitter pointer.\r
+ @param TextOut Simple Text Output protocol pointer.\r
\r
**/\r
VOID\r
MapTable = TextOutModeMap + Private->CurrentNumberOfConsoles;\r
while (Mode < TextOut->Mode->MaxMode) {\r
Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+\r
if (EFI_ERROR(Status)) {\r
if (Mode == 1) {\r
+ //\r
+ // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData\r
+ // is clear to 0x0.\r
+ //\r
MapTable[StepSize] = Mode;\r
TextOutQueryData[Mode].Columns = 0;\r
TextOutQueryData[Mode].Rows = 0;\r
MapTable[Index * StepSize] = Mode;\r
break;\r
}\r
-\r
Index++;\r
}\r
-\r
Mode++;\r
}\r
//\r
\r
\r
/**\r
+ Sync output device between ConOut and StdErr output.\r
\r
-\r
- @return EFI_SUCCESS\r
- @return EFI_OUT_OF_RESOURCES\r
+ @retval EFI_SUCCESS Sync implemented successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
&(mConOut.TextOutMode.MaxMode),\r
&(mConOut.TextOutMode.Mode)\r
);\r
+\r
if (mConOut.TextOutMode.Mode < 0) {\r
mConOut.TextOut.SetMode (&(mConOut.TextOut), 0);\r
}\r
&(mStdErr.TextOutMode.MaxMode),\r
&(mStdErr.TextOutMode.Mode)\r
);\r
+\r
if (mStdErr.TextOutMode.Mode < 0) {\r
mStdErr.TextOut.SetMode (&(mStdErr.TextOut), 0);\r
}\r
\r
\r
/**\r
+ Add Grahpics Output modes into Consplitter Text Out list.\r
\r
+ @param Private Text Out Splitter pointer.\r
+ @param GraphicsOutput Graphics Output protocol pointer.\r
+ @param UgaDraw UGA Draw protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Output mode added successfully.\r
+ @retval other Failed to add output mode.\r
\r
**/\r
EFI_STATUS\r
UINT32 UgaColorDepth;\r
UINT32 UgaRefreshRate;\r
\r
- if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
+ ASSERT (GraphicsOutput != NULL || UgaDraw != NULL);\r
\r
CurrentGraphicsOutputMode = Private->GraphicsOutput.Mode;\r
\r
CurrentGraphicsOutputMode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo;\r
CurrentGraphicsOutputMode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase;\r
CurrentGraphicsOutputMode->FrameBufferSize = GraphicsOutput->Mode->FrameBufferSize;\r
-\r
+ \r
//\r
// Allocate resource for the private mode buffer\r
//\r
- ModeBuffer = AllocatePool (GraphicsOutput->Mode->SizeOfInfo * GraphicsOutput->Mode->MaxMode);\r
+ ModeBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION) * GraphicsOutput->Mode->MaxMode);\r
if (ModeBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
Mode = ModeBuffer;\r
for (Index = 0; Index < GraphicsOutput->Mode->MaxMode; Index++) {\r
+ //\r
+ // The Info buffer would be allocated by callee\r
+ //\r
Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) Index, &SizeOfInfo, &Info);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+ ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
CopyMem (Mode, Info, SizeOfInfo);\r
Mode++;\r
FreePool (Info);\r
Match = FALSE;\r
\r
for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) {\r
+ //\r
+ // The Info buffer would be allocated by callee\r
+ //\r
Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&\r
(Info->VerticalResolution == Mode->VerticalResolution)) {\r
+ //\r
+ // If GOP device supports one mode in current mode buffer,\r
+ // it will be added into matched mode buffer\r
+ //\r
Match = TRUE;\r
FreePool (Info);\r
break;\r
if (Match) {\r
AlreadyExist = FALSE;\r
\r
+ //\r
+ // Check if GOP mode has been in the mode buffer, ModeBuffer = MatchedMode at begin.\r
+ //\r
for (Info = ModeBuffer; Info < MatchedMode; Info++) {\r
if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&\r
(Info->VerticalResolution == Mode->VerticalResolution)) {\r
}\r
}\r
}\r
- }\r
- if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
// Graphics console driver can ensure the same mode for all GOP devices\r
// so we can get the current mode from this video device\r
CurrentGraphicsOutputMode->MaxMode = 1;\r
Info = CurrentGraphicsOutputMode->Info;\r
Info->Version = 0;\r
- Info->HorizontalResolution = UgaHorizontalResolution;\r
- Info->VerticalResolution = UgaVerticalResolution;\r
- Info->PixelFormat = PixelBltOnly;\r
- Info->PixelsPerScanLine = UgaHorizontalResolution;\r
- CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+ Info->HorizontalResolution = UgaHorizontalResolution;\r
+ Info->VerticalResolution = UgaVerticalResolution;\r
+ Info->PixelFormat = PixelBltOnly;\r
+ Info->PixelsPerScanLine = UgaHorizontalResolution;\r
+ CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
CurrentGraphicsOutputMode->FrameBufferSize = 0;\r
\r
// Graphics console can ensure all GOP devices have the same mode which can be taken as current mode.\r
//\r
Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, (UINT32) CurrentIndex);\r
-\r
- //\r
- // If user defined mode is not valid for UGA, set to the default mode 800x600.\r
- //\r
if (EFI_ERROR(Status)) {\r
+ //\r
+ // If user defined mode is not valid for display device, set to the default mode 800x600.\r
+ //\r
(Private->GraphicsOutputModeBuffer[0]).HorizontalResolution = 800;\r
(Private->GraphicsOutputModeBuffer[0]).VerticalResolution = 600;\r
Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, 0);\r
return Status;\r
}\r
\r
-\r
/**\r
+ Set the current console out mode.\r
+\r
This routine will get the current console mode information (column, row)\r
from ConsoleOutMode variable and set it; if the variable does not exist,\r
set to user defined console mode.\r
\r
- None\r
-\r
- @return None\r
+ @param Private Consplitter Text Out pointer.\r
\r
**/\r
VOID\r
IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private\r
)\r
{\r
- UINTN Col;\r
- UINTN Row;\r
- UINTN Mode;\r
- UINTN PreferMode;\r
- UINTN BaseMode;\r
- UINTN ModeInfoSize;\r
- UINTN MaxMode;\r
- EFI_STATUS Status;\r
- CONSOLE_OUT_MODE *ModeInfo;\r
+ UINTN Col;\r
+ UINTN Row;\r
+ UINTN Mode;\r
+ UINTN PreferMode;\r
+ UINTN BaseMode;\r
+ UINTN MaxMode;\r
+ EFI_STATUS Status;\r
+ CONSOLE_OUT_MODE ModeInfo;\r
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;\r
\r
PreferMode = 0xFF;\r
BaseMode = 0xFF;\r
TextOut = &Private->TextOut;\r
MaxMode = (UINTN) (TextOut->Mode->MaxMode);\r
- ModeInfoSize = sizeof (CONSOLE_OUT_MODE);\r
-\r
- ModeInfo = AllocateZeroPool (sizeof(CONSOLE_OUT_MODE));\r
- ASSERT(ModeInfo != NULL);\r
\r
- Status = gRT->GetVariable (\r
- VARCONOUTMODE,\r
- &gEfiGenericPlatformVariableGuid,\r
- NULL,\r
- &ModeInfoSize,\r
- ModeInfo\r
- );\r
+ ModeInfo.Column = PcdGet32 (PcdConOutColumn);\r
+ ModeInfo.Row = PcdGet32 (PcdConOutRow);\r
\r
//\r
- // Set to the default mode 80 x 25 required by EFI/UEFI spec;\r
- // user can also define other valid default console mode here.\r
+ // To find the prefer mode and basic mode from Text Out mode list\r
//\r
- if (EFI_ERROR(Status)) {\r
- ModeInfo->Column = 80;\r
- ModeInfo->Row = 25;\r
- Status = gRT->SetVariable (\r
- VARCONOUTMODE,\r
- &gEfiGenericPlatformVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (CONSOLE_OUT_MODE),\r
- ModeInfo\r
- );\r
- }\r
-\r
for (Mode = 0; Mode < MaxMode; Mode++) {\r
Status = TextOut->QueryMode (TextOut, Mode, &Col, &Row);\r
if (!EFI_ERROR(Status)) {\r
- if (Col == ModeInfo->Column && Row == ModeInfo->Row) {\r
+ if (Col == ModeInfo.Column && Row == ModeInfo.Row) {\r
PreferMode = Mode;\r
}\r
if (Col == 80 && Row == 25) {\r
}\r
}\r
\r
- Status = TextOut->SetMode (TextOut, PreferMode);\r
-\r
//\r
- // if current mode setting is failed, default 80x25 mode will be set.\r
+ // Set prefer mode to Text Out devices.\r
//\r
+ Status = TextOut->SetMode (TextOut, PreferMode);\r
if (EFI_ERROR(Status)) {\r
- Status = TextOut->SetMode (TextOut, BaseMode);\r
- ASSERT(!EFI_ERROR(Status));\r
-\r
- ModeInfo->Column = 80;\r
- ModeInfo->Row = 25;\r
-\r
//\r
- // Update ConOutMode variable\r
+ // if current mode setting is failed, default 80x25 mode will be set.\r
//\r
- Status = gRT->SetVariable (\r
- VARCONOUTMODE,\r
- &gEfiGenericPlatformVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (CONSOLE_OUT_MODE),\r
- ModeInfo\r
- );\r
+ Status = TextOut->SetMode (TextOut, BaseMode);\r
+ ASSERT(!EFI_ERROR(Status));\r
+ \r
+ PcdSet32 (PcdConOutColumn, 80);\r
+ PcdSet32 (PcdConOutRow, 25);\r
}\r
\r
- gBS->FreePool (ModeInfo);\r
+ return ;\r
}\r
\r
\r
-\r
/**\r
+ Add Text Output Device in Consplitter Text Output list.\r
\r
+ @param Private Text Out Splitter pointer.\r
+ @param TextOut Simple Text Output protocol pointer.\r
+ @param GraphicsOutput Graphics Output protocol pointer.\r
+ @param UgaDraw UGA Draw protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Text Output Device added successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size.\r
\r
**/\r
EFI_STATUS\r
IN EFI_UGA_DRAW_PROTOCOL *UgaDraw\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN CurrentNumOfConsoles;\r
- INT32 CurrentMode;\r
- INT32 MaxMode;\r
- UINT32 UgaHorizontalResolution;\r
- UINT32 UgaVerticalResolution;\r
- UINT32 UgaColorDepth;\r
- UINT32 UgaRefreshRate;\r
- TEXT_OUT_AND_GOP_DATA *TextAndGop;\r
+ EFI_STATUS Status;\r
+ UINTN CurrentNumOfConsoles;\r
+ INT32 CurrentMode;\r
+ INT32 MaxMode;\r
+ UINT32 UgaHorizontalResolution;\r
+ UINT32 UgaVerticalResolution;\r
+ UINT32 UgaColorDepth;\r
+ UINT32 UgaRefreshRate;\r
+ TEXT_OUT_AND_GOP_DATA *TextAndGop;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
\r
Status = EFI_SUCCESS;\r
CurrentNumOfConsoles = Private->CurrentNumberOfConsoles;\r
\r
//\r
- // If the Text Out List is full, enlarge it by calling growbuffer().\r
+ // If the Text Out List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
while (CurrentNumOfConsoles >= Private->TextOutListCount) {\r
Status = ConSplitterGrowBuffer (\r
\r
TextAndGop = &Private->TextOutList[CurrentNumOfConsoles];\r
\r
- TextAndGop->TextOut = TextOut;\r
+ TextAndGop->TextOut = TextOut;\r
TextAndGop->GraphicsOutput = GraphicsOutput;\r
- TextAndGop->UgaDraw = UgaDraw;\r
+ TextAndGop->UgaDraw = UgaDraw;\r
\r
if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) {\r
//\r
MaxMode = Private->TextOutMode.MaxMode;\r
ASSERT (MaxMode >= 1);\r
\r
- //\r
- // Update DevNull mode according to current video device\r
- //\r
if (FeaturePcdGet (PcdConOutGopSupport)) {\r
- if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) {\r
+ //\r
+ // If GOP is produced by Consplitter, this device display mode will be added into Graphics Ouput modes.\r
+ //\r
+ if ((GraphicsOutput != NULL) || (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport))) {\r
ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw);\r
}\r
}\r
+\r
if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
- if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ UgaHorizontalResolution = 800;\r
+ UgaVerticalResolution = 600;\r
+ UgaColorDepth = 32;\r
+ UgaRefreshRate = 60;\r
+\r
+ Status = EFI_DEVICE_ERROR;\r
+ //\r
+ // If UGA is produced by Consplitter\r
+ //\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+\r
+ UgaHorizontalResolution = Info->HorizontalResolution;\r
+ UgaVerticalResolution = Info->VerticalResolution;\r
+\r
+ FreePool (Info);\r
+\r
+ } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
Status = UgaDraw->GetMode (\r
UgaDraw,\r
&UgaHorizontalResolution,\r
&UgaColorDepth,\r
&UgaRefreshRate\r
);\r
- if (!EFI_ERROR (Status)) {\r
- Status = ConSpliterUgaDrawSetMode (\r
- &Private->UgaDraw,\r
- UgaHorizontalResolution,\r
- UgaVerticalResolution,\r
- UgaColorDepth,\r
- UgaRefreshRate\r
- );\r
- }\r
- //\r
- // If GetMode/SetMode is failed, set to 800x600 mode\r
- //\r
- if(EFI_ERROR (Status)) {\r
- Status = ConSpliterUgaDrawSetMode (\r
- &Private->UgaDraw,\r
- 800,\r
- 600,\r
- 32,\r
- 60\r
- );\r
- }\r
}\r
+\r
+ //\r
+ // Set UGA Draw mode,\r
+ // if GetMode is failed, set to 800x600 mode\r
+ //\r
+ Status = ConSpliterUgaDrawSetMode (\r
+ &Private->UgaDraw,\r
+ UgaHorizontalResolution,\r
+ UgaVerticalResolution,\r
+ UgaColorDepth,\r
+ UgaRefreshRate\r
+ );\r
}\r
\r
if (Private->ConsoleOutputMode == EfiConsoleControlScreenGraphics && GraphicsOutput != NULL) {\r
// We just added a new GOP or UGA device in graphics mode\r
//\r
if (FeaturePcdGet (PcdConOutGopSupport)) {\r
+ //\r
+ // Sync display output on new device based on GOP settings.\r
+ //\r
DevNullGopSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
} else if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
+ //\r
+ // Sync display output on new device based on UGA settings.\r
+ //\r
DevNullUgaSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
}\r
} else if ((CurrentMode >= 0) && ((GraphicsOutput != NULL) || (UgaDraw != NULL)) && (CurrentMode < Private->TextOutMode.MaxMode)) {\r
\r
\r
/**\r
+ Remove Text Out Device in Consplitter Text Out list.\r
\r
+ @param Private Text Out Splitter pointer.\r
+ @param TextOut Simple Text Output Pointer protocol pointer.\r
\r
- @return None\r
+ @retval EFI_SUCCESS Text Out Device removed successfully.\r
+ @retval EFI_NOT_FOUND No Text Out Device found.\r
\r
**/\r
EFI_STATUS\r
\r
return Status;\r
}\r
-//\r
-// ConSplitter TextIn member functions\r
-//\r
+\r
\r
/**\r
Reset the input device and optionaly run diagnostics\r
Reads the next keystroke from the input device. The WaitForKey Event can\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
\r
- @param This Protocol instance pointer.\r
+ @param Private Protocol instance pointer.\r
@param Key Driver may perform diagnostics on reset.\r
\r
@retval EFI_SUCCESS The keystroke information was returned.\r
return EFI_NOT_READY;\r
}\r
\r
-\r
/**\r
Return TRUE if StdIn is locked. The ConIn device on the virtual handle is\r
the only device locked.\r
\r
- NONE\r
-\r
@retval TRUE StdIn locked\r
@retval FALSE StdIn working normally\r
\r
\r
\r
/**\r
- This timer event will fire when StdIn is locked. It will check the key\r
- sequence on StdIn to see if it matches the password. Any error in the\r
- password will cause the check to reset. As long a mConIn.PasswordEnabled is\r
- TRUE the StdIn splitter will not report any input.\r
+ Record and check key sequence on StdIn.\r
\r
- (Standard EFI_EVENT_NOTIFY)\r
-\r
- @return None\r
+ This timer event will fire when StdIn is locked. It will record the key sequence\r
+ on StdIn and also check to see if it matches the password. Any error in the\r
+ password will cause the check to reset. As long as a mConIn.PasswordEnabled is\r
+ TRUE, the StdIn splitter will not report any input.\r
\r
+ @param Event The Event this notify function registered to.\r
+ @param Context Pointer to the context data registerd to the\r
+ Event.\r
**/\r
VOID\r
EFIAPI\r
Status = ConSplitterTextInPrivateReadKeyStroke (&mConIn, &Key);\r
if (!EFI_ERROR (Status)) {\r
//\r
- // if it's an ENTER, match password\r
+ // If key read successfully\r
//\r
if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN) && (Key.ScanCode == SCAN_NULL)) {\r
+ //\r
+ // If it's an ENTER, match password\r
+ //\r
mConIn.PwdAttempt[mConIn.PwdIndex] = CHAR_NULL;\r
- if (StrCmp (mConIn.Password, mConIn.PwdAttempt)) {\r
+ if (StrCmp (mConIn.Password, mConIn.PwdAttempt) != 0) {\r
//\r
// Password not match\r
//\r
BackSpaceString[0] = CHAR_BACKSPACE;\r
BackSpaceString[1] = 0;\r
\r
- SpaceString[0] = ' ';\r
+ SpaceString[0] = L' ';\r
SpaceString[1] = 0;\r
\r
ConSplitterTextOutOutputString (&mConOut.TextOut, BackSpaceString);\r
}\r
} else if ((Key.ScanCode == SCAN_NULL) && (Key.UnicodeChar >= 32)) {\r
//\r
- // If it's not an ENTER, neigher a function key, nor a CTRL-X or ALT-X, record the input\r
+ // If it's not an ENTER, neigher a function key, nor a CTRL-X or ALT-X, record the input,\r
+ // value 32 stands for a Blank Space key.\r
//\r
if (mConIn.PwdIndex < (MAX_STD_IN_PASSWORD - 1)) {\r
if (mConIn.PwdIndex == 0) {\r
\r
\r
/**\r
- If Password is NULL unlock the password state variable and set the event\r
- timer. If the Password is too big return an error. If the Password is valid\r
- Copy the Password and enable state variable and then arm the periodic timer\r
+ If Password is NULL or the Password is too big, then return an error. If the\r
+ Password is valid, then store the password, lock StdIn and arm the periodic timer.\r
\r
+ @param This Console Control protocol pointer.\r
+ @param Password The password input.\r
\r
- @retval EFI_SUCCESS Lock the StdIn device\r
- @retval EFI_INVALID_PARAMETER Password is NULL\r
- @retval EFI_OUT_OF_RESOURCES Buffer allocation to store the password fails\r
+ @retval EFI_SUCCESS Lock the StdIn device.\r
+ @retval EFI_INVALID_PARAMETER Password is NULL.\r
+ @retval EFI_OUT_OF_RESOURCES Buffer allocation to store the password fails.\r
\r
**/\r
EFI_STATUS\r
StrCpy (mConIn.Password, Password);\r
mConIn.PasswordEnabled = TRUE;\r
mConIn.PwdIndex = 0;\r
- gBS->SetTimer (mConIn.LockEvent, TimerPeriodic, (10000 * 25));\r
+ //\r
+ // Lock Timer Periodic is 25ms.\r
+ //\r
+ gBS->SetTimer (mConIn.LockEvent, TimerPeriodic, 10000 * 25);\r
\r
return EFI_SUCCESS;\r
}\r
\r
\r
/**\r
- This event agregates all the events of the ConIn devices in the spliter.\r
+ This event aggregates all the events of the ConIn devices in the spliter.\r
+\r
If the ConIn is password locked then return.\r
If any events of physical ConIn devices are signaled, signal the ConIn\r
spliter event. This will cause the calling code to call\r
@param Event The Event assoicated with callback.\r
@param Context Context registered when Event was created.\r
\r
- @return None\r
-\r
**/\r
VOID\r
EFIAPI\r
UINTN Index;\r
\r
Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;\r
+\r
if (Private->PasswordEnabled) {\r
//\r
// If StdIn Locked return not ready\r
return ;\r
}\r
\r
- //\r
- // if KeyEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()\r
- //\r
if (Private->KeyEventSignalState) {\r
+ //\r
+ // If KeyEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()\r
+ //\r
gBS->SignalEvent (Event);\r
return ;\r
}\r
+\r
//\r
- // if any physical console input device has key input, signal the event.\r
+ // If any physical console input device has key input, signal the event.\r
//\r
for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
Status = gBS->CheckEvent (Private->TextInList[Index]->WaitForKey);\r
\r
\r
/**\r
+ Test if the key has been registered on input device.\r
\r
@param RegsiteredData A pointer to a buffer that is filled in with the\r
keystroke state data for the key that was\r
\r
}\r
\r
-//\r
-// Simple Text Input Ex protocol functions\r
-//\r
-\r
\r
/**\r
Reset the input device and optionaly run diagnostics\r
successfully.\r
@retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necesssary data\r
structures.\r
- @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle is NULL.\r
+ @retval EFI_INVALID_PARAMETER KeyData or KeyNotificationFunction or NotifyHandle is NULL.\r
\r
**/\r
EFI_STATUS\r
Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
\r
//\r
- // if no physical console input device exists,\r
+ // If no physical console input device exists,\r
// return EFI_SUCCESS directly.\r
//\r
if (Private->CurrentNumberOfExConsoles <= 0) {\r
// Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.\r
//\r
for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
- CurrentNotify = CR (\r
- Link,\r
- TEXT_IN_EX_SPLITTER_NOTIFY,\r
- NotifyEntry,\r
- TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE\r
- );\r
+ CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);\r
if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {\r
*NotifyHandle = CurrentNotify->NotifyHandle;\r
}\r
NewNotify->Signature = TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE;\r
NewNotify->KeyNotificationFn = KeyNotificationFunction;\r
+ NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;\r
CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));\r
\r
//\r
}\r
}\r
\r
- //\r
- // Use gSimpleTextInExNotifyGuid to get a valid EFI_HANDLE\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &NewNotify->NotifyHandle,\r
- &gSimpleTextInExNotifyGuid,\r
- NULL,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
InsertTailList (&mConIn.NotifyList, &NewNotify->NotifyEntry);\r
\r
*NotifyHandle = NewNotify->NotifyHandle;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Status = gBS->OpenProtocol (\r
- NotificationHandle,\r
- &gSimpleTextInExNotifyGuid,\r
- NULL,\r
- NULL,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
\r
//\r
}\r
\r
for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
- CurrentNotify = CR (Link, TEXT_IN_EX_SPLITTER_NOTIFY, NotifyEntry, TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE);\r
+ CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);\r
if (CurrentNotify->NotifyHandle == NotificationHandle) {\r
for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {\r
Status = Private->TextInExList[Index]->UnregisterKeyNotify (\r
}\r
}\r
RemoveEntryList (&CurrentNotify->NotifyEntry);\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- CurrentNotify->NotifyHandle,\r
- &gSimpleTextInExNotifyGuid,\r
- NULL,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+\r
gBS->FreePool (CurrentNotify->NotifyHandleList);\r
gBS->FreePool (CurrentNotify);\r
return EFI_SUCCESS;\r
Reads the next keystroke from the input device. The WaitForKey Event can\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
\r
- @param This Protocol instance pointer. State -\r
+ @param Private Protocol instance pointer.\r
+ @param State The state information of simple pointer device.\r
\r
@retval EFI_SUCCESS The keystroke information was returned.\r
@retval EFI_NOT_READY There was no keystroke data availiable.\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
If the ConIn is password locked make it look like no keystroke is availible\r
\r
- @param This Protocol instance pointer. State -\r
+ @param This A pointer to protocol instance.\r
+ @param State A pointer to state information on the pointer device\r
\r
- @retval EFI_SUCCESS The keystroke information was returned.\r
+ @retval EFI_SUCCESS The keystroke information was returned in State.\r
@retval EFI_NOT_READY There was no keystroke data availiable.\r
@retval EFI_DEVICE_ERROR The keydtroke information was not returned due\r
to hardware errors.\r
@param Event The Event assoicated with callback.\r
@param Context Context registered when Event was created.\r
\r
- @return None\r
-\r
**/\r
VOID\r
EFIAPI\r
}\r
}\r
\r
-//\r
-// Absolute Pointer Protocol functions\r
-//\r
-\r
-\r
/**\r
Resets the pointer device hardware.\r
\r
@param Event The Event assoicated with callback.\r
@param Context Context registered when Event was created.\r
\r
- @return None\r
-\r
**/\r
VOID\r
EFIAPI\r
Write a Unicode string to the output device.\r
\r
@param This Protocol instance pointer.\r
- @param String The NULL-terminated Unicode string to be\r
+ @param WString The NULL-terminated Unicode string to be\r
displayed on the output device(s). All output\r
devices must also support the Unicode drawing\r
defined in this file.\r
TargetString = WString;\r
} else {\r
TargetString = AllocatePool (sizeof (CHAR16) * (StrLen (WString) + BackSpaceCount + 1));\r
+ ASSERT (TargetString != NULL);\r
+\r
StrCpy (TargetString, WString);\r
}\r
//\r
target device.\r
\r
@param This Protocol instance pointer.\r
- @param String The NULL-terminated Unicode string to be\r
+ @param WString The NULL-terminated Unicode string to be\r
examined for the output device(s).\r
\r
@retval EFI_SUCCESS The device(s) are capable of rendering the\r
\r
@param This Protocol instance pointer.\r
@param ModeNumber The mode number to return information on.\r
- @param Rows Returns the geometry of the text output device\r
+ @param Columns Returns the columns of the text output device\r
+ for the requested ModeNumber.\r
+ @param Rows Returns the rows of the text output device\r
for the requested ModeNumber.\r
\r
@retval EFI_SUCCESS The requested mode information was returned.\r
Sets the current coordinates of the cursor position\r
\r
@param This Protocol instance pointer.\r
- @param Row the position to set the cursor to. Must be\r
+ @param Column The column position to set the cursor to. Must be\r
+ greater than or equal to zero and less than the\r
+ number of columns by QueryMode ().\r
+ @param Row The row position to set the cursor to. Must be\r
greater than or equal to zero and less than the\r
- number of columns and rows by QueryMode ().\r
+ number of rows by QueryMode ().\r
\r
@retval EFI_SUCCESS The operation completed successfully.\r
@retval EFI_DEVICE_ERROR The device had an error and could not complete\r