diff --git a/drivers/hid/hidusb/hidusb.c b/drivers/hid/hidusb/hidusb.c index 88265c1d3c4..69a52153ca7 100644 --- a/drivers/hid/hidusb/hidusb.c +++ b/drivers/hid/hidusb/hidusb.c @@ -1230,6 +1230,72 @@ Hid_SelectConfiguration( return Status; } +NTSTATUS +Hid_SetIdle( + IN PDEVICE_OBJECT DeviceObject) +{ + PHID_USB_DEVICE_EXTENSION HidDeviceExtension; + PHID_DEVICE_EXTENSION DeviceExtension; + PURB Urb; + NTSTATUS Status; + + // + // get device extension + // + DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension; + + // + // allocate urb + // + Urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)); + if (!Urb) + { + // + // no memory + // + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // zero urb + // + RtlZeroMemory(Urb, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)); + + // + // format urb + // + UsbBuildVendorRequest(Urb, + URB_FUNCTION_CLASS_INTERFACE, + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), + 0, + HID_REPORT_DESCRIPTOR_TYPE, + USB_SET_IDLE_REQUEST, // HID_SET_IDLE + 0, + 0, + NULL, + NULL, + 0, + NULL); + + // + // dispatch urb + // + Status = Hid_DispatchUrb(DeviceObject, Urb); + + // + // free urb + // + ExFreePool(Urb); + + // + // print status + // + DPRINT1("Status %x\n", Status); + return Status; +} + + NTSTATUS Hid_PnpStart( @@ -1333,6 +1399,12 @@ Hid_PnpStart( ASSERT(InterfaceDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE); ASSERT(InterfaceDescriptor->bLength == sizeof(USB_INTERFACE_DESCRIPTOR)); + // + // now set the device idle + // + Hid_SetIdle(DeviceObject); + + // // move to next descriptor // diff --git a/drivers/hid/hidusb/hidusb.h b/drivers/hid/hidusb/hidusb.h index 02eb640cbac..84e50cf8ff3 100644 --- a/drivers/hid/hidusb/hidusb.h +++ b/drivers/hid/hidusb/hidusb.h @@ -12,6 +12,8 @@ #include #include +#include + typedef struct { // @@ -80,3 +82,5 @@ NTSTATUS Hid_DispatchUrb( IN PDEVICE_OBJECT DeviceObject, IN PURB Urb); + +#define USB_SET_IDLE_REQUEST 0xA diff --git a/drivers/usb/usbohci/hub_controller.cpp b/drivers/usb/usbohci/hub_controller.cpp index 54726de4eef..02e96cba674 100644 --- a/drivers/usb/usbohci/hub_controller.cpp +++ b/drivers/usb/usbohci/hub_controller.cpp @@ -1731,7 +1731,10 @@ CHubController::HandleClassInterface( if (Urb->UrbControlVendorClassRequest.TransferBufferLength == 0) { - DPRINT1("Invalid request length\n"); + // + // FIXME: support requests w/o data stage + //; + ASSERT(FALSE); return STATUS_SUCCESS; } diff --git a/include/ddk/hidport.h b/include/ddk/hidport.h index 078f58ea9b5..e6819e9b52d 100644 --- a/include/ddk/hidport.h +++ b/include/ddk/hidport.h @@ -47,6 +47,11 @@ typedef struct _HID_DESCRIPTOR #include +#define HID_HID_DESCRIPTOR_TYPE 0x21 +#define HID_REPORT_DESCRIPTOR_TYPE 0x22 +#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23 + + typedef VOID