From 0f8304cd85c0930bcc3f8e2247eda1b17e42176a Mon Sep 17 00:00:00 2001 From: eric_tian Date: Tue, 27 Nov 2007 05:55:26 +0000 Subject: [PATCH] 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 --- .../Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.c | 1094 +++++++++++++++++ .../Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.h | 430 +++++++ .../ComponentName.c | 240 ++++ .../Ps2MouseSimulateTouchPad.c | 799 ++++++++++++ .../Ps2MouseSimulateTouchPad.h | 301 +++++ .../Ps2MouseSimulateTouchPadDxe.inf | 58 + .../Ps2MouseSimulateTouchPadDxe.msa | 98 ++ .../IntelFrameworkModulePkg.dsc | 1 + 8 files changed, 3021 insertions(+) create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.c create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.h create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/ComponentName.c create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.c create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.h create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.inf create mode 100644 IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.msa diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.c b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.c new file mode 100644 index 0000000000..719a650cb6 --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.c @@ -0,0 +1,1094 @@ +/**@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. + +**/ + +#include "Ps2MouseSimulateTouchPad.h" +#include "CommPs2.h" + +UINT8 SampleRateTbl[MAX_SR] = { 0xa, 0x14, 0x28, 0x3c, 0x50, 0x64, 0xc8 }; + +UINT8 ResolutionTbl[MAX_CMR] = { 0, 1, 2, 3 }; + +EFI_STATUS +KbcSelfTest ( + IN EFI_ISA_IO_PROTOCOL *IsaIo + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + +Returns: + + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Data; + + // + // Keyboard controller self test + // + Status = Out8042Command (IsaIo, SELF_TEST); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Read return code + // + Status = In8042Data (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Data != 0x55) { + return EFI_DEVICE_ERROR; + } + // + // Set system flag + // + Status = Out8042Command (IsaIo, READ_CMD_BYTE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = In8042Data (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = Out8042Command (IsaIo, WRITE_CMD_BYTE); + if (EFI_ERROR (Status)) { + return Status; + } + + Data |= CMD_SYS_FLAG; + Status = Out8042Data (IsaIo, Data); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +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 + +--*/ +{ + // + // Send 8042 enable mouse command + // + return Out8042Command (IsaIo, ENABLE_AUX); +} + +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 + +--*/ +{ + // + // Send 8042 disable mouse command + // + return Out8042Command (IsaIo, DISABLE_AUX); +} + +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 + +--*/ +{ + // + // Send 8042 enable keyboard command + // + return Out8042Command (IsaIo, ENABLE_KB); +} + +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 + +--*/ +{ + // + // Send 8042 disable keyboard command + // + return Out8042Command (IsaIo, DISABLE_KB); +} + +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: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Data; + + // + // Send command to read KBC command byte + // + Status = Out8042Command (IsaIo, READ_CMD_BYTE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = In8042Data (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Check keyboard enable or not + // + if ((Data & CMD_KB_STS) == CMD_KB_DIS) { + *KeyboardEnable = FALSE; + } else { + *KeyboardEnable = TRUE; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +PS2MouseReset ( + IN EFI_ISA_IO_PROTOCOL *IsaIo + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + +Returns: + + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Data; + + Status = Out8042AuxCommand (IsaIo, RESET_CMD, FALSE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = In8042AuxData (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Check BAT Complete Code + // + if (Data != PS2MOUSE_BAT1) { + return EFI_DEVICE_ERROR; + } + + Status = In8042AuxData (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Check BAT Complete Code + // + if (Data != PS2MOUSE_BAT2) { + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +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 Status; + + // + // Send auxiliary command to set mouse sample rate + // + Status = Out8042AuxCommand (IsaIo, SETSR_CMD, FALSE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = Out8042AuxData (IsaIo, SampleRateTbl[SampleRate]); + + return Status; +} + +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 Status; + + // + // Send auxiliary command to set mouse resolution + // + Status = Out8042AuxCommand (IsaIo, SETRE_CMD, FALSE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = Out8042AuxData (IsaIo, ResolutionTbl[Resolution]); + + return Status; +} + +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 + +--*/ +{ + UINT8 Command; + + Command = (UINT8) (Scaling == SF1 ? SETSF1_CMD : SETSF2_CMD); + + // + // Send auxiliary command to set mouse scaling data + // + return Out8042AuxCommand (IsaIo, Command, FALSE); +} + +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 + +--*/ +{ + // + // Send auxiliary command to enable mouse + // + return Out8042AuxCommand (IsaIo, ENABLE_CMD, FALSE); +} + +EFI_STATUS +PS2MouseGetPacket ( + PS2_MOUSE_SIMULATE_TOUCHPAD_DEV *MouseSimulateTouchPadDev + ) +/*++ + +Routine Description: + + Get mouse packet . Only care first 3 bytes + +Arguments: + + MouseDev - Pointer of PS2 Mouse Private Data Structure + +Returns: + + EFI_NOT_READY - Mouse Device not ready to input data packet, or some error happened during getting the packet + EFI_SUCCESS - The data packet is gotten successfully. + +--*/ +{ + EFI_STATUS Status; + BOOLEAN KeyboardEnable; + UINT8 Packet[PS2_PACKET_LENGTH]; + UINT8 Data; + UINTN Count; + UINTN State; + INT16 RelativeMovementX; + INT16 RelativeMovementY; + BOOLEAN LButton; + BOOLEAN RButton; + + KeyboardEnable = FALSE; + Count = 1; + State = PS2_READ_BYTE_ONE; + + // + // State machine to get mouse packet + // + while (1) { + + switch (State) { + case PS2_READ_BYTE_ONE: + // + // Read mouse first byte data, if failed, immediately return + // + KbcDisableAux (MouseSimulateTouchPadDev->IsaIo); + Status = PS2MouseRead (MouseSimulateTouchPadDev->IsaIo, &Data, &Count, State); + if (EFI_ERROR (Status)) { + KbcEnableAux (MouseSimulateTouchPadDev->IsaIo); + return EFI_NOT_READY; + } + + if (Count != 1) { + KbcEnableAux (MouseSimulateTouchPadDev->IsaIo); + return EFI_NOT_READY; + } + + if (IS_PS2_SYNC_BYTE (Data)) { + Packet[0] = Data; + State = PS2_READ_DATA_BYTE; + + CheckKbStatus (MouseSimulateTouchPadDev->IsaIo, &KeyboardEnable); + KbcDisableKb (MouseSimulateTouchPadDev->IsaIo); + KbcEnableAux (MouseSimulateTouchPadDev->IsaIo); + } + break; + + case PS2_READ_DATA_BYTE: + Count = 2; + Status = PS2MouseRead (MouseSimulateTouchPadDev->IsaIo, (Packet + 1), &Count, State); + if (EFI_ERROR (Status)) { + if (KeyboardEnable) { + KbcEnableKb (MouseSimulateTouchPadDev->IsaIo); + } + + return EFI_NOT_READY; + } + + if (Count != 2) { + if (KeyboardEnable) { + KbcEnableKb (MouseSimulateTouchPadDev->IsaIo); + } + + return EFI_NOT_READY; + } + + State = PS2_PROCESS_PACKET; + break; + + case PS2_PROCESS_PACKET: + if (KeyboardEnable) { + KbcEnableKb (MouseSimulateTouchPadDev->IsaIo); + } + // + // Decode the packet + // + RelativeMovementX = Packet[1]; + RelativeMovementY = Packet[2]; + // + // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 + // Byte 0 | Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn + // Byte 1 | 8 bit X Movement + // Byte 2 | 8 bit Y Movement + // + // X sign bit + 8 bit X Movement : 9-bit signed twos complement integer that presents the relative displacement of the device in the X direction since the last data transmission. + // Y sign bit + 8 bit Y Movement : Same as X sign bit + 8 bit X Movement. + // + // + // First, Clear X and Y high 8 bits + // + RelativeMovementX = (INT16) (RelativeMovementX & 0xFF); + RelativeMovementY = (INT16) (RelativeMovementY & 0xFF); + // + // Second, if the 9-bit signed twos complement integer is negative, set the high 8 bit 0xff + // + if ((Packet[0] & 0x10) != 0) { + RelativeMovementX = (INT16) (RelativeMovementX | 0xFF00); + } + if ((Packet[0] & 0x20) != 0) { + RelativeMovementY = (INT16) (RelativeMovementY | 0xFF00); + } + + + RButton = (UINT8) (Packet[0] & 0x2); + LButton = (UINT8) (Packet[0] & 0x1); + + // + // Update mouse state + // + MouseSimulateTouchPadDev->State.CurrentX += RelativeMovementX; + MouseSimulateTouchPadDev->State.CurrentY -= RelativeMovementY; + MouseSimulateTouchPadDev->State.CurrentZ = 0; + MouseSimulateTouchPadDev->State.ActiveButtons = (UINT8) (LButton || RButton) & 0x3; + MouseSimulateTouchPadDev->StateChanged = TRUE; + + return EFI_SUCCESS; + } + } +} + +EFI_STATUS +PS2MouseRead ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + OUT VOID *Buffer, + IN OUT UINTN *BufSize, + IN UINTN State + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Buffer - GC_TODO: add argument description + BufSize - GC_TODO: add argument description + State - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +{ + EFI_STATUS Status; + UINTN BytesRead; + + Status = EFI_SUCCESS; + BytesRead = 0; + + if (State == PS2_READ_BYTE_ONE) { + // + // Check input for mouse + // + Status = CheckForInput (IsaIo); + + if (EFI_ERROR (Status)) { + return Status; + } + } + + while (BytesRead < *BufSize) { + + Status = WaitOutputFull (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + break; + } + + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Buffer); + + BytesRead++; + Buffer = (UINT8 *) Buffer + 1; + } + // + // Verify the correct number of bytes read + // + if (BytesRead == 0 || BytesRead != *BufSize) { + Status = EFI_NOT_FOUND; + } + + *BufSize = BytesRead; + return Status; +} +// +// 8042 I/O function +// +EFI_STATUS +Out8042Command ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINT8 Command + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Command - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Data; + + // + // Wait keyboard controller input buffer empty + // + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Send command + // + Data = Command; + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); + + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +Out8042Data ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINT8 Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 temp; + // + // Wait keyboard controller input buffer empty + // + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + temp = Data; + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &temp); + + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +In8042Data ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN OUT UINT8 *Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + EFI_TIMEOUT - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + UINTN Delay; + UINT8 temp; + + Delay = TIMEOUT / 50; + + do { + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &temp); + + // + // Check keyboard controller status bit 0(output buffer status) + // + if ((temp & KBC_OUTB) == KBC_OUTB) { + break; + } + + gBS->Stall (50); + Delay--; + } while (Delay); + + if (Delay == 0) { + return EFI_TIMEOUT; + } + + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data); + + return EFI_SUCCESS; +} + +EFI_STATUS +Out8042AuxCommand ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINT8 Command, + IN BOOLEAN Resend + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Command - GC_TODO: add argument description + Resend - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Data; + + // + // Wait keyboard controller input buffer empty + // + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Send write to auxiliary device command + // + Data = WRITE_AUX_DEV; + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); + + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Send auxiliary device command + // + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Command); + + // + // Read return code + // + Status = In8042AuxData (IsaIo, &Data); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Data == PS2_ACK) { + // + // Receive mouse acknowledge, command send success + // + return EFI_SUCCESS; + + } else if (Resend) { + // + // Resend fail + // + return EFI_DEVICE_ERROR; + + } else if (Data == PS2_RESEND) { + // + // Resend command + // + Status = Out8042AuxCommand (IsaIo, Command, TRUE); + if (EFI_ERROR (Status)) { + return Status; + } + + } else { + // + // Invalid return code + // + return EFI_DEVICE_ERROR; + + } + + return EFI_SUCCESS; +} + +EFI_STATUS +Out8042AuxData ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINT8 Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + UINT8 Temp; + // + // Wait keyboard controller input buffer empty + // + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Send write to auxiliary device command + // + Temp = WRITE_AUX_DEV; + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Temp); + + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + Temp = Data; + IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Temp); + + Status = WaitInputEmpty (IsaIo, TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +In8042AuxData ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN OUT UINT8 *Data + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Data - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + EFI_STATUS Status; + + // + // wait for output data + // + Status = WaitOutputFull (IsaIo, BAT_TIMEOUT); + if (EFI_ERROR (Status)) { + return Status; + } + + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data); + + return EFI_SUCCESS; +} + +EFI_STATUS +CheckForInput ( + IN EFI_ISA_IO_PROTOCOL *IsaIo + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + +Returns: + + EFI_NOT_READY - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + UINT8 Data; + + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); + + // + // Check keyboard controller status, if it is output buffer full and for auxiliary device + // + if ((Data & (KBC_OUTB | KBC_AUXB)) != (KBC_OUTB | KBC_AUXB)) { + return EFI_NOT_READY; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +WaitInputEmpty ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINTN Timeout + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Timeout - GC_TODO: add argument description + +Returns: + + EFI_TIMEOUT - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + UINTN Delay; + UINT8 Data; + + Delay = Timeout / 50; + + do { + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); + + // + // Check keyboard controller status bit 1(input buffer status) + // + if ((Data & KBC_INPB) == 0) { + break; + } + + gBS->Stall (50); + Delay--; + } while (Delay); + + if (Delay == 0) { + return EFI_TIMEOUT; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +WaitOutputFull ( + IN EFI_ISA_IO_PROTOCOL *IsaIo, + IN UINTN Timeout + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + IsaIo - GC_TODO: add argument description + Timeout - GC_TODO: add argument description + +Returns: + + EFI_TIMEOUT - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + UINTN Delay; + UINT8 Data; + + Delay = Timeout / 50; + + do { + IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); + + // + // Check keyboard controller status bit 0(output buffer status) + // & bit5(output buffer for auxiliary device) + // + if ((Data & (KBC_OUTB | KBC_AUXB)) == (KBC_OUTB | KBC_AUXB)) { + break; + } + + gBS->Stall (50); + Delay--; + } while (Delay); + + if (Delay == 0) { + return EFI_TIMEOUT; + } + + return EFI_SUCCESS; +} diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.h b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.h new file mode 100644 index 0000000000..9702cb5dcf --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/CommPs2.h @@ -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_ diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/ComponentName.c b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/ComponentName.c new file mode 100644 index 0000000000..d59fabee6d --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/ComponentName.c @@ -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) + ); +} diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.c b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.c new file mode 100644 index 0000000000..c787656205 --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.c @@ -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; +} diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.h b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.h new file mode 100644 index 0000000000..26b4f3363f --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPad.h @@ -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 +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +// +// 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 diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.inf b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.inf new file mode 100644 index 0000000000..0b5c40c1c3 --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.inf @@ -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 + diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.msa b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.msa new file mode 100644 index 0000000000..5e0d108347 --- /dev/null +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2MouseSimulateTouchPadDxe/Ps2MouseSimulateTouchPadDxe.msa @@ -0,0 +1,98 @@ + + + + Ps2MouseSimulateTouchPad + DXE_DRIVER + 2899C94A-1FB6-4b1a-B96B-8364975303E0 + 1.0 + 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. + 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. + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + Ps2MouseSimulateTouchPad + + + + DebugLib + + + UefiDriverModelLib + + + UefiDriverEntryPoint + + + UefiLib + + + BaseMemoryLib + + + MemoryAllocationLib + + + UefiBootServicesTableLib + + + ReportStatusCodeLib + + + + Ps2MouseSimulateTouchPad.c + Ps2MouseSimulateTouchPad.h + CommPs2.c + CommPs2.h + ComponentName.c + + + + + + + + gEfiDevicePathProtocolGuid + + + gEfiAbsolutePointerProtocolGuid + + + gEfiIsaIoProtocolGuid + + + + + + EVENT_TYPE_RELATIVE_TIMER + Set up a time event to wait for the faked touchpad input + + + EVENT_TYPE_PERIODIC_TIMER + Set up a periodic timer to poll the faked touchpad state at a fixed interval + + + + + EVENT_TYPE_RELATIVE_TIMER + Signal an event whenever these is a pending event from the faked touchpad input + + + + + EFI_SPECIFICATION_VERSION 0x00020000 + EDK_RELEASE_VERSION 0x00020000 + + gPS2MouseSimulateTouchPadDriver + gPs2MouseSimulateTouchPadComponentName + + + \ No newline at end of file diff --git a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc index af1486b2c6..edf8642493 100644 --- a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc +++ b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc @@ -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