From f6bb488c87572bbd74bd463dc8d732cb85a2a63a Mon Sep 17 00:00:00 2001 From: Arjav Garg Date: Tue, 19 Jan 2021 00:41:10 +0530 Subject: [PATCH] [i8042prt] Fixed mouse type detection regression on Compaq N600C Co-authored-by: Benjamin Aerni --- boot/bootdata/bootcd/unattend.inf | 4 +- drivers/input/i8042prt/hwhacks.c | 67 ------------------------------- drivers/input/i8042prt/i8042prt.h | 19 +++++---- drivers/input/i8042prt/mouse.c | 45 +++++++++++++-------- drivers/input/i8042prt/pnp.c | 14 +++---- 5 files changed, 46 insertions(+), 103 deletions(-) diff --git a/boot/bootdata/bootcd/unattend.inf b/boot/bootdata/bootcd/unattend.inf index ce5593788e..85ff56a34f 100644 --- a/boot/bootdata/bootcd/unattend.inf +++ b/boot/bootdata/bootcd/unattend.inf @@ -4,7 +4,7 @@ Signature = "$ReactOS$" ; Set UnattendSetupEnabled to yes in order to get unattended setup working ; yes - unattend setup enabled ; no - unattend setup disabled -UnattendSetupEnabled = no +UnattendSetupEnabled = yes ; Install to \Device\Harddisk0\Partition1\ReactOS DestinationDiskNumber = 0 @@ -46,7 +46,7 @@ FsType = 0 ; enable this setting to disable Gecko install ; yes - disabled ; no - enabled -DisableGeckoInst = no +DisableGeckoInst = yes ; set this option to automatically ; specify language in 2nd mode setup diff --git a/drivers/input/i8042prt/hwhacks.c b/drivers/input/i8042prt/hwhacks.c index ddb8a6fbaa..99b368d8c7 100644 --- a/drivers/input/i8042prt/hwhacks.c +++ b/drivers/input/i8042prt/hwhacks.c @@ -19,43 +19,6 @@ const GUID MSSmBios_RawSMBiosTables_GUID = SMBIOS_DATA_GUID; PVOID i8042SMBiosTables; -ULONG i8042HwFlags; - -typedef struct _MATCHENTRY -{ - ULONG Type; - PCHAR String; -} MATCHENTRY; - -#define MAX_MATCH_ENTRIES 3 -typedef struct _HARDWARE_TABLE -{ - MATCHENTRY MatchEntries[MAX_MATCH_ENTRIES]; - ULONG Flags; -} HARDWARE_TABLE; - -const HARDWARE_TABLE i8042HardwareTable[] = -{ -// { {{BOARD_VENDOR, "RIOWORKS"}, {BOARD_NAME, "HDAMB"}, {BOARD_VERSION, "Rev E"}}, FL_NOLOOP }, -// { {{BOARD_VENDOR, "ASUSTeK Computer Inc."}, {BOARD_NAME, "G1S"}, {BOARD_VERSION, "1.0"}}, FL_NOLOOP }, - - { {{SYS_VENDOR, "Microsoft Corporation"}, {SYS_PRODUCT, "Virtual Machine"}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Inspiron 6000 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D430 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D530 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D531 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D600 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D610 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D620 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D630 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D810 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E4300 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E4310 "}}, FL_INITHACK }, - { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E6400 "}}, FL_INITHACK }, - -}; - - static VOID @@ -63,7 +26,6 @@ i8042ParseSMBiosTables( _In_reads_bytes_(TableSize) PVOID SMBiosTables, _In_ ULONG TableSize) { - ULONG i, j; PCHAR Strings[ID_STRINGS_MAX] = { 0 }; ParseSMBiosTables(SMBiosTables, TableSize, Strings); @@ -83,35 +45,6 @@ i8042ParseSMBiosTables( DbgPrint("BOARD_SERIAL: %s\n", Strings[BOARD_SERIAL]); DbgPrint("BOARD_ASSET_TAG: %s\n", Strings[BOARD_ASSET_TAG]); #endif - - /* Now loop the hardware table to find a match */ - for (i = 0; i < ARRAYSIZE(i8042HardwareTable); i++) - { - for (j = 0; j < MAX_MATCH_ENTRIES; j++) - { - ULONG Type = i8042HardwareTable[i].MatchEntries[j].Type; - - if (Type != ID_NONE) - { - /* Check for a match */ - if ((Strings[Type] == NULL) || - strcmp(i8042HardwareTable[i].MatchEntries[j].String, - Strings[i8042HardwareTable[i].MatchEntries[j].Type])) - { - /* Does not match, try next entry */ - break; - } - } - } - - if (j == MAX_MATCH_ENTRIES) - { - /* All items matched! */ - i8042HwFlags = i8042HardwareTable[i].Flags; - DPRINT("Found match for hw table index %u\n", i); - break; - } - } } static diff --git a/drivers/input/i8042prt/i8042prt.h b/drivers/input/i8042prt/i8042prt.h index 71be982326..dbde119ba7 100644 --- a/drivers/input/i8042prt/i8042prt.h +++ b/drivers/input/i8042prt/i8042prt.h @@ -195,6 +195,7 @@ typedef struct _I8042_MOUSE_EXTENSION BOOLEAN MouseTimeoutActive; UCHAR MouseLogiBuffer[3]; + INT AckCount; I8042_MOUSE_TYPE MouseType; } I8042_MOUSE_EXTENSION; @@ -275,8 +276,14 @@ typedef struct _I8042_HOOK_WORKITEM * Mouse commands * --------------------------------------------------*/ -#define MOU_ENAB 0xF4 -#define MOU_CMD_RESET 0xFF +#define MOU_READ_DEV_TYPE 0xF2 +#define MOU_DEF_SAMPLE_RATE 0xF3 +#define MOU_ENAB 0xF4 +#define MOU_NO_ERROR_REPORT 0xF5 /* Apparently this should be sent before doing anything else when in stream mode */ +#define MOU_CMD_RESET_NO_TEST 0xF6 /* Reset to default settings */ +#define MOU_CMD_RESET 0xFF /* Reset with a self test */ +#define MOU_SET_STREAM_MODE 0xEA /* Configure for stream mode */ +#define MOU_ENAB_RESEND 0xEB /* Resend last movement data, used whenever an invalid response was received */ /*----------------------------------------------------- * Mouse responses @@ -450,12 +457,4 @@ NTAPI i8042InitializeHwHacks( VOID); -enum _FLAGS -{ - FL_NOLOOP = 0x01, - FL_INITHACK = 0x02, -}; - -extern ULONG i8042HwFlags; - #endif /* _I8042PRT_PCH_ */ diff --git a/drivers/input/i8042prt/mouse.c b/drivers/input/i8042prt/mouse.c index 09516c1fe4..c81f08a37b 100644 --- a/drivers/input/i8042prt/mouse.c +++ b/drivers/input/i8042prt/mouse.c @@ -655,6 +655,7 @@ i8042MouResetIsr( DeviceExtension->MouseTimeoutState = TimeoutStart; PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension; + DPRINT1("Value: %x\tResetState: %x\n", Value, DeviceExtension->MouseResetState); switch ((ULONG)DeviceExtension->MouseResetState) { @@ -688,7 +689,7 @@ i8042MouResetIsr( { DeviceExtension->MouseResetState++; DeviceExtension->MouseType = GenericPS2; - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF2); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_READ_DEV_TYPE); } else { @@ -770,7 +771,7 @@ i8042MouResetIsr( DeviceExtension->MouseAttributes.NumberOfButtons = DeviceExtension->MouseLogiBuffer[1]; DeviceExtension->MouseType = Ps2pp; - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState = ExpectingSetSamplingRateACK; /* TODO: Go through EnableWheel and Enable5Buttons */ return TRUE; @@ -779,7 +780,15 @@ i8042MouResetIsr( i8042MouResetIsr(DeviceExtension, Status, Value); return TRUE; case EnableWheel: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_SET_STREAM_MODE); + DeviceExtension->MouseResetState = 1050; + return TRUE; + case 1050: + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_NO_ERROR_REPORT); + DeviceExtension->MouseResetState++; + return TRUE; + case 1051: + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState = 1001; return TRUE; case 1001: @@ -788,7 +797,7 @@ i8042MouResetIsr( return TRUE; case 1002: case 1004: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState++; return TRUE; case 1003: @@ -800,15 +809,15 @@ i8042MouResetIsr( DeviceExtension->MouseResetState++; return TRUE; case 1006: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF2); - DeviceExtension->MouseResetState++; - return TRUE; - case 1007: - /* Ignore ACK */ - DeviceExtension->MouseResetState++; + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_READ_DEV_TYPE); + DeviceExtension->MouseResetState+=2; + DeviceExtension->AckCount = 0; return TRUE; case 1008: - if (0x03 == Value) { + if (DeviceExtension->AckCount <= 10 && MOUSE_ACK == Value) { + DeviceExtension->AckCount++; + } + else if (0x03 == Value) { /* It's either an Intellimouse or Intellimouse Explorer. */ DeviceExtension->MouseAttributes.NumberOfButtons = 3; DeviceExtension->MouseAttributes.MouseIdentifier = @@ -820,17 +829,17 @@ i8042MouResetIsr( else { /* Just set the default settings and be done */ - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState = ExpectingSetSamplingRateACK; } return TRUE; case Enable5Buttons: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState = 1021; return TRUE; case 1022: case 1024: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState++; return TRUE; case 1021: @@ -843,7 +852,7 @@ i8042MouResetIsr( DeviceExtension->MouseResetState++; return TRUE; case 1026: - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF2); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_READ_DEV_TYPE); DeviceExtension->MouseResetState++; return TRUE; case 1027: @@ -854,7 +863,7 @@ i8042MouResetIsr( WHEELMOUSE_I8042_HARDWARE; DeviceExtension->MouseType = IntellimouseExplorer; } - DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xF3); + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_DEF_SAMPLE_RATE); DeviceExtension->MouseResetState = ExpectingSetSamplingRateACK; return TRUE; case ExpectingSetSamplingRateACK: @@ -872,6 +881,10 @@ i8042MouResetIsr( return TRUE; } case 1040: /* Fallthrough */ + DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, MOU_ENAB); + DeviceExtension->MouseResetState++; + return TRUE; + case 1041: DeviceExtension->MouseHook.IsrWritePort(DeviceExtension->MouseHook.CallContext, 0xE8); DeviceExtension->MouseResetState = ExpectingFinalResolutionACK; return TRUE; diff --git a/drivers/input/i8042prt/pnp.c b/drivers/input/i8042prt/pnp.c index e5fe57b208..c0d0f38e3a 100644 --- a/drivers/input/i8042prt/pnp.c +++ b/drivers/input/i8042prt/pnp.c @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: drivers/input/i8042prt/pnp.c * PURPOSE: IRP_MJ_PNP operations - * PROGRAMMERS: Copyright 2006-2007 Hervé Poussineau (hpoussin@reactos.org) + * PROGRAMMERS: Copyright 2006-2007 HervĂ© Poussineau (hpoussin@reactos.org) * Copyright 2008 Colin Finck (mail@colinfinck.de) */ @@ -470,6 +470,8 @@ StartProcedure( DeviceExtension->Flags & MOUSE_STARTED && !(DeviceExtension->Flags & MOUSE_INITIALIZED)) { + /* Detect the mouse type here, rather than in i8042DetectMouse, fixes lockup on BootCD */ + //i8042DetectMouseType(DeviceExtension); /* Mouse is ready to be initialized */ Status = i8042ConnectMouseInterrupt(DeviceExtension->MouseExtension); if (NT_SUCCESS(Status)) @@ -483,13 +485,9 @@ StartProcedure( /* Start the mouse */ Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); - /* HACK: the mouse has already been reset in i8042DetectMouse. This second - reset prevents some touchpads/mice from working (Dell D531, D600). - See CORE-6901 */ - if (!(i8042HwFlags & FL_INITHACK)) - { - i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); - } + + i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); + KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); } -- 2.30.0.windows.1