-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
- Ps2Mouse.c\r
-\r
-Abstract:\r
-\r
+/** @file\r
PS/2 Mouse driver. Routines that interacts with callers,\r
- conforming to EFI driver model\r
+ conforming to EFI driver model.\r
\r
---*/\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
\r
#include "Ps2Mouse.h"\r
#include "CommPs2.h"\r
\r
-//\r
-// DriverBinding Protocol Instance\r
-//\r
+///\r
+/// DriverBinding Protocol Instance\r
+///\r
EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {\r
PS2MouseDriverSupported,\r
PS2MouseDriverStart,\r
NULL\r
};\r
\r
+/**\r
+ Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
+ than contains a IsaIo protocol can be supported.\r
+\r
+ @param This 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
+ @retval EFI_SUCCESS This driver supports this device\r
+ @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+ @retval other This driver does not support this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PS2MouseDriverSupported (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- ControllerDriver Protocol Method\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-// GC_TODO: This - add argument and description to function comment\r
-// GC_TODO: Controller - add argument and description to function comment\r
-// GC_TODO: RemainingDevicePath - add argument and description to function comment\r
{\r
EFI_STATUS Status;\r
EFI_ISA_IO_PROTOCOL *IsaIo;\r
return Status;\r
}\r
\r
+/**\r
+ Start this driver on ControllerHandle by opening a IsaIo protocol, creating\r
+ PS2_MOUSE_ABSOLUTE_POINTER_DEV device and install gEfiAbsolutePointerProtocolGuid\r
+ finally.\r
+\r
+ @param This 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
+ @retval EFI_SUCCESS This driver is added to ControllerHandle\r
+ @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
+ @retval other This driver does not support this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PS2MouseDriverStart (\r
IN EFI_HANDLE Controller,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Start protocol interfaces for the mouse device handles.\r
-\r
-Arguments:\r
- This - Protocol instance pointer.\r
- Controller - Handle of device to bind driver to.\r
- RemainingDevicePath - Not used.\r
-\r
-Returns:\r
- EFI_SUCCESS - This driver is added to DeviceHandle.\r
- other - Errors occurred.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_STATUS EmptyStatus;\r
//\r
MouseDev->Signature = PS2_MOUSE_DEV_SIGNATURE;\r
MouseDev->Handle = Controller;\r
- MouseDev->SampleRate = SSR_20;\r
- MouseDev->Resolution = CMR4;\r
- MouseDev->Scaling = SF1;\r
+ MouseDev->SampleRate = SampleRate20;\r
+ MouseDev->Resolution = MouseResolution4;\r
+ MouseDev->Scaling = Scaling1;\r
MouseDev->DataPackageSize = 3;\r
MouseDev->IsaIo = IsaIo;\r
MouseDev->DevicePath = ParentDevicePath;\r
// Initialize keyboard controller if necessary\r
//\r
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);\r
+ //\r
+ // Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.\r
+ //\r
+ if ((Data & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {\r
+ //\r
+ // If nobody decodes KBC I/O port, it will read back as 0xFF.\r
+ // Check the Time-Out and Parity bit to see if it has an active KBC in system\r
+ //\r
+ Status = EFI_DEVICE_ERROR;\r
+ StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;\r
+ goto ErrorExit;\r
+ }\r
+\r
+ REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+ EFI_PROGRESS_CODE,\r
+ EFI_PERIPHERAL_MOUSE | EFI_P_MOUSE_PC_SELF_TEST,\r
+ ParentDevicePath\r
+ );\r
+\r
if ((Data & KBC_SYSF) != KBC_SYSF) {\r
Status = KbcSelfTest (IsaIo);\r
if (EFI_ERROR (Status)) {\r
//\r
// Reset the mouse\r
//\r
- Status = MouseDev->SimplePointerProtocol.Reset (&MouseDev->SimplePointerProtocol, TRUE);\r
+ Status = MouseDev->SimplePointerProtocol.Reset (\r
+ &MouseDev->SimplePointerProtocol,\r
+ FeaturePcdGet (PcdPs2MouseExtendedVerification)\r
+ );\r
if (EFI_ERROR (Status)) {\r
//\r
// mouse not connected\r
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;\r
goto ErrorExit;\r
}\r
+\r
+ REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+ EFI_PROGRESS_CODE,\r
+ EFI_PERIPHERAL_MOUSE | EFI_P_PC_DETECTED,\r
+ ParentDevicePath\r
+ );\r
+\r
//\r
// Setup the WaitForKey event\r
//\r
}\r
\r
MouseDev->ControllerNameTable = NULL;\r
- AddUnicodeString (\r
+ AddUnicodeString2 (\r
"eng",\r
gPs2MouseComponentName.SupportedLanguages,\r
&MouseDev->ControllerNameTable,\r
- L"PS/2 Mouse Device"\r
+ L"PS/2 Mouse Device",\r
+ TRUE\r
+ );\r
+ AddUnicodeString2 (\r
+ "en",\r
+ gPs2MouseComponentName2.SupportedLanguages,\r
+ &MouseDev->ControllerNameTable,\r
+ L"PS/2 Mouse Device",\r
+ FALSE\r
);\r
\r
+\r
//\r
// Install protocol interfaces for the mouse device.\r
//\r
\r
ErrorExit:\r
\r
- KbcDisableAux (IsaIo);\r
+ if (Status != EFI_DEVICE_ERROR) {\r
+ KbcDisableAux (IsaIo);\r
+ }\r
\r
if (StatusCode != 0) {\r
REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) {\r
FreeUnicodeStringTable (MouseDev->ControllerNameTable);\r
}\r
- //\r
- // Since there will be no timer handler for mouse input any more,\r
- // exhaust input data just in case there is still mouse data left\r
- //\r
- EmptyStatus = EFI_SUCCESS;\r
- while (!EFI_ERROR (EmptyStatus)) {\r
- EmptyStatus = In8042Data (IsaIo, &Data);\r
+\r
+ if (Status != EFI_DEVICE_ERROR) {\r
+ //\r
+ // Since there will be no timer handler for mouse input any more,\r
+ // exhaust input data just in case there is still mouse data left\r
+ //\r
+ EmptyStatus = EFI_SUCCESS;\r
+ while (!EFI_ERROR (EmptyStatus)) {\r
+ EmptyStatus = In8042Data (IsaIo, &Data);\r
+ }\r
}\r
\r
if (MouseDev != NULL) {\r
- gBS->FreePool (MouseDev);\r
+ FreePool (MouseDev);\r
}\r
\r
gBS->CloseProtocol (\r
return Status;\r
}\r
\r
+/**\r
+ Stop this driver on ControllerHandle. Support stopping any child handles\r
+ created by this driver.\r
+\r
+ @param This 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 This driver is removed ControllerHandle\r
+ @retval other This driver was not removed from this device\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PS2MouseDriverStop (\r
IN UINTN NumberOfChildren,\r
IN EFI_HANDLE *ChildHandleBuffer\r
)\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Arguments:\r
-\r
- Returns:\r
-\r
---*/\r
-// GC_TODO: This - add argument and description to function comment\r
-// GC_TODO: Controller - add argument and description to function comment\r
-// GC_TODO: NumberOfChildren - add argument and description to function comment\r
-// GC_TODO: ChildHandleBuffer - add argument and description to function comment\r
-// GC_TODO: EFI_SUCCESS - add return value to function comment\r
-// GC_TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- //\r
- // Disable mouse on keyboard controller\r
- //\r
- KbcDisableAux (MouseDev->IsaIo);\r
\r
//\r
// Cancel mouse data polling timer, close timer event\r
\r
gBS->CloseEvent (MouseDev->SimplePointerProtocol.WaitForInput);\r
FreeUnicodeStringTable (MouseDev->ControllerNameTable);\r
- gBS->FreePool (MouseDev);\r
+ FreePool (MouseDev);\r
\r
gBS->CloseProtocol (\r
Controller,\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Reset the Mouse and do BAT test for it, if ExtendedVerification is TRUE and there is a mouse device connected to system\r
+\r
+ @param This - Pointer of simple pointer Protocol.\r
+ @param ExtendedVerification - Whether configure mouse parameters. True: do; FALSE: skip.\r
+\r
+\r
+ @retval EFI_SUCCESS - The command byte is written successfully.\r
+ @retval EFI_DEVICE_ERROR - Errors occurred during resetting keyboard.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
MouseReset (\r
IN EFI_SIMPLE_POINTER_PROTOCOL *This,\r
IN BOOLEAN ExtendedVerification\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Reset the Mouse and do BAT test for it, if ExtendedVerification isTRUE and there is a mouse device connectted to system\r
-\r
-Arguments:\r
-\r
- This - Pointer of simple pointer Protocol.\r
- ExtendedVerification - Whether configure mouse parameters. True: do; FALSE: skip.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The command byte is written successfully.\r
- EFI_DEVICE_ERROR - Errors occurred during reseting keyboard.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
PS2_MOUSE_DEV *MouseDev;\r
return Status;\r
}\r
\r
-BOOLEAN\r
-CheckMouseConnect (\r
- IN PS2_MOUSE_DEV *MouseDev\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
Check whether there is Ps/2 mouse device in system\r
\r
-Arguments:\r
+ @param MouseDev - Mouse Private Data Structure\r
\r
- PS2_MOUSE_DEV - Mouse Private Data Structure\r
+ @retval TRUE - Keyboard in System.\r
+ @retval FALSE - Keyboard not in System.\r
\r
-Returns:\r
-\r
- TRUE - Keyboard in System.\r
- FALSE - Keyboard not in System.\r
+**/\r
+BOOLEAN\r
+CheckMouseConnect (\r
+ IN PS2_MOUSE_DEV *MouseDev\r
+ )\r
\r
---*/\r
{\r
EFI_STATUS Status;\r
\r
return FALSE;\r
}\r
\r
+/**\r
+ Get and Clear mouse status.\r
+\r
+ @param This - Pointer of simple pointer Protocol.\r
+ @param State - Output buffer holding status.\r
+\r
+ @retval EFI_INVALID_PARAMETER Output buffer is invalid.\r
+ @retval EFI_NOT_READY Mouse is not changed status yet.\r
+ @retval EFI_SUCCESS Mouse status is changed and get successful.\r
+**/\r
EFI_STATUS\r
EFIAPI\r
MouseGetState (\r
IN EFI_SIMPLE_POINTER_PROTOCOL *This,\r
IN OUT EFI_SIMPLE_POINTER_STATE *State\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
- This - GC_TODO: add argument description\r
- State - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_INVALID_PARAMETER - GC_TODO: Add description for return value\r
- EFI_NOT_READY - GC_TODO: Add description for return value\r
- EFI_SUCCESS - GC_TODO: Add description for return value\r
-\r
---*/\r
{\r
PS2_MOUSE_DEV *MouseDev;\r
EFI_TPL OldTpl;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+\r
+ Event notification function for SIMPLE_POINTER.WaitForInput event.\r
+ Signal the event if there is input from mouse.\r
+\r
+ @param Event event object\r
+ @param Context event context\r
+\r
+**/\r
VOID\r
EFIAPI\r
MouseWaitForInput (\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Event notification function for SIMPLE_POINTER.WaitForInput event\r
- Signal the event if there is input from mouse\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-// GC_TODO: Event - add argument and description to function comment\r
-// GC_TODO: Context - add argument and description to function comment\r
{\r
PS2_MOUSE_DEV *MouseDev;\r
\r
\r
}\r
\r
+/**\r
+ Event notification function for TimerEvent event.\r
+ If mouse device is connected to system, try to get the mouse packet data.\r
+\r
+ @param Event - TimerEvent in PS2_MOUSE_DEV\r
+ @param Context - Pointer to PS2_MOUSE_DEV structure\r
+\r
+**/\r
VOID\r
EFIAPI\r
PollMouse (\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
)\r
-/*++\r
-\r
-Routine Description:\r
\r
- Event notification function for TimerEvent event\r
- If mouse device is connected to system, try to get the mouse packet data\r
-\r
-Arguments:\r
-\r
- Event - TimerEvent in PS2_MOUSE_DEV\r
- Context - Pointer to PS2_MOUSE_DEV structure\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
{\r
PS2_MOUSE_DEV *MouseDev;\r
\r
/**\r
The user Entry Point for module Ps2Mouse. The user code starts with this function.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \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
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r
//\r
// Install driver model protocol(s).\r
//\r
- Status = EfiLibInstallAllDriverProtocols (\r
+ Status = EfiLibInstallDriverBindingComponentName2 (\r
ImageHandle,\r
SystemTable,\r
&gPS2MouseDriver,\r
ImageHandle,\r
&gPs2MouseComponentName,\r
- NULL,\r
- NULL\r
+ &gPs2MouseComponentName2\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
return Status;\r
}\r
+\r