From b8cd2d963da57aba55afd7f57546e3bb69e9a2c1 Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 7 Feb 2023 12:33:14 +0800 Subject: [PATCH 1/5] HID: kye: Rewrite tablet descriptor fixup routine Genius digitizer tablets send incorrect (vendor-defined) report descriptors by default. Descriptors for several models were added to override original ones. Since they share the same structure and are handled by the same Windows driver routine, extract the descriptor template and dynamic parameters for easier new device adoption. Signed-off-by: David Yang Signed-off-by: Jiri Kosina --- drivers/hid/hid-kye.c | 114 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 12 deletions(-) diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index da903138eee4..d8ac16bdb094 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -5,11 +5,10 @@ * Copyright (c) 2009 Jiri Kosina * Copyright (c) 2009 Tomas Hanak * Copyright (c) 2012 Nikolai Kondrashov + * Copyright (c) 2023 David Yang */ -/* - */ - +#include #include #include #include @@ -554,8 +553,25 @@ static __u8 easypen_m406xe_rdesc_fixed[] = { 0xC0 /* End Collection */ }; +static const struct kye_tablet_info { + __u32 product; + __s32 x_logical_maximum; + __s32 y_logical_maximum; + __s32 pressure_logical_maximum; + __s32 x_physical_maximum; + __s32 y_physical_maximum; + __s8 unit_exponent; + __s8 unit; + bool has_punk; + unsigned int control_rsize; + const __u8 *control_rdesc; +} kye_tablets_info[] = { + {} +}; + static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, - unsigned int *rsize, int offset, const char *device_name) { + unsigned int *rsize, int offset, const char *device_name) +{ /* * the fixup that need to be done: * - change Usage Maximum in the Consumer Control @@ -574,6 +590,79 @@ static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } +/* + * Fix tablet descriptor of so-called "DataFormat 2". + * + * Though we may achieve a usable descriptor from original vendor-defined one, + * some problems exist: + * - Their Logical Maximum never exceed 32767 (7F FF), though device do report + * values greater than that; + * - Physical Maximums are arbitrarily filled (always equal to Logical + * Maximum); + * - Detail for control buttons are not provided (a vendor-defined Usage Page + * with fixed content). + * + * Thus we use a pre-defined parameter table rather than digging it from + * original descriptor. + * + * We may as well write a fallback routine for unrecognized kye tablet, but it's + * clear kye are unlikely to produce new models in the foreseeable future, so we + * simply enumerate all possible models. + */ +static __u8 *kye_tablet_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) +{ + const struct kye_tablet_info *info; + unsigned int newsize; + + if (*rsize < sizeof(kye_tablet_rdesc)) { + hid_warn(hdev, + "tablet report size too small, or kye_tablet_rdesc unexpectedly large\n"); + return rdesc; + } + + for (info = kye_tablets_info; info->product; info++) { + if (hdev->product == info->product) + break; + } + + if (!info->product) { + hid_err(hdev, "tablet unknown, someone forget to add kye_tablet_info entry?\n"); + return rdesc; + } + + newsize = info->has_punk ? sizeof(kye_tablet_rdesc) : 112; + memcpy(rdesc, kye_tablet_rdesc, newsize); + + put_unaligned_le32(info->x_logical_maximum, rdesc + 66); + put_unaligned_le32(info->x_physical_maximum, rdesc + 72); + rdesc[77] = info->unit; + rdesc[79] = info->unit_exponent; + put_unaligned_le32(info->y_logical_maximum, rdesc + 87); + put_unaligned_le32(info->y_physical_maximum, rdesc + 92); + put_unaligned_le32(info->pressure_logical_maximum, rdesc + 104); + + if (info->has_punk) { + put_unaligned_le32(info->x_logical_maximum, rdesc + 156); + put_unaligned_le32(info->x_physical_maximum, rdesc + 162); + rdesc[167] = info->unit; + rdesc[169] = info->unit_exponent; + put_unaligned_le32(info->y_logical_maximum, rdesc + 177); + put_unaligned_le32(info->y_physical_maximum, rdesc + 182); + } + + if (info->control_rsize) { + if (newsize + info->control_rsize > *rsize) + hid_err(hdev, "control rdesc unexpectedly large"); + else { + memcpy(rdesc + newsize, info->control_rdesc, info->control_rsize); + newsize += info->control_rsize; + } + } + + *rsize = newsize; + return rdesc; +} + static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) { @@ -654,14 +743,6 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } -/** - * kye_tablet_enable() - Enable fully-functional tablet mode by setting a special feature report. - * - * @hdev: HID device - * - * The specific report ID and data were discovered by sniffing the - * Windows driver traffic. - */ static int kye_tablet_enable(struct hid_device *hdev) { struct list_head *list; @@ -688,6 +769,15 @@ static int kye_tablet_enable(struct hid_device *hdev) value = report->field[0]->value; + /* + * The code is for DataFormat 2 of config xml. They have no obvious + * meaning (at least not configurable in Windows driver) except enabling + * fully-functional tablet mode (absolute positioning). Otherwise, the + * tablet acts like a relative mouse. + * + * Though there're magic codes for DataFormat 3 and 4, no devices use + * these DataFormats. + */ value[0] = 0x12; value[1] = 0x10; value[2] = 0x11; From 4782c0e07092b9ed7b5d8f702167e7f604951fea Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 7 Feb 2023 12:33:15 +0800 Subject: [PATCH 2/5] HID: kye: Generate tablet fixup descriptors on the fly Remove duplicated descriptor structures and make it easier to discover bugs. Signed-off-by: David Yang Signed-off-by: Jiri Kosina --- drivers/hid/hid-kye.c | 592 +++++++----------------------------------- 1 file changed, 101 insertions(+), 491 deletions(-) diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index d8ac16bdb094..03a9ad9057b2 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -15,351 +15,75 @@ #include "hid-ids.h" -/* Original EasyPen i405X report descriptor size */ -#define EASYPEN_I405X_RDESC_ORIG_SIZE 476 - -/* Fixed EasyPen i405X report descriptor */ -static __u8 easypen_i405x_rdesc_fixed[] = { - 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ - 0x09, 0x01, /* Usage (01h), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x05, /* Report ID (5), */ - 0x09, 0x01, /* Usage (01h), */ - 0x15, 0x80, /* Logical Minimum (-128), */ - 0x25, 0x7F, /* Logical Maximum (127), */ - 0x75, 0x08, /* Report Size (8), */ - 0x95, 0x07, /* Report Count (7), */ - 0xB1, 0x02, /* Feature (Variable), */ - 0xC0, /* End Collection, */ - 0x05, 0x0D, /* Usage Page (Digitizer), */ - 0x09, 0x01, /* Usage (Digitizer), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x10, /* Report ID (16), */ - 0x09, 0x20, /* Usage (Stylus), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x09, 0x42, /* Usage (Tip Switch), */ - 0x09, 0x44, /* Usage (Barrel Switch), */ - 0x09, 0x46, /* Usage (Tablet Pick), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x09, 0x32, /* Usage (In Range), */ - 0x95, 0x01, /* Report Count (1), */ - 0x81, 0x02, /* Input (Variable), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 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, 0x7C, 0x15, /* Physical Maximum (5500), */ - 0x26, 0x00, 0x37, /* Logical Maximum (14080), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */ - 0x26, 0x00, 0x28, /* Logical Maximum (10240), */ - 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 */ +static const __u8 easypen_m610x_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x79, 0x02, /* Usage (AC Redo Or Repeat), */ + 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ + 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x34, /* Report Count (52), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ }; -/* Original MousePen i608X report descriptor size */ -#define MOUSEPEN_I608X_RDESC_ORIG_SIZE 476 - -/* Fixed MousePen i608X report descriptor */ -static __u8 mousepen_i608x_rdesc_fixed[] = { - 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ - 0x09, 0x01, /* Usage (01h), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x05, /* Report ID (5), */ - 0x09, 0x01, /* Usage (01h), */ - 0x15, 0x80, /* Logical Minimum (-128), */ - 0x25, 0x7F, /* Logical Maximum (127), */ - 0x75, 0x08, /* Report Size (8), */ - 0x95, 0x07, /* Report Count (7), */ - 0xB1, 0x02, /* Feature (Variable), */ - 0xC0, /* End Collection, */ - 0x05, 0x0D, /* Usage Page (Digitizer), */ - 0x09, 0x01, /* Usage (Digitizer), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x10, /* Report ID (16), */ - 0x09, 0x20, /* Usage (Stylus), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x09, 0x42, /* Usage (Tip Switch), */ - 0x09, 0x44, /* Usage (Barrel Switch), */ - 0x09, 0x46, /* Usage (Tablet Pick), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x09, 0x32, /* Usage (In Range), */ - 0x95, 0x01, /* Report Count (1), */ - 0x81, 0x02, /* Input (Variable), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 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, 0x40, 0x1F, /* Physical Maximum (8000), */ - 0x26, 0x00, 0x50, /* Logical Maximum (20480), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0x70, 0x17, /* Physical Maximum (6000), */ - 0x26, 0x00, 0x3C, /* Logical Maximum (15360), */ - 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, */ - 0x05, 0x01, /* Usage Page (Desktop), */ - 0x09, 0x02, /* Usage (Mouse), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x11, /* Report ID (17), */ - 0x09, 0x01, /* Usage (Pointer), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0xA4, /* Push, */ - 0x05, 0x09, /* Usage Page (Button), */ - 0x75, 0x01, /* Report Size (1), */ - 0x19, 0x01, /* Usage Minimum (01h), */ - 0x29, 0x03, /* Usage Maximum (03h), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x05, /* Report Count (5), */ - 0x81, 0x01, /* Input (Constant), */ - 0xB4, /* Pop, */ - 0x95, 0x01, /* Report Count (1), */ - 0xA4, /* Push, */ - 0x55, 0xFD, /* Unit Exponent (-3), */ - 0x65, 0x13, /* Unit (Inch), */ - 0x34, /* Physical Minimum (0), */ - 0x75, 0x10, /* Report Size (16), */ - 0x09, 0x30, /* Usage (X), */ - 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */ - 0x26, 0x00, 0x50, /* Logical Maximum (20480), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0x70, 0x17, /* Physical Maximum (6000), */ - 0x26, 0x00, 0x3C, /* Logical Maximum (15360), */ - 0x81, 0x02, /* Input (Variable), */ - 0xB4, /* Pop, */ - 0x75, 0x08, /* Report Size (8), */ - 0x09, 0x38, /* Usage (Wheel), */ - 0x15, 0xFF, /* Logical Minimum (-1), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x81, 0x06, /* Input (Variable, Relative), */ - 0x81, 0x01, /* Input (Constant), */ - 0xC0, /* End Collection, */ - 0xC0 /* End Collection */ +static const __u8 pensketch_m912_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x08, /* Report Count (8), */ + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x01, 0x02, /* Usage (AC New), */ + 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ + 0x0A, 0x25, 0x02, /* Usage (AC Forward), */ + 0x0A, 0x24, 0x02, /* Usage (AC Back), */ + 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ + 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x30, /* Report Count (48), */ + 0x81, 0x03, /* Input (Constant, Variable), */ + 0xC0 /* End Collection */ }; -/* Original MousePen i608X v2 report descriptor size */ -#define MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE 482 +static const __u8 easypen_m406xe_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x0A, 0x79, 0x02, /* Usage (AC Redo Or Repeat), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ + 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x34, /* Report Count (52), */ + 0x81, 0x03, /* Input (Constant, Variable), */ + 0xC0 /* End Collection */ +}; -/* Fixed MousePen i608X v2 report descriptor */ -static __u8 mousepen_i608x_v2_rdesc_fixed[] = { +/* Fix indexes in kye_tablet_report_fixup if you change this */ +static const __u8 kye_tablet_rdesc[] = { 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ 0x09, 0x01, /* Usage (01h), */ 0xA1, 0x01, /* Collection (Application), */ 0x85, 0x05, /* Report ID (5), */ 0x09, 0x01, /* Usage (01h), */ - 0x15, 0x80, /* Logical Minimum (-128), */ - 0x25, 0x7F, /* Logical Maximum (127), */ - 0x75, 0x08, /* Report Size (8), */ - 0x95, 0x07, /* Report Count (7), */ - 0xB1, 0x02, /* Feature (Variable), */ - 0xC0, /* End Collection, */ - 0x05, 0x0D, /* Usage Page (Digitizer), */ - 0x09, 0x01, /* Usage (Digitizer), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x10, /* Report ID (16), */ - 0x09, 0x20, /* Usage (Stylus), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x09, 0x42, /* Usage (Tip Switch), */ - 0x09, 0x44, /* Usage (Barrel Switch), */ - 0x09, 0x46, /* Usage (Tablet Pick), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x09, 0x32, /* Usage (In Range), */ - 0x95, 0x01, /* Report Count (1), */ - 0x81, 0x02, /* Input (Variable), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 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, 0x40, 0x1F, /* Physical Maximum (8000), */ - 0x27, 0x00, 0xA0, 0x00, 0x00, /* Logical Maximum (40960), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0x70, 0x17, /* Physical Maximum (6000), */ - 0x26, 0x00, 0x78, /* Logical Maximum (30720), */ - 0x81, 0x02, /* Input (Variable), */ - 0xB4, /* Pop, */ - 0x09, 0x30, /* Usage (Tip Pressure), */ - 0x26, 0xFF, 0x07, /* Logical Maximum (2047), */ - 0x81, 0x02, /* Input (Variable), */ - 0xC0, /* End Collection, */ - 0xC0, /* End Collection, */ - 0x05, 0x01, /* Usage Page (Desktop), */ - 0x09, 0x02, /* Usage (Mouse), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x11, /* Report ID (17), */ - 0x09, 0x01, /* Usage (Pointer), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0xA4, /* Push, */ - 0x05, 0x09, /* Usage Page (Button), */ - 0x75, 0x01, /* Report Size (1), */ - 0x19, 0x01, /* Usage Minimum (01h), */ - 0x29, 0x03, /* Usage Maximum (03h), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x05, /* Report Count (5), */ - 0x81, 0x01, /* Input (Constant), */ - 0xB4, /* Pop, */ - 0x95, 0x01, /* Report Count (1), */ - 0xA4, /* Push, */ - 0x55, 0xFD, /* Unit Exponent (-3), */ - 0x65, 0x13, /* Unit (Inch), */ - 0x34, /* Physical Minimum (0), */ - 0x75, 0x10, /* Report Size (16), */ - 0x09, 0x30, /* Usage (X), */ - 0x46, 0x40, 0x1F, /* Physical Maximum (8000), */ - 0x27, 0x00, 0xA0, 0x00, 0x00, /* Logical Maximum (40960), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0x70, 0x17, /* Physical Maximum (6000), */ - 0x26, 0x00, 0x78, /* Logical Maximum (30720), */ - 0x81, 0x02, /* Input (Variable), */ - 0xB4, /* Pop, */ - 0x75, 0x08, /* Report Size (8), */ - 0x09, 0x38, /* Usage (Wheel), */ - 0x15, 0xFF, /* Logical Minimum (-1), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x81, 0x06, /* Input (Variable, Relative), */ - 0x81, 0x01, /* Input (Constant), */ - 0xC0, /* End Collection, */ - 0xC0 /* End Collection */ -}; - -/* Original EasyPen M610X report descriptor size */ -#define EASYPEN_M610X_RDESC_ORIG_SIZE 476 - -/* Fixed EasyPen M610X report descriptor */ -static __u8 easypen_m610x_rdesc_fixed[] = { - 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ - 0x09, 0x01, /* Usage (01h), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x05, /* Report ID (5), */ - 0x09, 0x01, /* Usage (01h), */ - 0x15, 0x80, /* Logical Minimum (-128), */ - 0x25, 0x7F, /* Logical Maximum (127), */ - 0x75, 0x08, /* Report Size (8), */ - 0x95, 0x07, /* Report Count (7), */ - 0xB1, 0x02, /* Feature (Variable), */ - 0xC0, /* End Collection, */ - 0x05, 0x0D, /* Usage Page (Digitizer), */ - 0x09, 0x01, /* Usage (Digitizer), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x10, /* Report ID (16), */ - 0x09, 0x20, /* Usage (Stylus), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x09, 0x42, /* Usage (Tip Switch), */ - 0x09, 0x44, /* Usage (Barrel Switch), */ - 0x09, 0x46, /* Usage (Tablet Pick), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x09, 0x32, /* Usage (In Range), */ - 0x95, 0x01, /* Report Count (1), */ - 0x81, 0x02, /* Input (Variable), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 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, 0x00, 0xA0, 0x00, 0x00, /* Logical Maximum (40960), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0x6A, 0x18, /* Physical Maximum (6250), */ - 0x26, 0x00, 0x64, /* Logical Maximum (25600), */ - 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, */ - 0x05, 0x0C, /* Usage Page (Consumer), */ - 0x09, 0x01, /* Usage (Consumer Control), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x12, /* Report ID (18), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x95, 0x04, /* Report Count (4), */ - 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ - 0x0A, 0x79, 0x02, /* Usage (AC Redo Or Repeat), */ - 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ - 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x01, /* Report Count (1), */ - 0x75, 0x14, /* Report Size (20), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x75, 0x20, /* Report Size (32), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0xC0 /* End Collection */ -}; - - -/* Original PenSketch M912 report descriptor size */ -#define PENSKETCH_M912_RDESC_ORIG_SIZE 482 - -/* Fixed PenSketch M912 report descriptor */ -static __u8 pensketch_m912_rdesc_fixed[] = { - 0x05, 0x01, /* Usage Page (Desktop), */ - 0x08, /* Usage (00h), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x05, /* Report ID (5), */ - 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ - 0x09, 0x01, /* Usage (01h), */ 0x15, 0x81, /* Logical Minimum (-127), */ 0x25, 0x7F, /* Logical Maximum (127), */ 0x75, 0x08, /* Report Size (8), */ @@ -381,30 +105,29 @@ static __u8 pensketch_m912_rdesc_fixed[] = { 0x95, 0x03, /* Report Count (3), */ 0x81, 0x02, /* Input (Variable), */ 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ + 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), */ 0xA4, /* Push, */ 0x05, 0x01, /* Usage Page (Desktop), */ - 0x55, 0xFD, /* Unit Exponent (-3), */ - 0x65, 0x13, /* Unit (Inch), */ - 0x14, /* Logical Minimum (0), */ - 0x34, /* Physical Minimum (0), */ 0x09, 0x30, /* Usage (X), */ - 0x27, 0x00, 0xF0, 0x00, 0x00, /* Logical Maximum (61440), */ - 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */ + 0x27, 0xFF, 0x7F, 0x00, 0x00, /* Logical Maximum (32767), */ + 0x34, /* Physical Minimum (0), */ + 0x47, 0x00, 0x00, 0x00, 0x00, /* Physical Maximum (0), */ + 0x65, 0x11, /* Unit (Centimeter), */ + 0x55, 0x00, /* Unit Exponent (0), */ + 0x75, 0x10, /* Report Size (16), */ 0x81, 0x02, /* Input (Variable), */ 0x09, 0x31, /* Usage (Y), */ - 0x27, 0x00, 0xB4, 0x00, 0x00, /* Logical Maximum (46080), */ - 0x46, 0x28, 0x23, /* Physical Maximum (9000), */ + 0x27, 0xFF, 0x7F, 0x00, 0x00, /* Logical Maximum (32767), */ + 0x47, 0x00, 0x00, 0x00, 0x00, /* Physical Maximum (0), */ 0x81, 0x02, /* Input (Variable), */ 0xB4, /* Pop, */ + 0x05, 0x0D, /* Usage Page (Digitizer), */ 0x09, 0x30, /* Usage (Tip Pressure), */ - 0x14, /* Logical Minimum (0), */ - 0x26, 0xFF, 0x07, /* Logical Maximum (2047), */ + 0x27, 0xFF, 0x07, 0x00, 0x00, /* Logical Maximum (2047), */ 0x81, 0x02, /* Input (Variable), */ 0xC0, /* End Collection, */ 0xC0, /* End Collection, */ @@ -415,144 +138,44 @@ static __u8 pensketch_m912_rdesc_fixed[] = { 0x09, 0x21, /* Usage (Puck), */ 0xA0, /* Collection (Physical), */ 0x05, 0x09, /* Usage Page (Button), */ - 0x75, 0x01, /* Report Size (1), */ 0x19, 0x01, /* Usage Minimum (01h), */ 0x29, 0x03, /* Usage Maximum (03h), */ 0x14, /* Logical Minimum (0), */ 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ 0x95, 0x03, /* Report Count (3), */ 0x81, 0x02, /* Input (Variable), */ 0x95, 0x04, /* Report Count (4), */ 0x81, 0x01, /* Input (Constant), */ + 0x05, 0x0D, /* Usage Page (Digitizer), */ + 0x09, 0x32, /* Usage (In Range), */ 0x95, 0x01, /* Report Count (1), */ - 0x0B, 0x32, 0x00, 0x0D, 0x00, /* Usage (Digitizer In Range), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ 0x81, 0x02, /* Input (Variable), */ - 0xA4, /* Push, */ 0x05, 0x01, /* Usage Page (Desktop), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 0x55, 0xFD, /* Unit Exponent (-3), */ - 0x65, 0x13, /* Unit (Inch), */ - 0x14, /* Logical Minimum (0), */ - 0x34, /* Physical Minimum (0), */ + 0xA4, /* Push, */ 0x09, 0x30, /* Usage (X), */ - 0x27, 0x00, 0xF0, 0x00, 0x00, /* Logical Maximum (61440), */ - 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */ + 0x27, 0xFF, 0x7F, 0x00, 0x00, /* Logical Maximum (32767), */ + 0x34, /* Physical Minimum (0), */ + 0x47, 0x00, 0x00, 0x00, 0x00, /* Physical Maximum (0), */ + 0x65, 0x11, /* Unit (Centimeter), */ + 0x55, 0x00, /* Unit Exponent (0), */ + 0x75, 0x10, /* Report Size (16), */ 0x81, 0x02, /* Input (Variable), */ 0x09, 0x31, /* Usage (Y), */ - 0x27, 0x00, 0xB4, 0x00, 0x00, /* Logical Maximum (46080), */ - 0x46, 0x28, 0x23, /* Physical Maximum (9000), */ + 0x27, 0xFF, 0x7F, 0x00, 0x00, /* Logical Maximum (32767), */ + 0x47, 0x00, 0x00, 0x00, 0x00, /* Physical Maximum (0), */ 0x81, 0x02, /* Input (Variable), */ + 0xB4, /* Pop, */ 0x09, 0x38, /* Usage (Wheel), */ + 0x15, 0xFF, /* Logical Minimum (-1), */ 0x75, 0x08, /* Report Size (8), */ 0x95, 0x01, /* Report Count (1), */ - 0x15, 0xFF, /* Logical Minimum (-1), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x34, /* Physical Minimum (0), */ - 0x44, /* Physical Maximum (0), */ 0x81, 0x06, /* Input (Variable, Relative), */ - 0xB4, /* Pop, */ + 0x81, 0x01, /* Input (Constant), */ 0xC0, /* End Collection, */ - 0xC0, /* End Collection, */ - 0x05, 0x0C, /* Usage Page (Consumer), */ - 0x09, 0x01, /* Usage (Consumer Control), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x12, /* Report ID (18), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x95, 0x08, /* Report Count (8), */ - 0x05, 0x0C, /* Usage Page (Consumer), */ - 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ - 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ - 0x0A, 0x01, 0x02, /* Usage (AC New), */ - 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ - 0x0A, 0x25, 0x02, /* Usage (AC Forward), */ - 0x0A, 0x24, 0x02, /* Usage (AC Back), */ - 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ - 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x30, /* Report Count (48), */ - 0x81, 0x03, /* Input (Constant, Variable), */ 0xC0 /* End Collection */ }; -/* Original EasyPen M406XE report descriptor size */ -#define EASYPEN_M406XE_RDESC_ORIG_SIZE 476 - -/* Fixed EasyPen M406XE report descriptor */ -static __u8 easypen_m406xe_rdesc_fixed[] = { - 0x05, 0x01, /* Usage Page (Desktop), */ - 0x09, 0x01, /* Usage (01h), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x05, /* Report ID (5), */ - 0x09, 0x01, /* Usage (01h), */ - 0x15, 0x80, /* Logical Minimum (-128), */ - 0x25, 0x7F, /* Logical Maximum (127), */ - 0x75, 0x08, /* Report Size (8), */ - 0x95, 0x07, /* Report Count (7), */ - 0xB1, 0x02, /* Feature (Variable), */ - 0xC0, /* End Collection, */ - 0x05, 0x0D, /* Usage Page (Digitizer), */ - 0x09, 0x01, /* Usage (Digitizer), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x10, /* Report ID (16), */ - 0x09, 0x20, /* Usage (Stylus), */ - 0xA0, /* Collection (Physical), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x09, 0x42, /* Usage (Tip Switch), */ - 0x09, 0x44, /* Usage (Barrel Switch), */ - 0x09, 0x46, /* Usage (Tablet Pick), */ - 0x95, 0x03, /* Report Count (3), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x04, /* Report Count (4), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0x09, 0x32, /* Usage (In Range), */ - 0x95, 0x01, /* Report Count (1), */ - 0x81, 0x02, /* Input (Variable), */ - 0x75, 0x10, /* Report Size (16), */ - 0x95, 0x01, /* Report Count (1), */ - 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, 0x70, 0x17, /* Physical Maximum (6000), */ - 0x26, 0x00, 0x3C, /* Logical Maximum (15360), */ - 0x81, 0x02, /* Input (Variable), */ - 0x09, 0x31, /* Usage (Y), */ - 0x46, 0xA0, 0x0F, /* Physical Maximum (4000), */ - 0x26, 0x00, 0x28, /* Logical Maximum (10240), */ - 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 */ - 0x05, 0x0C, /* Usage Page (Consumer), */ - 0x09, 0x01, /* Usage (Consumer Control), */ - 0xA1, 0x01, /* Collection (Application), */ - 0x85, 0x12, /* Report ID (18), */ - 0x14, /* Logical Minimum (0), */ - 0x25, 0x01, /* Logical Maximum (1), */ - 0x75, 0x01, /* Report Size (1), */ - 0x95, 0x04, /* Report Count (4), */ - 0x0A, 0x79, 0x02, /* Usage (AC Redo Or Repeat), */ - 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ - 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ - 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ - 0x81, 0x02, /* Input (Variable), */ - 0x95, 0x34, /* Report Count (52), */ - 0x81, 0x03, /* Input (Constant, Variable), */ - 0xC0 /* End Collection */ -}; - static const struct kye_tablet_info { __u32 product; __s32 x_logical_maximum; @@ -566,6 +189,21 @@ static const struct kye_tablet_info { unsigned int control_rsize; const __u8 *control_rdesc; } kye_tablets_info[] = { + {USB_DEVICE_ID_KYE_EASYPEN_I405X, /* 0x5010 */ + 14080, 10240, 1023, 55, 40, -1, 0x13, false}, + {USB_DEVICE_ID_KYE_MOUSEPEN_I608X, /* 0x5011 */ + 20480, 15360, 2047, 8, 6, 0, 0x13, true}, + {USB_DEVICE_ID_KYE_EASYPEN_M610X, /* 0x5013 */ + 40960, 25600, 1023, 1000, 625, -2, 0x13, false, + sizeof(easypen_m610x_control_rdesc), easypen_m610x_control_rdesc}, + {USB_DEVICE_ID_KYE_PENSKETCH_M912, /* 0x5015 */ + 61440, 46080, 2047, 12, 9, 0, 0x13, true, + sizeof(pensketch_m912_control_rdesc), pensketch_m912_control_rdesc}, + {USB_DEVICE_ID_KYE_EASYPEN_M406XE, /* 0x5019 */ + 15360, 10240, 1023, 6, 4, 0, 0x13, false, + sizeof(easypen_m406xe_control_rdesc), easypen_m406xe_control_rdesc}, + {USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2, /* 0x501A */ + 40960, 30720, 2047, 8, 6, 0, 0x13, true}, {} }; @@ -692,40 +330,12 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, } break; case USB_DEVICE_ID_KYE_EASYPEN_I405X: - if (*rsize == EASYPEN_I405X_RDESC_ORIG_SIZE) { - rdesc = easypen_i405x_rdesc_fixed; - *rsize = sizeof(easypen_i405x_rdesc_fixed); - } - break; case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: - if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) { - rdesc = mousepen_i608x_rdesc_fixed; - *rsize = sizeof(mousepen_i608x_rdesc_fixed); - } - break; case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: - if (*rsize == MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE) { - rdesc = mousepen_i608x_v2_rdesc_fixed; - *rsize = sizeof(mousepen_i608x_v2_rdesc_fixed); - } - break; case USB_DEVICE_ID_KYE_EASYPEN_M610X: - if (*rsize == EASYPEN_M610X_RDESC_ORIG_SIZE) { - rdesc = easypen_m610x_rdesc_fixed; - *rsize = sizeof(easypen_m610x_rdesc_fixed); - } - break; case USB_DEVICE_ID_KYE_EASYPEN_M406XE: - if (*rsize == EASYPEN_M406XE_RDESC_ORIG_SIZE) { - rdesc = easypen_m406xe_rdesc_fixed; - *rsize = sizeof(easypen_m406xe_rdesc_fixed); - } - break; case USB_DEVICE_ID_KYE_PENSKETCH_M912: - if (*rsize == PENSKETCH_M912_RDESC_ORIG_SIZE) { - rdesc = pensketch_m912_rdesc_fixed; - *rsize = sizeof(pensketch_m912_rdesc_fixed); - } + rdesc = kye_tablet_fixup(hdev, rdesc, rsize); break; case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, From 8c7b79bc04abb67e7f5864e94286a800b42aa96c Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 7 Feb 2023 12:33:16 +0800 Subject: [PATCH 3/5] HID: kye: Sort kye devices Sort kye devices by their Produce IDs. Signed-off-by: David Yang Signed-off-by: Jiri Kosina --- drivers/hid/hid-ids.h | 2 +- drivers/hid/hid-kye.c | 66 ++++++++++++++++++++-------------------- drivers/hid/hid-quirks.c | 6 ++-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 63545cd307e5..c6e14d1e9e9a 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -720,10 +720,10 @@ #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 -#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501a #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 #define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015 #define USB_DEVICE_ID_KYE_EASYPEN_M406XE 0x5019 +#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501A #define USB_VENDOR_ID_LABTEC 0x1020 #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index 03a9ad9057b2..47f5aa5e9d88 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -329,6 +329,18 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, rdesc[74] = 0x08; } break; + case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, + "Genius Gila Gaming Mouse"); + break; + case USB_DEVICE_ID_GENIUS_MANTICORE: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, + "Genius Manticore Keyboard"); + break; + case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, + "Genius Gx Imperator Keyboard"); + break; case USB_DEVICE_ID_KYE_EASYPEN_I405X: case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: @@ -337,18 +349,6 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, case USB_DEVICE_ID_KYE_PENSKETCH_M912: rdesc = kye_tablet_fixup(hdev, rdesc, rsize); break; - case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: - rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, - "Genius Gila Gaming Mouse"); - break; - case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: - rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, - "Genius Gx Imperator Keyboard"); - break; - case USB_DEVICE_ID_GENIUS_MANTICORE: - rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, - "Genius Manticore Keyboard"); - break; } return rdesc; } @@ -417,18 +417,6 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id) } switch (id->product) { - case USB_DEVICE_ID_KYE_EASYPEN_I405X: - case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: - case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: - case USB_DEVICE_ID_KYE_EASYPEN_M610X: - case USB_DEVICE_ID_KYE_EASYPEN_M406XE: - case USB_DEVICE_ID_KYE_PENSKETCH_M912: - ret = kye_tablet_enable(hdev); - if (ret) { - hid_err(hdev, "tablet enabling failed\n"); - goto enabling_err; - } - break; case USB_DEVICE_ID_GENIUS_MANTICORE: /* * The manticore keyboard needs to have all the interfaces @@ -437,6 +425,18 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id) if (hid_hw_open(hdev)) hid_hw_close(hdev); break; + case USB_DEVICE_ID_KYE_EASYPEN_I405X: + case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: + case USB_DEVICE_ID_KYE_EASYPEN_M610X: + case USB_DEVICE_ID_KYE_PENSKETCH_M912: + case USB_DEVICE_ID_KYE_EASYPEN_M406XE: + case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: + ret = kye_tablet_enable(hdev); + if (ret) { + hid_err(hdev, "tablet enabling failed\n"); + goto enabling_err; + } + break; } return 0; @@ -448,24 +448,24 @@ err: static const struct hid_device_id kye_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_GENIUS_MANTICORE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, - USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_PENSKETCH_M912) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, - USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, - USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, - USB_DEVICE_ID_GENIUS_MANTICORE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, - USB_DEVICE_ID_KYE_PENSKETCH_M912) }, + USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) }, { } }; MODULE_DEVICE_TABLE(hid, kye_devices); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 66e64350f138..121c8f0d2231 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -104,12 +104,12 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL }, From 2dd438cdc2e9e6913893009a4d8dff3edf26f4f5 Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 7 Feb 2023 12:33:17 +0800 Subject: [PATCH 4/5] HID: kye: Add support for all kye tablets Physical data for all kye tablets are collected from Windows driver, to generate correct HID reports. Signed-off-by: David Yang Signed-off-by: Jiri Kosina --- drivers/hid/hid-ids.h | 7 ++ drivers/hid/hid-kye.c | 173 +++++++++++++++++++++++++++++++++++++++ drivers/hid/hid-quirks.c | 8 ++ 3 files changed, 188 insertions(+) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index c6e14d1e9e9a..d487dd9c86e1 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -718,12 +718,19 @@ #define USB_DEVICE_ID_GENIUS_MANTICORE 0x0153 #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 +#define USB_DEVICE_ID_KYE_EASYPEN_M406 0x5005 +#define USB_DEVICE_ID_KYE_EASYPEN_M506 0x500F #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 +#define USB_DEVICE_ID_KYE_EASYPEN_M406W 0x5012 #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 +#define USB_DEVICE_ID_KYE_EASYPEN_340 0x5014 #define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015 +#define USB_DEVICE_ID_KYE_MOUSEPEN_M508WX 0x5016 +#define USB_DEVICE_ID_KYE_MOUSEPEN_M508X 0x5017 #define USB_DEVICE_ID_KYE_EASYPEN_M406XE 0x5019 #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 0x501A +#define USB_DEVICE_ID_KYE_PENSKETCH_T609A 0x501B #define USB_VENDOR_ID_LABTEC 0x1020 #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index 47f5aa5e9d88..b3bde4bb979d 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -15,6 +15,74 @@ #include "hid-ids.h" +/* Data gathered from Database/VID0458_PID????/Vista/TBoard/default.xml in ioTablet driver + * + * TODO: + * - Add battery and sleep support for EasyPen M406W and MousePen M508WX + * - Investigate ScrollZ.MiceFMT buttons of EasyPen M406 + */ + +static const __u8 easypen_m406_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x45, 0x02, /* Usage (AC Rotate), */ + 0x09, 0x40, /* Usage (Menu), */ + 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ + 0x0A, 0x46, 0x02, /* Usage (AC Resize), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x24, 0x02, /* Usage (AC Back), */ + 0x0A, 0x25, 0x02, /* Usage (AC Forward), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x08, /* Report Count (8), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x30, /* Report Count (48), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + +static const __u8 easypen_m506_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ + 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x34, /* Report Count (52), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + +static const __u8 easypen_m406w_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x01, 0x02, /* Usage (AC New), */ + 0x09, 0x40, /* Usage (Menu), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x34, /* Report Count (52), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + static const __u8 easypen_m610x_control_rdesc[] = { 0x05, 0x0C, /* Usage Page (Consumer), */ 0x09, 0x01, /* Usage (Consumer Control), */ @@ -58,6 +126,54 @@ static const __u8 pensketch_m912_control_rdesc[] = { 0xC0 /* End Collection */ }; +static const __u8 mousepen_m508wx_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ + 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x34, /* Report Count (52), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + +static const __u8 mousepen_m508x_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x01, 0x02, /* Usage (AC New), */ + 0x09, 0x40, /* Usage (Menu), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x04, /* Report Count (4), */ + 0x81, 0x02, /* Input (Variable), */ + 0x81, 0x01, /* Input (Constant), */ + 0x15, 0xFF, /* Logical Minimum (-1), */ + 0x95, 0x10, /* Report Count (16), */ + 0x81, 0x01, /* Input (Constant), */ + 0x0A, 0x35, 0x02, /* Usage (AC Scroll), */ + 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ + 0x0A, 0x38, 0x02, /* Usage (AC Pan), */ + 0x75, 0x08, /* Report Size (8), */ + 0x95, 0x03, /* Report Count (3), */ + 0x81, 0x06, /* Input (Variable, Relative), */ + 0x95, 0x01, /* Report Count (1), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + static const __u8 easypen_m406xe_control_rdesc[] = { 0x05, 0x0C, /* Usage Page (Consumer), */ 0x09, 0x01, /* Usage (Consumer Control), */ @@ -77,6 +193,22 @@ static const __u8 easypen_m406xe_control_rdesc[] = { 0xC0 /* End Collection */ }; +static const __u8 pensketch_t609a_control_rdesc[] = { + 0x05, 0x0C, /* Usage Page (Consumer), */ + 0x09, 0x01, /* Usage (Consumer Control), */ + 0xA1, 0x01, /* Collection (Application), */ + 0x85, 0x12, /* Report ID (18), */ + 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ + 0x14, /* Logical Minimum (0), */ + 0x25, 0x01, /* Logical Maximum (1), */ + 0x75, 0x01, /* Report Size (1), */ + 0x95, 0x08, /* Report Count (8), */ + 0x81, 0x02, /* Input (Variable), */ + 0x95, 0x37, /* Report Count (55), */ + 0x81, 0x01, /* Input (Constant), */ + 0xC0 /* End Collection */ +}; + /* Fix indexes in kye_tablet_report_fixup if you change this */ static const __u8 kye_tablet_rdesc[] = { 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ @@ -189,21 +321,41 @@ static const struct kye_tablet_info { unsigned int control_rsize; const __u8 *control_rdesc; } kye_tablets_info[] = { + {USB_DEVICE_ID_KYE_EASYPEN_M406, /* 0x5005 */ + 15360, 10240, 1023, 6, 4, 0, 0x13, false, + sizeof(easypen_m406_control_rdesc), easypen_m406_control_rdesc}, + {USB_DEVICE_ID_KYE_EASYPEN_M506, /* 0x500F */ + 24576, 20480, 1023, 6, 5, 0, 0x13, false, + sizeof(easypen_m506_control_rdesc), easypen_m506_control_rdesc}, {USB_DEVICE_ID_KYE_EASYPEN_I405X, /* 0x5010 */ 14080, 10240, 1023, 55, 40, -1, 0x13, false}, {USB_DEVICE_ID_KYE_MOUSEPEN_I608X, /* 0x5011 */ 20480, 15360, 2047, 8, 6, 0, 0x13, true}, + {USB_DEVICE_ID_KYE_EASYPEN_M406W, /* 0x5012 */ + 15360, 10240, 1023, 6, 4, 0, 0x13, false, + sizeof(easypen_m406w_control_rdesc), easypen_m406w_control_rdesc}, {USB_DEVICE_ID_KYE_EASYPEN_M610X, /* 0x5013 */ 40960, 25600, 1023, 1000, 625, -2, 0x13, false, sizeof(easypen_m610x_control_rdesc), easypen_m610x_control_rdesc}, + {USB_DEVICE_ID_KYE_EASYPEN_340, /* 0x5014 */ + 10240, 7680, 1023, 4, 3, 0, 0x13, false}, {USB_DEVICE_ID_KYE_PENSKETCH_M912, /* 0x5015 */ 61440, 46080, 2047, 12, 9, 0, 0x13, true, sizeof(pensketch_m912_control_rdesc), pensketch_m912_control_rdesc}, + {USB_DEVICE_ID_KYE_MOUSEPEN_M508WX, /* 0x5016 */ + 40960, 25600, 2047, 8, 5, 0, 0x13, true, + sizeof(mousepen_m508wx_control_rdesc), mousepen_m508wx_control_rdesc}, + {USB_DEVICE_ID_KYE_MOUSEPEN_M508X, /* 0x5017 */ + 40960, 25600, 2047, 8, 5, 0, 0x13, true, + sizeof(mousepen_m508x_control_rdesc), mousepen_m508x_control_rdesc}, {USB_DEVICE_ID_KYE_EASYPEN_M406XE, /* 0x5019 */ 15360, 10240, 1023, 6, 4, 0, 0x13, false, sizeof(easypen_m406xe_control_rdesc), easypen_m406xe_control_rdesc}, {USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2, /* 0x501A */ 40960, 30720, 2047, 8, 6, 0, 0x13, true}, + {USB_DEVICE_ID_KYE_PENSKETCH_T609A, /* 0x501B */ + 43520, 28160, 1023, 85, 55, -1, 0x13, false, + sizeof(pensketch_t609a_control_rdesc), pensketch_t609a_control_rdesc}, {} }; @@ -425,12 +577,19 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id) if (hid_hw_open(hdev)) hid_hw_close(hdev); break; + case USB_DEVICE_ID_KYE_EASYPEN_M406: + case USB_DEVICE_ID_KYE_EASYPEN_M506: case USB_DEVICE_ID_KYE_EASYPEN_I405X: case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: + case USB_DEVICE_ID_KYE_EASYPEN_M406W: case USB_DEVICE_ID_KYE_EASYPEN_M610X: + case USB_DEVICE_ID_KYE_EASYPEN_340: case USB_DEVICE_ID_KYE_PENSKETCH_M912: + case USB_DEVICE_ID_KYE_MOUSEPEN_M508WX: + case USB_DEVICE_ID_KYE_MOUSEPEN_M508X: case USB_DEVICE_ID_KYE_EASYPEN_M406XE: case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: + case USB_DEVICE_ID_KYE_PENSKETCH_T609A: ret = kye_tablet_enable(hdev); if (ret) { hid_err(hdev, "tablet enabling failed\n"); @@ -454,18 +613,32 @@ static const struct hid_device_id kye_devices[] = { USB_DEVICE_ID_GENIUS_MANTICORE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_EASYPEN_M406) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_EASYPEN_M506) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_EASYPEN_M406W) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_EASYPEN_340) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_MOUSEPEN_M508WX) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_MOUSEPEN_M508X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, + USB_DEVICE_ID_KYE_PENSKETCH_T609A) }, { } }; MODULE_DEVICE_TABLE(hid, kye_devices); diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index 121c8f0d2231..804fc03600cc 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -105,11 +105,19 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M506), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406W), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_340), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_M508WX), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_M508X), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_T609A), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL }, From 0f6fac2cfbefa1d891389104af46e54c982b1c7a Mon Sep 17 00:00:00 2001 From: David Yang Date: Wed, 12 Apr 2023 01:33:08 +0800 Subject: [PATCH 5/5] HID: kye: Fix rdesc for kye tablets I forget to add them in previous commit 2dd438cdc2e9 ("HID: kye: Add support for all kye tablets"). Signed-off-by: David Yang Link: https://lore.kernel.org/r/20230411173308.422756-1-mmyangfl@gmail.com Signed-off-by: Benjamin Tissoires --- drivers/hid/hid-kye.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index b3bde4bb979d..eb9bf2829937 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c @@ -209,7 +209,7 @@ static const __u8 pensketch_t609a_control_rdesc[] = { 0xC0 /* End Collection */ }; -/* Fix indexes in kye_tablet_report_fixup if you change this */ +/* Fix indexes in kye_tablet_fixup if you change this */ static const __u8 kye_tablet_rdesc[] = { 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ 0x09, 0x01, /* Usage (01h), */ @@ -493,12 +493,19 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, "Genius Gx Imperator Keyboard"); break; + case USB_DEVICE_ID_KYE_EASYPEN_M406: + case USB_DEVICE_ID_KYE_EASYPEN_M506: case USB_DEVICE_ID_KYE_EASYPEN_I405X: case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: - case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: + case USB_DEVICE_ID_KYE_EASYPEN_M406W: case USB_DEVICE_ID_KYE_EASYPEN_M610X: - case USB_DEVICE_ID_KYE_EASYPEN_M406XE: + case USB_DEVICE_ID_KYE_EASYPEN_340: case USB_DEVICE_ID_KYE_PENSKETCH_M912: + case USB_DEVICE_ID_KYE_MOUSEPEN_M508WX: + case USB_DEVICE_ID_KYE_MOUSEPEN_M508X: + case USB_DEVICE_ID_KYE_EASYPEN_M406XE: + case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2: + case USB_DEVICE_ID_KYE_PENSKETCH_T609A: rdesc = kye_tablet_fixup(hdev, rdesc, rsize); break; }