Skip to content

Commit

Permalink
backport: HID: wacom: support named keys on older devices
Browse files Browse the repository at this point in the history
Some Wacom devices have keys with predefined meanings. However, when
support was originally added for these devices, the codes for these
keys were not available yet. These keys were thus reported with
the numbered KEY_PROG* range.

Some missing key codes were added with commit 4eb220cb35a9 ("HID:
wacom: generic: add 3 tablet touch keys") and we are now able to
report the proper key codes. We continue to report the original
KEY_PROG codes so as not to break any unknown applications that
may depend on them.

Also, to support the touch key, track its state in the pad report.

Signed-off-by: Aaron Armstrong Skomra <aaron.skomra@wacom.com>
Link: https://gitlab.freedesktop.org/libinput/libinput/merge_requests/155
Link: linuxwacom/xf86-input-wacom#46
Reviewed-by: Ping Cheng <ping.cheng@wacom.com>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
[aaron.skomra@wacom.com: Imported into input-wacom repository (670e90924bfe)]
Signed-off-by: Aaron Armstrong Skomra <aaron.skomra@wacom.com>
[aaron.skomra@wacom.com: Backported to input-wacom repository (ea97cd0)]
Signed-off-by: Aaron Armstrong Skomra <aaron.skomra@wacom.com>
  • Loading branch information
skomra committed Sep 4, 2019
1 parent e926e28 commit ded1034
Show file tree
Hide file tree
Showing 4 changed files with 273 additions and 0 deletions.
65 changes: 65 additions & 0 deletions 2.6.32/wacom_wac.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,8 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
int ring1 = 0, ring2 = 0;
int strip1 = 0, strip2 = 0;
bool prox = false;
bool wrench = false, keyboard = false, mute_touch = false, menu = false,
info = false;

/* pad packets. Works as a second tool and is always in prox */
if (!(data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
Expand Down Expand Up @@ -493,9 +495,29 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
keys = ((data[3] & 0x1C) ? 1<<2 : 0) |
((data[4] & 0xE0) ? 1<<1 : 0) |
((data[4] & 0x07) ? 1<<0 : 0);
keyboard = !!(data[4] & 0xE0);
info = !!(data[3] & 0x1C);

if (features->oPid) {
mute_touch = !!(data[4] & 0x07);
if (mute_touch)
wacom->shared->is_touch_on =
!wacom->shared->is_touch_on;
} else {
wrench = !!(data[4] & 0x07);
}
} else if (features->type == WACOM_27QHD) {
nkeys = 3;
keys = data[2] & 0x07;

if (features->oPid) {
mute_touch = !!(data[2] & 0x04);
if (mute_touch)
wacom->shared->is_touch_on =
!wacom->shared->is_touch_on;
} else {
menu = !!(data[2] & 0x04);
}
} else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
/*
* ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
Expand All @@ -514,6 +536,9 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
if (features->type == WACOM_22HD) {
nkeys = 3;
keys = data[9] & 0x07;

info = !!(data[9] & 0x01);
wrench = !!(data[9] & 0x02);
}
} else {
buttons = ((data[6] & 0x10) << 5) |
Expand All @@ -533,6 +558,18 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
for (i = 0; i < nkeys; i++)
input_report_key(input, KEY_PROG1 + i, keys & (1 << i));

input_report_key(input, KEY_BUTTONCONFIG, wrench);
input_report_key(input, KEY_ONSCREEN_KEYBOARD, keyboard);
input_report_key(input, KEY_CONTROLPANEL, menu);
input_report_key(input, KEY_INFO, info);

if (wacom->shared && wacom->shared->touch_input) {
input_report_switch(wacom->shared->touch_input,
SW_MUTE_DEVICE,
!wacom->shared->is_touch_on);
input_sync(wacom->shared->touch_input);
}

input_report_abs(input, ABS_RX, strip1);
input_report_abs(input, ABS_RY, strip2);

Expand Down Expand Up @@ -1011,6 +1048,12 @@ static int wacom_multitouch_generic(struct wacom_wac *wacom)
bytes_header = 1;
break;
case WACOM_27QHDT:
if (wacom->shared->has_mute_touch_switch &&
!wacom->shared->is_touch_on) {
if (!wacom->shared->touch_down)
return 0;
}

current_num_contacts = data[63];
contacts_per_packet = 10;
bytes_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
Expand Down Expand Up @@ -2264,6 +2307,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
__set_bit(KEY_INFO, input_dev->keybit);

if (!features->oPid)
__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);

input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
/* fall through */

Expand All @@ -2279,6 +2328,13 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG1, input_dev->keybit);
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);

if (!features->oPid)
__set_bit(KEY_CONTROLPANEL, input_dev->keybit);

input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);

wacom_setup_cintiq(wacom_wac);
Expand All @@ -2288,6 +2344,9 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG1, input_dev->keybit);
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);
__set_bit(KEY_INFO, input_dev->keybit);
/* fall through */

