Commit d51ddb2b authored by Jason Gerecke's avatar Jason Gerecke Committed by Dmitry Torokhov

Input: wacom - add support for three new ISDv4 sensors

This patch adds support for the 0x4004, 0x5000, and 0x5002 sensors found
on what should be the Motion R12, Fujitsu Q704, and Fujitsu T904. These
tablets use a new report ID (3) for their touch packets and a slightly
different HID descriptor format, but are otherwise largely identical in
protocol to the "MTTPC" tablets.

Note:
 * The R12 uses its 0x4004 sensor for touch input only. A pen interface
   is not present in its HID descriptor, though its possible a 0x4004
   may be used for pen input by other tablet PCs in the future.

 * The 0x5002 sensor appears to use a new report ID (8) for its pen
   packets. The other sensors continue to use the traditional report
   ID (2).
Signed-off-by: default avatarJason Gerecke <killertofu@gmail.com>
Reviewed-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent edc8e20a
...@@ -349,6 +349,7 @@ static int wacom_parse_hid(struct usb_interface *intf, ...@@ -349,6 +349,7 @@ static int wacom_parse_hid(struct usb_interface *intf,
break; break;
case MTTPC: case MTTPC:
case MTTPC_B:
features->pktlen = WACOM_PKGLEN_MTTPC; features->pktlen = WACOM_PKGLEN_MTTPC;
break; break;
...@@ -380,6 +381,16 @@ static int wacom_parse_hid(struct usb_interface *intf, ...@@ -380,6 +381,16 @@ static int wacom_parse_hid(struct usb_interface *intf,
i += 12; i += 12;
break; break;
case MTTPC_B:
features->x_max =
get_unaligned_le16(&report[i + 3]);
features->x_phy =
get_unaligned_le16(&report[i + 6]);
features->unit = report[i - 5];
features->unitExpo = report[i - 3];
i += 9;
break;
default: default:
features->x_max = features->x_max =
get_unaligned_le16(&report[i + 3]); get_unaligned_le16(&report[i + 3]);
...@@ -430,6 +441,14 @@ static int wacom_parse_hid(struct usb_interface *intf, ...@@ -430,6 +441,14 @@ static int wacom_parse_hid(struct usb_interface *intf,
i += 12; i += 12;
break; break;
case MTTPC_B:
features->y_max =
get_unaligned_le16(&report[i + 3]);
features->y_phy =
get_unaligned_le16(&report[i + 6]);
i += 9;
break;
default: default:
features->y_max = features->y_max =
features->x_max; features->x_max;
......
...@@ -962,7 +962,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom) ...@@ -962,7 +962,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
int x_offset = 0; int x_offset = 0;
/* MTTPC does not support Height and Width */ /* MTTPC does not support Height and Width */
if (wacom->features.type == MTTPC) if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
x_offset = -4; x_offset = -4;
/* /*
...@@ -1114,6 +1114,9 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) ...@@ -1114,6 +1114,9 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
case WACOM_PKGLEN_TPC2FG: case WACOM_PKGLEN_TPC2FG:
return wacom_tpc_mt_touch(wacom); return wacom_tpc_mt_touch(wacom);
case WACOM_PKGLEN_PENABLED:
return wacom_tpc_pen(wacom);
default: default:
switch (data[0]) { switch (data[0]) {
case WACOM_REPORT_TPC1FG: case WACOM_REPORT_TPC1FG:
...@@ -1123,6 +1126,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) ...@@ -1123,6 +1126,7 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
return wacom_tpc_single_touch(wacom, len); return wacom_tpc_single_touch(wacom, len);
case WACOM_REPORT_TPCMT: case WACOM_REPORT_TPCMT:
case WACOM_REPORT_TPCMT2:
return wacom_mt_touch(wacom); return wacom_mt_touch(wacom);
case WACOM_REPORT_PENABLED: case WACOM_REPORT_PENABLED:
...@@ -1465,6 +1469,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) ...@@ -1465,6 +1469,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
case TABLETPC2FG: case TABLETPC2FG:
case MTSCREEN: case MTSCREEN:
case MTTPC: case MTTPC:
case MTTPC_B:
sync = wacom_tpc_irq(wacom_wac, len); sync = wacom_tpc_irq(wacom_wac, len);
break; break;
...@@ -1806,6 +1811,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, ...@@ -1806,6 +1811,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
case MTSCREEN: case MTSCREEN:
case MTTPC: case MTTPC:
case MTTPC_B:
case TABLETPC2FG: case TABLETPC2FG:
if (features->device_type == BTN_TOOL_FINGER) { if (features->device_type == BTN_TOOL_FINGER) {
unsigned int flags = INPUT_MT_DIRECT; unsigned int flags = INPUT_MT_DIRECT;
...@@ -2243,6 +2249,15 @@ static const struct wacom_features wacom_features_0x116 = ...@@ -2243,6 +2249,15 @@ static const struct wacom_features wacom_features_0x116 =
static const struct wacom_features wacom_features_0x4001 = static const struct wacom_features wacom_features_0x4001 =
{ "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, { "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255,
0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x4004 =
{ "Wacom ISDv4 4004", WACOM_PKGLEN_MTTPC, 11060, 6220, 255,
0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x5000 =
{ "Wacom ISDv4 5000", WACOM_PKGLEN_MTTPC, 27848, 15752, 1023,
0, MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x5002 =
{ "Wacom ISDv4 5002", WACOM_PKGLEN_MTTPC, 29576, 16724, 1023,
0, MTTPC_B, 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 };
...@@ -2465,6 +2480,9 @@ const struct usb_device_id wacom_ids[] = { ...@@ -2465,6 +2480,9 @@ const struct usb_device_id wacom_ids[] = {
{ USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) }, { USB_DEVICE_DETAILED(0x315, USB_CLASS_HID, 0, 0) },
{ USB_DEVICE_DETAILED(0x317, USB_CLASS_HID, 0, 0) }, { USB_DEVICE_DETAILED(0x317, USB_CLASS_HID, 0, 0) },
{ USB_DEVICE_WACOM(0x4001) }, { USB_DEVICE_WACOM(0x4001) },
{ USB_DEVICE_WACOM(0x4004) },
{ USB_DEVICE_WACOM(0x5000) },
{ USB_DEVICE_WACOM(0x5002) },
{ USB_DEVICE_WACOM(0x47) }, { USB_DEVICE_WACOM(0x47) },
{ USB_DEVICE_WACOM(0xF4) }, { USB_DEVICE_WACOM(0xF4) },
{ USB_DEVICE_WACOM(0xF8) }, { USB_DEVICE_WACOM(0xF8) },
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define WACOM_PKGLEN_MTOUCH 62 #define WACOM_PKGLEN_MTOUCH 62
#define WACOM_PKGLEN_MTTPC 40 #define WACOM_PKGLEN_MTTPC 40
#define WACOM_PKGLEN_DTUS 68 #define WACOM_PKGLEN_DTUS 68
#define WACOM_PKGLEN_PENABLED 8
/* 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
...@@ -53,6 +54,7 @@ ...@@ -53,6 +54,7 @@
#define WACOM_REPORT_TPC1FG 6 #define WACOM_REPORT_TPC1FG 6
#define WACOM_REPORT_TPC2FG 13 #define WACOM_REPORT_TPC2FG 13
#define WACOM_REPORT_TPCMT 13 #define WACOM_REPORT_TPCMT 13
#define WACOM_REPORT_TPCMT2 3
#define WACOM_REPORT_TPCHID 15 #define WACOM_REPORT_TPCHID 15
#define WACOM_REPORT_TPCST 16 #define WACOM_REPORT_TPCST 16
#define WACOM_REPORT_DTUS 17 #define WACOM_REPORT_DTUS 17
...@@ -106,6 +108,7 @@ enum { ...@@ -106,6 +108,7 @@ enum {
TABLETPC2FG, TABLETPC2FG,
MTSCREEN, MTSCREEN,
MTTPC, MTTPC,
MTTPC_B,
MAX_TYPE MAX_TYPE
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment