Blame view

drivers/hid/wacom.h 8.07 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
3bea733ab   Ping Cheng   USB: wacom tablet...
2
  /*
4104d13fe   Dmitry Torokhov   Input: move USB t...
3
   * drivers/input/tablet/wacom.h
3bea733ab   Ping Cheng   USB: wacom tablet...
4
   *
232f5693e   Ping Cheng   Input: wacom - en...
5
   *  USB Wacom tablet support
3bea733ab   Ping Cheng   USB: wacom tablet...
6
7
8
9
10
11
12
13
14
   *
   *  Copyright (c) 2000-2004 Vojtech Pavlik	<vojtech@ucw.cz>
   *  Copyright (c) 2000 Andreas Bach Aaen	<abach@stofanet.dk>
   *  Copyright (c) 2000 Clifford Wolf		<clifford@clifford.at>
   *  Copyright (c) 2000 Sam Mosel		<sam.mosel@computer.org>
   *  Copyright (c) 2000 James E. Blair		<corvus@gnu.org>
   *  Copyright (c) 2000 Daniel Egger		<egger@suse.de>
   *  Copyright (c) 2001 Frederic Lepied		<flepied@mandrakesoft.com>
   *  Copyright (c) 2004 Panagiotis Issaris	<panagiotis.issaris@mech.kuleuven.ac.be>
09e7d9410   Ping Cheng   Input: wacom - ad...
15
   *  Copyright (c) 2002-2011 Ping Cheng		<pingc@wacom.com>
1c3c52354   Benjamin Tissoires   Input: wacom - ad...
16
   *  Copyright (c) 2014 Benjamin Tissoires	<benjamin.tissoires@redhat.com>
3bea733ab   Ping Cheng   USB: wacom tablet...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
   *
   *  ChangeLog:
   *      v0.1 (vp)  - Initial release
   *      v0.2 (aba) - Support for all buttons / combinations
   *      v0.3 (vp)  - Support for Intuos added
   *	v0.4 (sm)  - Support for more Intuos models, menustrip
   *			relative mode, proximity.
   *	v0.5 (vp)  - Big cleanup, nifty features removed,
   *			they belong in userspace
   *	v1.8 (vp)  - Submit URB only when operating, moved to CVS,
   *			use input_report_key instead of report_btn and
   *			other cleanups
   *	v1.11 (vp) - Add URB ->dev setting for new kernels
   *	v1.11 (jb) - Add support for the 4D Mouse & Lens
   *	v1.12 (de) - Add support for two more inking pen IDs
   *	v1.14 (vp) - Use new USB device id probing scheme.
   *		     Fix Wacom Graphire mouse wheel
   *	v1.18 (vp) - Fix mouse wheel direction
   *		     Make mouse relative
   *      v1.20 (fl) - Report tool id for Intuos devices
   *                 - Multi tools support
   *                 - Corrected Intuos protocol decoding (airbrush, 4D mouse, lens cursor...)
   *                 - Add PL models support
   *		   - Fix Wacom Graphire mouse wheel again
   *	v1.21 (vp) - Removed protocol descriptions
   *		   - Added MISC_SERIAL for tool serial numbers
   *	      (gb) - Identify version on module load.
   *    v1.21.1 (fl) - added Graphire2 support
   *    v1.21.2 (fl) - added Intuos2 support
   *                 - added all the PL ids
   *    v1.21.3 (fl) - added another eraser id from Neil Okamoto
   *                 - added smooth filter for Graphire from Peri Hankey
   *                 - added PenPartner support from Olaf van Es
   *                 - new tool ids from Ole Martin Bjoerndalen
   *	v1.29 (pc) - Add support for more tablets
   *		   - Fix pressure reporting
   *	v1.30 (vp) - Merge 2.4 and 2.5 drivers
   *		   - Since 2.5 now has input_sync(), remove MSC_SERIAL abuse
   *		   - Cleanups here and there
   *    v1.30.1 (pi) - Added Graphire3 support
   *	v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
   *	v1.43 (pc) - Added support for Cintiq 21UX
   *		   - Fixed a Graphire bug
   *		   - Merged wacom_intuos3_irq into wacom_intuos_irq
   *	v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc.
   *		   - Report Device IDs
   *      v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19
   *                 - Minor data report fix
   *      v1.46 (pc) - Split wacom.c into wacom_sys.c and wacom_wac.c,
   *		   - where wacom_sys.c deals with system specific code,
7ecfbfd3d   Ping Cheng   Input: wacom - ad...
67
   *		   - and wacom_wac.c deals with Wacom specific code
8d32e3ae5   Ping Cheng   USB: Wacom driver...
68
   *		   - Support Intuos3 4x6
7ecfbfd3d   Ping Cheng   Input: wacom - ad...
69
   *      v1.47 (pc) - Added support for Bamboo
0e1763f53   Ping Cheng   Input: wacom - ad...
70
   *      v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX
545f4e99d   Ping Cheng   Input: wacom - ad...
71
   *      v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A)
384318ecd   Ping Cheng   Input: wacom - fi...
72
   *      v1.50 (pc) - Fixed a TabletPC touch bug in 2.6.28
6f660f12d   Ping Cheng   Input: wacom - ad...
73
   *      v1.51 (pc) - Added support for Intuos4
232f5693e   Ping Cheng   Input: wacom - en...
74
   *      v1.52 (pc) - Query Wacom data upon system resume
ee54500d7   Ping Cheng   Input: wacom - ad...
75
   *                 - add defines for features->type
ec67bbedc   Ping Cheng   Input: wacom - ad...
76
   *                 - add new devices (0x9F, 0xE2, and 0XE3)
1c3c52354   Benjamin Tissoires   Input: wacom - ad...
77
78
   *      v2.00 (bt) - conversion to a HID driver
   *                 - integration of the Bluetooth devices
3bea733ab   Ping Cheng   USB: wacom tablet...
79
80
81
   */
  
  /*
3bea733ab   Ping Cheng   USB: wacom tablet...
82
83
84
85
86
87
   */
  #ifndef WACOM_H
  #define WACOM_H
  #include <linux/kernel.h>
  #include <linux/slab.h>
  #include <linux/module.h>
