2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2009-03-11 13:43:27 +03:00
/*
* HID driver for Kye / Genius devices not fully compliant with HID standard
*
* Copyright ( c ) 2009 Jiri Kosina
* Copyright ( c ) 2009 Tomas Hanak
2012-02-28 15:01:46 +04:00
* Copyright ( c ) 2012 Nikolai Kondrashov
2009-03-11 13:43:27 +03:00
*/
/*
*/
# include <linux/device.h>
# include <linux/hid.h>
# include <linux/module.h>
# include "hid-ids.h"
2012-02-28 15:01:46 +04:00
/* 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 , 0x02 , /* Usage (Pen), */
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 */
} ;
/* 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 , 0x02 , /* Usage (Pen), */
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 */
} ;
2016-09-14 21:38:14 +03:00
/* Original MousePen i608X v2 report descriptor size */
# define MOUSEPEN_I608X_V2_RDESC_ORIG_SIZE 482
/* Fixed MousePen i608X v2 report descriptor */
static __u8 mousepen_i608x_v2_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 , 0x02 , /* Usage (Pen), */
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 */
} ;
2012-02-28 15:01:46 +04:00
/* 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 , 0x02 , /* Usage (Pen), */
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 */
} ;
2015-02-14 11:48:44 +03:00
/* 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), */
0x95 , 0x07 , /* Report Count (7), */
0xB1 , 0x02 , /* Feature (Variable), */
0xC0 , /* End Collection, */
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x02 , /* Usage (Pen), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x10 , /* Report ID (16), */
0x09 , 0x20 , /* Usage (Stylus), */
0xA0 , /* Collection (Physical), */
0x09 , 0x42 , /* Usage (Tip Switch), */
0x09 , 0x44 , /* Usage (Barrel Switch), */
0x09 , 0x46 , /* Usage (Tablet Pick), */
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 , 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), */
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), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x27 , 0x00 , 0xB4 , 0x00 , 0x00 , /* Logical Maximum (46080), */
0x46 , 0x28 , 0x23 , /* Physical Maximum (9000), */
0x81 , 0x02 , /* Input (Variable), */
0xB4 , /* Pop, */
0x09 , 0x30 , /* Usage (Tip Pressure), */
0x14 , /* Logical Minimum (0), */
0x26 , 0xFF , 0x07 , /* Logical Maximum (2047), */
0x81 , 0x02 , /* Input (Variable), */
0xC0 , /* End Collection, */
0xC0 , /* End Collection, */
0x05 , 0x0D , /* Usage Page (Digitizer), */
0x09 , 0x21 , /* Usage (Puck), */
0xA1 , 0x01 , /* Collection (Application), */
0x85 , 0x11 , /* Report ID (17), */
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), */
0x95 , 0x03 , /* Report Count (3), */
0x81 , 0x02 , /* Input (Variable), */
0x95 , 0x04 , /* Report Count (4), */
0x81 , 0x01 , /* Input (Constant), */
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), */
0x09 , 0x30 , /* Usage (X), */
0x27 , 0x00 , 0xF0 , 0x00 , 0x00 , /* Logical Maximum (61440), */
0x46 , 0xE0 , 0x2E , /* Physical Maximum (12000), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x31 , /* Usage (Y), */
0x27 , 0x00 , 0xB4 , 0x00 , 0x00 , /* Logical Maximum (46080), */
0x46 , 0x28 , 0x23 , /* Physical Maximum (9000), */
0x81 , 0x02 , /* Input (Variable), */
0x09 , 0x38 , /* Usage (Wheel), */
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, */
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 */
} ;
2019-02-10 13:13:47 +03:00
/* 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 , 0x02 , /* Usage (Pen), */
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 */
} ;
2013-07-15 12:12:18 +04:00
static __u8 * kye_consumer_control_fixup ( struct hid_device * hdev , __u8 * rdesc ,
unsigned int * rsize , int offset , const char * device_name ) {
/*
* the fixup that need to be done :
2017-02-28 01:29:25 +03:00
* - change Usage Maximum in the Consumer Control
2013-07-15 12:12:18 +04:00
* ( report ID 3 ) to a reasonable value
*/
if ( * rsize > = offset + 31 & &
/* Usage Page (Consumer Devices) */
rdesc [ offset ] = = 0x05 & & rdesc [ offset + 1 ] = = 0x0c & &
/* Usage (Consumer Control) */
rdesc [ offset + 2 ] = = 0x09 & & rdesc [ offset + 3 ] = = 0x01 & &
/* Usage Maximum > 12287 */
rdesc [ offset + 10 ] = = 0x2a & & rdesc [ offset + 12 ] > 0x2f ) {
hid_info ( hdev , " fixing up %s report descriptor \n " , device_name ) ;
rdesc [ offset + 12 ] = 0x2f ;
}
return rdesc ;
}
2010-08-06 23:03:06 +04:00
static __u8 * kye_report_fixup ( struct hid_device * hdev , __u8 * rdesc ,
unsigned int * rsize )
2009-03-11 13:43:27 +03:00
{
2012-02-28 15:01:46 +04:00
switch ( hdev - > product ) {
case USB_DEVICE_ID_KYE_ERGO_525V :
/* the fixups that need to be done:
* - change led usage page to button for extra buttons
* - report size 8 count 1 must be size 1 count 8 for button
* bitfield
* - change the button usage range to 4 - 7 for the extra
* buttons
*/
2014-08-21 18:57:48 +04:00
if ( * rsize > = 75 & &
2012-02-28 15:01:46 +04:00
rdesc [ 61 ] = = 0x05 & & rdesc [ 62 ] = = 0x08 & &
rdesc [ 63 ] = = 0x19 & & rdesc [ 64 ] = = 0x08 & &
rdesc [ 65 ] = = 0x29 & & rdesc [ 66 ] = = 0x0f & &
rdesc [ 71 ] = = 0x75 & & rdesc [ 72 ] = = 0x08 & &
rdesc [ 73 ] = = 0x95 & & rdesc [ 74 ] = = 0x01 ) {
hid_info ( hdev ,
" fixing up Kye/Genius Ergo Mouse "
" report descriptor \n " ) ;
rdesc [ 62 ] = 0x09 ;
rdesc [ 64 ] = 0x04 ;
rdesc [ 66 ] = 0x07 ;
rdesc [ 72 ] = 0x01 ;
rdesc [ 74 ] = 0x08 ;
}
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 ;
2016-09-14 21:38:14 +03:00
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 ;
2012-02-28 15:01:46 +04:00
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 ;
2019-02-10 13:13:47 +03:00
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 ;
2015-02-14 11:48:44 +03:00
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 ) ;
}
break ;
HID: kye: Add report fixup for Genius Gila Gaming mouse
Genius Gila Gaming Mouse presents an obviously wrong report descriptor.
the Consumer control (report ID 3) is the following:
0x05, 0x0c, // Usage Page (Consumer Devices) 105
0x09, 0x01, // Usage (Consumer Control) 107
0xa1, 0x01, // Collection (Application) 109
0x85, 0x03, // Report ID (3) 111
0x19, 0x00, // Usage Minimum (0) 113
0x2a, 0xff, 0x7f, // Usage Maximum (32767) 115
0x15, 0x00, // Logical Minimum (0) 118
0x26, 0xff, 0x7f, // Logical Maximum (32767) 120
0x75, 0x10, // Report Size (16) 123
0x95, 0x03, // Report Count (3) 125
0x81, 0x00, // Input (Data,Arr,Abs) 127
0x75, 0x08, // Report Size (8) 129
0x95, 0x01, // Report Count (1) 131
0x81, 0x01, // Input (Cnst,Arr,Abs) 133
0xc0, // End Collection 135
So the first input whithin this report has a count of 3 but a usage range
of 32768. So this value is obviously wrong as it should not be greater than
the report count.
Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=959721
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2013-07-02 20:10:09 +04:00
case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE :
2013-07-15 12:12:18 +04:00
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 " ) ;
2013-11-30 23:12:27 +04:00
break ;
2013-11-20 18:49:41 +04:00
case USB_DEVICE_ID_GENIUS_MANTICORE :
rdesc = kye_consumer_control_fixup ( hdev , rdesc , rsize , 104 ,
" Genius Manticore Keyboard " ) ;
HID: kye: Add report fixup for Genius Gila Gaming mouse
Genius Gila Gaming Mouse presents an obviously wrong report descriptor.
the Consumer control (report ID 3) is the following:
0x05, 0x0c, // Usage Page (Consumer Devices) 105
0x09, 0x01, // Usage (Consumer Control) 107
0xa1, 0x01, // Collection (Application) 109
0x85, 0x03, // Report ID (3) 111
0x19, 0x00, // Usage Minimum (0) 113
0x2a, 0xff, 0x7f, // Usage Maximum (32767) 115
0x15, 0x00, // Logical Minimum (0) 118
0x26, 0xff, 0x7f, // Logical Maximum (32767) 120
0x75, 0x10, // Report Size (16) 123
0x95, 0x03, // Report Count (3) 125
0x81, 0x00, // Input (Data,Arr,Abs) 127
0x75, 0x08, // Report Size (8) 129
0x95, 0x01, // Report Count (1) 131
0x81, 0x01, // Input (Cnst,Arr,Abs) 133
0xc0, // End Collection 135
So the first input whithin this report has a count of 3 but a usage range
of 32768. So this value is obviously wrong as it should not be greater than
the report count.
Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=959721
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2013-07-02 20:10:09 +04:00
break ;
2009-03-11 13:43:27 +03:00
}
2010-08-06 23:03:06 +04:00
return rdesc ;
2009-03-11 13:43:27 +03:00
}
2012-02-28 15:01:46 +04:00
/**
2021-03-26 17:34:47 +03:00
* kye_tablet_enable ( ) - Enable fully - functional tablet mode by setting a special feature report .
2012-02-28 15:01:46 +04:00
*
* @ 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 ;
struct list_head * head ;
struct hid_report * report ;
__s32 * value ;
list = & hdev - > report_enum [ HID_FEATURE_REPORT ] . report_list ;
list_for_each ( head , list ) {
report = list_entry ( head , struct hid_report , list ) ;
if ( report - > id = = 5 )
break ;
}
if ( head = = list ) {
hid_err ( hdev , " tablet-enabling feature report not found \n " ) ;
return - ENODEV ;
}
if ( report - > maxfield < 1 | | report - > field [ 0 ] - > report_count < 7 ) {
hid_err ( hdev , " invalid tablet-enabling feature report \n " ) ;
return - ENODEV ;
}
value = report - > field [ 0 ] - > value ;
value [ 0 ] = 0x12 ;
value [ 1 ] = 0x10 ;
value [ 2 ] = 0x11 ;
value [ 3 ] = 0x12 ;
value [ 4 ] = 0x00 ;
value [ 5 ] = 0x00 ;
value [ 6 ] = 0x00 ;
2013-02-25 14:31:46 +04:00
hid_hw_request ( hdev , report , HID_REQ_SET_REPORT ) ;
2012-02-28 15:01:46 +04:00
return 0 ;
}
static int kye_probe ( struct hid_device * hdev , const struct hid_device_id * id )
{
int ret ;
ret = hid_parse ( hdev ) ;
if ( ret ) {
hid_err ( hdev , " parse failed \n " ) ;
goto err ;
}
ret = hid_hw_start ( hdev , HID_CONNECT_DEFAULT ) ;
if ( ret ) {
hid_err ( hdev , " hw start failed \n " ) ;
goto err ;
}
switch ( id - > product ) {
case USB_DEVICE_ID_KYE_EASYPEN_I405X :
case USB_DEVICE_ID_KYE_MOUSEPEN_I608X :
2016-09-14 21:38:13 +03:00
case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 :
2012-02-28 15:01:46 +04:00
case USB_DEVICE_ID_KYE_EASYPEN_M610X :
2019-02-10 13:13:47 +03:00
case USB_DEVICE_ID_KYE_EASYPEN_M406XE :
2015-02-14 11:48:44 +03:00
case USB_DEVICE_ID_KYE_PENSKETCH_M912 :
2012-02-28 15:01:46 +04:00
ret = kye_tablet_enable ( hdev ) ;
if ( ret ) {
hid_err ( hdev , " tablet enabling failed \n " ) ;
goto enabling_err ;
}
break ;
2013-11-20 18:49:42 +04:00
case USB_DEVICE_ID_GENIUS_MANTICORE :
/*
* The manticore keyboard needs to have all the interfaces
* opened at least once to be fully functional .
*/
if ( hid_hw_open ( hdev ) )
hid_hw_close ( hdev ) ;
break ;
2012-02-28 15:01:46 +04:00
}
return 0 ;
enabling_err :
hid_hw_stop ( hdev ) ;
err :
return ret ;
}
2009-03-11 13:43:27 +03:00
static const struct hid_device_id kye_devices [ ] = {
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE , USB_DEVICE_ID_KYE_ERGO_525V ) } ,
2012-02-28 15:01:46 +04:00
{ 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 ) } ,
2014-12-27 01:28:30 +03:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
2016-09-14 21:38:13 +03:00
USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2 ) } ,
2012-02-28 15:01:46 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_KYE_EASYPEN_M610X ) } ,
2019-02-10 13:13:47 +03:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_KYE_EASYPEN_M406XE ) } ,
HID: kye: Add report fixup for Genius Gila Gaming mouse
Genius Gila Gaming Mouse presents an obviously wrong report descriptor.
the Consumer control (report ID 3) is the following:
0x05, 0x0c, // Usage Page (Consumer Devices) 105
0x09, 0x01, // Usage (Consumer Control) 107
0xa1, 0x01, // Collection (Application) 109
0x85, 0x03, // Report ID (3) 111
0x19, 0x00, // Usage Minimum (0) 113
0x2a, 0xff, 0x7f, // Usage Maximum (32767) 115
0x15, 0x00, // Logical Minimum (0) 118
0x26, 0xff, 0x7f, // Logical Maximum (32767) 120
0x75, 0x10, // Report Size (16) 123
0x95, 0x03, // Report Count (3) 125
0x81, 0x00, // Input (Data,Arr,Abs) 127
0x75, 0x08, // Report Size (8) 129
0x95, 0x01, // Report Count (1) 131
0x81, 0x01, // Input (Cnst,Arr,Abs) 133
0xc0, // End Collection 135
So the first input whithin this report has a count of 3 but a usage range
of 32768. So this value is obviously wrong as it should not be greater than
the report count.
Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=959721
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2013-07-02 20:10:09 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE ) } ,
2013-07-15 12:12:18 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_GENIUS_GX_IMPERATOR ) } ,
2013-11-20 18:49:41 +04:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_GENIUS_MANTICORE ) } ,
2015-02-14 11:48:44 +03:00
{ HID_USB_DEVICE ( USB_VENDOR_ID_KYE ,
USB_DEVICE_ID_KYE_PENSKETCH_M912 ) } ,
2009-03-11 13:43:27 +03:00
{ }
} ;
MODULE_DEVICE_TABLE ( hid , kye_devices ) ;
static struct hid_driver kye_driver = {
. name = " kye " ,
. id_table = kye_devices ,
2012-02-28 15:01:46 +04:00
. probe = kye_probe ,
2009-03-11 13:43:27 +03:00
. report_fixup = kye_report_fixup ,
} ;
2012-12-18 02:28:26 +04:00
module_hid_driver ( kye_driver ) ;
2009-03-11 13:43:27 +03:00
MODULE_LICENSE ( " GPL " ) ;