Skip to content

Commit ac2423c

Browse files
skomraJiri Kosina
authored andcommitted
HID: wacom: generic: add vendor defined touch
Add vendor defined touch to support the second generation Intuos Pro. Previously all generic Wacom devices used true HID to report their touch. Signed-off-by: Aaron Skomra <[email protected]> Reviewed-by: Ping Cheng <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 60a2218 commit ac2423c

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed

drivers/hid/wacom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,5 @@ enum led_brightness wacom_leds_brightness_get(struct wacom_led *led);
219219
struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
220220
unsigned int id);
221221
struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
222+
int wacom_equivalent_usage(int usage);
222223
#endif

drivers/hid/wacom_sys.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,12 @@ static void wacom_feature_mapping(struct hid_device *hdev,
112112
struct wacom *wacom = hid_get_drvdata(hdev);
113113
struct wacom_features *features = &wacom->wacom_wac.features;
114114
struct hid_data *hid_data = &wacom->wacom_wac.hid_data;
115+
unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
115116
u8 *data;
116117
int ret;
117118
int n;
118119

119-
switch (usage->hid) {
120+
switch (equivalent_usage) {
120121
case HID_DG_CONTACTMAX:
121122
/* leave touch_max as is if predefined */
122123
if (!features->touch_max) {
@@ -325,8 +326,14 @@ static void wacom_post_parse_hid(struct hid_device *hdev,
325326
if (features->type == HID_GENERIC) {
326327
/* Any last-minute generic device setup */
327328
if (features->touch_max > 1) {
328-
input_mt_init_slots(wacom_wac->touch_input, wacom_wac->features.touch_max,
329-
INPUT_MT_DIRECT);
329+
if (features->device_type & WACOM_DEVICETYPE_DIRECT)
330+
input_mt_init_slots(wacom_wac->touch_input,
331+
wacom_wac->features.touch_max,
332+
INPUT_MT_DIRECT);
333+
else
334+
input_mt_init_slots(wacom_wac->touch_input,
335+
wacom_wac->features.touch_max,
336+
INPUT_MT_POINTER);
330337
}
331338
}
332339
}

drivers/hid/wacom_wac.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
15991599
return 0;
16001600
}
16011601

1602-
static int wacom_equivalent_usage(int usage)
1602+
int wacom_equivalent_usage(int usage)
16031603
{
16041604
if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMDIGITIZER) {
16051605
int subpage = (usage & 0xFF00) << 8;
@@ -1626,6 +1626,16 @@ static int wacom_equivalent_usage(int usage)
16261626
return subpage | subusage;
16271627
}
16281628

1629+
if ((usage & HID_USAGE_PAGE) == WACOM_HID_UP_WACOMTOUCH) {
1630+
int subpage = (usage & 0xFF00) << 8;
1631+
int subusage = (usage & 0xFF);
1632+
1633+
if (subpage == HID_UP_UNDEFINED)
1634+
subpage = WACOM_HID_SP_DIGITIZER;
1635+
1636+
return subpage | subusage;
1637+
}
1638+
16291639
return usage;
16301640
}
16311641

@@ -2218,8 +2228,10 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
22182228

22192229
for (j = 0; j < field->maxusage; j++) {
22202230
struct hid_usage *usage = &field->usage[j];
2231+
unsigned int equivalent_usage =
2232+
wacom_equivalent_usage(usage->hid);
22212233

2222-
switch (usage->hid) {
2234+
switch (equivalent_usage) {
22232235
case HID_GD_X:
22242236
case HID_GD_Y:
22252237
case HID_DG_WIDTH:
@@ -2228,7 +2240,7 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
22282240
case HID_DG_INRANGE:
22292241
case HID_DG_INVERT:
22302242
case HID_DG_TIPSWITCH:
2231-
hid_data->last_slot_field = usage->hid;
2243+
hid_data->last_slot_field = equivalent_usage;
22322244
break;
22332245
case HID_DG_CONTACTCOUNT:
22342246
hid_data->cc_report = report->id;
@@ -2283,8 +2295,8 @@ void wacom_wac_usage_mapping(struct hid_device *hdev,
22832295
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
22842296
struct wacom_features *features = &wacom_wac->features;
22852297

2286-
/* currently, only direct devices have proper hid report descriptors */
2287-
features->device_type |= WACOM_DEVICETYPE_DIRECT;
2298+
if (WACOM_DIRECT_DEVICE(field))
2299+
features->device_type |= WACOM_DEVICETYPE_DIRECT;
22882300

22892301
if (WACOM_PAD_FIELD(field))
22902302
wacom_wac_pad_usage_mapping(hdev, field, usage);

drivers/hid/wacom_wac.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
#define WACOM_HID_SP_DIGITIZER 0x000d0000
102102
#define WACOM_HID_SP_DIGITIZERINFO 0x00100000
103103
#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01)
104+
#define WACOM_HID_WD_PEN (WACOM_HID_UP_WACOMDIGITIZER | 0x02)
104105
#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36)
105106
#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
106107
#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
@@ -137,6 +138,12 @@
137138
#define WACOM_HID_UP_G11 0xff110000
138139
#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02)
139140
#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11)
141+
#define WACOM_HID_UP_WACOMTOUCH 0xff000000
142+
#define WACOM_HID_WT_TOUCHSCREEN (WACOM_HID_UP_WACOMTOUCH | 0x04)
143+
#define WACOM_HID_WT_TOUCHPAD (WACOM_HID_UP_WACOMTOUCH | 0x05)
144+
#define WACOM_HID_WT_CONTACTMAX (WACOM_HID_UP_WACOMTOUCH | 0x55)
145+
#define WACOM_HID_WT_X (WACOM_HID_UP_WACOMTOUCH | 0x130)
146+
#define WACOM_HID_WT_Y (WACOM_HID_UP_WACOMTOUCH | 0x131)
140147

141148
#define WACOM_PAD_FIELD(f) (((f)->physical == HID_DG_TABLETFUNCTIONKEY) || \
142149
((f)->physical == WACOM_HID_WD_DIGITIZERFNKEYS) || \
@@ -154,7 +161,14 @@
154161
((f)->physical == HID_DG_FINGER) || \
155162
((f)->application == HID_DG_TOUCHSCREEN) || \
156163
((f)->application == WACOM_HID_G9_TOUCHSCREEN) || \
157-
((f)->application == WACOM_HID_G11_TOUCHSCREEN))
164+
((f)->application == WACOM_HID_G11_TOUCHSCREEN) || \
165+
((f)->application == WACOM_HID_WT_TOUCHPAD) || \
166+
((f)->application == HID_DG_TOUCHPAD))
167+
168+
#define WACOM_DIRECT_DEVICE(f) (((f)->application == HID_DG_TOUCHSCREEN) || \
169+
((f)->application == WACOM_HID_WT_TOUCHSCREEN) || \
170+
((f)->application == HID_DG_PEN) || \
171+
((f)->application == WACOM_HID_WD_PEN))
158172

159173
enum {
160174
PENPARTNER = 0,

0 commit comments

Comments
 (0)