HID: wacom: Correct button numbering 2nd-gen Intuos Pro over Bluetooth [Linux 4.14.128]

HID: wacom: Correct button numbering 2nd-gen Intuos Pro over Bluetooth [Linux 4.14.128]

This Linux kernel change "HID: wacom: Correct button numbering 2nd-gen Intuos Pro over Bluetooth" is included in the Linux 4.14.128 release. This change is authored by Jason Gerecke <jason.gerecke [at] wacom.com> on Tue May 7 11:53:21 2019 -0700. The commit for this change in Linux stable tree is f0c83ba (patch) which is from upstream commit 6441fc7. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 6441fc7.

HID: wacom: Correct button numbering 2nd-gen Intuos Pro over Bluetooth

commit 6441fc781c344df61402be1fde582c4491fa35fa upstream.

The button numbering of the 2nd-gen Intuos Pro is not consistent between
the USB and Bluetooth interfaces. Over USB, the HID_GENERIC codepath
enumerates the eight ExpressKeys first (BTN_0 - BTN_7) followed by the
center modeswitch button (BTN_8). The Bluetooth codepath, however, has
the center modeswitch button as BTN_0 and the the eight ExpressKeys as
BTN_1 - BTN_8. To ensure userspace button mappings do not change
depending on how the tablet is connected, modify the Bluetooth codepath
to report buttons in the same order as USB.

To ensure the mode switch LED continues to toggle in response to the
mode switch button, the `wacom_is_led_toggled` function also requires
a small update.

Link: https://github.com/linuxwacom/input-wacom/pull/79
Fixes: 4922cd26f03c ("HID: wacom: Support 2nd-gen Intuos Pro's Bluetooth classic interface")
Cc: <stable@vger.kernel.org> # 4.11+
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Reviewed-by: Aaron Skomra <aaron.skomra@wacom.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

There are 11 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/hid/wacom_wac.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 4c72e68..b6b39eb 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1340,7 +1340,7 @@ static void wacom_intuos_pro2_bt_pad(struct wacom_wac *wacom)
    struct input_dev *pad_input = wacom->pad_input;
    unsigned char *data = wacom->data;

-   int buttons = (data[282] << 1) | ((data[281] >> 6) & 0x01);
+   int buttons = data[282] | ((data[281] & 0x40) << 2);
    int ring = data[285] & 0x7F;
    bool ringstatus = data[285] & 0x80;
    bool prox = buttons || ringstatus;
@@ -3650,7 +3650,7 @@ static void wacom_24hd_update_leds(struct wacom *wacom, int mask, int group)
 static bool wacom_is_led_toggled(struct wacom *wacom, int button_count,
                 int mask, int group)
 {
-   int button_per_group;
+   int group_button;

    /*
     * 21UX2 has LED group 1 to the left and LED group 0
@@ -3660,9 +3660,12 @@ static bool wacom_is_led_toggled(struct wacom *wacom, int button_count,
    if (wacom->wacom_wac.features.type == WACOM_21UX2)
        group = 1 - group;

-   button_per_group = button_count/wacom->led.count;
+   group_button = group * (button_count/wacom->led.count);

-   return mask & (1 << (group * button_per_group));
+   if (wacom->wacom_wac.features.type == INTUOSP2_BT)
+       group_button = 8;
+
+   return mask & (1 << group_button);
 }

 static void wacom_update_led(struct wacom *wacom, int button_count, int mask,

Leave a Reply

Your email address will not be published. Required fields are marked *