b036f6fb3   Bastian Blank   Input: wacom - ge...
88
  #include <linux/mod_devicetable.h>
7704ac937   Benjamin Tissoires   HID: wacom: imple...
89
  #include <linux/hid.h>
e6f2813a6   Benjamin Tissoires   HID: wacom: EKR: ...
90
  #include <linux/kfifo.h>
97f5541fc   Benjamin Tissoires   HID: wacom: leds:...
91
  #include <linux/leds.h>
3bea733ab   Ping Cheng   USB: wacom tablet...
92
  #include <linux/usb/input.h>
a1d552cc1   Chris Bagwell   Input: wacom - wi...
93
  #include <linux/power_supply.h>
3bea733ab   Ping Cheng   USB: wacom tablet...
94
95
96
97
98
  #include <asm/unaligned.h>
  
  /*
   * Version Information
   */
1c3c52354   Benjamin Tissoires   Input: wacom - ad...
99
  #define DRIVER_VERSION "v2.00"
3bea733ab   Ping Cheng   USB: wacom tablet...
100
  #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
232f5693e   Ping Cheng   Input: wacom - en...
101
  #define DRIVER_DESC "USB Wacom tablet driver"
3bea733ab   Ping Cheng   USB: wacom tablet...
102

3bea733ab   Ping Cheng   USB: wacom tablet...
103
  #define USB_VENDOR_ID_WACOM	0x056a
7b4b30689   Ajay Ramaswamy   Input: wacom - ad...
104
  #define USB_VENDOR_ID_LENOVO	0x17ef
3bea733ab   Ping Cheng   USB: wacom tablet...
105

d17d1f171   Benjamin Tissoires   HID: wacom: use o...
106
107
108
  enum wacom_worker {
  	WACOM_WORKER_WIRELESS,
  	WACOM_WORKER_BATTERY,
e6f2813a6   Benjamin Tissoires   HID: wacom: EKR: ...
109
  	WACOM_WORKER_REMOTE,
4082da80f   Benjamin Tissoires   HID: wacom: gener...
110
  	WACOM_WORKER_MODE_CHANGE,
d17d1f171   Benjamin Tissoires   HID: wacom: use o...
111
  };
97f5541fc   Benjamin Tissoires   HID: wacom: leds:...
112
113
114
115
116
117
118
119
120
121
122
123
  struct wacom;
  
  struct wacom_led {
  	struct led_classdev cdev;
  	struct led_trigger trigger;
  	struct wacom *wacom;
  	unsigned int group;
  	unsigned int id;
  	u8 llv;
  	u8 hlv;
  	bool held;
  };
