-/*++\r
+/**@file\r
\r
Copyright (c) 2006 - 2007, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
If Handle(1) contains a gEfiWinNtSerialPortGuid protocol then the driver is\r
loaded on the device.\r
\r
---*/\r
-\r
-//\r
-// The package level header files this module uses\r
-//\r
-#include <Uefi.h>\r
-#include <WinNtDxe.h>\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
-//\r
-#include <Protocol/WinNtIo.h>\r
-#include <Protocol/ComponentName.h>\r
-#include <Protocol/SerialIo.h>\r
-#include <Protocol/DriverBinding.h>\r
-#include <Protocol/DevicePath.h>\r
-//\r
-// The Library classes this module consumes\r
-//\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
+**/\r
\r
#include "WinNtSerialIo.h"\r
\r
NULL\r
};\r
\r
+//\r
+// List of supported baud rate\r
+//\r
+UINT64 mBaudRateCurrentSupport[] = {50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200, 38400, 57600, 115200, SERIAL_PORT_MAX_BAUD_RATE + 1};\r
+\r
/**\r
The user Entry Point for module WinNtSerialIo. The user code starts with this function.\r
\r
//\r
// Install driver model protocol(s).\r
//\r
- Status = EfiLibInstallAllDriverProtocols (\r
+ Status = EfiLibInstallDriverBindingComponentName2 (\r
ImageHandle,\r
SystemTable,\r
&gWinNtSerialIoDriverBinding,\r
ImageHandle,\r
&gWinNtSerialIoComponentName,\r
- NULL,\r
- NULL\r
+ &gWinNtSerialIoComponentName2\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingSupported (\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingStart (\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
OpenInfoBuffer[Index].ControllerHandle,\r
&gEfiSerialIoProtocolGuid,\r
- &SerialIo,\r
+ (VOID **) &SerialIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
Private->Fifo.Last = 0;\r
Private->Fifo.Surplus = SERIAL_MAX_BUFFER_SIZE;\r
\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gWinNtSerialIoComponentName.SupportedLanguages,\r
&Private->ControllerNameTable,\r
- WinNtIo->EnvString\r
+ WinNtIo->EnvString,\r
+ TRUE\r
);\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gWinNtSerialIoComponentName2.SupportedLanguages,\r
+ &Private->ControllerNameTable,\r
+ WinNtIo->EnvString,\r
+ FALSE\r
+ );\r
+\r
\r
Private->SerialIo.Revision = SERIAL_IO_INTERFACE_REVISION;\r
Private->SerialIo.Reset = WinNtSerialIoReset;\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
Private->Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingStop (\r
Status = gBS->OpenProtocol (\r
ChildHandleBuffer[Index],\r
&gEfiSerialIoProtocolGuid,\r
- &SerialIo,\r
+ (VOID **) &SerialIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
// Serial IO Protocol member functions\r
//\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoReset (\r
);\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoSetAttributes (\r
// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
+ UINTN Index; \r
WIN_NT_SERIAL_IO_PRIVATE_DATA *Private;\r
COMMTIMEOUTS PortTimeOuts;\r
DWORD ConvertedTime;\r
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
EFI_TPL Tpl;\r
\r
- Tpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
\r
//\r
// we must set the default values if a null argument is passed in.\r
//\r
if (BaudRate == 0) {\r
- BaudRate = SERIAL_BAUD_DEFAULT;\r
+ BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);\r
}\r
\r
if (ReceiveFifoDepth == 0) {\r
}\r
\r
if (Parity == DefaultParity) {\r
- Parity = NoParity;\r
+ Parity = FixedPcdGet8 (PcdUartDefaultParity);\r
}\r
\r
if (DataBits == 0) {\r
- DataBits = SERIAL_DATABITS_DEFAULT;\r
+ DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
}\r
\r
if (StopBits == DefaultStopBits) {\r
- StopBits = OneStopBit;\r
+ StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);\r
+ }\r
+\r
+ //\r
+ // Make sure all parameters are valid\r
+ //\r
+ if ((BaudRate > SERIAL_PORT_MAX_BAUD_RATE) || (BaudRate < SERIAL_PORT_MIN_BAUD_RATE)) {\r
+ return EFI_INVALID_PARAMETER;\r
}\r
+\r
+ //\r
+ //The lower baud rate supported by the serial device will be selected without exceeding the unsupported BaudRate parameter\r
+ // \r
+ \r
+ for (Index = 1; Index < (sizeof (mBaudRateCurrentSupport) / sizeof (mBaudRateCurrentSupport[0])); Index++) {\r
+ if (BaudRate < mBaudRateCurrentSupport[Index]) {\r
+ BaudRate = mBaudRateCurrentSupport[Index-1];\r
+ break;\r
+ }\r
+ }\r
+ \r
+ if ((ReceiveFifoDepth < 1) || (ReceiveFifoDepth > SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((Timeout < SERIAL_PORT_MIN_TIMEOUT) || (Timeout > SERIAL_PORT_MAX_TIMEOUT)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((Parity < NoParity) || (Parity > SpaceParity)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((StopBits < OneStopBit) || (StopBits > TwoStopBits)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Now we only support DataBits=7,8.\r
+ //\r
+ if ((DataBits < 7) || (DataBits > 8)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ //\r
+ // Now we only support DataBits=7,8.\r
+ // for DataBits = 6,7,8, StopBits can not set OneFiveStopBits.\r
+ //\r
+ if (StopBits == OneFiveStopBits) {\r
+ return EFI_INVALID_PARAMETER;\r
+ } \r
+ \r
//\r
// See if the new attributes already match the current attributes\r
//\r
Private->UartDevicePath.StopBits == StopBits &&\r
Private->SerialIoMode.ReceiveFifoDepth == ReceiveFifoDepth &&\r
Private->SerialIoMode.Timeout == Timeout ) {\r
- gBS->RestoreTPL(Tpl);\r
return EFI_SUCCESS;\r
}\r
\r
+ Tpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
//\r
// Get current values from NT\r
//\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoSetControl (\r
DCB Dcb;\r
EFI_TPL Tpl;\r
\r
+ //\r
+ // first determine the parameter is invalid\r
+ //\r
+ if (Control & (~(EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+ EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \r
+ EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
Tpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoGetControl (\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoWrite (\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoRead (\r