From aa3c97709dd96c380d89eea6542f9bec6eaa909c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Thu, 15 Nov 2007 20:13:49 +0000 Subject: [PATCH] Reset mouse to detect its type See issue #2817 for more details. svn path=/trunk/; revision=30470 --- reactos/drivers/input/i8042prt/i8042prt.c | 16 ---------------- reactos/drivers/input/i8042prt/mouse.c | 6 ++++-- reactos/drivers/input/i8042prt/pnp.c | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/reactos/drivers/input/i8042prt/i8042prt.c b/reactos/drivers/input/i8042prt/i8042prt.c index ba0dd1bd3b6..e9c122e01e7 100644 --- a/reactos/drivers/input/i8042prt/i8042prt.c +++ b/reactos/drivers/input/i8042prt/i8042prt.c @@ -202,22 +202,6 @@ i8042SendHookWorkItem( } } } -#if 0 - else - { - /* Mouse doesn't have this, but we need to send a - * reset to start the detection. - */ - KIRQL Irql; - - Irql = KeAcquireInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt); - - i8042Write(PortDeviceExtension, PortDeviceExtension->ControlPort, CTRL_WRITE_MOUSE); - i8042Write(PortDeviceExtension, PortDeviceExtension->DataPort, MOU_CMD_RESET); - - KeReleaseInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt, Irql); - } -#endif WorkItemData->Irp->IoStatus.Status = STATUS_SUCCESS; diff --git a/reactos/drivers/input/i8042prt/mouse.c b/reactos/drivers/input/i8042prt/mouse.c index 40e1f4912ba..9366fcbb663 100644 --- a/reactos/drivers/input/i8042prt/mouse.c +++ b/reactos/drivers/input/i8042prt/mouse.c @@ -28,14 +28,14 @@ i8042MouIsrWritePort( DeviceExtension = (PI8042_MOUSE_EXTENSION)Context; - if (DeviceExtension->MouseHook.IsrWritePort) + if (DeviceExtension->MouseHook.IsrWritePort != i8042MouIsrWritePort) { DeviceExtension->MouseHook.IsrWritePort( DeviceExtension->MouseHook.CallContext, Value); } else - i8042IsrWritePort(Context, Value, CTRL_WRITE_MOUSE); + i8042IsrWritePort(DeviceExtension->Common.PortDeviceExtension, Value, CTRL_WRITE_MOUSE); } static VOID NTAPI @@ -429,6 +429,8 @@ i8042MouInternalDeviceControl( DeviceExtension->Common.PortDeviceExtension->Flags |= MOUSE_CONNECTED; IoMarkIrpPending(Irp); + DeviceExtension->MouseState = MouseResetting; + DeviceExtension->MouseResetState = 1100; DeviceExtension->MouseHook.IsrWritePort = i8042MouIsrWritePort; DeviceExtension->MouseHook.QueueMousePacket = i8042MouQueuePacket; DeviceExtension->MouseHook.CallContext = DeviceExtension; diff --git a/reactos/drivers/input/i8042prt/pnp.c b/reactos/drivers/input/i8042prt/pnp.c index 88f17bb8c64..de66da8365f 100644 --- a/reactos/drivers/input/i8042prt/pnp.c +++ b/reactos/drivers/input/i8042prt/pnp.c @@ -333,6 +333,19 @@ EnableInterrupts( i8042Flush(DeviceExtension); + /* First, reset the mouse (if any) to start the detection */ + if (DeviceExtension->Flags & MOUSE_PRESENT) + { + KIRQL Irql; + + Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); + + i8042Write(DeviceExtension, DeviceExtension->ControlPort, CTRL_WRITE_MOUSE); + i8042Write(DeviceExtension, DeviceExtension->DataPort, MOU_CMD_RESET); + + KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); + } + /* Select the devices we have */ if (DeviceExtension->Flags & KEYBOARD_PRESENT) { @@ -533,7 +546,7 @@ i8042PnpStartDevice( else InterruptData.InterruptMode = LevelSensitive; InterruptData.ShareInterrupt = (ResourceDescriptorTranslated->ShareDisposition == CmResourceShareShared); - DPRINT("Found irq resource: %lu\n", ResourceDescriptor->u.Interrupt.Vector); + DPRINT("Found irq resource: %lu\n", ResourceDescriptor->u.Interrupt.Level); FoundIrq = TRUE; break; }