use a PS/2 mouse to simulate a faked touchpad device.
verify the correction of the ABSOLUTE POINTER protocol's installation and usage git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4331 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,430 @@ | ||||
| /**@file | ||||
|   PS2 Mouse Communication Interface  | ||||
|  | ||||
|    | ||||
| Copyright (c) 2006 - 2007, Intel Corporation | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are licensed and made available under the terms and conditions of the BSD License | ||||
| which accompanies this distribution.  The full text of the license may be found at | ||||
| http://opensource.org/licenses/bsd-license.php | ||||
|  | ||||
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #ifndef _COMMPS2_H_ | ||||
| #define _COMMPS2_H_ | ||||
|  | ||||
| #define PS2_PACKET_LENGTH       3 | ||||
| #define PS2_SYNC_MASK           0xc | ||||
| #define PS2_SYNC_BYTE           0x8 | ||||
|  | ||||
| #define IS_PS2_SYNC_BYTE(byte)  ((byte & PS2_SYNC_MASK) == PS2_SYNC_BYTE) | ||||
|  | ||||
| #define PS2_READ_BYTE_ONE       0 | ||||
| #define PS2_READ_DATA_BYTE      1 | ||||
| #define PS2_PROCESS_PACKET      2 | ||||
|  | ||||
| #define TIMEOUT                 50000 | ||||
| #define BAT_TIMEOUT             500000 | ||||
|  | ||||
| // | ||||
| // 8042 I/O Port | ||||
| // | ||||
| #define KBC_DATA_PORT     0x60 | ||||
| #define KBC_CMD_STS_PORT  0x64 | ||||
|  | ||||
| // | ||||
| // 8042 Command | ||||
| // | ||||
| #define READ_CMD_BYTE   0x20 | ||||
| #define WRITE_CMD_BYTE  0x60 | ||||
| #define DISABLE_AUX     0xa7 | ||||
| #define ENABLE_AUX      0xa8 | ||||
| #define SELF_TEST       0xaa | ||||
| #define DISABLE_KB      0xad | ||||
| #define ENABLE_KB       0xae | ||||
| #define WRITE_AUX_DEV   0xd4 | ||||
|  | ||||
| #define CMD_SYS_FLAG    0x04 | ||||
| #define CMD_KB_STS      0x10 | ||||
| #define CMD_KB_DIS      0x10 | ||||
| #define CMD_KB_EN       0x0 | ||||
|  | ||||
| // | ||||
| // 8042 Auxiliary Device Command | ||||
| // | ||||
| #define SETSF1_CMD  0xe6 | ||||
| #define SETSF2_CMD  0xe7 | ||||
| #define SETRE_CMD   0xe8 | ||||
| #define READ_CMD    0xeb | ||||
| #define SETRM_CMD   0xf0 | ||||
| #define SETSR_CMD   0xf3 | ||||
| #define ENABLE_CMD  0xf4 | ||||
| #define DISABLE_CMD 0xf5 | ||||
| #define RESET_CMD   0xff | ||||
|  | ||||
| // | ||||
| // return code | ||||
| // | ||||
| #define PS2_ACK       0xfa | ||||
| #define PS2_RESEND    0xfe | ||||
| #define PS2MOUSE_BAT1 0xaa | ||||
| #define PS2MOUSE_BAT2 0x0 | ||||
|  | ||||
| // | ||||
| // Keyboard Controller Status | ||||
| // | ||||
| #define KBC_PARE  0x80  // Parity Error | ||||
| #define KBC_TIM   0x40  // General Time Out | ||||
| #define KBC_AUXB  0x20  // Output buffer for auxiliary device (PS/2): | ||||
| //    0 - Holds keyboard data | ||||
| //    1 - Holds data for auxiliary device | ||||
| // | ||||
| #define KBC_KEYL  0x10  // Keyboard lock status: | ||||
| //    0 - keyboard locked | ||||
| //    1 - keyboard free | ||||
| // | ||||
| #define KBC_CD  0x08  // Command/Data: | ||||
| //    0 - data byte written via port 60h | ||||
| //    1 - command byte written via port 64h | ||||
| // | ||||
| #define KBC_SYSF  0x04  // System Flag: | ||||
| //    0 - power-on reset | ||||
| //    1 - self-test successful | ||||
| // | ||||
| #define KBC_INPB  0x02  // Input Buffer Status : | ||||
| //    0 - input buffer empty | ||||
| //    1 - CPU data in input buffer | ||||
| // | ||||
| #define KBC_OUTB  0x01  // Output Buffer Status : | ||||
| //    0 - output buffer empty | ||||
| //    1 - keyboard controller data in output buffer | ||||
| // | ||||
| EFI_STATUS | ||||
| KbcSelfTest ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| KbcEnableAux ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| KbcDisableAux ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| KbcEnableKb ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| KbcDisableKb ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| CheckKbStatus ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   OUT BOOLEAN                             *KeyboardEnable | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo           - GC_TODO: add argument description | ||||
|   KeyboardEnable  - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseReset ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseSetSampleRate ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN MOUSE_SR                             SampleRate | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo       - GC_TODO: add argument description | ||||
|   SampleRate  - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseSetResolution ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN MOUSE_RE                             Resolution | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo       - GC_TODO: add argument description | ||||
|   Resolution  - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseSetScaling ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN MOUSE_SF                             Scaling | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo   - GC_TODO: add argument description | ||||
|   Scaling - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseEnable ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   IsaIo - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseGetPacket ( | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV     *MouseSimulateTouchPadDev | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   MouseDev  - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   GC_TODO: add return values | ||||
|  | ||||
| --*/ | ||||
| ; | ||||
|  | ||||
| EFI_STATUS | ||||
| PS2MouseRead ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   OUT VOID                                *Buffer, | ||||
|   IN OUT UINTN                            *BufSize, | ||||
|   IN  UINTN                               State | ||||
|   ); | ||||
|  | ||||
| // | ||||
| // 8042 I/O function | ||||
| // | ||||
| EFI_STATUS | ||||
| Out8042Command ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINT8                                Command | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| In8042Data ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN OUT UINT8                            *Data | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| Out8042Data ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINT8                                Data | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| Out8042AuxCommand ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINT8                                Command, | ||||
|   IN BOOLEAN                              Resend | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| In8042AuxData ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN OUT UINT8                            *Data | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| Out8042AuxData ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINT8                                Data | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| CheckForInput ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| WaitInputEmpty ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINTN                                Timeout | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| WaitOutputFull ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN UINTN                                Timeout | ||||
|   ); | ||||
|  | ||||
| #endif // _COMMPS2_H_ | ||||
| @@ -0,0 +1,240 @@ | ||||
| /**@file | ||||
|  | ||||
| Copyright (c) 2006 - 2007, Intel Corporation | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are licensed and made available under the terms and conditions of the BSD License | ||||
| which accompanies this distribution.  The full text of the license may be found at | ||||
| http://opensource.org/licenses/bsd-license.php | ||||
|  | ||||
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #include "Ps2MouseSimulateTouchPad.h" | ||||
|  | ||||
| // | ||||
| // EFI Component Name Protocol | ||||
| // | ||||
| GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gPs2MouseSimulateTouchPadComponentName = { | ||||
|   Ps2MouseSimulateTouchPadComponentNameGetDriverName, | ||||
|   Ps2MouseSimulateTouchPadComponentNameGetControllerName, | ||||
|   "eng" | ||||
| }; | ||||
|  | ||||
| // | ||||
| // EFI Component Name 2 Protocol | ||||
| // | ||||
| GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2MouseSimulateTouchPadComponentName2 = { | ||||
|   (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ps2MouseSimulateTouchPadComponentNameGetDriverName, | ||||
|   (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ps2MouseSimulateTouchPadComponentNameGetControllerName, | ||||
|   "en" | ||||
| }; | ||||
|  | ||||
|  | ||||
| GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2MouseSimulateTouchPadDriverNameTable[] = { | ||||
|   { | ||||
|     "eng;en", | ||||
|     L"faked PS/2 Touchpad Driver" | ||||
|   }, | ||||
|   { | ||||
|     NULL, | ||||
|     NULL | ||||
|   } | ||||
| }; | ||||
|  | ||||
| /** | ||||
|   Retrieves a Unicode string that is the user readable name of the driver. | ||||
|  | ||||
|   This function retrieves the user readable name of a driver in the form of a | ||||
|   Unicode string. If the driver specified by This has a user readable name in | ||||
|   the language specified by Language, then a pointer to the driver name is | ||||
|   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified | ||||
|   by This does not support the language specified by Language, | ||||
|   then EFI_UNSUPPORTED is returned. | ||||
|  | ||||
|   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or | ||||
|                                 EFI_COMPONENT_NAME_PROTOCOL instance. | ||||
|  | ||||
|   @param  Language[in]          A pointer to a Null-terminated ASCII string | ||||
|                                 array indicating the language. This is the | ||||
|                                 language of the driver name that the caller is | ||||
|                                 requesting, and it must match one of the | ||||
|                                 languages specified in SupportedLanguages. The | ||||
|                                 number of languages supported by a driver is up | ||||
|                                 to the driver writer. Language is specified | ||||
|                                 in RFC 3066 or ISO 639-2 language code format. | ||||
|  | ||||
|   @param  DriverName[out]       A pointer to the Unicode string to return. | ||||
|                                 This Unicode string is the name of the | ||||
|                                 driver specified by This in the language | ||||
|                                 specified by Language. | ||||
|  | ||||
|   @retval EFI_SUCCESS           The Unicode string for the Driver specified by | ||||
|                                 This and the language specified by Language was | ||||
|                                 returned in DriverName. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER Language is NULL. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER DriverName is NULL. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This does not support | ||||
|                                 the language specified by Language. | ||||
|  | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| Ps2MouseSimulateTouchPadComponentNameGetDriverName ( | ||||
|   IN  EFI_COMPONENT_NAME_PROTOCOL  *This, | ||||
|   IN  CHAR8                        *Language, | ||||
|   OUT CHAR16                       **DriverName | ||||
|   ) | ||||
| { | ||||
|   return LookupUnicodeString2 ( | ||||
|            Language, | ||||
|            This->SupportedLanguages, | ||||
|            mPs2MouseSimulateTouchPadDriverNameTable, | ||||
|            DriverName, | ||||
|            (BOOLEAN)(This == &gPs2MouseSimulateTouchPadComponentName) | ||||
|            ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   Retrieves a Unicode string that is the user readable name of the controller | ||||
|   that is being managed by a driver. | ||||
|  | ||||
|   This function retrieves the user readable name of the controller specified by | ||||
|   ControllerHandle and ChildHandle in the form of a Unicode string. If the | ||||
|   driver specified by This has a user readable name in the language specified by | ||||
|   Language, then a pointer to the controller name is returned in ControllerName, | ||||
|   and EFI_SUCCESS is returned.  If the driver specified by This is not currently | ||||
|   managing the controller specified by ControllerHandle and ChildHandle, | ||||
|   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not | ||||
|   support the language specified by Language, then EFI_UNSUPPORTED is returned. | ||||
|  | ||||
|   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or | ||||
|                                 EFI_COMPONENT_NAME_PROTOCOL instance. | ||||
|  | ||||
|   @param  ControllerHandle[in]  The handle of a controller that the driver | ||||
|                                 specified by This is managing.  This handle | ||||
|                                 specifies the controller whose name is to be | ||||
|                                 returned. | ||||
|  | ||||
|   @param  ChildHandle[in]       The handle of the child controller to retrieve | ||||
|                                 the name of.  This is an optional parameter that | ||||
|                                 may be NULL.  It will be NULL for device | ||||
|                                 drivers.  It will also be NULL for a bus drivers | ||||
|                                 that wish to retrieve the name of the bus | ||||
|                                 controller.  It will not be NULL for a bus | ||||
|                                 driver that wishes to retrieve the name of a | ||||
|                                 child controller. | ||||
|  | ||||
|   @param  Language[in]          A pointer to a Null-terminated ASCII string | ||||
|                                 array indicating the language.  This is the | ||||
|                                 language of the driver name that the caller is | ||||
|                                 requesting, and it must match one of the | ||||
|                                 languages specified in SupportedLanguages. The | ||||
|                                 number of languages supported by a driver is up | ||||
|                                 to the driver writer. Language is specified in | ||||
|                                 RFC 3066 or ISO 639-2 language code format. | ||||
|  | ||||
|   @param  ControllerName[out]   A pointer to the Unicode string to return. | ||||
|                                 This Unicode string is the name of the | ||||
|                                 controller specified by ControllerHandle and | ||||
|                                 ChildHandle in the language specified by | ||||
|                                 Language from the point of view of the driver | ||||
|                                 specified by This. | ||||
|  | ||||
|   @retval EFI_SUCCESS           The Unicode string for the user readable name in | ||||
|                                 the language specified by Language for the | ||||
|                                 driver specified by This was returned in | ||||
|                                 DriverName. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid | ||||
|                                 EFI_HANDLE. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER Language is NULL. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ControllerName is NULL. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This is not currently | ||||
|                                 managing the controller specified by | ||||
|                                 ControllerHandle and ChildHandle. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This does not support | ||||
|                                 the language specified by Language. | ||||
|  | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| Ps2MouseSimulateTouchPadComponentNameGetControllerName ( | ||||
|   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This, | ||||
|   IN  EFI_HANDLE                                      ControllerHandle, | ||||
|   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL, | ||||
|   IN  CHAR8                                           *Language, | ||||
|   OUT CHAR16                                          **ControllerName | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS                                  Status; | ||||
|   EFI_ABSOLUTE_POINTER_PROTOCOL               *AbsolutePointerProtocol; | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV             *MouseSimulateTouchPadDev; | ||||
|   EFI_ISA_IO_PROTOCOL                         *IsaIoProtocol; | ||||
|  | ||||
|   // | ||||
|   // This is a device driver, so ChildHandle must be NULL. | ||||
|   // | ||||
|   if (ChildHandle != NULL) { | ||||
|     return EFI_UNSUPPORTED; | ||||
|   } | ||||
|   // | ||||
|   // Check Controller's handle | ||||
|   // | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   ControllerHandle, | ||||
|                   &gEfiIsaIoProtocolGuid, | ||||
|                   (VOID **) &IsaIoProtocol, | ||||
|                   gPS2MouseSimulateTouchPadDriver.DriverBindingHandle, | ||||
|                   ControllerHandle, | ||||
|                   EFI_OPEN_PROTOCOL_BY_DRIVER | ||||
|                   ); | ||||
|   if (!EFI_ERROR (Status)) { | ||||
|     gBS->CloseProtocol ( | ||||
|            ControllerHandle, | ||||
|            &gEfiIsaIoProtocolGuid, | ||||
|            gPS2MouseSimulateTouchPadDriver.DriverBindingHandle, | ||||
|            ControllerHandle | ||||
|            ); | ||||
|  | ||||
|     return EFI_UNSUPPORTED; | ||||
|   } | ||||
|  | ||||
|   if (Status != EFI_ALREADY_STARTED) { | ||||
|     return EFI_UNSUPPORTED; | ||||
|   } | ||||
|   // | ||||
|   // Get the device context | ||||
|   // | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   ControllerHandle, | ||||
|                   &gEfiAbsolutePointerProtocolGuid, | ||||
|                   (VOID **) &AbsolutePointerProtocol, | ||||
|                   gPS2MouseSimulateTouchPadDriver.DriverBindingHandle, | ||||
|                   ControllerHandle, | ||||
|                   EFI_OPEN_PROTOCOL_GET_PROTOCOL | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|  | ||||
|   MouseSimulateTouchPadDev = PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_FROM_THIS (AbsolutePointerProtocol); | ||||
|  | ||||
|   return LookupUnicodeString2 ( | ||||
|            Language, | ||||
|            This->SupportedLanguages, | ||||
|            MouseSimulateTouchPadDev->ControllerNameTable, | ||||
|            ControllerName, | ||||
|            (BOOLEAN)(This == &gPs2MouseSimulateTouchPadComponentName) | ||||
|            ); | ||||
| } | ||||
| @@ -0,0 +1,799 @@ | ||||
| /**@file | ||||
|   A faked PS/2 Touchpad driver. Routines that interacts with callers, | ||||
|   conforming to EFI driver model | ||||
|    | ||||
| Copyright (c) 2006 - 2007, Intel Corporation | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are licensed and made available under the terms and conditions of the BSD License | ||||
| which accompanies this distribution.  The full text of the license may be found at | ||||
| http://opensource.org/licenses/bsd-license.php | ||||
|  | ||||
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #include "Ps2MouseSimulateTouchPad.h" | ||||
| #include "CommPs2.h" | ||||
|  | ||||
| // | ||||
| // DriverBinding Protocol Instance | ||||
| // | ||||
| EFI_DRIVER_BINDING_PROTOCOL gPS2MouseSimulateTouchPadDriver = { | ||||
|   PS2MouseSimulateTouchPadDriverSupported, | ||||
|   PS2MouseSimulateTouchPadDriverStart, | ||||
|   PS2MouseSimulateTouchPadDriverStop, | ||||
|   0x1, | ||||
|   NULL, | ||||
|   NULL | ||||
| }; | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverSupported ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This, | ||||
|   IN EFI_HANDLE                     Controller, | ||||
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   ControllerDriver Protocol Method | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
| Returns: | ||||
|  | ||||
| --*/ | ||||
| // GC_TODO:    This - add argument and description to function comment | ||||
| // GC_TODO:    Controller - add argument and description to function comment | ||||
| // GC_TODO:    RemainingDevicePath - add argument and description to function comment | ||||
| { | ||||
|   EFI_STATUS                          Status; | ||||
|   EFI_ISA_IO_PROTOCOL                 *IsaIo; | ||||
|  | ||||
|   Status = EFI_SUCCESS; | ||||
|  | ||||
|   // | ||||
|   // Open the IO Abstraction(s) needed to perform the supported test | ||||
|   // | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   Controller, | ||||
|                   &gEfiIsaIoProtocolGuid, | ||||
|                   (VOID **) &IsaIo, | ||||
|                   This->DriverBindingHandle, | ||||
|                   Controller, | ||||
|                   EFI_OPEN_PROTOCOL_BY_DRIVER | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|   // | ||||
|   // Use the ISA I/O Protocol to see if Controller is the Mouse controller | ||||
|   // | ||||
|   switch (IsaIo->ResourceList->Device.HID) { | ||||
|   case EISA_PNP_ID (0xF03): | ||||
|   // | ||||
|   // Microsoft PS/2 style mouse | ||||
|   // | ||||
|   case EISA_PNP_ID (0xF13): | ||||
|     // | ||||
|     // PS/2 Port for PS/2-style Mice | ||||
|     // | ||||
|     break; | ||||
|  | ||||
|   case EISA_PNP_ID (0x303): | ||||
|     // | ||||
|     // IBM Enhanced (101/102-key, PS/2 mouse support) | ||||
|     // | ||||
|     if (IsaIo->ResourceList->Device.UID == 1) { | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   default: | ||||
|     Status = EFI_UNSUPPORTED; | ||||
|     break; | ||||
|   } | ||||
|   // | ||||
|   // Close the I/O Abstraction(s) used to perform the supported test | ||||
|   // | ||||
|   gBS->CloseProtocol ( | ||||
|          Controller, | ||||
|          &gEfiIsaIoProtocolGuid, | ||||
|          This->DriverBindingHandle, | ||||
|          Controller | ||||
|          ); | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverStart ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This, | ||||
|   IN EFI_HANDLE                     Controller, | ||||
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|     Start protocol interfaces for the mouse device handles. | ||||
|  | ||||
| Arguments: | ||||
|     This                               - Protocol instance pointer. | ||||
|     Controller                      - Handle of device to bind driver to. | ||||
|     RemainingDevicePath  - Not used. | ||||
|  | ||||
| Returns: | ||||
|     EFI_SUCCESS             - This driver is added to DeviceHandle. | ||||
|     other                               - Errors occurred. | ||||
|  | ||||
| --*/ | ||||
| { | ||||
|   EFI_STATUS                          Status; | ||||
|   EFI_STATUS                          EmptyStatus; | ||||
|   EFI_ISA_IO_PROTOCOL                 *IsaIo; | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV     *MouseSimulateTouchPadDev; | ||||
|   UINT8                               Data; | ||||
|   EFI_TPL                             OldTpl; | ||||
|   EFI_STATUS_CODE_VALUE               StatusCode; | ||||
|   EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath; | ||||
|  | ||||
|   StatusCode  = 0; | ||||
|   MouseSimulateTouchPadDev    = NULL; | ||||
|   IsaIo       = NULL; | ||||
|  | ||||
|   // | ||||
|   // Open the device path protocol | ||||
|   // | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   Controller, | ||||
|                   &gEfiDevicePathProtocolGuid, | ||||
|                   (VOID **) &ParentDevicePath, | ||||
|                   This->DriverBindingHandle, | ||||
|                   Controller, | ||||
|                   EFI_OPEN_PROTOCOL_BY_DRIVER | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|   // | ||||
|   // Report that the keyboard is being enabled | ||||
|   // | ||||
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH ( | ||||
|     EFI_PROGRESS_CODE, | ||||
|     EFI_PERIPHERAL_MOUSE | EFI_P_PC_ENABLE, | ||||
|     ParentDevicePath | ||||
|     ); | ||||
|  | ||||
|   // | ||||
|   // Get the ISA I/O Protocol on Controller's handle | ||||
|   // | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   Controller, | ||||
|                   &gEfiIsaIoProtocolGuid, | ||||
|                   (VOID **) &IsaIo, | ||||
|                   This->DriverBindingHandle, | ||||
|                   Controller, | ||||
|                   EFI_OPEN_PROTOCOL_BY_DRIVER | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     gBS->CloseProtocol ( | ||||
|            Controller, | ||||
|            &gEfiDevicePathProtocolGuid, | ||||
|            This->DriverBindingHandle, | ||||
|            Controller | ||||
|            ); | ||||
|     return EFI_INVALID_PARAMETER; | ||||
|   } | ||||
|   // | ||||
|   // Raise TPL to avoid keyboard operation impact | ||||
|   // | ||||
|   OldTpl = gBS->RaiseTPL (TPL_NOTIFY); | ||||
|  | ||||
|   // | ||||
|   // Allocate private data | ||||
|   // | ||||
|   MouseSimulateTouchPadDev = AllocateZeroPool (sizeof (PS2_MOUSE_SIMULATE_TOUCHPAD_DEV)); | ||||
|   if (MouseSimulateTouchPadDev == NULL) { | ||||
|     Status = EFI_OUT_OF_RESOURCES; | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|   // | ||||
|   // Setup the device instance | ||||
|   // | ||||
|   MouseSimulateTouchPadDev->Signature       = PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_SIGNATURE; | ||||
|   MouseSimulateTouchPadDev->Handle          = Controller; | ||||
|   MouseSimulateTouchPadDev->SampleRate      = SSR_20; | ||||
|   MouseSimulateTouchPadDev->Resolution      = CMR4; | ||||
|   MouseSimulateTouchPadDev->Scaling         = SF1; | ||||
|   MouseSimulateTouchPadDev->DataPackageSize = 3; | ||||
|   MouseSimulateTouchPadDev->IsaIo           = IsaIo; | ||||
|   MouseSimulateTouchPadDev->DevicePath      = ParentDevicePath; | ||||
|  | ||||
|   // | ||||
|   // Resolution = 4 counts/mm | ||||
|   // | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMaxX               = 1024; | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMinX               = 0; | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMaxY               = 798; | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMinY               = 0; | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMaxZ               = 0; | ||||
|   MouseSimulateTouchPadDev->Mode.AbsoluteMinZ               = 0; | ||||
|   MouseSimulateTouchPadDev->Mode.Attributes                 = 0x03; | ||||
|  | ||||
|   MouseSimulateTouchPadDev->AbsolutePointerProtocol.Reset     = MouseSimulateTouchPadReset; | ||||
|   MouseSimulateTouchPadDev->AbsolutePointerProtocol.GetState  = MouseSimulateTouchPadGetState; | ||||
|   MouseSimulateTouchPadDev->AbsolutePointerProtocol.Mode      = &(MouseSimulateTouchPadDev->Mode); | ||||
|  | ||||
|   // | ||||
|   // Initialize keyboard controller if necessary | ||||
|   // | ||||
|   IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); | ||||
|   if ((Data & KBC_SYSF) != KBC_SYSF) { | ||||
|     Status = KbcSelfTest (IsaIo); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_CONTROLLER_ERROR; | ||||
|       goto ErrorExit; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   KbcEnableAux (IsaIo); | ||||
|  | ||||
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH ( | ||||
|     EFI_PROGRESS_CODE, | ||||
|     EFI_PERIPHERAL_MOUSE | EFI_P_PC_PRESENCE_DETECT, | ||||
|     ParentDevicePath | ||||
|     ); | ||||
|  | ||||
|   // | ||||
|   // Reset the mouse | ||||
|   // | ||||
|   Status = MouseSimulateTouchPadDev->AbsolutePointerProtocol.Reset (&MouseSimulateTouchPadDev->AbsolutePointerProtocol, TRUE); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     // | ||||
|     // mouse not connected | ||||
|     // | ||||
|     Status      = EFI_SUCCESS; | ||||
|     StatusCode  = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED; | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|   // | ||||
|   // Setup the WaitForKey event | ||||
|   // | ||||
|   Status = gBS->CreateEvent ( | ||||
|                   EVT_NOTIFY_WAIT, | ||||
|                   TPL_NOTIFY, | ||||
|                   MouseSimulateTouchPadWaitForInput, | ||||
|                   MouseSimulateTouchPadDev, | ||||
|                   &((MouseSimulateTouchPadDev->AbsolutePointerProtocol).WaitForInput) | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     Status = EFI_OUT_OF_RESOURCES; | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|   // | ||||
|   // Setup a periodic timer, used to poll mouse state | ||||
|   // | ||||
|   Status = gBS->CreateEvent ( | ||||
|                   EVT_TIMER | EVT_NOTIFY_SIGNAL, | ||||
|                   TPL_NOTIFY, | ||||
|                   PollMouseSimulateTouchPad, | ||||
|                   MouseSimulateTouchPadDev, | ||||
|                   &MouseSimulateTouchPadDev->TimerEvent | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     Status = EFI_OUT_OF_RESOURCES; | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|   // | ||||
|   // Start timer to poll mouse (100 samples per second) | ||||
|   // | ||||
|   Status = gBS->SetTimer (MouseSimulateTouchPadDev->TimerEvent, TimerPeriodic, 100000); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     Status = EFI_OUT_OF_RESOURCES; | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|  | ||||
|   MouseSimulateTouchPadDev->ControllerNameTable = NULL; | ||||
|   AddUnicodeString2 ( | ||||
|     "eng", | ||||
|     gPs2MouseSimulateTouchPadComponentName.SupportedLanguages, | ||||
|     &MouseSimulateTouchPadDev->ControllerNameTable, | ||||
|     L"Faked PS/2 Touchpad Device", | ||||
|     TRUE | ||||
|     ); | ||||
|   AddUnicodeString2 ( | ||||
|     "en", | ||||
|     gPs2MouseSimulateTouchPadComponentName2.SupportedLanguages, | ||||
|     &MouseSimulateTouchPadDev->ControllerNameTable, | ||||
|     L"Faked PS/2 Touchpad Device", | ||||
|     FALSE | ||||
|     ); | ||||
|  | ||||
|  | ||||
|   // | ||||
|   // Install protocol interfaces for the mouse device. | ||||
|   // | ||||
|   Status = gBS->InstallMultipleProtocolInterfaces ( | ||||
|                   &Controller, | ||||
|                   &gEfiAbsolutePointerProtocolGuid, | ||||
|                   &MouseSimulateTouchPadDev->AbsolutePointerProtocol, | ||||
|                   NULL | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     goto ErrorExit; | ||||
|   } | ||||
|  | ||||
|   gBS->RestoreTPL (OldTpl); | ||||
|  | ||||
|   return Status; | ||||
|  | ||||
| ErrorExit: | ||||
|  | ||||
|   KbcDisableAux (IsaIo); | ||||
|  | ||||
|   if (StatusCode != 0) { | ||||
|     REPORT_STATUS_CODE_WITH_DEVICE_PATH ( | ||||
|       EFI_ERROR_CODE | EFI_ERROR_MINOR, | ||||
|       StatusCode, | ||||
|       ParentDevicePath | ||||
|       ); | ||||
|   } | ||||
|  | ||||
|   if ((MouseSimulateTouchPadDev != NULL) && (MouseSimulateTouchPadDev->AbsolutePointerProtocol.WaitForInput != NULL)) { | ||||
|     gBS->CloseEvent (MouseSimulateTouchPadDev->AbsolutePointerProtocol.WaitForInput); | ||||
|   } | ||||
|  | ||||
|   if ((MouseSimulateTouchPadDev != NULL) && (MouseSimulateTouchPadDev->TimerEvent != NULL)) { | ||||
|     gBS->CloseEvent (MouseSimulateTouchPadDev->TimerEvent); | ||||
|   } | ||||
|  | ||||
|   if ((MouseSimulateTouchPadDev != NULL) && (MouseSimulateTouchPadDev->ControllerNameTable != NULL)) { | ||||
|     FreeUnicodeStringTable (MouseSimulateTouchPadDev->ControllerNameTable); | ||||
|   } | ||||
|   // | ||||
|   // Since there will be no timer handler for mouse input any more, | ||||
|   // exhaust input data just in case there is still mouse data left | ||||
|   // | ||||
|   EmptyStatus = EFI_SUCCESS; | ||||
|   while (!EFI_ERROR (EmptyStatus)) { | ||||
|     EmptyStatus = In8042Data (IsaIo, &Data); | ||||
|   } | ||||
|  | ||||
|   if (MouseSimulateTouchPadDev != NULL) { | ||||
|     gBS->FreePool (MouseSimulateTouchPadDev); | ||||
|   } | ||||
|  | ||||
|   gBS->CloseProtocol ( | ||||
|          Controller, | ||||
|          &gEfiDevicePathProtocolGuid, | ||||
|          This->DriverBindingHandle, | ||||
|          Controller | ||||
|          ); | ||||
|  | ||||
|   gBS->CloseProtocol ( | ||||
|          Controller, | ||||
|          &gEfiIsaIoProtocolGuid, | ||||
|          This->DriverBindingHandle, | ||||
|          Controller | ||||
|          ); | ||||
|  | ||||
|   gBS->RestoreTPL (OldTpl); | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverStop ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This, | ||||
|   IN EFI_HANDLE                     Controller, | ||||
|   IN UINTN                          NumberOfChildren, | ||||
|   IN EFI_HANDLE                     *ChildHandleBuffer | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
|   Routine Description: | ||||
|  | ||||
|   Arguments: | ||||
|  | ||||
|   Returns: | ||||
|  | ||||
| --*/ | ||||
| // GC_TODO:    This - add argument and description to function comment | ||||
| // GC_TODO:    Controller - add argument and description to function comment | ||||
| // GC_TODO:    NumberOfChildren - add argument and description to function comment | ||||
| // GC_TODO:    ChildHandleBuffer - add argument and description to function comment | ||||
| // GC_TODO:    EFI_SUCCESS - add return value to function comment | ||||
| // GC_TODO:    EFI_SUCCESS - add return value to function comment | ||||
| { | ||||
|   EFI_STATUS                            Status; | ||||
|   EFI_ABSOLUTE_POINTER_PROTOCOL         *AbsolutePointerProtocol; | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV       *MouseSimulateTouchPadDev; | ||||
|   UINT8                                 Data; | ||||
|  | ||||
|   Status = gBS->OpenProtocol ( | ||||
|                   Controller, | ||||
|                   &gEfiAbsolutePointerProtocolGuid, | ||||
|                   (VOID **) &AbsolutePointerProtocol, | ||||
|                   This->DriverBindingHandle, | ||||
|                   Controller, | ||||
|                   EFI_OPEN_PROTOCOL_GET_PROTOCOL | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return EFI_SUCCESS; | ||||
|   } | ||||
|  | ||||
|   MouseSimulateTouchPadDev = PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_FROM_THIS (AbsolutePointerProtocol); | ||||
|  | ||||
|   // | ||||
|   // Report that the keyboard is being disabled | ||||
|   // | ||||
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH ( | ||||
|     EFI_PROGRESS_CODE, | ||||
|     EFI_PERIPHERAL_MOUSE | EFI_P_PC_DISABLE, | ||||
|     MouseSimulateTouchPadDev->DevicePath | ||||
|     ); | ||||
|  | ||||
|   Status = gBS->UninstallProtocolInterface ( | ||||
|                   Controller, | ||||
|                   &gEfiAbsolutePointerProtocolGuid, | ||||
|                   &MouseSimulateTouchPadDev->AbsolutePointerProtocol | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|   // | ||||
|   // Disable mouse on keyboard controller | ||||
|   // | ||||
|   KbcDisableAux (MouseSimulateTouchPadDev->IsaIo); | ||||
|  | ||||
|   // | ||||
|   // Cancel mouse data polling timer, close timer event | ||||
|   // | ||||
|   gBS->SetTimer (MouseSimulateTouchPadDev->TimerEvent, TimerCancel, 0); | ||||
|   gBS->CloseEvent (MouseSimulateTouchPadDev->TimerEvent); | ||||
|  | ||||
|   // | ||||
|   // Since there will be no timer handler for mouse input any more, | ||||
|   // exhaust input data just in case there is still mouse data left | ||||
|   // | ||||
|   Status = EFI_SUCCESS; | ||||
|   while (!EFI_ERROR (Status)) { | ||||
|     Status = In8042Data (MouseSimulateTouchPadDev->IsaIo, &Data); | ||||
|   } | ||||
|  | ||||
|   gBS->CloseEvent (MouseSimulateTouchPadDev->AbsolutePointerProtocol.WaitForInput); | ||||
|   FreeUnicodeStringTable (MouseSimulateTouchPadDev->ControllerNameTable); | ||||
|   gBS->FreePool (MouseSimulateTouchPadDev); | ||||
|  | ||||
|   gBS->CloseProtocol ( | ||||
|          Controller, | ||||
|          &gEfiDevicePathProtocolGuid, | ||||
|          This->DriverBindingHandle, | ||||
|          Controller | ||||
|          ); | ||||
|  | ||||
|   gBS->CloseProtocol ( | ||||
|          Controller, | ||||
|          &gEfiIsaIoProtocolGuid, | ||||
|          This->DriverBindingHandle, | ||||
|          Controller | ||||
|          ); | ||||
|  | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadReset ( | ||||
|   IN EFI_ABSOLUTE_POINTER_PROTOCOL    *This, | ||||
|   IN BOOLEAN                          ExtendedVerification | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   Reset the Mouse and do BAT test for it, if ExtendedVerification isTRUE and there is a mouse device connectted to system | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   This                 - Pointer of simple pointer Protocol. | ||||
|   ExtendedVerification - Whether configure mouse parameters. True: do; FALSE: skip. | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|  EFI_SUCCESS         - The command byte is written successfully. | ||||
|  EFI_DEVICE_ERROR    - Errors occurred during reseting keyboard. | ||||
|  | ||||
| --*/ | ||||
| { | ||||
|   EFI_STATUS                       Status; | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV  *MouseSimulateTouchPadDev; | ||||
|   EFI_TPL                          OldTpl; | ||||
|   BOOLEAN                          KeyboardEnable; | ||||
|   UINT8                            Data; | ||||
|  | ||||
|   MouseSimulateTouchPadDev = PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_FROM_THIS (This); | ||||
|  | ||||
|   // | ||||
|   // Report reset progress code | ||||
|   // | ||||
|   REPORT_STATUS_CODE_WITH_DEVICE_PATH ( | ||||
|     EFI_PROGRESS_CODE, | ||||
|     EFI_PERIPHERAL_MOUSE | EFI_P_PC_RESET, | ||||
|     MouseSimulateTouchPadDev->DevicePath | ||||
|     ); | ||||
|  | ||||
|   KeyboardEnable = FALSE; | ||||
|  | ||||
|   // | ||||
|   // Raise TPL to avoid keyboard operation impact | ||||
|   // | ||||
|   OldTpl = gBS->RaiseTPL (TPL_NOTIFY); | ||||
|  | ||||
|   ZeroMem (&MouseSimulateTouchPadDev->State, sizeof (EFI_ABSOLUTE_POINTER_STATE)); | ||||
|   MouseSimulateTouchPadDev->StateChanged = FALSE; | ||||
|  | ||||
|   // | ||||
|   // Exhaust input data | ||||
|   // | ||||
|   Status = EFI_SUCCESS; | ||||
|   while (!EFI_ERROR (Status)) { | ||||
|     Status = In8042Data (MouseSimulateTouchPadDev->IsaIo, &Data); | ||||
|   } | ||||
|  | ||||
|   CheckKbStatus (MouseSimulateTouchPadDev->IsaIo, &KeyboardEnable); | ||||
|  | ||||
|   KbcDisableKb (MouseSimulateTouchPadDev->IsaIo); | ||||
|  | ||||
|   MouseSimulateTouchPadDev->IsaIo->Io.Read (MouseSimulateTouchPadDev->IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); | ||||
|  | ||||
|   // | ||||
|   // if there's data block on KBC data port, read it out | ||||
|   // | ||||
|   if ((Data & KBC_OUTB) == KBC_OUTB) { | ||||
|     MouseSimulateTouchPadDev->IsaIo->Io.Read (MouseSimulateTouchPadDev->IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Data); | ||||
|   } | ||||
|  | ||||
|   Status = EFI_SUCCESS; | ||||
|   // | ||||
|   // The PS2 mouse driver reset behavior is always successfully return no matter wheater or not there is mouse connected to system. | ||||
|   // This behavior is needed by performance speed. The following mouse command only succeessfully finish when mouse device is | ||||
|   // connected to system, so if PS2 mouse device not connect to system or user not ask for, we skip the mouse configuration and enabling | ||||
|   // | ||||
|   if (ExtendedVerification && CheckMouseSimulateTouchPadConnect (MouseSimulateTouchPadDev)) { | ||||
|     // | ||||
|     // Send mouse reset command and set mouse default configure | ||||
|     // | ||||
|     Status = PS2MouseReset (MouseSimulateTouchPadDev->IsaIo); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       Status = EFI_DEVICE_ERROR; | ||||
|       goto Exit; | ||||
|     } | ||||
|  | ||||
|     Status = PS2MouseSetSampleRate (MouseSimulateTouchPadDev->IsaIo, MouseSimulateTouchPadDev->SampleRate); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       Status = EFI_DEVICE_ERROR; | ||||
|       goto Exit; | ||||
|     } | ||||
|  | ||||
|     Status = PS2MouseSetResolution (MouseSimulateTouchPadDev->IsaIo, MouseSimulateTouchPadDev->Resolution); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       Status = EFI_DEVICE_ERROR; | ||||
|       goto Exit; | ||||
|     } | ||||
|  | ||||
|     Status = PS2MouseSetScaling (MouseSimulateTouchPadDev->IsaIo, MouseSimulateTouchPadDev->Scaling); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       Status = EFI_DEVICE_ERROR; | ||||
|       goto Exit; | ||||
|     } | ||||
|  | ||||
|     Status = PS2MouseEnable (MouseSimulateTouchPadDev->IsaIo); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       Status = EFI_DEVICE_ERROR; | ||||
|       goto Exit; | ||||
|     } | ||||
|   } | ||||
| Exit: | ||||
|   gBS->RestoreTPL (OldTpl); | ||||
|  | ||||
|   if (KeyboardEnable) { | ||||
|     KbcEnableKb (MouseSimulateTouchPadDev->IsaIo); | ||||
|   } | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
|  | ||||
| BOOLEAN | ||||
| CheckMouseSimulateTouchPadConnect ( | ||||
|   IN  PS2_MOUSE_SIMULATE_TOUCHPAD_DEV     *MouseSimulateTouchPadDev | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   Check whether there is Ps/2 mouse device in system | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   PS2_MOUSE_DEV - Mouse Private Data Structure | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   TRUE                - Keyboard in System. | ||||
|   FALSE               - Keyboard not in System. | ||||
|  | ||||
| --*/ | ||||
| { | ||||
|   EFI_STATUS     Status; | ||||
|  | ||||
|   Status = PS2MouseEnable (MouseSimulateTouchPadDev->IsaIo); | ||||
|   if (!EFI_ERROR (Status)) { | ||||
|     return TRUE; | ||||
|   } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadGetState ( | ||||
|   IN EFI_ABSOLUTE_POINTER_PROTOCOL     *This, | ||||
|   IN OUT EFI_ABSOLUTE_POINTER_STATE    *State | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   GC_TODO: Add function description | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   This  - GC_TODO: add argument description | ||||
|   State - GC_TODO: add argument description | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   EFI_INVALID_PARAMETER - GC_TODO: Add description for return value | ||||
|   EFI_NOT_READY - GC_TODO: Add description for return value | ||||
|   EFI_SUCCESS - GC_TODO: Add description for return value | ||||
|  | ||||
| --*/ | ||||
| { | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *MouseSimulateTouchPadDev; | ||||
|   EFI_TPL       OldTpl; | ||||
|  | ||||
|   MouseSimulateTouchPadDev = PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_FROM_THIS (This); | ||||
|  | ||||
|   if (State == NULL) { | ||||
|     return EFI_INVALID_PARAMETER; | ||||
|   } | ||||
|  | ||||
|   if (!MouseSimulateTouchPadDev->StateChanged) { | ||||
|     return EFI_NOT_READY; | ||||
|   } | ||||
|  | ||||
|   OldTpl = gBS->RaiseTPL (TPL_NOTIFY); | ||||
|   CopyMem (State, &(MouseSimulateTouchPadDev->State), sizeof (EFI_ABSOLUTE_POINTER_STATE)); | ||||
|  | ||||
|   // | ||||
|   // clear mouse state | ||||
|   // | ||||
|   MouseSimulateTouchPadDev->State.CurrentX = 0; | ||||
|   MouseSimulateTouchPadDev->State.CurrentY = 0; | ||||
|   MouseSimulateTouchPadDev->State.CurrentZ = 0; | ||||
|   MouseSimulateTouchPadDev->State.ActiveButtons = 0x0; | ||||
|   MouseSimulateTouchPadDev->StateChanged            = FALSE; | ||||
|   gBS->RestoreTPL (OldTpl); | ||||
|  | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
|  | ||||
| VOID | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadWaitForInput ( | ||||
|   IN  EFI_EVENT               Event, | ||||
|   IN  VOID                    *Context | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   Event notification function for SIMPLE_POINTER.WaitForInput event | ||||
|   Signal the event if there is input from mouse | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
| Returns: | ||||
|  | ||||
| --*/ | ||||
| // GC_TODO:    Event - add argument and description to function comment | ||||
| // GC_TODO:    Context - add argument and description to function comment | ||||
| { | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *MouseSimulateTouchPadDev; | ||||
|  | ||||
|   MouseSimulateTouchPadDev = (PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *) Context; | ||||
|  | ||||
|   // | ||||
|   // Someone is waiting on the mouse event, if there's | ||||
|   // input from mouse, signal the event | ||||
|   // | ||||
|   if (MouseSimulateTouchPadDev->StateChanged) { | ||||
|     gBS->SignalEvent (Event); | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| VOID | ||||
| EFIAPI | ||||
| PollMouseSimulateTouchPad( | ||||
|   IN EFI_EVENT  Event, | ||||
|   IN VOID       *Context | ||||
|   ) | ||||
| /*++ | ||||
|  | ||||
| Routine Description: | ||||
|  | ||||
|   Event notification function for TimerEvent event | ||||
|   If mouse device is connected to system, try to get the mouse packet data | ||||
|  | ||||
| Arguments: | ||||
|  | ||||
|   Event      -  TimerEvent in PS2_MOUSE_DEV | ||||
|   Context  -  Pointer to PS2_MOUSE_DEV structure | ||||
|  | ||||
| Returns: | ||||
|  | ||||
|   None | ||||
|  | ||||
| --*/ | ||||
| { | ||||
|   PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *MouseSimulateTouchPadDev; | ||||
|  | ||||
|   MouseSimulateTouchPadDev = (PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *) Context; | ||||
|  | ||||
|   // | ||||
|   // Polling mouse packet data | ||||
|   // | ||||
|   PS2MouseGetPacket (MouseSimulateTouchPadDev); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   The user Entry Point for module Ps2MouseSimulateTouchPad. The user code starts with this function. | ||||
|  | ||||
|   @param[in] ImageHandle    The firmware allocated handle for the EFI image.   | ||||
|   @param[in] SystemTable    A pointer to the EFI System Table. | ||||
|    | ||||
|   @retval EFI_SUCCESS       The entry point is executed successfully. | ||||
|   @retval other             Some error occurs when executing this entry point. | ||||
|  | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| InitializePs2MouseSimulateTouchPad( | ||||
|   IN EFI_HANDLE           ImageHandle, | ||||
|   IN EFI_SYSTEM_TABLE     *SystemTable | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS              Status; | ||||
|  | ||||
|   // | ||||
|   // Install driver model protocol(s). | ||||
|   // | ||||
|   Status = EfiLibInstallDriverBindingComponentName2 ( | ||||
|              ImageHandle, | ||||
|              SystemTable, | ||||
|              &gPS2MouseSimulateTouchPadDriver, | ||||
|              ImageHandle, | ||||
|              &gPs2MouseSimulateTouchPadComponentName, | ||||
|              &gPs2MouseSimulateTouchPadComponentName2 | ||||
|              ); | ||||
|   ASSERT_EFI_ERROR (Status); | ||||
|  | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
| @@ -0,0 +1,301 @@ | ||||
| /**@file | ||||
|   A faked PS/2 Touchpad driver header file | ||||
|    | ||||
| Copyright (c) 2006 - 2007, Intel Corporation | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are licensed and made available under the terms and conditions of the BSD License | ||||
| which accompanies this distribution.  The full text of the license may be found at | ||||
| http://opensource.org/licenses/bsd-license.php | ||||
|  | ||||
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #ifndef _PS2MOUSESIMULATETOUCHPAD_H | ||||
| #define _PS2MOUSESIMULATETOUCHPAD_H | ||||
|  | ||||
| #include <PiDxe.h> | ||||
| #include <Framework/StatusCode.h> | ||||
|  | ||||
| #include <Protocol/AbsolutePointer.h> | ||||
| #include <Protocol/IsaIo.h> | ||||
| #include <Protocol/DevicePath.h> | ||||
|  | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/UefiDriverEntryPoint.h> | ||||
| #include <Library/UefiLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/MemoryAllocationLib.h> | ||||
| #include <Library/UefiBootServicesTableLib.h> | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
|  | ||||
| // | ||||
| // PS/2 mouse sample rate | ||||
| // | ||||
| typedef enum { | ||||
|   SSR_10, | ||||
|   SSR_20, | ||||
|   SSR_40, | ||||
|   SSR_60, | ||||
|   SSR_80, | ||||
|   SSR_100, | ||||
|   SSR_200, | ||||
|   MAX_SR | ||||
| } MOUSE_SR; | ||||
|  | ||||
| // | ||||
| // PS/2 mouse resolution | ||||
| // | ||||
| typedef enum { | ||||
|   CMR1, | ||||
|   CMR2, | ||||
|   CMR4, | ||||
|   CMR8, | ||||
|   MAX_CMR | ||||
| } MOUSE_RE; | ||||
|  | ||||
| // | ||||
| // PS/2 mouse scaling | ||||
| // | ||||
| typedef enum { | ||||
|   SF1, | ||||
|   SF2 | ||||
| } MOUSE_SF; | ||||
|  | ||||
| // | ||||
| // Driver Private Data | ||||
| // | ||||
| #define PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_SIGNATURE EFI_SIGNATURE_32 ('p', '2', 's', 't') | ||||
|  | ||||
| typedef struct { | ||||
|   UINTN                               Signature; | ||||
|  | ||||
|   EFI_HANDLE                          Handle; | ||||
|   EFI_ABSOLUTE_POINTER_PROTOCOL       AbsolutePointerProtocol; | ||||
|   EFI_ABSOLUTE_POINTER_STATE          State; | ||||
|   EFI_ABSOLUTE_POINTER_MODE           Mode; | ||||
|   BOOLEAN                             StateChanged; | ||||
|  | ||||
|   // | ||||
|   // PS2 Mouse device specific information | ||||
|   // | ||||
|   MOUSE_SR                            SampleRate; | ||||
|   MOUSE_RE                            Resolution; | ||||
|   MOUSE_SF                            Scaling; | ||||
|   UINT8                               DataPackageSize; | ||||
|  | ||||
|   EFI_ISA_IO_PROTOCOL                 *IsaIo; | ||||
|  | ||||
|   EFI_EVENT                           TimerEvent; | ||||
|  | ||||
|   EFI_UNICODE_STRING_TABLE            *ControllerNameTable; | ||||
|   EFI_DEVICE_PATH_PROTOCOL            *DevicePath; | ||||
| } PS2_MOUSE_SIMULATE_TOUCHPAD_DEV; | ||||
|  | ||||
| #define PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_FROM_THIS(a)  CR (a, PS2_MOUSE_SIMULATE_TOUCHPAD_DEV, AbsolutePointerProtocol, PS2_MOUSE_SIMULATE_TOUCHPAD_DEV_SIGNATURE) | ||||
|  | ||||
| // | ||||
| // Global Variables | ||||
| // | ||||
| extern EFI_DRIVER_BINDING_PROTOCOL   gPS2MouseSimulateTouchPadDriver; | ||||
| extern EFI_COMPONENT_NAME_PROTOCOL   gPs2MouseSimulateTouchPadComponentName; | ||||
| extern EFI_COMPONENT_NAME2_PROTOCOL  gPs2MouseSimulateTouchPadComponentName2; | ||||
|  | ||||
| // | ||||
| // Function prototypes | ||||
| // | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverSupported ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This, | ||||
|   IN EFI_HANDLE                     Controller, | ||||
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverStart ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL    *This, | ||||
|   IN EFI_HANDLE                     Controller, | ||||
|   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| PS2MouseSimulateTouchPadDriverStop ( | ||||
|   IN EFI_DRIVER_BINDING_PROTOCOL   *This, | ||||
|   IN EFI_HANDLE                    Controller, | ||||
|   IN UINTN                         NumberOfChildren, | ||||
|   IN EFI_HANDLE                    *ChildHandleBuffer | ||||
|   ); | ||||
|  | ||||
| // | ||||
| // EFI Component Name Functions | ||||
| // | ||||
| /** | ||||
|   Retrieves a Unicode string that is the user readable name of the driver. | ||||
|  | ||||
|   This function retrieves the user readable name of a driver in the form of a | ||||
|   Unicode string. If the driver specified by This has a user readable name in | ||||
|   the language specified by Language, then a pointer to the driver name is | ||||
|   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified | ||||
|   by This does not support the language specified by Language, | ||||
|   then EFI_UNSUPPORTED is returned. | ||||
|  | ||||
|   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or | ||||
|                                 EFI_COMPONENT_NAME_PROTOCOL instance. | ||||
|  | ||||
|   @param  Language[in]          A pointer to a Null-terminated ASCII string | ||||
|                                 array indicating the language. This is the | ||||
|                                 language of the driver name that the caller is | ||||
|                                 requesting, and it must match one of the | ||||
|                                 languages specified in SupportedLanguages. The | ||||
|                                 number of languages supported by a driver is up | ||||
|                                 to the driver writer. Language is specified | ||||
|                                 in RFC 3066 or ISO 639-2 language code format. | ||||
|  | ||||
|   @param  DriverName[out]       A pointer to the Unicode string to return. | ||||
|                                 This Unicode string is the name of the | ||||
|                                 driver specified by This in the language | ||||
|                                 specified by Language. | ||||
|  | ||||
|   @retval EFI_SUCCESS           The Unicode string for the Driver specified by | ||||
|                                 This and the language specified by Language was | ||||
|                                 returned in DriverName. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER Language is NULL. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER DriverName is NULL. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This does not support | ||||
|                                 the language specified by Language. | ||||
|  | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| Ps2MouseSimulateTouchPadComponentNameGetDriverName ( | ||||
|   IN  EFI_COMPONENT_NAME_PROTOCOL  *This, | ||||
|   IN  CHAR8                        *Language, | ||||
|   OUT CHAR16                       **DriverName | ||||
|   ); | ||||
|  | ||||
|  | ||||
| /** | ||||
|   Retrieves a Unicode string that is the user readable name of the controller | ||||
|   that is being managed by a driver. | ||||
|  | ||||
|   This function retrieves the user readable name of the controller specified by | ||||
|   ControllerHandle and ChildHandle in the form of a Unicode string. If the | ||||
|   driver specified by This has a user readable name in the language specified by | ||||
|   Language, then a pointer to the controller name is returned in ControllerName, | ||||
|   and EFI_SUCCESS is returned.  If the driver specified by This is not currently | ||||
|   managing the controller specified by ControllerHandle and ChildHandle, | ||||
|   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not | ||||
|   support the language specified by Language, then EFI_UNSUPPORTED is returned. | ||||
|  | ||||
|   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or | ||||
|                                 EFI_COMPONENT_NAME_PROTOCOL instance. | ||||
|  | ||||
|   @param  ControllerHandle[in]  The handle of a controller that the driver | ||||
|                                 specified by This is managing.  This handle | ||||
|                                 specifies the controller whose name is to be | ||||
|                                 returned. | ||||
|  | ||||
|   @param  ChildHandle[in]       The handle of the child controller to retrieve | ||||
|                                 the name of.  This is an optional parameter that | ||||
|                                 may be NULL.  It will be NULL for device | ||||
|                                 drivers.  It will also be NULL for a bus drivers | ||||
|                                 that wish to retrieve the name of the bus | ||||
|                                 controller.  It will not be NULL for a bus | ||||
|                                 driver that wishes to retrieve the name of a | ||||
|                                 child controller. | ||||
|  | ||||
|   @param  Language[in]          A pointer to a Null-terminated ASCII string | ||||
|                                 array indicating the language.  This is the | ||||
|                                 language of the driver name that the caller is | ||||
|                                 requesting, and it must match one of the | ||||
|                                 languages specified in SupportedLanguages. The | ||||
|                                 number of languages supported by a driver is up | ||||
|                                 to the driver writer. Language is specified in | ||||
|                                 RFC 3066 or ISO 639-2 language code format. | ||||
|  | ||||
|   @param  ControllerName[out]   A pointer to the Unicode string to return. | ||||
|                                 This Unicode string is the name of the | ||||
|                                 controller specified by ControllerHandle and | ||||
|                                 ChildHandle in the language specified by | ||||
|                                 Language from the point of view of the driver | ||||
|                                 specified by This. | ||||
|  | ||||
|   @retval EFI_SUCCESS           The Unicode string for the user readable name in | ||||
|                                 the language specified by Language for the | ||||
|                                 driver specified by This was returned in | ||||
|                                 DriverName. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid | ||||
|                                 EFI_HANDLE. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER Language is NULL. | ||||
|  | ||||
|   @retval EFI_INVALID_PARAMETER ControllerName is NULL. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This is not currently | ||||
|                                 managing the controller specified by | ||||
|                                 ControllerHandle and ChildHandle. | ||||
|  | ||||
|   @retval EFI_UNSUPPORTED       The driver specified by This does not support | ||||
|                                 the language specified by Language. | ||||
|  | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| Ps2MouseSimulateTouchPadComponentNameGetControllerName ( | ||||
|   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This, | ||||
|   IN  EFI_HANDLE                                      ControllerHandle, | ||||
|   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL, | ||||
|   IN  CHAR8                                           *Language, | ||||
|   OUT CHAR16                                          **ControllerName | ||||
|   ); | ||||
|  | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadReset ( | ||||
|   IN EFI_ABSOLUTE_POINTER_PROTOCOL  *This, | ||||
|   IN BOOLEAN                        ExtendedVerification | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadGetState ( | ||||
|   IN EFI_ABSOLUTE_POINTER_PROTOCOL  *This, | ||||
|   IN OUT EFI_ABSOLUTE_POINTER_STATE   *State | ||||
|   ); | ||||
|  | ||||
| VOID | ||||
| EFIAPI | ||||
| MouseSimulateTouchPadWaitForInput ( | ||||
|   IN  EFI_EVENT               Event, | ||||
|   IN  VOID                    *Context | ||||
|   ); | ||||
|  | ||||
| VOID | ||||
| EFIAPI | ||||
| PollMouseSimulateTouchPad ( | ||||
|   IN EFI_EVENT  Event, | ||||
|   IN VOID       *Context | ||||
|   ); | ||||
|  | ||||
| EFI_STATUS | ||||
| In8042Data ( | ||||
|   IN EFI_ISA_IO_PROTOCOL                  *IsaIo, | ||||
|   IN OUT UINT8                            *Data | ||||
|   ); | ||||
| BOOLEAN | ||||
| CheckMouseSimulateTouchPadConnect ( | ||||
|   IN  PS2_MOUSE_SIMULATE_TOUCHPAD_DEV     *MouseDev | ||||
|   ); | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,58 @@ | ||||
| #/** @file | ||||
| # Ps2 Mouse Simulate TouchPad Driver | ||||
| # | ||||
| # This dirver directly uses IsaIo protocol service to support a faked Ps2 TouchPad work. | ||||
| # Copyright (c) 2006 - 2007, Intel Corporation. | ||||
| # | ||||
| # Copyright (c) 2006 - 2007, Intel Corporation | ||||
| # All rights reserved. This program and the accompanying materials | ||||
| # are licensed and made available under the terms and conditions of the BSD License | ||||
| # which accompanies this distribution.  The full text of the license may be found at | ||||
| # http://opensource.org/licenses/bsd-license.php | ||||
| # | ||||
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| # | ||||
| # | ||||
| #**/ | ||||
|  | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = Ps2MouseSimulateTouchPadDxe | ||||
|   FILE_GUID                      = 2899C94A-1FB6-4b1a-B96B-8364975303E0 | ||||
|   MODULE_TYPE                    = DXE_DRIVER | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   EDK_RELEASE_VERSION            = 0x00020000 | ||||
|   EFI_SPECIFICATION_VERSION      = 0x00020000 | ||||
|  | ||||
|   ENTRY_POINT                    = InitializePs2MouseSimulateTouchPad | ||||
|  | ||||
| #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC | ||||
|  | ||||
| [Sources.common] | ||||
|   ComponentName.c | ||||
|   CommPs2.h | ||||
|   CommPs2.c | ||||
|   Ps2MouseSimulateTouchPad.h | ||||
|   Ps2MouseSimulateTouchPad.c | ||||
|  | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   MdeModulePkg/MdeModulePkg.dec | ||||
|   IntelFrameworkPkg/IntelFrameworkPkg.dec | ||||
|   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec | ||||
|  | ||||
| [LibraryClasses] | ||||
|   ReportStatusCodeLib | ||||
|   UefiBootServicesTableLib | ||||
|   MemoryAllocationLib | ||||
|   BaseMemoryLib | ||||
|   UefiLib | ||||
|   UefiDriverEntryPoint | ||||
|   DebugLib | ||||
|  | ||||
| [Protocols] | ||||
|   gEfiIsaIoProtocolGuid                         # PROTOCOL TO_START | ||||
|   gEfiAbsolutePointerProtocolGuid               # PROTOCOL BY_START | ||||
|   gEfiDevicePathProtocolGuid                    # PROTOCOL TO_START | ||||
|  | ||||
| @@ -0,0 +1,98 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ModuleSurfaceArea xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0  http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd" xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||||
|   <MsaHeader> | ||||
|     <ModuleName>Ps2MouseSimulateTouchPad</ModuleName> | ||||
|     <ModuleType>DXE_DRIVER</ModuleType> | ||||
|     <GuidValue>2899C94A-1FB6-4b1a-B96B-8364975303E0</GuidValue> | ||||
|     <Version>1.0</Version> | ||||
|     <Abstract>Ps2 Mouse Simulate Touchpad Driver</Abstract> | ||||
|     <Description>This dirver directly uses IsaIo protocol service to support a faked Ps2 touchpad work.</Description> | ||||
|     <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright> | ||||
|     <License>All rights reserved. This program and the accompanying materials | ||||
|       are licensed and made available under the terms and conditions of the BSD License | ||||
|       which accompanies this distribution.  The full text of the license may be found at | ||||
|       http://opensource.org/licenses/bsd-license.php | ||||
|       THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License> | ||||
|     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification> | ||||
|   </MsaHeader> | ||||
|   <ModuleDefinitions> | ||||
|     <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures> | ||||
|     <BinaryModule>false</BinaryModule> | ||||
|     <OutputFileBasename>Ps2MouseSimulateTouchPad</OutputFileBasename> | ||||
|   </ModuleDefinitions> | ||||
|   <LibraryClassDefinitions> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>DebugLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiDriverModelLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiDriverEntryPoint</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>BaseMemoryLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>MemoryAllocationLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>UefiBootServicesTableLib</Keyword> | ||||
|     </LibraryClass> | ||||
|     <LibraryClass Usage="ALWAYS_CONSUMED"> | ||||
|       <Keyword>ReportStatusCodeLib</Keyword> | ||||
|     </LibraryClass> | ||||
|   </LibraryClassDefinitions> | ||||
|   <SourceFiles> | ||||
|     <Filename>Ps2MouseSimulateTouchPad.c</Filename> | ||||
|     <Filename>Ps2MouseSimulateTouchPad.h</Filename> | ||||
|     <Filename>CommPs2.c</Filename> | ||||
|     <Filename>CommPs2.h</Filename> | ||||
|     <Filename>ComponentName.c</Filename> | ||||
|   </SourceFiles> | ||||
|   <PackageDependencies> | ||||
|     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/> | ||||
|     <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/> | ||||
|   </PackageDependencies> | ||||
|   <Protocols> | ||||
|     <Protocol Usage="TO_START"> | ||||
|       <ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName> | ||||
|     </Protocol> | ||||
|     <Protocol Usage="BY_START"> | ||||
|       <ProtocolCName>gEfiAbsolutePointerProtocolGuid</ProtocolCName> | ||||
|     </Protocol> | ||||
|     <Protocol Usage="TO_START"> | ||||
|       <ProtocolCName>gEfiIsaIoProtocolGuid</ProtocolCName> | ||||
|     </Protocol> | ||||
|   </Protocols> | ||||
|   <Events> | ||||
|     <CreateEvents> | ||||
|       <EventTypes Usage="ALWAYS_PRODUCED"> | ||||
|         <EventType>EVENT_TYPE_RELATIVE_TIMER</EventType> | ||||
|         <HelpText>Set up a time event to wait for the faked touchpad input</HelpText> | ||||
|       </EventTypes> | ||||
|       <EventTypes Usage="ALWAYS_PRODUCED"> | ||||
|         <EventType>EVENT_TYPE_PERIODIC_TIMER</EventType> | ||||
|         <HelpText>Set up a periodic timer to poll the faked touchpad state at a fixed interval</HelpText> | ||||
|       </EventTypes> | ||||
|     </CreateEvents> | ||||
|     <SignalEvents> | ||||
|       <EventTypes Usage="SOMETIMES_PRODUCED"> | ||||
|         <EventType>EVENT_TYPE_RELATIVE_TIMER</EventType> | ||||
|         <HelpText>Signal an event whenever these is a pending event from the faked touchpad input</HelpText> | ||||
|       </EventTypes> | ||||
|     </SignalEvents> | ||||
|   </Events> | ||||
|   <Externs> | ||||
|     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification> | ||||
|     <Specification>EDK_RELEASE_VERSION 0x00020000</Specification> | ||||
|     <Extern> | ||||
|       <DriverBinding>gPS2MouseSimulateTouchPadDriver</DriverBinding> | ||||
|       <ComponentName>gPs2MouseSimulateTouchPadComponentName</ComponentName> | ||||
|     </Extern> | ||||
|   </Externs> | ||||
| </ModuleSurfaceArea> | ||||
| @@ -183,6 +183,7 @@ | ||||
|   IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf | ||||
|   IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2keyboardDxe.inf | ||||
|   IntelFrameworkModulePkg/Bus/Isa/Ps2MouseDxe/Ps2MouseDxe.inf | ||||
|   IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.inf | ||||
|   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf | ||||
|   IntelFrameworkModulePkg/Universal/DataHubStdErrDxe/DataHubStdErrDxe.inf | ||||
|   IntelFrameworkModulePkg/Universal/StatusCode/Pei/PeiStatusCode.inf | ||||
|   | ||||
		Reference in New Issue
	
	Block a user