hw/usb/wacom: Add missing HID descriptor
PATCH 1/1 hw/usb/wacom: Add missing HID descriptor
The USB wacom device is missing a HID descriptor which causes it to fail to operate with recent kernels (e.g. 3.17).
This patch adds a HID desriptor to the device, based upon one from real wacom device and allows the device to work properly again.
Signed-off-by Richard Purdie <[email protected]>
hw/usb/dev-wacom.c +93 -1
@@ -68,6 +68,89 @@ [STR_SERIALNUMBER] = "1", }; +static const uint8_t qemu_tablet_hid_report_descriptor[] = { +0x05 ,0x01 ,/* Usage Page (Generic Desktop) */ +0x09 ,0x02 ,/* Usage (Mouse) */ +0xa1 ,0x01 ,/* Collection (Application) */ +0x85 ,0x01 ,/* Report ID (1) */ +0x09 ,0x01 ,/* Usage (Pointer) */ +0xa1 ,0x00 ,/* Collection (Physical) */ +0x05 ,0x09 ,/* Usage Page (Button) */ +0x19 ,0x01 ,/* Usage Minimum (1) */ +0x29 ,0x05 ,/* Usage Maximum (5) */ +0x15 ,0x00 ,/* Logical Minimum (0) */ +0x25 ,0x01 ,/* Logical Maximum (1) */ +0x95 ,0x05 ,/* Report Count (5) */ +0x75 ,0x01 ,/* Report Size (1) */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0x95 ,0x01 ,/* Report Count (1) */ +0x75 ,0x03 ,/* Report Size (3) */ +0x81 ,0x01 ,/* Input (Constant) */ +0x05 ,0x01 ,/* Usage Page (Generic Desktop) */ +0x09 ,0x30 ,/* Usage (X) */ +0x09 ,0x31 ,/* Usage (Y) */ +0x15 ,0x81 ,/* Logical Minimum (-127) */ +0x25 ,0x7f ,/* Logical Maximum (127) */ +0x75 ,0x08 ,/* Report Size (8) */ +0x95 ,0x02 ,/* Report Count (2) */ +0x81 ,0x06 ,/* Input (Data, Variable, Relative) */ +0xc0 ,/* End Collection */ +0xc0 ,/* End Collection */ +0x05 ,0x0d ,/* Usage Page (Digitizer) */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0xa1 ,0x01 ,/* Collection (Application) */ +0x85 ,0x02 ,/* Report ID (2) */ +0xa1 ,0x00 ,/* Collection (Physical) */ +0x06 ,0x00 ,0xff ,/* Usage Page (Vendor 0xff00) */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0x15 ,0x00 ,/* Logical Minimum (0) */ +0x26 ,0xff ,0x00 ,/* Logical Maximum (255) */ +0x75 ,0x08 ,/* Report Size (8) */ +0x95 ,0x08 ,/* Report Count (8) */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0xc0 ,/* End Collection */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0x85 ,0x02 ,/* Report ID (2) */ +0x95 ,0x01 ,/* Report Count (1) */ +0xb1 ,0x02 ,/* FEATURE (2) */ +0xc0 ,/* End Collection */ +0x06 ,0x00 ,0xff ,/* Usage Page (Vendor 0xff00) */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0xa1 ,0x01 ,/* Collection (Application) */ +0x85 ,0x02 ,/* Report ID (2) */ +0x05 ,0x0d ,/* Usage Page (Digitizer) */ +0x09 ,0x22 ,/* Usage (Finger) */ +0xa1 ,0x00 ,/* Collection (Physical) */ +0x06 ,0x00 ,0xff ,/* Usage Page (Vendor 0xff00) */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0x15 ,0x00 ,/* Logical Minimum (0) */ +0x26 ,0xff ,0x00 ,/* Logical Maximum */ +0x75 ,0x08 ,/* Report Size (8) */ +0x95 ,0x02 ,/* Report Count (2) */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0x05 ,0x01 ,/* Usage Page (Generic Desktop) */ +0x09 ,0x30 ,/* Usage (X) */ +0x35 ,0x00 ,/* Physical Minimum */ +0x46 ,0xe0 ,0x2e ,/* Physical Maximum */ +0x26 ,0xe0 ,0x01 ,/* Logical Maximum */ +0x75 ,0x10 ,/* Report Size (16) */ +0x95 ,0x01 ,/* Report Count (1) */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0x09 ,0x31 ,/* Usage (Y) */ +0x46 ,0x40 ,0x1f ,/* Physical Maximum */ +0x26 ,0x40 ,0x01 ,/* Logical Maximum */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0x06 ,0x00 ,0xff ,/* Usage Page (Vendor 0xff00) */ +0x09 ,0x01 ,/* Usage (Digitizer) */ +0x26 ,0xff ,0x00 ,/* Logical Maximum */ +0x75 ,0x08 ,/* Report Size (8) */ +0x95 ,0x0d ,/* Report Count (13) */ +0x81 ,0x02 ,/* Input (Data, Variable, Absolute) */ +0xc0 ,/* End Collection */ +0xc0 ,/* End Collection */ +}; + +static const USBDescIface desc_iface_wacom = { .bInterfaceNumber =0 , .bNumEndpoints =1 ,
@@ -85,7 +168,7 @@ 0x00, /* u8 country_code */ 0x01, /* u8 num_descriptors */ 0x22, /* u8 type: Report */ - 0x6e, 0, /* u16 len */ + sizeof(qemu_tablet_hid_report_descriptor), 0, /* u16 len */ }, }, },
@@ -265,6 +350,15 @@ }switch (request) { +case InterfaceRequest |USB_REQ_GET_DESCRIPTOR : +switch (value >>8 ) { +case 0x22 : +memcpy (data, qemu_tablet_hid_report_descriptor, +sizeof (qemu_tablet_hid_report_descriptor)); + p->actual_length =sizeof (qemu_tablet_hid_report_descriptor); +break ; + } +break ;case WACOM_SET_REPORT :if (s->mouse_grabbed) {qemu_remove_mouse_event_handler (s->eh_entry);