case WACOM_21UX2:
Expand Down Expand Up @@ -2382,6 +2441,12 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
for (i = 0; i < 10; i++)
wacom_wac->slots[i] = -1;
}
if (wacom_wac->shared->touch_input->id.product == 0x32C ||
wacom_wac->shared->touch_input->id.product == 0xF6) {
input_dev->evbit[0] |= BIT_MASK(EV_SW);
__set_bit(SW_MUTE_DEVICE, input_dev->swbit);
wacom_wac->shared->has_mute_touch_switch = true;
}
/* fall through */

case TABLETPC2FG:
Expand Down
70 changes: 70 additions & 0 deletions 2.6.38/wacom_wac.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,8 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
int ring1 = 0, ring2 = 0;
int strip1 = 0, strip2 = 0;
bool prox = false;
bool wrench = false, keyboard = false, mute_touch = false, menu = false,
info = false;

/* pad packets. Works as a second tool and is always in prox */
if (!(data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
Expand Down Expand Up @@ -525,9 +527,32 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
keys = ((data[3] & 0x1C) ? 1<<2 : 0) |
((data[4] & 0xE0) ? 1<<1 : 0) |
((data[4] & 0x07) ? 1<<0 : 0);
keyboard = !!(data[4] & 0xE0);
info = !!(data[3] & 0x1C);

if (features->oPid) {
mute_touch = !!(data[4] & 0x07);
if (mute_touch)
wacom->shared->is_touch_on =
!wacom->shared->is_touch_on;
} else {
wrench = !!(data[4] & 0x07);
}
} else if (features->type == WACOM_27QHD) {
nkeys = 3;
keys = data[2] & 0x07;

wrench = !!(data[2] & 0x01);
keyboard = !!(data[2] & 0x02);

if (features->oPid) {
mute_touch = !!(data[2] & 0x04);
if (mute_touch)
wacom->shared->is_touch_on =
!wacom->shared->is_touch_on;
} else {
menu = !!(data[2] & 0x04);
}
} else if (features->type == CINTIQ_HYBRID) {
/*
* Do not send hardware buttons under Android. They
Expand Down Expand Up @@ -570,6 +595,9 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
if (features->type == WACOM_22HD) {
nkeys = 3;
keys = data[9] & 0x07;

info = !!(data[9] & 0x01);
wrench = !!(data[9] & 0x02);
}
} else {
buttons = ((data[6] & 0x10) << 5) |
Expand All @@ -589,6 +617,18 @@ static int wacom_intuos_pad(struct wacom_wac *wacom)
for (i = 0; i < nkeys; i++)
input_report_key(input, KEY_PROG1 + i, keys & (1 << i));

input_report_key(input, KEY_BUTTONCONFIG, wrench);
input_report_key(input, KEY_ONSCREEN_KEYBOARD, keyboard);
input_report_key(input, KEY_CONTROLPANEL, menu);
input_report_key(input, KEY_INFO, info);

if (wacom->shared && wacom->shared->touch_input) {
input_report_switch(wacom->shared->touch_input,
SW_MUTE_DEVICE,
!wacom->shared->is_touch_on);
input_sync(wacom->shared->touch_input);
}

input_report_abs(input, ABS_RX, strip1);
input_report_abs(input, ABS_RY, strip2);

Expand Down Expand Up @@ -1236,6 +1276,12 @@ static int wacom_multitouch_generic(struct wacom_wac *wacom)
bytes_header = 1;
break;
case WACOM_27QHDT:
if (wacom->shared->has_mute_touch_switch &&
!wacom->shared->is_touch_on) {
if (!wacom->shared->touch_down)
return 0;
}

current_num_contacts = data[63];
contacts_per_packet = 10;
bytes_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
Expand Down Expand Up @@ -2512,6 +2558,12 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
__set_bit(KEY_INFO, input_dev->keybit);

if (!features->oPid)
__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);

input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
/* fall through */

Expand All @@ -2531,6 +2583,13 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG1, input_dev->keybit);
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_ONSCREEN_KEYBOARD, input_dev->keybit);
__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);

if (!features->oPid)
__set_bit(KEY_CONTROLPANEL, input_dev->keybit);

__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);

Expand All @@ -2541,6 +2600,9 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
__set_bit(KEY_PROG1, input_dev->keybit);
__set_bit(KEY_PROG2, input_dev->keybit);
__set_bit(KEY_PROG3, input_dev->keybit);

__set_bit(KEY_BUTTONCONFIG, input_dev->keybit);
__set_bit(KEY_INFO, input_dev->keybit);
/* fall through */

case WACOM_21UX2:
Expand Down Expand Up @@ -2657,6 +2719,14 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
/* fall through */

case WACOM_27QHDT:
if (wacom_wac->shared->touch_input->id.product == 0x32C ||
wacom_wac->shared->touch_input->id.product == 0xF6) {
input_dev->evbit[0] |= BIT_MASK(EV_SW);
__set_bit(SW_MUTE_DEVICE, input_dev->swbit);
wacom_wac->shared->has_mute_touch_switch = true;
}
/* fall through */

case MTSCREEN:
case MTTPC:
case MTTPC_B:
Expand Down

0 comments on commit ded1034

Please sign in to comment.