Skip to content

Commit 07d1721

Browse files
author
Jiri Kosina
committed
Merge branch 'for-5.19/wacom' into for-linus
- support for pens with 3 buttons (Joshua Dickens) - support for HID_DG_SCANTIME to report the timestamp for pen and touch events (Joshua Dickens)
2 parents 2e688e6 + d88591a commit 07d1721

File tree

4 files changed

+49
-9
lines changed

4 files changed

+49
-9
lines changed

MAINTAINERS

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8639,6 +8639,14 @@ F: drivers/hid/hid-sensor-*
86398639
F: drivers/iio/*/hid-*
86408640
F: include/linux/hid-sensor-*
86418641

8642+
HID WACOM DRIVER
8643+
M: Ping Cheng <[email protected]>
8644+
M: Jason Gerecke <[email protected]>
8645+
8646+
S: Maintained
8647+
F: drivers/hid/wacom.h
8648+
F: drivers/hid/wacom_*
8649+
86428650
HIGH-RESOLUTION TIMERS, CLOCKEVENTS
86438651
M: Thomas Gleixner <[email protected]>
86448652

drivers/hid/wacom_sys.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1777,7 +1777,7 @@ static int __wacom_initialize_battery(struct wacom *wacom,
17771777
bat_desc->get_property = wacom_battery_get_property;
17781778
sprintf(battery->bat_name, "wacom_battery_%ld", n);
17791779
bat_desc->name = battery->bat_name;
1780-
bat_desc->type = POWER_SUPPLY_TYPE_USB;
1780+
bat_desc->type = POWER_SUPPLY_TYPE_BATTERY;
17811781
bat_desc->use_for_apm = 0;
17821782

17831783
ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg);

drivers/hid/wacom_wac.c

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,7 +1811,9 @@ int wacom_equivalent_usage(int usage)
18111811
usage == WACOM_HID_WD_TOUCHSTRIP2 ||
18121812
usage == WACOM_HID_WD_TOUCHRING ||
18131813
usage == WACOM_HID_WD_TOUCHRINGSTATUS ||
1814-
usage == WACOM_HID_WD_REPORT_VALID) {
1814+
usage == WACOM_HID_WD_REPORT_VALID ||
1815+
usage == WACOM_HID_WD_BARRELSWITCH3 ||
1816+
usage == WACOM_HID_WD_SEQUENCENUMBER) {
18151817
return usage;
18161818
}
18171819

@@ -2196,8 +2198,11 @@ static void wacom_set_barrel_switch3_usage(struct wacom_wac *wacom_wac)
21962198
if (!(features->quirks & WACOM_QUIRK_AESPEN) &&
21972199
wacom_wac->hid_data.barrelswitch &&
21982200
wacom_wac->hid_data.barrelswitch2 &&
2199-
wacom_wac->hid_data.serialhi)
2201+
wacom_wac->hid_data.serialhi &&
2202+
!wacom_wac->hid_data.barrelswitch3) {
22002203
input_set_capability(input, EV_KEY, BTN_STYLUS3);
2204+
features->quirks |= WACOM_QUIRK_PEN_BUTTON3;
2205+
}
22012206
}
22022207

22032208
static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
@@ -2261,6 +2266,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
22612266
features->quirks |= WACOM_QUIRK_TOOLSERIAL;
22622267
wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
22632268
break;
2269+
case HID_DG_SCANTIME:
2270+
wacom_map_usage(input, usage, field, EV_MSC, MSC_TIMESTAMP, 0);
2271+
break;
22642272
case WACOM_HID_WD_SENSE:
22652273
features->quirks |= WACOM_QUIRK_SENSE;
22662274
wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
@@ -2274,6 +2282,11 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
22742282
input_set_capability(input, EV_KEY, BTN_TOOL_AIRBRUSH);
22752283
wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
22762284
break;
2285+
case WACOM_HID_WD_BARRELSWITCH3:
2286+
wacom_wac->hid_data.barrelswitch3 = true;
2287+
wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS3, 0);
2288+
features->quirks &= ~WACOM_QUIRK_PEN_BUTTON3;
2289+
break;
22772290
}
22782291
}
22792292

@@ -2390,6 +2403,14 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field
23902403
case WACOM_HID_WD_REPORT_VALID:
23912404
wacom_wac->is_invalid_bt_frame = !value;
23922405
return;
2406+
case WACOM_HID_WD_BARRELSWITCH3:
2407+
wacom_wac->hid_data.barrelswitch3 = value;
2408+
return;
2409+
case WACOM_HID_WD_SEQUENCENUMBER:
2410+
if (wacom_wac->hid_data.sequence_number != value)
2411+
hid_warn(hdev, "Dropped %hu packets", (unsigned short)(value - wacom_wac->hid_data.sequence_number));
2412+
wacom_wac->hid_data.sequence_number = value + 1;
2413+
return;
23932414
}
23942415

23952416
/* send pen events only when touch is up or forced out
@@ -2442,12 +2463,15 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
24422463

24432464
if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) {
24442465
int id = wacom_wac->id[0];
2445-
int sw_state = wacom_wac->hid_data.barrelswitch |
2446-
(wacom_wac->hid_data.barrelswitch2 << 1);
2447-
2448-
input_report_key(input, BTN_STYLUS, sw_state == 1);
2449-
input_report_key(input, BTN_STYLUS2, sw_state == 2);
2450-
input_report_key(input, BTN_STYLUS3, sw_state == 3);
2466+
if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3 &&
2467+
wacom_wac->hid_data.barrelswitch & wacom_wac->hid_data.barrelswitch2) {
2468+
wacom_wac->hid_data.barrelswitch = 0;
2469+
wacom_wac->hid_data.barrelswitch2 = 0;
2470+
wacom_wac->hid_data.barrelswitch3 = 1;
2471+
}
2472+
input_report_key(input, BTN_STYLUS, wacom_wac->hid_data.barrelswitch);
2473+
input_report_key(input, BTN_STYLUS2, wacom_wac->hid_data.barrelswitch2);
2474+
input_report_key(input, BTN_STYLUS3, wacom_wac->hid_data.barrelswitch3);
24512475

24522476
/*
24532477
* Non-USI EMR tools should have their IDs mangled to
@@ -2529,6 +2553,9 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
25292553
field->logical_maximum = 255;
25302554
}
25312555
break;
2556+
case HID_DG_SCANTIME:
2557+
wacom_map_usage(input, usage, field, EV_MSC, MSC_TIMESTAMP, 0);
2558+
break;
25322559
}
25332560
}
25342561

drivers/hid/wacom_wac.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
#define WACOM_QUIRK_AESPEN 0x0004
8787
#define WACOM_QUIRK_BATTERY 0x0008
8888
#define WACOM_QUIRK_TOOLSERIAL 0x0010
89+
#define WACOM_QUIRK_PEN_BUTTON3 0x0020
8990

9091
/* device types */
9192
#define WACOM_DEVICETYPE_NONE 0x0000
@@ -108,13 +109,15 @@
108109
#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
109110
#define WACOM_HID_WD_SERIALNUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x5b)
110111
#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
112+
#define WACOM_HID_WD_BARRELSWITCH3 (WACOM_HID_UP_WACOMDIGITIZER | 0x5d)
111113
#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77)
112114
#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132)
113115
#define WACOM_HID_WD_TOUCHSTRIP (WACOM_HID_UP_WACOMDIGITIZER | 0x0136)
114116
#define WACOM_HID_WD_TOUCHSTRIP2 (WACOM_HID_UP_WACOMDIGITIZER | 0x0137)
115117
#define WACOM_HID_WD_TOUCHRING (WACOM_HID_UP_WACOMDIGITIZER | 0x0138)
116118
#define WACOM_HID_WD_TOUCHRINGSTATUS (WACOM_HID_UP_WACOMDIGITIZER | 0x0139)
117119
#define WACOM_HID_WD_REPORT_VALID (WACOM_HID_UP_WACOMDIGITIZER | 0x01d0)
120+
#define WACOM_HID_WD_SEQUENCENUMBER (WACOM_HID_UP_WACOMDIGITIZER | 0x0220)
118121
#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
119122
#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
120123
#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
@@ -300,6 +303,7 @@ struct hid_data {
300303
bool tipswitch;
301304
bool barrelswitch;
302305
bool barrelswitch2;
306+
bool barrelswitch3;
303307
bool serialhi;
304308
bool confidence;
305309
int x;
@@ -320,6 +324,7 @@ struct hid_data {
320324
int bat_connected;
321325
int ps_connected;
322326
bool pad_input_event_flag;
327+
unsigned short sequence_number;
323328
};
324329

325330
struct wacom_remote_data {

0 commit comments

Comments
 (0)