a50aac719   Benjamin Tissoires   HID: wacom: leds:...
124
125
  struct wacom_group_leds {
  	u8 select; /* status led selector (0..3) */
97f5541fc   Benjamin Tissoires   HID: wacom: leds:...
126
127
  	struct wacom_led *leds;
  	unsigned int count;
589e50602   Benjamin Tissoires   HID: wacom: leds:...
128
  	struct device *dev;
a50aac719   Benjamin Tissoires   HID: wacom: leds:...
129
  };
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
130
  struct wacom_battery {
9956953ec   Benjamin Tissoires   HID: wacom: power...
131
  	struct wacom *wacom;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
132
  	struct power_supply_desc bat_desc;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
133
  	struct power_supply *battery;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
134
  	char bat_name[WACOM_NAME_MAX];
16e459890   Jason Gerecke   HID: wacom: Add a...
135
  	int bat_status;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
136
137
138
139
140
  	int battery_capacity;
  	int bat_charging;
  	int bat_connected;
  	int ps_connected;
  };
83e6b40e2   Benjamin Tissoires   HID: wacom: EKR: ...
141
142
143
144
  struct wacom_remote {
  	spinlock_t remote_lock;
  	struct kfifo remote_fifo;
  	struct kobject *remote_dir;
e7749f6e5   Benjamin Tissoires   HID: wacom: EKR: ...
145
146
147
  	struct {
  		struct attribute_group group;
  		u32 serial;
7c35dc3cd   Benjamin Tissoires   HID: wacom: EKR: ...
148
149
  		struct input_dev *input;
  		bool registered;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
150
  		struct wacom_battery battery;
e7749f6e5   Benjamin Tissoires   HID: wacom: EKR: ...
151
  	} remotes[WACOM_MAX_REMOTES];
83e6b40e2   Benjamin Tissoires   HID: wacom: EKR: ...
152
  };
3bea733ab   Ping Cheng   USB: wacom tablet...
153
  struct wacom {
3bea733ab   Ping Cheng   USB: wacom tablet...
154
  	struct usb_device *usbdev;
e72240944   Oliver Neukum   Input: wacom - im...
155
  	struct usb_interface *intf;
51269fe86   Dmitry Torokhov   Input: wacom - do...
156
  	struct wacom_wac wacom_wac;
29b473913   Benjamin Tissoires   Input: wacom - sw...
157
  	struct hid_device *hdev;
e72240944   Oliver Neukum   Input: wacom - im...
158
  	struct mutex lock;
d17d1f171   Benjamin Tissoires   HID: wacom: use o...
159
160
  	struct work_struct wireless_work;
  	struct work_struct battery_work;
e6f2813a6   Benjamin Tissoires   HID: wacom: EKR: ...
161
  	struct work_struct remote_work;
a544c619a   Benjamin Tissoires   HID: wacom: do no...
162
  	struct delayed_work init_work;
83e6b40e2   Benjamin Tissoires   HID: wacom: EKR: ...
163
  	struct wacom_remote *remote;
4082da80f   Benjamin Tissoires   HID: wacom: gener...
164
  	struct work_struct mode_change_work;
10c55cacb   Aaron Armstrong Skomra   HID: wacom: gener...
165
  	bool generic_has_leds;
a50aac719   Benjamin Tissoires   HID: wacom: leds:...
166
167
  	struct wacom_leds {
  		struct wacom_group_leds *groups;
97f5541fc   Benjamin Tissoires   HID: wacom: leds:...
168
  		unsigned int count;
09e7d9410   Ping Cheng   Input: wacom - ad...
169
170
  		u8 llv;       /* status led brightness no button (1..127) */
  		u8 hlv;       /* status led brightness button pressed (1..127) */
5d7e7d479   Eduard Hasenleithner   Input: wacom - ad...
171
  		u8 img_lum;   /* OLED matrix display brightness */
97f5541fc   Benjamin Tissoires   HID: wacom: leds:...
172
173
  		u8 max_llv;   /* maximum brightness of LED (llv) */
  		u8 max_hlv;   /* maximum brightness of LED (hlv) */
5d7e7d479   Eduard Hasenleithner   Input: wacom - ad...
174
  	} led;
59d69bc82   Benjamin Tissoires   HID: wacom: EKR: ...
175
  	struct wacom_battery battery;
84dfbd7f2   Benjamin Tissoires   HID: wacom: put t...
176
  	bool resources;
3bea733ab   Ping Cheng   USB: wacom tablet...
177
  };
