aboutsummaryrefslogtreecommitdiff
path: root/drivers/hid/hid-uclogic.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-uclogic.c')
-rw-r--r--drivers/hid/hid-uclogic.c586
1 files changed, 309 insertions, 277 deletions
diff --git a/drivers/hid/hid-uclogic.c b/drivers/hid/hid-uclogic.c
index 05fdc85a76e..fb8b516ff0e 100644
--- a/drivers/hid/hid-uclogic.c
+++ b/drivers/hid/hid-uclogic.c
@@ -14,145 +14,21 @@
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
+#include <linux/usb.h>
#include "hid-ids.h"
/*
- * The original descriptors of WPXXXXU tablets have three report IDs, of
- * which only two are used (8 and 9), and the remaining (7) seems to have
- * the originally intended pen description which was abandoned for some
- * reason. From this unused description it is possible to extract the
- * actual physical extents and resolution. All the models use the same
- * descriptor with different extents for the unused report ID.
- *
- * Here it is:
- *
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Pen), ; Pen (02h, application collection)
- * Collection (Application),
- * Report ID (7),
- * Usage (Stylus), ; Stylus (20h, logical collection)
- * Collection (Physical),
- * Usage (Tip Switch), ; Tip switch (42h, momentary control)
- * Usage (Barrel Switch), ; Barrel switch (44h, momentary control)
- * Usage (Eraser), ; Eraser (45h, momentary control)
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Size (1),
- * Report Count (3),
- * Input (Variable),
- * Report Count (3),
- * Input (Constant, Variable),
- * Usage (In Range), ; In range (32h, momentary control)
- * Report Count (1),
- * Input (Variable),
- * Report Count (1),
- * Input (Constant, Variable),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Report Size (16),
- * Report Count (1),
- * Push,
- * Unit Exponent (13),
- * Unit (Inch^3),
- * Physical Minimum (0),
- * Physical Maximum (Xpm),
- * Logical Maximum (Xlm),
- * Input (Variable),
- * Usage (Y), ; Y (31h, dynamic value)
- * Physical Maximum (Ypm),
- * Logical Maximum (Ylm),
- * Input (Variable),
- * Pop,
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
- * Logical Maximum (1023),
- * Input (Variable),
- * Report Size (16),
- * End Collection,
- * End Collection,
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (Mouse), ; Mouse (02h, application collection)
- * Collection (Application),
- * Report ID (8),
- * Usage (Pointer), ; Pointer (01h, physical collection)
- * Collection (Physical),
- * Usage Page (Button), ; Button (09h)
- * Usage Minimum (01h),
- * Usage Maximum (03h),
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Count (3),
- * Report Size (1),
- * Input (Variable),
- * Report Count (5),
- * Input (Constant),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Usage (Y), ; Y (31h, dynamic value)
- * Usage (Wheel), ; Wheel (38h, dynamic value)
- * Usage (00h),
- * Logical Minimum (-127),
- * Logical Maximum (127),
- * Report Size (8),
- * Report Count (4),
- * Input (Variable, Relative),
- * End Collection,
- * End Collection,
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (Mouse), ; Mouse (02h, application collection)
- * Collection (Application),
- * Report ID (9),
- * Usage (Pointer), ; Pointer (01h, physical collection)
- * Collection (Physical),
- * Usage Page (Button), ; Button (09h)
- * Usage Minimum (01h),
- * Usage Maximum (03h),
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Count (3),
- * Report Size (1),
- * Input (Variable),
- * Report Count (5),
- * Input (Constant),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Usage (Y), ; Y (31h, dynamic value)
- * Logical Minimum (0),
- * Logical Maximum (32767),
- * Physical Minimum (0),
- * Physical Maximum (32767),
- * Report Count (2),
- * Report Size (16),
- * Input (Variable),
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
- * Logical Maximum (1023),
- * Report Count (1),
- * Report Size (16),
- * Input (Variable),
- * End Collection,
- * End Collection
- *
- * Here are the extents values for the WPXXXXU models:
- *
- * Xpm Xlm Ypm Ylm
- * WP4030U 4000 8000 3000 6000
- * WP5540U 5500 11000 4000 8000
- * WP8060U 8000 16000 6000 12000
- *
- * This suggests that all of them have 2000 LPI resolution, as advertised.
+ * See WPXXXXU model descriptions, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP4030U
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP5540U
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP8060U
*/
/* Size of the original descriptor of WPXXXXU tablets */
#define WPXXXXU_RDESC_ORIG_SIZE 212
-/*
- * Fixed WP4030U report descriptor.
- * Although the hardware might actually support it, the mouse description
- * has been removed, since there seems to be no devices having one and it
- * wouldn't make much sense because of the working area size.
- */
+/* Fixed WP4030U report descriptor */
static __u8 wp4030u_rdesc_fixed[] = {
0x05, 0x0D, /* Usage Page (Digitizer), */
0x09, 0x02, /* Usage (Pen), */
@@ -343,146 +219,67 @@ static __u8 wp8060u_rdesc_fixed[] = {
};
/*
- * Original PF1209 report descriptor.
- *
- * The descriptor is similar to WPXXXXU descriptors, with an addition of a
- * feature report (ID 4) of unknown purpose.
- *
- * Although the advertised resolution is 4000 LPI the unused report ID
- * (taken from WPXXXXU, it seems) states 2000 LPI, but it is probably
- * incorrect and is a result of blind copying without understanding. Anyway
- * the real logical extents are always scaled to 0..32767, which IMHO spoils
- * the precision.
- *
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Pen), ; Pen (02h, application collection)
- * Collection (Application),
- * Report ID (7),
- * Usage (Stylus), ; Stylus (20h, logical collection)
- * Collection (Physical),
- * Usage (Tip Switch), ; Tip switch (42h, momentary control)
- * Usage (Barrel Switch), ; Barrel switch (44h, momentary control)
- * Usage (Eraser), ; Eraser (45h, momentary control)
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Size (1),
- * Report Count (3),
- * Input (Variable),
- * Report Count (3),
- * Input (Constant, Variable),
- * Usage (In Range), ; In range (32h, momentary control)
- * Report Count (1),
- * Input (Variable),
- * Report Count (1),
- * Input (Constant, Variable),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Report Size (16),
- * Report Count (1),
- * Push,
- * Unit Exponent (13),
- * Unit (Inch^3),
- * Physical Minimum (0),
- * Physical Maximum (12000),
- * Logical Maximum (24000),
- * Input (Variable),
- * Usage (Y), ; Y (31h, dynamic value)
- * Physical Maximum (9000),
- * Logical Maximum (18000),
- * Input (Variable),
- * Pop,
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
- * Logical Maximum (1023),
- * Input (Variable),
- * Report Size (16),
- * End Collection,
- * End Collection,
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (Mouse), ; Mouse (02h, application collection)
- * Collection (Application),
- * Report ID (8),
- * Usage (Pointer), ; Pointer (01h, physical collection)
- * Collection (Physical),
- * Usage Page (Button), ; Button (09h)
- * Usage Minimum (01h),
- * Usage Maximum (03h),
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Count (3),
- * Report Size (1),
- * Input (Variable),
- * Report Count (5),
- * Input (Constant),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Usage (Y), ; Y (31h, dynamic value)
- * Usage (Wheel), ; Wheel (38h, dynamic value)
- * Usage (00h),
- * Logical Minimum (-127),
- * Logical Maximum (127),
- * Report Size (8),
- * Report Count (4),
- * Input (Variable, Relative),
- * End Collection,
- * End Collection,
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (Mouse), ; Mouse (02h, application collection)
- * Collection (Application),
- * Report ID (9),
- * Usage (Pointer), ; Pointer (01h, physical collection)
- * Collection (Physical),
- * Usage Page (Button), ; Button (09h)
- * Usage Minimum (01h),
- * Usage Maximum (03h),
- * Logical Minimum (0),
- * Logical Maximum (1),
- * Report Count (3),
- * Report Size (1),
- * Input (Variable),
- * Report Count (5),
- * Input (Constant),
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (X), ; X (30h, dynamic value)
- * Usage (Y), ; Y (31h, dynamic value)
- * Logical Minimum (0),
- * Logical Maximum (32767),
- * Physical Minimum (0),
- * Physical Maximum (32767),
- * Report Count (2),
- * Report Size (16),
- * Input (Variable),
- * Usage Page (Digitizer), ; Digitizer (0Dh)
- * Usage (Tip Pressure), ; Tip pressure (30h, dynamic value)
- * Logical Maximum (1023),
- * Report Count (1),
- * Report Size (16),
- * Input (Variable),
- * End Collection,
- * End Collection,
- * Usage Page (Desktop), ; Generic desktop controls (01h)
- * Usage (00h),
- * Collection (Application),
- * Report ID (4),
- * Logical Minimum (0),
- * Logical Maximum (255),
- * Usage (00h),
- * Report Size (8),
- * Report Count (3),
- * Feature (Variable),
- * End Collection
+ * See WP1062 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_WP1062
*/
-/* Size of the original descriptor of PF1209 tablet */
-#define PF1209_RDESC_ORIG_SIZE 234
+/* Size of the original descriptor of WP1062 tablet */
+#define WP1062_RDESC_ORIG_SIZE 254
+
+/* Fixed WP1062 report descriptor */
+static __u8 wp1062_rdesc_fixed[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x04, /* Report Count (4), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x09, 0x32, /* Usage (In Range), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x14, /* Logical Minimum (0), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0x10, 0x27, /* Physical Maximum (10000), */
+ 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0xB7, 0x19, /* Physical Maximum (6583), */
+ 0x26, 0x6E, 0x33, /* Logical Maximum (13166), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
/*
- * Fixed PF1209 report descriptor
- *
- * The descriptor is fixed similarly to WP5540U and WP8060U, plus the
- * feature report is removed, because its purpose is unknown and it is of no
- * use to the generic HID driver anyway for now.
+ * See PF1209 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_PF1209
*/
+
+/* Size of the original descriptor of PF1209 tablet */
+#define PF1209_RDESC_ORIG_SIZE 234
+
+/* Fixed PF1209 report descriptor */
static __u8 pf1209_rdesc_fixed[] = {
0x05, 0x0D, /* Usage Page (Digitizer), */
0x09, 0x02, /* Usage (Pen), */
@@ -556,9 +353,205 @@ static __u8 pf1209_rdesc_fixed[] = {
0xC0 /* End Collection */
};
+/*
+ * See TWHL850 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Wireless_Tablet_TWHL850
+ */
+
+/* Size of the original descriptors of TWHL850 tablet */
+#define TWHL850_RDESC_ORIG_SIZE0 182
+#define TWHL850_RDESC_ORIG_SIZE1 161
+#define TWHL850_RDESC_ORIG_SIZE2 92
+
+/* Fixed PID 0522 tablet report descriptor, interface 0 (stylus) */
+static __u8 twhl850_rdesc_fixed0[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x81, 0x03, /* Input (Constant, Variable), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x09, 0x32, /* Usage (In Range), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x81, 0x03, /* Input (Constant, Variable), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */
+ 0x26, 0x00, 0x7D, /* Logical Maximum (32000), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0x88, 0x13, /* Physical Maximum (5000), */
+ 0x26, 0x20, 0x4E, /* Logical Maximum (20000), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+/* Fixed PID 0522 tablet report descriptor, interface 1 (mouse) */
+static __u8 twhl850_rdesc_fixed1[] = {
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x02, /* Usage (Mouse), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x01, /* Report ID (1), */
+ 0x09, 0x01, /* Usage (Pointer), */
+ 0xA0, /* Collection (Physical), */
+ 0x05, 0x09, /* Usage Page (Button), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x19, 0x01, /* Usage Minimum (01h), */
+ 0x29, 0x03, /* Usage Maximum (03h), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x05, /* Report Count (5), */
+ 0x81, 0x03, /* Input (Constant, Variable), */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x16, 0x00, 0x80, /* Logical Minimum (-32768), */
+ 0x26, 0xFF, 0x7F, /* Logical Maximum (32767), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x02, /* Report Count (2), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x09, 0x38, /* Usage (Wheel), */
+ 0x15, 0xFF, /* Logical Minimum (-1), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x75, 0x08, /* Report Size (8), */
+ 0x81, 0x06, /* Input (Variable, Relative), */
+ 0x81, 0x03, /* Input (Constant, Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+/* Fixed PID 0522 tablet report descriptor, interface 2 (frame buttons) */
+static __u8 twhl850_rdesc_fixed2[] = {
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x06, /* Usage (Keyboard), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x03, /* Report ID (3), */
+ 0x05, 0x07, /* Usage Page (Keyboard), */
+ 0x14, /* Logical Minimum (0), */
+ 0x19, 0xE0, /* Usage Minimum (KB Leftcontrol), */
+ 0x29, 0xE7, /* Usage Maximum (KB Right GUI), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x95, 0x08, /* Report Count (8), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x18, /* Usage Minimum (None), */
+ 0x29, 0xFF, /* Usage Maximum (FFh), */
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
+ 0x75, 0x08, /* Report Size (8), */
+ 0x95, 0x06, /* Report Count (6), */
+ 0x80, /* Input, */
+ 0xC0 /* End Collection */
+};
+
+/*
+ * See TWHA60 description, device and HID report descriptors at
+ * http://sf.net/apps/mediawiki/digimend/?title=UC-Logic_Tablet_TWHA60
+ */
+
+/* Size of the original descriptors of TWHA60 tablet */
+#define TWHA60_RDESC_ORIG_SIZE0 254
+#define TWHA60_RDESC_ORIG_SIZE1 139
+
+/* Fixed TWHA60 report descriptor, interface 0 (stylus) */
+static __u8 twha60_rdesc_fixed0[] = {
+ 0x05, 0x0D, /* Usage Page (Digitizer), */
+ 0x09, 0x02, /* Usage (Pen), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x09, /* Report ID (9), */
+ 0x09, 0x20, /* Usage (Stylus), */
+ 0xA0, /* Collection (Physical), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x09, 0x42, /* Usage (Tip Switch), */
+ 0x09, 0x44, /* Usage (Barrel Switch), */
+ 0x09, 0x46, /* Usage (Tablet Pick), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x95, 0x03, /* Report Count (3), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x04, /* Report Count (4), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x09, 0x32, /* Usage (In Range), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x75, 0x10, /* Report Size (16), */
+ 0x95, 0x01, /* Report Count (1), */
+ 0x14, /* Logical Minimum (0), */
+ 0xA4, /* Push, */
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x55, 0xFD, /* Unit Exponent (-3), */
+ 0x65, 0x13, /* Unit (Inch), */
+ 0x34, /* Physical Minimum (0), */
+ 0x09, 0x30, /* Usage (X), */
+ 0x46, 0x10, 0x27, /* Physical Maximum (10000), */
+ 0x27, 0x3F, 0x9C,
+ 0x00, 0x00, /* Logical Maximum (39999), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x09, 0x31, /* Usage (Y), */
+ 0x46, 0x6A, 0x18, /* Physical Maximum (6250), */
+ 0x26, 0xA7, 0x61, /* Logical Maximum (24999), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xB4, /* Pop, */
+ 0x09, 0x30, /* Usage (Tip Pressure), */
+ 0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0xC0, /* End Collection, */
+ 0xC0 /* End Collection */
+};
+
+/* Fixed TWHA60 report descriptor, interface 1 (frame buttons) */
+static __u8 twha60_rdesc_fixed1[] = {
+ 0x05, 0x01, /* Usage Page (Desktop), */
+ 0x09, 0x06, /* Usage (Keyboard), */
+ 0xA1, 0x01, /* Collection (Application), */
+ 0x85, 0x05, /* Report ID (5), */
+ 0x05, 0x07, /* Usage Page (Keyboard), */
+ 0x14, /* Logical Minimum (0), */
+ 0x25, 0x01, /* Logical Maximum (1), */
+ 0x75, 0x01, /* Report Size (1), */
+ 0x95, 0x08, /* Report Count (8), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0x95, 0x0C, /* Report Count (12), */
+ 0x19, 0x3A, /* Usage Minimum (KB F1), */
+ 0x29, 0x45, /* Usage Maximum (KB F12), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x0C, /* Report Count (12), */
+ 0x19, 0x68, /* Usage Minimum (KB F13), */
+ 0x29, 0x73, /* Usage Maximum (KB F24), */
+ 0x81, 0x02, /* Input (Variable), */
+ 0x95, 0x08, /* Report Count (8), */
+ 0x81, 0x01, /* Input (Constant), */
+ 0xC0 /* End Collection */
+};
+
static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
unsigned int *rsize)
{
+ struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
+ __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
+
switch (hdev->product) {
case USB_DEVICE_ID_UCLOGIC_TABLET_PF1209:
if (*rsize == PF1209_RDESC_ORIG_SIZE) {
@@ -584,6 +577,50 @@ static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
*rsize = sizeof(wp8060u_rdesc_fixed);
}
break;
+ case USB_DEVICE_ID_UCLOGIC_TABLET_WP1062:
+ if (*rsize == WP1062_RDESC_ORIG_SIZE) {
+ rdesc = wp1062_rdesc_fixed;
+ *rsize = sizeof(wp1062_rdesc_fixed);
+ }
+ break;
+ case USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850:
+ switch (iface_num) {
+ case 0:
+ if (*rsize == TWHL850_RDESC_ORIG_SIZE0) {
+ rdesc = twhl850_rdesc_fixed0;
+ *rsize = sizeof(twhl850_rdesc_fixed0);
+ }
+ break;
+ case 1:
+ if (*rsize == TWHL850_RDESC_ORIG_SIZE1) {
+ rdesc = twhl850_rdesc_fixed1;
+ *rsize = sizeof(twhl850_rdesc_fixed1);
+ }
+ break;
+ case 2:
+ if (*rsize == TWHL850_RDESC_ORIG_SIZE2) {
+ rdesc = twhl850_rdesc_fixed2;
+ *rsize = sizeof(twhl850_rdesc_fixed2);
+ }
+ break;
+ }
+ break;
+ case USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60:
+ switch (iface_num) {
+ case 0:
+ if (*rsize == TWHA60_RDESC_ORIG_SIZE0) {
+ rdesc = twha60_rdesc_fixed0;
+ *rsize = sizeof(twha60_rdesc_fixed0);
+ }
+ break;
+ case 1:
+ if (*rsize == TWHA60_RDESC_ORIG_SIZE1) {
+ rdesc = twha60_rdesc_fixed1;
+ *rsize = sizeof(twha60_rdesc_fixed1);
+ }
+ break;
+ }
+ break;
}
return rdesc;
@@ -598,6 +635,12 @@ static const struct hid_device_id uclogic_devices[] = {
USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC,
+ USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
{ }
};
MODULE_DEVICE_TABLE(hid, uclogic_devices);
@@ -607,17 +650,6 @@ static struct hid_driver uclogic_driver = {
.id_table = uclogic_devices,
.report_fixup = uclogic_report_fixup,
};
+module_hid_driver(uclogic_driver);
-static int __init uclogic_init(void)
-{
- return hid_register_driver(&uclogic_driver);
-}
-
-static void __exit uclogic_exit(void)
-{
- hid_unregister_driver(&uclogic_driver);
-}
-
-module_init(uclogic_init);
-module_exit(uclogic_exit);
MODULE_LICENSE("GPL");