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>
This commit is contained in:
Ping Cheng 2012-11-03 12:16:15 -07:00 committed by Dmitry Torokhov
parent 3699dd7e16
commit 6afdc289c9
3 changed files with 25 additions and 3 deletions

View File

@ -397,6 +397,10 @@ static int wacom_parse_hid(struct usb_interface *intf,
features->pktlen = WACOM_PKGLEN_MTOUCH; features->pktlen = WACOM_PKGLEN_MTOUCH;
break; break;
case MTTPC:
features->pktlen = WACOM_PKGLEN_MTTPC;
break;
case BAMBOO_PT: case BAMBOO_PT:
features->pktlen = WACOM_PKGLEN_BBTOUCH; features->pktlen = WACOM_PKGLEN_BBTOUCH;
break; break;
@ -453,6 +457,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
switch (features->type) { switch (features->type) {
case TABLETPC2FG: case TABLETPC2FG:
case MTSCREEN: case MTSCREEN:
case MTTPC:
features->y_max = features->y_max =
get_unaligned_le16(&report[i + 3]); get_unaligned_le16(&report[i + 3]);
features->y_phy = features->y_phy =

View File

@ -877,6 +877,11 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
int i; int i;
int current_num_contacts = data[2]; int current_num_contacts = data[2];
int contacts_to_send = 0; int contacts_to_send = 0;
int x_offset = 0;
/* MTTPC does not support Height and Width */
if (wacom->features.type == MTTPC)
x_offset = -4;
/* /*
* First packet resets the counter since only the first * First packet resets the counter since only the first
@ -889,7 +894,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
contacts_to_send = min(5, wacom->num_contacts_left); contacts_to_send = min(5, wacom->num_contacts_left);
for (i = 0; i < contacts_to_send; i++) { for (i = 0; i < contacts_to_send; i++) {
int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3; int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
bool touch = data[offset] & 0x1; bool touch = data[offset] & 0x1;
int id = le16_to_cpup((__le16 *)&data[offset + 1]); int id = le16_to_cpup((__le16 *)&data[offset + 1]);
int slot = find_slot_from_contactid(wacom, id); int slot = find_slot_from_contactid(wacom, id);
@ -900,8 +905,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
input_mt_slot(input, slot); input_mt_slot(input, slot);
input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
if (touch) { if (touch) {
int x = le16_to_cpup((__le16 *)&data[offset + 7]); int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]);
int y = le16_to_cpup((__le16 *)&data[offset + 9]); int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]);
input_report_abs(input, ABS_MT_POSITION_X, x); input_report_abs(input, ABS_MT_POSITION_X, x);
input_report_abs(input, ABS_MT_POSITION_Y, y); input_report_abs(input, ABS_MT_POSITION_Y, y);
} }
@ -1336,6 +1341,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
case TABLETPCE: case TABLETPCE:
case TABLETPC2FG: case TABLETPC2FG:
case MTSCREEN: case MTSCREEN:
case MTTPC:
sync = wacom_tpc_irq(wacom_wac, len); sync = wacom_tpc_irq(wacom_wac, len);
break; break;
@ -1657,6 +1663,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
/* fall through */ /* fall through */
case MTSCREEN: case MTSCREEN:
case MTTPC:
if (features->device_type == BTN_TOOL_FINGER) { if (features->device_type == BTN_TOOL_FINGER) {
wacom_wac->slots = kmalloc(features->touch_max * wacom_wac->slots = kmalloc(features->touch_max *
sizeof(int), sizeof(int),
@ -2018,6 +2025,12 @@ static const struct wacom_features wacom_features_0xED =
static const struct wacom_features wacom_features_0xEF = static const struct wacom_features wacom_features_0xEF =
{ "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255,
0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x100 =
{ "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x101 =
{ "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x47 = static const struct wacom_features wacom_features_0x47 =
{ "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023,
31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
@ -2194,6 +2207,8 @@ const struct usb_device_id wacom_ids[] = {
{ USB_DEVICE_WACOM(0xEC) }, { USB_DEVICE_WACOM(0xEC) },
{ USB_DEVICE_WACOM(0xED) }, { USB_DEVICE_WACOM(0xED) },
{ USB_DEVICE_WACOM(0xEF) }, { USB_DEVICE_WACOM(0xEF) },
{ USB_DEVICE_WACOM(0x100) },
{ USB_DEVICE_WACOM(0x101) },
{ USB_DEVICE_WACOM(0x47) }, { USB_DEVICE_WACOM(0x47) },
{ USB_DEVICE_WACOM(0xF4) }, { USB_DEVICE_WACOM(0xF4) },
{ USB_DEVICE_WACOM(0xF8) }, { USB_DEVICE_WACOM(0xF8) },

View File

@ -26,6 +26,7 @@
#define WACOM_PKGLEN_BBPEN 10 #define WACOM_PKGLEN_BBPEN 10
#define WACOM_PKGLEN_WIRELESS 32 #define WACOM_PKGLEN_WIRELESS 32
#define WACOM_PKGLEN_MTOUCH 62 #define WACOM_PKGLEN_MTOUCH 62
#define WACOM_PKGLEN_MTTPC 40
/* wacom data size per MT contact */ /* wacom data size per MT contact */
#define WACOM_BYTES_PER_MT_PACKET 11 #define WACOM_BYTES_PER_MT_PACKET 11
@ -88,6 +89,7 @@ enum {
TABLETPCE, TABLETPCE,
TABLETPC2FG, TABLETPC2FG,
MTSCREEN, MTSCREEN,
MTTPC,
MAX_TYPE MAX_TYPE
}; };