d17d1f171   Benjamin Tissoires   HID: wacom: use o...
178
179
  static inline void wacom_schedule_work(struct wacom_wac *wacom_wac,
  				       enum wacom_worker which)
16bf288c4   Chris Bagwell   Input: wacom - cr...
180
181
  {
  	struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
d17d1f171   Benjamin Tissoires   HID: wacom: use o...
182
183
184
185
186
187
188
189
  
  	switch (which) {
  	case WACOM_WORKER_WIRELESS:
  		schedule_work(&wacom->wireless_work);
  		break;
  	case WACOM_WORKER_BATTERY:
  		schedule_work(&wacom->battery_work);
  		break;
e6f2813a6   Benjamin Tissoires   HID: wacom: EKR: ...
190
191
192
  	case WACOM_WORKER_REMOTE:
  		schedule_work(&wacom->remote_work);
  		break;
4082da80f   Benjamin Tissoires   HID: wacom: gener...
193
194
195
  	case WACOM_WORKER_MODE_CHANGE:
  		schedule_work(&wacom->mode_change_work);
  		break;
d17d1f171   Benjamin Tissoires   HID: wacom: use o...
196
  	}
16bf288c4   Chris Bagwell   Input: wacom - cr...
197
  }
ff479731c   Jason Gerecke   HID: wacom: gener...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  /*
   * Convert a signed 32-bit integer to an unsigned n-bit integer. Undoes
   * the normally-helpful work of 'hid_snto32' for fields that use signed
   * ranges for questionable reasons.
   */
  static inline __u32 wacom_s32tou(s32 value, __u8 n)
  {
  	switch (n) {
  	case 8:  return ((__u8)value);
  	case 16: return ((__u16)value);
  	case 32: return ((__u32)value);
  	}
  	return value & (1 << (n - 1)) ? value & (~(~0U << n)) : value;
  }
29b473913   Benjamin Tissoires   Input: wacom - sw...
212
  extern const struct hid_device_id wacom_ids[];
b036f6fb3   Bastian Blank   Input: wacom - ge...
213

95dd3b30c   Dmitry Torokhov   Input: wacom - ge...
214
  void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len);
42f4f2727   Ping Cheng   HID: wacom: move ...
215
  void wacom_setup_device_quirks(struct wacom *wacom);
2636a3f2d   Jason Gerecke   HID: wacom: Split...
216
217
218
  int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
  				   struct wacom_wac *wacom_wac);
  int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
1963518b9   Ping Cheng   Input: wacom - ad...
219
  				   struct wacom_wac *wacom_wac);
d2d13f18a   Benjamin Tissoires   Input: wacom - cr...
220
221
  int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
  				       struct wacom_wac *wacom_wac);
7704ac937   Benjamin Tissoires   HID: wacom: imple...
222
223
  void wacom_wac_usage_mapping(struct hid_device *hdev,
  		struct hid_field *field, struct hid_usage *usage);
354a32985   Ping Cheng   HID: wacom: gener...
224
  void wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
7704ac937   Benjamin Tissoires   HID: wacom: imple...
225
226
  		struct hid_usage *usage, __s32 value);
  void wacom_wac_report(struct hid_device *hdev, struct hid_report *report);
fce9957d8   Jason Gerecke   HID: wacom: Allow...
227
  void wacom_battery_work(struct work_struct *work);
34736aa96   Benjamin Tissoires   HID: wacom: leds:...
228
229
230
231
  enum led_brightness wacom_leds_brightness_get(struct wacom_led *led);
  struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
  				 unsigned int id);
  struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
ac2423c97   Aaron Armstrong Skomra   HID: wacom: gener...
232
  int wacom_equivalent_usage(int usage);
10c55cacb   Aaron Armstrong Skomra   HID: wacom: gener...
233
  int wacom_initialize_leds(struct wacom *wacom);
3bea733ab   Ping Cheng   USB: wacom tablet...
234
  #endif