diff options
author | Ping Cheng <pinglinux@gmail.com> | 2012-11-03 15:16:15 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-11-08 12:12:46 -0500 |
commit | 6afdc289c984451a6202a687fe6af727e051a784 (patch) | |
tree | acd038cdd5cfe752c446315bd0215e9ba65461da /drivers/input/tablet | |
parent | 3699dd7e16a9f68586a44e1efeb9708359f9c2a6 (diff) |
Input: wacom - add support for 2 new multi-touch tablets (0x100 and 0x101)
This adds support for the two new multi-touch tablets.
Signed-off-by: Ping Cheng <pinglinux@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/tablet')
-rw-r--r-- | drivers/input/tablet/wacom_sys.c | 5 | ||||
-rw-r--r-- | drivers/input/tablet/wacom_wac.c | 21 | ||||
-rw-r--r-- | drivers/input/tablet/wacom_wac.h | 2 |
3 files changed, 25 insertions, 3 deletions
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index 67442f409174..f92d34f45a1c 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
@@ -397,6 +397,10 @@ static int wacom_parse_hid(struct usb_interface *intf, | |||
397 | features->pktlen = WACOM_PKGLEN_MTOUCH; | 397 | features->pktlen = WACOM_PKGLEN_MTOUCH; |
398 | break; | 398 | break; |
399 | 399 | ||
400 | case MTTPC: | ||
401 | features->pktlen = WACOM_PKGLEN_MTTPC; | ||
402 | break; | ||
403 | |||
400 | case BAMBOO_PT: | 404 | case BAMBOO_PT: |
401 | features->pktlen = WACOM_PKGLEN_BBTOUCH; | 405 | features->pktlen = WACOM_PKGLEN_BBTOUCH; |
402 | break; | 406 | break; |
@@ -453,6 +457,7 @@ static int wacom_parse_hid(struct usb_interface *intf, | |||
453 | switch (features->type) { | 457 | switch (features->type) { |
454 | case TABLETPC2FG: | 458 | case TABLETPC2FG: |
455 | case MTSCREEN: | 459 | case MTSCREEN: |
460 | case MTTPC: | ||
456 | features->y_max = | 461 | features->y_max = |
457 | get_unaligned_le16(&report[i + 3]); | 462 | get_unaligned_le16(&report[i + 3]); |
458 | features->y_phy = | 463 | features->y_phy = |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 0a67031ffc13..7554a043ee46 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -877,6 +877,11 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
877 | int i; | 877 | int i; |
878 | int current_num_contacts = data[2]; | 878 | int current_num_contacts = data[2]; |
879 | int contacts_to_send = 0; | 879 | int contacts_to_send = 0; |
880 | int x_offset = 0; | ||
881 | |||
882 | /* MTTPC does not support Height and Width */ | ||
883 | if (wacom->features.type == MTTPC) | ||
884 | x_offset = -4; | ||
880 | 885 | ||
881 | /* | 886 | /* |
882 | * First packet resets the counter since only the first | 887 | * First packet resets the counter since only the first |
@@ -889,7 +894,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
889 | contacts_to_send = min(5, wacom->num_contacts_left); | 894 | contacts_to_send = min(5, wacom->num_contacts_left); |
890 | 895 | ||
891 | for (i = 0; i < contacts_to_send; i++) { | 896 | for (i = 0; i < contacts_to_send; i++) { |
892 | int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3; | 897 | int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3; |
893 | bool touch = data[offset] & 0x1; | 898 | bool touch = data[offset] & 0x1; |
894 | int id = le16_to_cpup((__le16 *)&data[offset + 1]); | 899 | int id = le16_to_cpup((__le16 *)&data[offset + 1]); |
895 | int slot = find_slot_from_contactid(wacom, id); | 900 | int slot = find_slot_from_contactid(wacom, id); |
@@ -900,8 +905,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
900 | input_mt_slot(input, slot); | 905 | input_mt_slot(input, slot); |
901 | input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); | 906 | input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); |
902 | if (touch) { | 907 | if (touch) { |
903 | int x = le16_to_cpup((__le16 *)&data[offset + 7]); | 908 | int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]); |
904 | int y = le16_to_cpup((__le16 *)&data[offset + 9]); | 909 | int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]); |
905 | input_report_abs(input, ABS_MT_POSITION_X, x); | 910 | input_report_abs(input, ABS_MT_POSITION_X, x); |
906 | input_report_abs(input, ABS_MT_POSITION_Y, y); | 911 | input_report_abs(input, ABS_MT_POSITION_Y, y); |
907 | } | 912 | } |
@@ -1336,6 +1341,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) | |||
1336 | case TABLETPCE: | 1341 | case TABLETPCE: |
1337 | case TABLETPC2FG: | 1342 | case TABLETPC2FG: |
1338 | case MTSCREEN: | 1343 | case MTSCREEN: |
1344 | case MTTPC: | ||
1339 | sync = wacom_tpc_irq(wacom_wac, len); | 1345 | sync = wacom_tpc_irq(wacom_wac, len); |
1340 | break; | 1346 | break; |
1341 | 1347 | ||
@@ -1657,6 +1663,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
1657 | /* fall through */ | 1663 | /* fall through */ |
1658 | 1664 | ||
1659 | case MTSCREEN: | 1665 | case MTSCREEN: |
1666 | case MTTPC: | ||
1660 | if (features->device_type == BTN_TOOL_FINGER) { | 1667 | if (features->device_type == BTN_TOOL_FINGER) { |
1661 | wacom_wac->slots = kmalloc(features->touch_max * | 1668 | wacom_wac->slots = kmalloc(features->touch_max * |
1662 | sizeof(int), | 1669 | sizeof(int), |
@@ -2018,6 +2025,12 @@ static const struct wacom_features wacom_features_0xED = | |||
2018 | static const struct wacom_features wacom_features_0xEF = | 2025 | static const struct wacom_features wacom_features_0xEF = |
2019 | { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, | 2026 | { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, |
2020 | 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 2027 | 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
2028 | static const struct wacom_features wacom_features_0x100 = | ||
2029 | { "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, | ||
2030 | 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | ||
2031 | static const struct wacom_features wacom_features_0x101 = | ||
2032 | { "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, | ||
2033 | 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | ||
2021 | static const struct wacom_features wacom_features_0x47 = | 2034 | static const struct wacom_features wacom_features_0x47 = |
2022 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, | 2035 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, |
2023 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 2036 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
@@ -2194,6 +2207,8 @@ const struct usb_device_id wacom_ids[] = { | |||
2194 | { USB_DEVICE_WACOM(0xEC) }, | 2207 | { USB_DEVICE_WACOM(0xEC) }, |
2195 | { USB_DEVICE_WACOM(0xED) }, | 2208 | { USB_DEVICE_WACOM(0xED) }, |
2196 | { USB_DEVICE_WACOM(0xEF) }, | 2209 | { USB_DEVICE_WACOM(0xEF) }, |
2210 | { USB_DEVICE_WACOM(0x100) }, | ||
2211 | { USB_DEVICE_WACOM(0x101) }, | ||
2197 | { USB_DEVICE_WACOM(0x47) }, | 2212 | { USB_DEVICE_WACOM(0x47) }, |
2198 | { USB_DEVICE_WACOM(0xF4) }, | 2213 | { USB_DEVICE_WACOM(0xF4) }, |
2199 | { USB_DEVICE_WACOM(0xF8) }, | 2214 | { USB_DEVICE_WACOM(0xF8) }, |
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 345f1e76975e..9396d7769f86 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #define WACOM_PKGLEN_BBPEN 10 | 26 | #define WACOM_PKGLEN_BBPEN 10 |
27 | #define WACOM_PKGLEN_WIRELESS 32 | 27 | #define WACOM_PKGLEN_WIRELESS 32 |
28 | #define WACOM_PKGLEN_MTOUCH 62 | 28 | #define WACOM_PKGLEN_MTOUCH 62 |
29 | #define WACOM_PKGLEN_MTTPC 40 | ||
29 | 30 | ||
30 | /* wacom data size per MT contact */ | 31 | /* wacom data size per MT contact */ |
31 | #define WACOM_BYTES_PER_MT_PACKET 11 | 32 | #define WACOM_BYTES_PER_MT_PACKET 11 |
@@ -88,6 +89,7 @@ enum { | |||
88 | TABLETPCE, | 89 | TABLETPCE, |
89 | TABLETPC2FG, | 90 | TABLETPC2FG, |
90 | MTSCREEN, | 91 | MTSCREEN, |
92 | MTTPC, | ||
91 | MAX_TYPE | 93 | MAX_TYPE |
92 | }; | 94 | }; |
93 | 95 | ||