Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-block.git] / drivers / hid / wacom_wac.h
CommitLineData
2874c5fd 1/* SPDX-License-Identifier: GPL-2.0-or-later */
35f47386 2
3bea733a
PC
3#ifndef WACOM_WAC_H
4#define WACOM_WAC_H
5
51269fe8 6#include <linux/types.h>
d97a5522 7#include <linux/hid.h>
83417206 8#include <linux/kfifo.h>
51269fe8 9
4922cd26
JG
10/* maximum packet length for USB/BT devices */
11#define WACOM_PKGLEN_MAX 361
ee54500d 12
57bcfce3 13#define WACOM_NAME_MAX 64
72b236d6
AS
14#define WACOM_MAX_REMOTES 5
15#define WACOM_STATUS_UNKNOWN 255
57bcfce3 16
ee54500d 17/* packet length for individual models */
e33da8a5 18#define WACOM_PKGLEN_BBFUN 9
ee54500d 19#define WACOM_PKGLEN_TPC1FG 5
61616ed0 20#define WACOM_PKGLEN_TPC1FG_B 10
e33da8a5 21#define WACOM_PKGLEN_TPC2FG 14
4a88081e 22#define WACOM_PKGLEN_BBTOUCH 20
4134361a 23#define WACOM_PKGLEN_BBTOUCH3 64
73149ab8 24#define WACOM_PKGLEN_BBPEN 10
d3825d51 25#define WACOM_PKGLEN_WIRELESS 32
d51ddb2b 26#define WACOM_PKGLEN_PENABLED 8
8c97a765
BT
27#define WACOM_PKGLEN_BPAD_TOUCH 32
28#define WACOM_PKGLEN_BPAD_TOUCH_USB 64
1963518b
PC
29
30/* wacom data size per MT contact */
31#define WACOM_BYTES_PER_MT_PACKET 11
b1e4279e 32#define WACOM_BYTES_PER_24HDT_PACKET 14
500d4160 33#define WACOM_BYTES_PER_QHDTHID_PACKET 6
ee54500d 34
ec67bbed 35/* device IDs */
3bea733a 36#define STYLUS_DEVICE_ID 0x02
545f4e99 37#define TOUCH_DEVICE_ID 0x03
3bea733a
PC
38#define CURSOR_DEVICE_ID 0x06
39#define ERASER_DEVICE_ID 0x0A
80d4e8e9 40#define PAD_DEVICE_ID 0x0F
3bea733a 41
cad74700
PC
42/* wacom data packet report IDs */
43#define WACOM_REPORT_PENABLED 2
387142bb 44#define WACOM_REPORT_PENABLED_BT 3
06109993
JG
45#define WACOM_REPORT_INTUOS_ID1 5
46#define WACOM_REPORT_INTUOS_ID2 6
cad74700 47#define WACOM_REPORT_INTUOSPAD 12
f860e581 48#define WACOM_REPORT_INTUOS5PAD 3
497ab1f2 49#define WACOM_REPORT_DTUSPAD 21
cad74700
PC
50#define WACOM_REPORT_TPC1FG 6
51#define WACOM_REPORT_TPC2FG 13
1963518b 52#define WACOM_REPORT_TPCMT 13
d51ddb2b 53#define WACOM_REPORT_TPCMT2 3
31175a83 54#define WACOM_REPORT_TPCHID 15
500d4160
PC
55#define WACOM_REPORT_CINTIQ 16
56#define WACOM_REPORT_CINTIQPAD 17
31175a83 57#define WACOM_REPORT_TPCST 16
497ab1f2 58#define WACOM_REPORT_DTUS 17
ac173837 59#define WACOM_REPORT_TPC1FGE 18
b1e4279e 60#define WACOM_REPORT_24HDT 1
b5fd2a3e 61#define WACOM_REPORT_WL 128
961794a0 62#define WACOM_REPORT_USB 192
8c97a765
BT
63#define WACOM_REPORT_BPAD_PEN 3
64#define WACOM_REPORT_BPAD_TOUCH 16
72b236d6 65#define WACOM_REPORT_DEVICE_LIST 16
eda01dab 66#define WACOM_REPORT_INTUOS_PEN 16
72b236d6 67#define WACOM_REPORT_REMOTE 17
0bbfe28a 68#define WACOM_REPORT_INTUOSHT2_ID 8
cad74700 69
5ba13c64
JG
70/* wacom command report ids */
71#define WAC_CMD_WL_LED_CONTROL 0x03
72#define WAC_CMD_LED_CONTROL 0x20
73#define WAC_CMD_ICON_START 0x21
74#define WAC_CMD_ICON_XFER 0x23
75#define WAC_CMD_ICON_BT_XFER 0x26
76#define WAC_CMD_DELETE_PAIRING 0x20
10c55cac 77#define WAC_CMD_LED_CONTROL_GENERIC 0x32
5ba13c64 78#define WAC_CMD_UNPAIR_ALL 0xFF
4922cd26 79#define WAC_CMD_WL_INTUOSP2 0x82
5ba13c64 80
bc73dd39 81/* device quirks */
f3586d2f 82#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0001
61ce346a 83#define WACOM_QUIRK_SENSE 0x0002
99acedad 84#define WACOM_QUIRK_AESPEN 0x0004
f3586d2f 85#define WACOM_QUIRK_BATTERY 0x0008
83417206 86#define WACOM_QUIRK_TOOLSERIAL 0x0010
6d09085b 87#define WACOM_QUIRK_PEN_BUTTON3 0x0020
bc73dd39 88
aa86b18c
JG
89/* device types */
90#define WACOM_DEVICETYPE_NONE 0x0000
91#define WACOM_DEVICETYPE_PEN 0x0001
92#define WACOM_DEVICETYPE_TOUCH 0x0002
862cf553 93#define WACOM_DEVICETYPE_PAD 0x0004
ccad85cc 94#define WACOM_DEVICETYPE_WL_MONITOR 0x0008
e5bc8eb1 95#define WACOM_DEVICETYPE_DIRECT 0x0010
aa86b18c 96
16e45989
JG
97#define WACOM_POWER_SUPPLY_STATUS_AUTO -1
98
8de82280 99#define WACOM_HID_UP_WACOMDIGITIZER 0xff0d0000
5922e613
JG
100#define WACOM_HID_SP_PAD 0x00040000
101#define WACOM_HID_SP_BUTTON 0x00090000
c9c09587
JG
102#define WACOM_HID_SP_DIGITIZER 0x000d0000
103#define WACOM_HID_SP_DIGITIZERINFO 0x00100000
8de82280 104#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01)
ac2423c9 105#define WACOM_HID_WD_PEN (WACOM_HID_UP_WACOMDIGITIZER | 0x02)
61ce346a 106#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36)
5922e613 107#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
99acedad 108#define WACOM_HID_WD_SERIALNUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x5b)
f85c9dc6 109#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
6d09085b 110#define WACOM_HID_WD_BARRELSWITCH3 (WACOM_HID_UP_WACOMDIGITIZER | 0x5d)
f85c9dc6 111#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77)
b5c921e6 112#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132)
bf78adcb
JG
113#define WACOM_HID_WD_TOUCHSTRIP (WACOM_HID_UP_WACOMDIGITIZER | 0x0136)
114#define WACOM_HID_WD_TOUCHSTRIP2 (WACOM_HID_UP_WACOMDIGITIZER | 0x0137)
5922e613
JG
115#define WACOM_HID_WD_TOUCHRING (WACOM_HID_UP_WACOMDIGITIZER | 0x0138)
116#define WACOM_HID_WD_TOUCHRINGSTATUS (WACOM_HID_UP_WACOMDIGITIZER | 0x0139)
b1f466a9 117#define WACOM_HID_WD_REPORT_VALID (WACOM_HID_UP_WACOMDIGITIZER | 0x01d0)
6d09085b 118#define WACOM_HID_WD_SEQUENCENUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x0220)
5922e613
JG
119#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
120#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
121#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
93aab7fa 122#define WACOM_HID_WD_BATTERY_CHARGING (WACOM_HID_UP_WACOMDIGITIZER | 0x0404)
d2ec58ae 123#define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0454)
93aab7fa 124#define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
5922e613 125#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
424d8237 126#define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0940)
4082da80 127#define WACOM_HID_WD_MODE_CHANGE (WACOM_HID_UP_WACOMDIGITIZER | 0x0980)
d793ff81 128#define WACOM_HID_WD_MUTE_DEVICE (WACOM_HID_UP_WACOMDIGITIZER | 0x0981)
4eb220cb
PC
129#define WACOM_HID_WD_CONTROLPANEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0982)
130#define WACOM_HID_WD_ONSCREEN_KEYBOARD (WACOM_HID_UP_WACOMDIGITIZER | 0x0983)
131#define WACOM_HID_WD_BUTTONCONFIG (WACOM_HID_UP_WACOMDIGITIZER | 0x0986)
5922e613
JG
132#define WACOM_HID_WD_BUTTONHOME (WACOM_HID_UP_WACOMDIGITIZER | 0x0990)
133#define WACOM_HID_WD_BUTTONUP (WACOM_HID_UP_WACOMDIGITIZER | 0x0991)
134#define WACOM_HID_WD_BUTTONDOWN (WACOM_HID_UP_WACOMDIGITIZER | 0x0992)
135#define WACOM_HID_WD_BUTTONLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0993)
136#define WACOM_HID_WD_BUTTONRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0994)
bf78adcb 137#define WACOM_HID_WD_BUTTONCENTER (WACOM_HID_UP_WACOMDIGITIZER | 0x0995)
929d6d5d 138#define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03)
345857bb
JG
139#define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30)
140#define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31)
141#define WACOM_HID_WD_OFFSETRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d32)
142#define WACOM_HID_WD_OFFSETBOTTOM (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33)
c9c09587 143#define WACOM_HID_WD_DATAMODE (WACOM_HID_UP_WACOMDIGITIZER | 0x1002)
5922e613 144#define WACOM_HID_WD_DIGITIZERINFO (WACOM_HID_UP_WACOMDIGITIZER | 0x1013)
d8e98060 145#define WACOM_HID_WD_TOUCH_RING_SETTING (WACOM_HID_UP_WACOMDIGITIZER | 0x1032)
8de82280
JG
146#define WACOM_HID_UP_G9 0xff090000
147#define WACOM_HID_G9_PEN (WACOM_HID_UP_G9 | 0x02)
148#define WACOM_HID_G9_TOUCHSCREEN (WACOM_HID_UP_G9 | 0x11)
149#define WACOM_HID_UP_G11 0xff110000
150#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02)
151#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11)
ac2423c9
AAS
152#define WACOM_HID_UP_WACOMTOUCH 0xff000000
153#define WACOM_HID_WT_TOUCHSCREEN (WACOM_HID_UP_WACOMTOUCH | 0x04)
154#define WACOM_HID_WT_TOUCHPAD (WACOM_HID_UP_WACOMTOUCH | 0x05)
155#define WACOM_HID_WT_CONTACTMAX (WACOM_HID_UP_WACOMTOUCH | 0x55)
99acedad 156#define WACOM_HID_WT_SERIALNUMBER (WACOM_HID_UP_WACOMTOUCH | 0x5b)
ac2423c9
AAS
157#define WACOM_HID_WT_X (WACOM_HID_UP_WACOMTOUCH | 0x130)
158#define WACOM_HID_WT_Y (WACOM_HID_UP_WACOMTOUCH | 0x131)
f4e11d59 159#define WACOM_HID_WT_REPORT_VALID (WACOM_HID_UP_WACOMTOUCH | 0x1d0)
042628ab 160
5ac3d4ae
JG
161#define WACOM_BATTERY_USAGE(f) (((f)->hid == HID_DG_BATTERYSTRENGTH) || \
162 ((f)->hid == WACOM_HID_WD_BATTERY_CHARGING) || \
163 ((f)->hid == WACOM_HID_WD_BATTERY_LEVEL))
164
5922e613
JG
165#define WACOM_PAD_FIELD(f) (((f)->physical == HID_DG_TABLETFUNCTIONKEY) || \
166 ((f)->physical == WACOM_HID_WD_DIGITIZERFNKEYS) || \
167 ((f)->physical == WACOM_HID_WD_DIGITIZERINFO))
168
d97a5522
BT
169#define WACOM_PEN_FIELD(f) (((f)->logical == HID_DG_STYLUS) || \
170 ((f)->physical == HID_DG_STYLUS) || \
61e9e7e4 171 ((f)->physical == HID_DG_PEN) || \
042628ab
JG
172 ((f)->application == HID_DG_PEN) || \
173 ((f)->application == HID_DG_DIGITIZER) || \
885e89f6 174 ((f)->application == WACOM_HID_WD_PEN) || \
1b18b75c
JG
175 ((f)->application == WACOM_HID_WD_DIGITIZER) || \
176 ((f)->application == WACOM_HID_G9_PEN) || \
177 ((f)->application == WACOM_HID_G11_PEN))
d97a5522
BT
178#define WACOM_FINGER_FIELD(f) (((f)->logical == HID_DG_FINGER) || \
179 ((f)->physical == HID_DG_FINGER) || \
1b18b75c
JG
180 ((f)->application == HID_DG_TOUCHSCREEN) || \
181 ((f)->application == WACOM_HID_G9_TOUCHSCREEN) || \
ac2423c9
AAS
182 ((f)->application == WACOM_HID_G11_TOUCHSCREEN) || \
183 ((f)->application == WACOM_HID_WT_TOUCHPAD) || \
184 ((f)->application == HID_DG_TOUCHPAD))
185
186#define WACOM_DIRECT_DEVICE(f) (((f)->application == HID_DG_TOUCHSCREEN) || \
187 ((f)->application == WACOM_HID_WT_TOUCHSCREEN) || \
188 ((f)->application == HID_DG_PEN) || \
189 ((f)->application == WACOM_HID_WD_PEN))
d97a5522 190
3bea733a
PC
191enum {
192 PENPARTNER = 0,
193 GRAPHIRE,
387142bb 194 GRAPHIRE_BT,
3bea733a
PC
195 WACOM_G4,
196 PTU,
197 PL,
c8f2edc5 198 DTU,
497ab1f2 199 DTUS,
fff00bf8 200 DTUSX,
3bea733a 201 INTUOS,
8d32e3ae 202 INTUOS3S,
3bea733a
PC
203 INTUOS3,
204 INTUOS3L,
6f660f12
PC
205 INTUOS4S,
206 INTUOS4,
81af7e61 207 INTUOS4WL,
6f660f12 208 INTUOS4L,
9fee6195
JG
209 INTUOS5S,
210 INTUOS5,
211 INTUOS5L,
9a35c411
PC
212 INTUOSPS,
213 INTUOSPM,
214 INTUOSPL,
4922cd26 215 INTUOSP2_BT,
912c6aa6 216 INTUOSP2S_BT,
87046b6c 217 INTUOSHT3_BT,
3a4b4aaa 218 WACOM_21UX2,
d838c644 219 WACOM_22HD,
a112e9fd 220 DTK,
d838c644 221 WACOM_24HD,
500d4160 222 WACOM_27QHD,
36d3c510 223 CINTIQ_HYBRID,
f7acb55c 224 CINTIQ_COMPANION_2,
3bea733a 225 CINTIQ,
0e1763f5 226 WACOM_BEE,
56218563 227 WACOM_13HD,
7ecfbfd3 228 WACOM_MO,
3b164a00
PC
229 BAMBOO_PEN,
230 INTUOSHT,
eda01dab 231 INTUOSHT2,
3b164a00 232 BAMBOO_TOUCH,
ea2e6024 233 BAMBOO_PT,
b1e4279e 234 WACOM_24HDT,
500d4160 235 WACOM_27QHDT,
8c97a765 236 BAMBOO_PAD,
7adb91bd 237 WIRELESS,
72b236d6 238 REMOTE,
ea2e6024 239 TABLETPC, /* add new TPC below */
ac173837 240 TABLETPCE,
ec67bbed 241 TABLETPC2FG,
1963518b 242 MTSCREEN,
6afdc289 243 MTTPC,
d51ddb2b 244 MTTPC_B,
7704ac93 245 HID_GENERIC,
1db1f392 246 BOOTLOADER,
3bea733a
PC
247 MAX_TYPE
248};
249
250struct wacom_features {
e33da8a5 251 const char *name;
3bea733a
PC
252 int x_max;
253 int y_max;
254 int pressure_max;
255 int distance_max;
256 int type;
e35fb8c1
PC
257 int x_resolution;
258 int y_resolution;
70ee06c5 259 int numbered_buttons;
e779ef23
JG
260 int offset_left;
261 int offset_right;
262 int offset_top;
263 int offset_bottom;
ec67bbed
PC
264 int device_type;
265 int x_phy;
266 int y_phy;
c669fb2b
BT
267 unsigned unit;
268 int unitExpo;
fed87e65
HR
269 int x_fuzz;
270 int y_fuzz;
271 int pressure_fuzz;
272 int distance_fuzz;
bef7e200 273 int tilt_fuzz;
bc73dd39 274 unsigned quirks;
f393ee2b 275 unsigned touch_max;
aea2bf6a
JG
276 int oVid;
277 int oPid;
80befa93 278 int pktlen;
29b47391
BT
279 bool check_for_hid_type;
280 int hid_type;
3bea733a
PC
281};
282
4492efff
PC
283struct wacom_shared {
284 bool stylus_in_proximity;
a43c7c53 285 bool touch_down;
961794a0
PC
286 /* for wireless device to access USB interfaces */
287 unsigned touch_max;
288 int type;
289 struct input_dev *touch_input;
a97ac104
BT
290 struct hid_device *pen;
291 struct hid_device *touch;
d2ec58ae 292 bool has_mute_touch_switch;
d793ff81 293 bool is_touch_on;
4492efff
PC
294};
295
7704ac93 296struct hid_data {
5ae6e89f
BT
297 __s16 inputmode; /* InputMode HID feature, -1 if non-existent */
298 __s16 inputmode_index; /* InputMode HID feature index in the report */
61ce346a 299 bool sense_state;
7704ac93
BT
300 bool inrange_state;
301 bool invert_state;
302 bool tipswitch;
9e429d56
JG
303 bool barrelswitch;
304 bool barrelswitch2;
6d09085b 305 bool barrelswitch3;
46fc466e 306 bool serialhi;
7fb0413b 307 bool confidence;
5ae6e89f
BT
308 int x;
309 int y;
310 int pressure;
311 int width;
312 int height;
313 int id;
499522c8 314 int cc_report;
1b5d514a
JG
315 int cc_index;
316 int cc_value_index;
003f50ab 317 int last_slot_field;
1b5d514a
JG
318 int num_expected;
319 int num_received;
16e45989 320 int bat_status;
93aab7fa
JG
321 int battery_capacity;
322 int bat_charging;
323 int bat_connected;
324 int ps_connected;
ed1fa736 325 bool pad_input_event_flag;
6d09085b 326 unsigned short sequence_number;
17d793f3 327 int time_delayed;
7704ac93
BT
328};
329
e6f2813a
BT
330struct wacom_remote_data {
331 struct {
332 u32 serial;
333 bool connected;
334 } remote[WACOM_MAX_REMOTES];
335};
336
3bea733a 337struct wacom_wac {
9956953e 338 char name[WACOM_NAME_MAX];
2a6cdbdd
JG
339 char pen_name[WACOM_NAME_MAX];
340 char touch_name[WACOM_NAME_MAX];
d2d13f18 341 char pad_name[WACOM_NAME_MAX];
29b47391 342 unsigned char data[WACOM_PKGLEN_MAX];
4fc19381
PC
343 int tool[2];
344 int id[2];
f85c9dc6 345 __u64 serial[2];
5bed0128 346 bool probe_complete;
b3bd7ef3 347 bool reporting_data;
e33da8a5 348 struct wacom_features features;
4492efff 349 struct wacom_shared *shared;
2a6cdbdd
JG
350 struct input_dev *pen_input;
351 struct input_dev *touch_input;
d2d13f18 352 struct input_dev *pad_input;
179e8e47 353 struct kfifo_rec_ptr_2 *pen_fifo;
16bf288c 354 int pid;
1963518b 355 int num_contacts_left;
f81a1295
BT
356 u8 bt_features;
357 u8 bt_high_speed;
326ea2a9
JG
358 int mode_report;
359 int mode_value;
7704ac93 360 struct hid_data hid_data;
d2ec58ae 361 bool has_mute_touch_switch;
dc9dc864 362 bool is_soft_touch_switch;
4082da80
BT
363 bool has_mode_change;
364 bool is_direct_mode;
b1f466a9 365 bool is_invalid_bt_frame;
3bea733a
PC
366};
367
368#endif