Author: janderwald
Date: Wed Dec 28 16:35:41 2011
New Revision: 54774
URL:
http://svn.reactos.org/svn/reactos?rev=54774&view=rev
Log:
[USB-BRINGUP]
- Fix a few bugs & race condition in the read report routine
- mouhid initializes and is able to read input reports
- button press / wheel state change is detected
- mouse move detection not yet working
Modified:
branches/usb-bringup/drivers/hid/mouhid/mouhid.c
branches/usb-bringup/drivers/hid/mouhid/mouhid.h
Modified: branches/usb-bringup/drivers/hid/mouhid/mouhid.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/hid/mouhid/…
==============================================================================
--- branches/usb-bringup/drivers/hid/mouhid/mouhid.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/hid/mouhid/mouhid.c [iso-8859-1] Wed Dec 28 16:35:41
2011
@@ -30,15 +30,11 @@
VOID
MouHid_GetButtonMove(
- IN PDEVICE_OBJECT DeviceObject,
+ IN PMOUHID_DEVICE_EXTENSION DeviceExtension,
OUT PLONG LastX,
OUT PLONG LastY)
{
- PMOUHID_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
-
- /* get device extension */
- DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
/* init result */
*LastX = 0;
@@ -59,18 +55,14 @@
VOID
MouHid_GetButtonFlags(
- IN PDEVICE_OBJECT DeviceObject,
+ IN PMOUHID_DEVICE_EXTENSION DeviceExtension,
OUT PUSHORT ButtonFlags)
{
- PMOUHID_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
USAGE Usage;
ULONG Index;
PUSAGE TempList;
ULONG CurrentUsageListLength;
-
- /* get device extension */
- DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
/* init flags */
*ButtonFlags = 0;
@@ -142,15 +134,14 @@
VOID
MouHid_DispatchInputData(
- IN PDEVICE_OBJECT DeviceObject,
+ IN PMOUHID_DEVICE_EXTENSION DeviceExtension,
IN PMOUSE_INPUT_DATA InputData)
{
- PMOUHID_DEVICE_EXTENSION DeviceExtension;
KIRQL OldIrql;
ULONG InputDataConsumed;
- /* get device extension */
- DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ if (!DeviceExtension->ClassService)
+ return;
/* sanity check */
ASSERT(DeviceExtension->ClassService);
@@ -181,13 +172,32 @@
MOUSE_INPUT_DATA MouseInputData;
/* get device extension */
- DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceExtension = (PMOUHID_DEVICE_EXTENSION)Context;
+
+ if (Irp->IoStatus.Status == STATUS_PRIVILEGE_NOT_HELD ||
+ Irp->IoStatus.Status == STATUS_DEVICE_NOT_CONNECTED ||
+ Irp->IoStatus.Status == STATUS_CANCELLED ||
+ DeviceExtension->StopReadReport)
+ {
+ /* failed to read or should be stopped*/
+ DPRINT1("[MOUHID] ReadCompletion terminating read Status %x\n",
Irp->IoStatus.Status);
+
+ /* report no longer active */
+ DeviceExtension->ReadReportActive = FALSE;
+
+ /* request stopping of the report cycle */
+ DeviceExtension->StopReadReport = FALSE;
+
+ /* signal completion event */
+ KeSetEvent(&DeviceExtension->ReadCompletionEvent, 0, 0);
+ return STATUS_MORE_PROCESSING_REQUIRED;
+ }
/* get mouse change flags */
- MouHid_GetButtonFlags(DeviceObject, &ButtonFlags);
+ MouHid_GetButtonFlags(DeviceExtension, &ButtonFlags);
/* get mouse change */
- MouHid_GetButtonMove(DeviceObject, &LastX, &LastY);
+ MouHid_GetButtonMove(DeviceExtension, &LastX, &LastY);
/* init input data */
RtlZeroMemory(&MouseInputData, sizeof(MOUSE_INPUT_DATA));
@@ -215,11 +225,13 @@
}
}
+ DPRINT1("[MOUHID] LastX %lu LastY %lu Flags %x ButtonData %x\n",
MouseInputData.LastX, MouseInputData.LastY, MouseInputData.ButtonFlags,
MouseInputData.ButtonData);
+
/* dispatch mouse action */
- MouHid_DispatchInputData(DeviceObject, &MouseInputData);
+ MouHid_DispatchInputData(DeviceExtension, &MouseInputData);
/* re-init read */
- MouHid_InitiateRead(DeviceObject);
+ MouHid_InitiateRead(DeviceExtension);
/* stop completion */
return STATUS_MORE_PROCESSING_REQUIRED;
@@ -227,14 +239,10 @@
NTSTATUS
MouHid_InitiateRead(
- IN PDEVICE_OBJECT DeviceObject)
-{
- PMOUHID_DEVICE_EXTENSION DeviceExtension;
+ IN PMOUHID_DEVICE_EXTENSION DeviceExtension)
+{
PIO_STACK_LOCATION IoStack;
NTSTATUS Status;
-
- /* get device extension */
- DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
/* re-use irp */
IoReuseIrp(DeviceExtension->Irp, STATUS_SUCCESS);
@@ -255,6 +263,9 @@
/* set completion routine */
IoSetCompletionRoutine(DeviceExtension->Irp, MouHid_ReadCompletion,
DeviceExtension, TRUE, TRUE, TRUE);
+ /* read is active */
+ DeviceExtension->ReadReportActive = TRUE;
+
/* start the read */
Status = IoCallDriver(DeviceExtension->NextDeviceObject,
DeviceExtension->Irp);
@@ -323,18 +334,23 @@
if (DeviceExtension->FileObject == NULL)
{
/* did the caller specify correct attributes */
- if (IoStack->Parameters.Create.FileAttributes & FILE_ATTRIBUTE_READONLY)
+ ASSERT(IoStack->Parameters.Create.SecurityContext);
+ if (IoStack->Parameters.Create.SecurityContext->DesiredAccess)
{
/* store file object */
DeviceExtension->FileObject = IoStack->FileObject;
+ /* reset event */
+ KeResetEvent(&DeviceExtension->ReadCompletionEvent);
+
/* initiating read */
- Status = MouHid_InitiateRead(DeviceObject);
- }
- else
- {
- /* wrong mode */
- DPRINT1("MOUHID: wrong attributes: %x\n",
IoStack->Parameters.Create.FileAttributes);
+ Status = MouHid_InitiateRead(DeviceExtension);
+ DPRINT1("[MOUHID] MouHid_InitiateRead: status %x\n", Status);
+ if (Status == STATUS_PENDING)
+ {
+ /* report irp is pending */
+ Status = STATUS_SUCCESS;
+ }
}
}
@@ -356,7 +372,21 @@
/* get device extension */
DeviceExtension = (PMOUHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- /* FIXME: cancel irp */
+ DPRINT("[MOUHID] IRP_MJ_CLOSE ReadReportActive %x\n",
DeviceExtension->ReadReportActive);
+
+ if (DeviceExtension->ReadReportActive)
+ {
+ /* request stopping of the report cycle */
+ DeviceExtension->StopReadReport = TRUE;
+
+ /* wait until the reports have been read */
+ KeWaitForSingleObject(&DeviceExtension->ReadCompletionEvent, Executive,
KernelMode, FALSE, NULL);
+
+ /* cancel irp */
+ IoCancelIrp(DeviceExtension->Irp);
+ }
+
+ DPRINT("[MOUHID] IRP_MJ_CLOSE ReadReportActive %x\n",
DeviceExtension->ReadReportActive);
/* remove file object */
DeviceExtension->FileObject = NULL;
@@ -572,22 +602,25 @@
if (!NT_SUCCESS(Status))
{
/* failed to query collection information */
+ DPRINT1("[MOUHID] failed to obtain collection information with %x\n",
Status);
return Status;
}
/* lets allocate space for preparsed data */
PreparsedData = ExAllocatePool(NonPagedPool, Information.DescriptorSize);
- if (PreparsedData)
+ if (!PreparsedData)
{
/* no memory */
+ DPRINT1("[MOUHID] no memory size %u\n", Information.DescriptorSize);
return STATUS_INSUFFICIENT_RESOURCES;
}
/* now obtain the preparsed data */
- Status = MouHid_SubmitRequest(DeviceObject, IOCTL_HID_GET_DRIVER_CONFIG, 0, NULL,
Information.DescriptorSize, PreparsedData);
+ Status = MouHid_SubmitRequest(DeviceObject, IOCTL_HID_GET_COLLECTION_DESCRIPTOR, 0,
NULL, Information.DescriptorSize, PreparsedData);
if (!NT_SUCCESS(Status))
{
/* failed to get preparsed data */
+ DPRINT1("[MOUHID] failed to obtain collection information with %x\n",
Status);
ExFreePool(PreparsedData);
return Status;
}
@@ -597,9 +630,12 @@
if (!NT_SUCCESS(Status))
{
/* failed to get capabilities */
+ DPRINT1("[MOUHID] failed to obtain caps with %x\n", Status);
ExFreePool(PreparsedData);
return Status;
}
+
+ DPRINT1("[MOUHID] Usage %x UsagePage %x\n", Capabilities.Usage,
Capabilities.UsagePage, Capabilities.InputReportByteLength);
/* verify capabilities */
if (Capabilities.Usage != HID_USAGE_GENERIC_POINTER && Capabilities.Usage !=
HID_USAGE_GENERIC_MOUSE || Capabilities.UsagePage != HID_USAGE_PAGE_GENERIC)
@@ -615,12 +651,17 @@
DeviceExtension->Report = (PUCHAR)ExAllocatePool(NonPagedPool,
DeviceExtension->ReportLength);
ASSERT(DeviceExtension->Report);
RtlZeroMemory(DeviceExtension->Report, DeviceExtension->ReportLength);
+
+ /* build mdl */
DeviceExtension->ReportMDL = IoAllocateMdl(DeviceExtension->Report,
DeviceExtension->ReportLength, FALSE, FALSE, NULL);
ASSERT(DeviceExtension->ReportMDL);
+ /* init mdl */
+ MmBuildMdlForNonPagedPool(DeviceExtension->ReportMDL);
/* get max number of buttons */
Buttons = HidP_MaxUsageListLength(HidP_Input, HID_USAGE_PAGE_BUTTON, PreparsedData);
+ DPRINT1("[MOUHID] Buttons %lu\n", Buttons);
ASSERT(Buttons > 0);
/* now allocate an array for those buttons */
@@ -662,6 +703,7 @@
/* mouse has wheel support */
DeviceExtension->MouseIdentifier = WHEELMOUSE_HID_HARDWARE;
DeviceExtension->WheelUsagePage = ValueCaps.UsagePage;
+ DPRINT1("[MOUHID] mouse wheel support detected\n", Status);
}
else
{
@@ -673,6 +715,7 @@
/* wheel support */
DeviceExtension->MouseIdentifier = WHEELMOUSE_HID_HARDWARE;
DeviceExtension->WheelUsagePage = ValueCaps.UsagePage;
+ DPRINT1("[MOUHID] mouse wheel support detected with z-axis\n",
Status);
}
}
@@ -827,7 +870,7 @@
DeviceExtension->MouseIdentifier = MOUSE_HID_HARDWARE;
DeviceExtension->WheelUsagePage = 0;
DeviceExtension->NextDeviceObject = NextDeviceObject;
- KeInitializeEvent(&DeviceExtension->Event, NotificationEvent, FALSE);
+ KeInitializeEvent(&DeviceExtension->ReadCompletionEvent, NotificationEvent,
FALSE);
DeviceExtension->Irp = IoAllocateIrp(NextDeviceObject->StackSize, FALSE);
/* FIXME handle allocation error */
Modified: branches/usb-bringup/drivers/hid/mouhid/mouhid.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/hid/mouhid/…
==============================================================================
--- branches/usb-bringup/drivers/hid/mouhid/mouhid.h [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/hid/mouhid/mouhid.h [iso-8859-1] Wed Dec 28 16:35:41
2011
@@ -8,6 +8,7 @@
#include <debug.h>
#include <ntddmou.h>
#include <kbdmou.h>
+#include <debug.h>
typedef struct
@@ -25,7 +26,7 @@
//
// event
//
- KEVENT Event;
+ KEVENT ReadCompletionEvent;
//
// device object for class callback
@@ -97,9 +98,19 @@
//
PFILE_OBJECT FileObject;
+ //
+ // report read is active
+ //
+ UCHAR ReadReportActive;
+
+ //
+ // stop reading flag
+ //
+ UCHAR StopReadReport;
+
}MOUHID_DEVICE_EXTENSION, *PMOUHID_DEVICE_EXTENSION;
NTSTATUS
MouHid_InitiateRead(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PMOUHID_DEVICE_EXTENSION DeviceExtension);