Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
b680751b
Commit
b680751b
authored
Apr 26, 2023
by
Jiri Kosina
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-6.4/kye' into for-linus
- generic support for all Kye tablets (David Yang)
parents
ba984d27
0f6fac2c
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
421 additions
and
526 deletions
+421
-526
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+8
-1
drivers/hid/hid-kye.c
drivers/hid/hid-kye.c
+402
-522
drivers/hid/hid-quirks.c
drivers/hid/hid-quirks.c
+11
-3
No files found.
drivers/hid/hid-ids.h
View file @
b680751b
...
...
@@ -722,12 +722,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_
MOUSEPEN_I608X_V2 0x501a
#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
...
...
drivers/hid/hid-kye.c
View file @
b680751b
...
...
@@ -5,329 +5,176 @@
* Copyright (c) 2009 Jiri Kosina
* Copyright (c) 2009 Tomas Hanak
* Copyright (c) 2012 Nikolai Kondrashov
* Copyright (c) 2023 David Yang
*/
/*
*/
#include <asm-generic/unaligned.h>
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include "hid-ids.h"
/* Original EasyPen i405X report descriptor size */
#define EASYPEN_I405X_RDESC_ORIG_SIZE 476
/* 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
*/
/* 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), */
static
const
__u8
easypen_m406_control_rdesc
[]
=
{
0x05
,
0x0C
,
/* Usage Page (Consumer), */
0x09
,
0x01
,
/* Usage (Consumer Control), */
0xA1
,
0x01
,
/* Collection (Application), */
0x85
,
0x10
,
/* Report ID (16), */
0x09
,
0x20
,
/* Usage (Stylus), */
0xA0
,
/* Collection (Physical), */
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), */
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), */
0x95
,
0x08
,
/* Report Count (8), */
0x81
,
0x02
,
/* Input (Variable), */
0xC0
,
/* End Collection, */
0x95
,
0x30
,
/* Report Count (48), */
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), */
static
const
__u8
easypen_m506_control_rdesc
[]
=
{
0x05
,
0x0C
,
/* Usage Page (Consumer), */
0x09
,
0x01
,
/* Usage (Consumer Control), */
0xA1
,
0x01
,
/* Collection (Application), */
0x85
,
0x10
,
/* Report ID (16), */
0x09
,
0x20
,
/* Usage (Stylus), */
0xA0
,
/* Collection (Physical), */
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), */
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), */
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
,
0x11
,
/* Report ID (17), */
0x09
,
0x01
,
/* Usage (Pointer), */
0xA0
,
/* Collection (Physical), */
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), */
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), */
0x75
,
0x01
,
/* Report Size (1), */
0x95
,
0x04
,
/* Report Count (4), */
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), */
0x95
,
0x34
,
/* Report Count (52), */
0x81
,
0x01
,
/* Input (Constant), */
0xC0
,
/* End Collection, */
0xC0
/* End Collection */
};
/* 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
,
0x01
,
/* Usage (Digitizer), */
static
const
__u8
easypen_m610x_control_rdesc
[]
=
{
0x05
,
0x0C
,
/* Usage Page (Consumer), */
0x09
,
0x01
,
/* Usage (Consumer Control), */
0xA1
,
0x01
,
/* Collection (Application), */
0x85
,
0x10
,
/* Report ID (16), */
0x09
,
0x20
,
/* Usage (Stylus), */
0xA0
,
/* Collection (Physical), */
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), */
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), */
0x95
,
0x34
,
/* Report Count (52), */
0x81
,
0x01
,
/* Input (Constant), */
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
,
0x11
,
/* Report ID (17), */
0x09
,
0x01
,
/* Usage (Pointer), */
0xA0
,
/* Collection (Physical), */
0x85
,
0x12
,
/* Report ID (18), */
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), */
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), */
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, */
0x95
,
0x30
,
/* Report Count (48), */
0x81
,
0x03
,
/* Input (Constant, Variable), */
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), */
static
const
__u8
mousepen_m508wx_control_rdesc
[]
=
{
0x05
,
0x0C
,
/* Usage Page (Consumer), */
0x09
,
0x01
,
/* Usage (Consumer Control), */
0xA1
,
0x01
,
/* Collection (Application), */
0x85
,
0x10
,
/* Report ID (16), */
0x09
,
0x20
,
/* Usage (Stylus), */
0xA0
,
/* Collection (Physical), */
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), */
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), */
0x
75
,
0x10
,
/* Report Size (16),
*/
0x
95
,
0x01
,
/* Report Count (1),
*/
0x
A4
,
/* Push,
*/
0x05
,
0x01
,
/* Usage Page (Desktop), */
0x55
,
0xFD
,
/* Unit Exponent (-3), */
0x65
,
0x13
,
/* Unit (Inch), */
0x
34
,
/* Physical Minimum (0),
*/
0x09
,
0x
30
,
/* Usage (X),
*/
0x
46
,
0x10
,
0x27
,
/* Physical Maximum (10000),
*/
0x
27
,
0x00
,
0xA0
,
0x00
,
0x00
,
/* Logical Maximum (40960),
*/
0x
81
,
0x02
,
/* Input (Variable),
*/
0x09
,
0x
31
,
/* Usage (Y),
*/
0x
46
,
0x6A
,
0x18
,
/* Physical Maximum (6250),
*/
0x
26
,
0x00
,
0x64
,
/* Logical Maximum (25600),
*/
0x
81
,
0x02
,
/* Input (Variable),
*/
0x
B4
,
/* Pop,
*/
0x
09
,
0x30
,
/* Usage (Tip Pressure),
*/
0x
26
,
0xFF
,
0x03
,
/* Logical Maximum (1023),
*/
0x
95
,
0x34
,
/* Report Count (52),
*/
0x
81
,
0x01
,
/* Input (Constant),
*/
0x
C0
/* End Collection
*/
};
static
const
__u8
mousepen_m508x_control_rdesc
[]
=
{
0x
05
,
0x0C
,
/* Usage Page (Consumer),
*/
0x09
,
0x
01
,
/* Usage (Consumer Control),
*/
0x
A1
,
0x01
,
/* Collection (Application),
*/
0x
85
,
0x12
,
/* Report ID (18),
*/
0x
0A
,
0x01
,
0x02
,
/* Usage (AC New),
*/
0x09
,
0x
40
,
/* Usage (Menu),
*/
0x
0A
,
0x6A
,
0x02
,
/* Usage (AC Delete),
*/
0x
0A
,
0x1A
,
0x02
,
/* Usage (AC Undo),
*/
0x
14
,
/* Logical Minimum (0),
*/
0x
25
,
0x01
,
/* Logical Maximum (1),
*/
0x
75
,
0x01
,
/* Report Size (1),
*/
0x
95
,
0x04
,
/* Report Count (4),
*/
0x81
,
0x02
,
/* Input (Variable), */
0xC0
,
/* End Collection, */
0xC0
,
/* End Collection, */
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), */
0xA1
,
0x01
,
/* Collection (Application), */
...
...
@@ -336,30 +183,38 @@ static __u8 easypen_m610x_rdesc_fixed[] = {
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
,
0x1A
,
0x02
,
/* Usage (AC Undo), */
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), */
0x95
,
0x34
,
/* Report Count (52), */
0x81
,
0x03
,
/* Input (Constant, Variable), */
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 */
};
/* 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), */
/* 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), */
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), */
...
...
@@ -382,30 +237,29 @@ static __u8 pensketch_m912_rdesc_fixed[] = {
0x95
,
0x03
,
/* Report Count (3), */
0x81
,
0x02
,
/* Input (Variable), */
0x95
,
0x04
,
/* Report Count (4), */
0x81
,
0x0
3
,
/* Input (Constant, Variable),
*/
0x81
,
0x0
1
,
/* 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
,
0x
00
,
0xB4
,
0x00
,
0x00
,
/* Logical Maximum (46080
), */
0x4
6
,
0x28
,
0x23
,
/* Physical Maximum (9000),
*/
0x27
,
0x
FF
,
0x7F
,
0x00
,
0x00
,
/* Logical Maximum (32767
), */
0x4
7
,
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, */
...
...
@@ -416,146 +270,98 @@ 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
,
0x
00
,
0xB4
,
0x00
,
0x00
,
/* Logical Maximum (46080
), */
0x4
6
,
0x28
,
0x23
,
/* Physical Maximum (9000),
*/
0x27
,
0x
FF
,
0x7F
,
0x00
,
0x00
,
/* Logical Maximum (32767
), */
0x4
7
,
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, */
0xC0
,
/* End Collection, */
0x81
,
0x01
,
/* Input (Constant), */
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
;
__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
[]
=
{
{
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
},
{}
};
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 +380,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
)
{
...
...
@@ -602,66 +481,37 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
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
;
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
);
}
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_GENIUS_MANTICORE
:
rdesc
=
kye_consumer_control_fixup
(
hdev
,
rdesc
,
rsize
,
104
,
"Genius Manticore Keyboard"
);
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
:
rdesc
=
kye_tablet_fixup
(
hdev
,
rdesc
,
rsize
);
break
;
}
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 +538,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
;
...
...
@@ -717,26 +576,33 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
}
switch
(
id
->
product
)
{
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
;
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
:
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
* opened at least once to be fully functional.
*/
if
(
hid_hw_open
(
hdev
))
hid_hw_close
(
hdev
);
break
;
}
return
0
;
...
...
@@ -748,24 +614,38 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
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_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_
MOUSEPEN_I608X_V2
)
},
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_
M406XE
)
},
USB_DEVICE_ID_KYE_EASYPEN_
340
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_KYE
,
USB_DEVICE_ID_
GENIUS_GILA_GAMING_MOUSE
)
},
USB_DEVICE_ID_
KYE_PENSKETCH_M912
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_KYE
,
USB_DEVICE_ID_
GENIUS_GX_IMPERATOR
)
},
USB_DEVICE_ID_
KYE_MOUSEPEN_M508WX
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_KYE
,
USB_DEVICE_ID_
GENIUS_MANTICORE
)
},
USB_DEVICE_ID_
KYE_MOUSEPEN_M508X
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_KYE
,
USB_DEVICE_ID_KYE_PENSKETCH_M912
)
},
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
);
...
...
drivers/hid/hid-quirks.c
View file @
b680751b
...
...
@@ -104,12 +104,20 @@ 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_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_MOUSEPEN_I608X_V2
),
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_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_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
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment