* [PATCH 1/4] input: wacom: Intuos5 basic support
@ 2012-03-10 2:06 Jason Gerecke
2012-03-10 2:06 ` [PATCH 2/4] input: wacom: Intuos5 Touch Ring/ExpressKey support Jason Gerecke
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Jason Gerecke @ 2012-03-10 2:06 UTC (permalink / raw)
To: linux-input, dmitry.torokhov, chris, linuxwacom-devel; +Cc: Jason Gerecke
This patch adds support for the basic pen functions of Intuos5
tablets.
---
drivers/input/tablet/wacom_wac.c | 36 +++++++++++++++++++++++++++++++++---
drivers/input/tablet/wacom_wac.h | 3 +++
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 9283507..35efc64 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -452,6 +452,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
if ((data[1] & 0xb8) == 0xa0) {
t = (data[6] << 2) | ((data[7] >> 6) & 3);
if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
+ (features->type >= INTUOS5S && features->type <= INTUOS5L) ||
features->type == WACOM_21UX2 || features->type == WACOM_24HD) {
t = (t << 1) | (data[1] & 1);
}
@@ -632,7 +633,9 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
(features->type == INTUOS3 ||
features->type == INTUOS3S ||
features->type == INTUOS4 ||
- features->type == INTUOS4S)) {
+ features->type == INTUOS4S ||
+ features->type == INTUOS5 ||
+ features->type == INTUOS5S)) {
return 0;
}
@@ -685,7 +688,8 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
} else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
/* I4 mouse */
- if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
+ if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
+ (features->type >= INTUOS5S && features->type <= INTUOS5L)) {
input_report_key(input, BTN_LEFT, data[6] & 0x01);
input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
input_report_key(input, BTN_RIGHT, data[6] & 0x04);
@@ -712,7 +716,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
}
}
} else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
- features->type == INTUOS4L) &&
+ features->type == INTUOS4L || features->type == INTUOS5L) &&
wacom->tool[idx] == BTN_TOOL_LENS) {
/* Lens cursor packets */
input_report_key(input, BTN_LEFT, data[8] & 0x01);
@@ -1078,6 +1082,9 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
case INTUOS4S:
case INTUOS4:
case INTUOS4L:
+ case INTUOS5S:
+ case INTUOS5:
+ case INTUOS5L:
case CINTIQ:
case WACOM_BEE:
case WACOM_21UX2:
@@ -1312,12 +1319,15 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
wacom_setup_intuos(wacom_wac);
break;
+ case INTUOS5:
+ case INTUOS5L:
case INTUOS4:
case INTUOS4L:
__set_bit(BTN_7, input_dev->keybit);
__set_bit(BTN_8, input_dev->keybit);
/* fall through */
+ case INTUOS5S:
case INTUOS4S:
for (i = 0; i < 7; i++)
__set_bit(BTN_0 + i, input_dev->keybit);
@@ -1586,6 +1596,21 @@ static const struct wacom_features wacom_features_0xBB =
static const struct wacom_features wacom_features_0xBC =
{ "Wacom Intuos4 WL", WACOM_PKGLEN_INTUOS, 40840, 25400, 2047,
63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0x26 =
+ { "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
+ 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0x27 =
+ { "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
+ 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0x28 =
+ { "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047,
+ 63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0x29 =
+ { "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047,
+ 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0x2A =
+ { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047,
+ 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
static const struct wacom_features wacom_features_0xF4 =
{ "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047,
63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
@@ -1752,6 +1777,11 @@ const struct usb_device_id wacom_ids[] = {
{ USB_DEVICE_WACOM(0xBA) },
{ USB_DEVICE_WACOM(0xBB) },
{ USB_DEVICE_WACOM(0xBC) },
+ { USB_DEVICE_WACOM(0x26) },
+ { USB_DEVICE_WACOM(0x27) },
+ { USB_DEVICE_WACOM(0x28) },
+ { USB_DEVICE_WACOM(0x29) },
+ { USB_DEVICE_WACOM(0x2A) },
{ USB_DEVICE_WACOM(0x3F) },
{ USB_DEVICE_WACOM(0xC5) },
{ USB_DEVICE_WACOM(0xC6) },
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
index 4f0ba21..5eb10c5 100644
--- a/drivers/input/tablet/wacom_wac.h
+++ b/drivers/input/tablet/wacom_wac.h
@@ -61,6 +61,9 @@ enum {
INTUOS4S,
INTUOS4,
INTUOS4L,
+ INTUOS5S,
+ INTUOS5,
+ INTUOS5L,
WACOM_24HD,
WACOM_21UX2,
CINTIQ,
--
1.7.9.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] input: wacom: Intuos5 Touch Ring/ExpressKey support
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
@ 2012-03-10 2:06 ` Jason Gerecke
2012-03-10 2:06 ` [PATCH 3/4] input: wacom: Intous5 Touch Ring LED support Jason Gerecke
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Jason Gerecke @ 2012-03-10 2:06 UTC (permalink / raw)
To: linux-input, dmitry.torokhov, chris, linuxwacom-devel; +Cc: Jason Gerecke
Intuos5 uses a new report type for Touch Ring and ExpressKey data.
Note that data from the capacitive sensors present on the ExpressKeys
will be ignored until a proper way is found to expose it.
---
drivers/input/tablet/wacom_wac.c | 33 +++++++++++++++++++++++++++++++--
drivers/input/tablet/wacom_wac.h | 1 +
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 35efc64..86827c7 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -484,7 +484,8 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
int idx = 0, result;
if (data[0] != WACOM_REPORT_PENABLED && data[0] != WACOM_REPORT_INTUOSREAD
- && data[0] != WACOM_REPORT_INTUOSWRITE && data[0] != WACOM_REPORT_INTUOSPAD) {
+ && data[0] != WACOM_REPORT_INTUOSWRITE && data[0] != WACOM_REPORT_INTUOSPAD
+ && data[0] != WACOM_REPORT_INTUOS5PAD) {
dbg("wacom_intuos_irq: received unknown report #%d", data[0]);
return 0;
}
@@ -494,7 +495,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
idx = data[1] & 0x01;
/* pad packets. Works as a second tool and is always in prox */
- if (data[0] == WACOM_REPORT_INTUOSPAD) {
+ if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD) {
if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
input_report_key(input, BTN_0, (data[2] & 0x01));
input_report_key(input, BTN_1, (data[3] & 0x01));
@@ -570,6 +571,34 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
input_report_key(input, wacom->tool[1], 0);
input_report_abs(input, ABS_MISC, 0);
}
+ } else if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
+ int i;
+
+ /* Touch ring mode switch has no capacitive sensor */
+ input_report_key(input, BTN_0, (data[3] & 0x01));
+
+ /* ExpressKeys on Intuos5 have a capacitive sensor in
+ * addition to the mechanical switch. Switch data is
+ * stored in data[4], capacitive data in data[5].
+ */
+ for (i = 0; i < 8; i++) {
+ input_report_key(input, BTN_1 + i, data[4] & (1 << i));
+ }
+
+ if (data[2] & 0x80) {
+ input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f));
+ } else {
+ /* Out of proximity, clear wheel value. */
+ input_report_abs(input, ABS_WHEEL, 0);
+ }
+
+ if (data[2] | (data[3] & 0x01) | data[4]) {
+ input_report_key(input, wacom->tool[1], 1);
+ input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
+ } else {
+ input_report_key(input, wacom->tool[1], 0);
+ input_report_abs(input, ABS_MISC, 0);
+ }
} else {
if (features->type == WACOM_21UX2) {
input_report_key(input, BTN_0, (data[5] & 0x01));
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
index 5eb10c5..99efc10 100644
--- a/drivers/input/tablet/wacom_wac.h
+++ b/drivers/input/tablet/wacom_wac.h
@@ -37,6 +37,7 @@
#define WACOM_REPORT_INTUOSREAD 5
#define WACOM_REPORT_INTUOSWRITE 6
#define WACOM_REPORT_INTUOSPAD 12
+#define WACOM_REPORT_INTUOS5PAD 3
#define WACOM_REPORT_TPC1FG 6
#define WACOM_REPORT_TPC2FG 13
#define WACOM_REPORT_TPCHID 15
--
1.7.9.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] input: wacom: Intous5 Touch Ring LED support
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
2012-03-10 2:06 ` [PATCH 2/4] input: wacom: Intuos5 Touch Ring/ExpressKey support Jason Gerecke
@ 2012-03-10 2:06 ` Jason Gerecke
2012-03-10 2:06 ` [PATCH 4/4] input: wacom: Intuos5 multitouch sensor support Jason Gerecke
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Jason Gerecke @ 2012-03-10 2:06 UTC (permalink / raw)
To: linux-input, dmitry.torokhov, chris, linuxwacom-devel; +Cc: Jason Gerecke
The Touch Ring LEDs on Intuos5 tablets use a different report
format which supports only 4 levels of brightness. We remap
the 7-bit value obtained from sysfs to an appropriate value
for the tablet. Control of the crop mark LEDs (new to the I5)
is left for a later patch.
---
Documentation/ABI/testing/sysfs-driver-wacom | 15 +++---
drivers/input/tablet/wacom_sys.c | 68 +++++++++++++++++++++----
2 files changed, 65 insertions(+), 18 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-driver-wacom b/Documentation/ABI/testing/sysfs-driver-wacom
index 0130d66..5e9cbdc 100644
--- a/Documentation/ABI/testing/sysfs-driver-wacom
+++ b/Documentation/ABI/testing/sysfs-driver-wacom
@@ -15,9 +15,10 @@ Contact: linux-input@vger.kernel.org
Description:
Attribute group for control of the status LEDs and the OLEDs.
This attribute group is only available for Intuos 4 M, L,
- and XL (with LEDs and OLEDs) and Cintiq 21UX2 and Cintiq 24HD
- (LEDs only). Therefore its presence implicitly signifies the
- presence of said LEDs and OLEDs on the tablet device.
+ and XL (with LEDs and OLEDs), Intuos 5 (LEDs only), and Cintiq
+ 21UX2 and Cintiq 24HD (LEDs only). Therefore its presence
+ implicitly signifies the presence of said LEDs and OLEDs on the
+ tablet device.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status0_luminance
Date: August 2011
@@ -40,10 +41,10 @@ What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led0
Date: August 2011
Contact: linux-input@vger.kernel.org
Description:
- Writing to this file sets which one of the four (for Intuos 4)
- or of the right four (for Cintiq 21UX2 and Cintiq 24HD) status
- LEDs is active (0..3). The other three LEDs on the same side are
- always inactive.
+ Writing to this file sets which one of the four (for Intuos 4
+ and Intuos 5) or of the right four (for Cintiq 21UX2 and Cintiq
+ 24HD) status LEDs is active (0..3). The other three LEDs on the
+ same side are always inactive.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<cfg>.<intf>/wacom_led/status_led1_select
Date: September 2011
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index c9588ee..11b4c05 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -553,23 +553,38 @@ static void wacom_remove_shared_data(struct wacom_wac *wacom)
static int wacom_led_control(struct wacom *wacom)
{
unsigned char *buf;
- int retval, led = 0;
+ int retval;
buf = kzalloc(9, GFP_KERNEL);
if (!buf)
return -ENOMEM;
- if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
- wacom->wacom_wac.features.type == WACOM_24HD)
- led = (wacom->led.select[1] << 4) | 0x40;
-
- led |= wacom->led.select[0] | 0x4;
+ if (wacom->wacom_wac.features.type >= INTUOS5S &&
+ wacom->wacom_wac.features.type <= INTUOS5L) {
+ /* Touch Ring and crop mark LED luminance may take on
+ * one of four values:
+ * 0 = Low; 1 = Medium; 2 = High; 3 = Off
+ */
+ int ring_led = wacom->led.select[0] & 0x03;
+ int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03;
+ int crop_lum = 0;
- buf[0] = WAC_CMD_LED_CONTROL;
- buf[1] = led;
- buf[2] = wacom->led.llv;
- buf[3] = wacom->led.hlv;
- buf[4] = wacom->led.img_lum;
+ buf[0] = WAC_CMD_LED_CONTROL;
+ buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led);
+ }
+ else {
+ int led = wacom->led.select[0] | 0x4;
+
+ if (wacom->wacom_wac.features.type == WACOM_21UX2 ||
+ wacom->wacom_wac.features.type == WACOM_24HD)
+ led |= (wacom->led.select[1] << 4) | 0x40;
+
+ buf[0] = WAC_CMD_LED_CONTROL;
+ buf[1] = led;
+ buf[2] = wacom->led.llv;
+ buf[3] = wacom->led.hlv;
+ buf[4] = wacom->led.img_lum;
+ }
retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL,
buf, 9, WAC_CMD_RETRIES);
@@ -762,6 +777,17 @@ static struct attribute_group intuos4_led_attr_group = {
.attrs = intuos4_led_attrs,
};
+static struct attribute *intuos5_led_attrs[] = {
+ &dev_attr_status0_luminance.attr,
+ &dev_attr_status_led0_select.attr,
+ NULL
+};
+
+static struct attribute_group intuos5_led_attr_group = {
+ .name = "wacom_led",
+ .attrs = intuos5_led_attrs,
+};
+
static int wacom_initialize_leds(struct wacom *wacom)
{
int error;
@@ -791,6 +817,19 @@ static int wacom_initialize_leds(struct wacom *wacom)
&cintiq_led_attr_group);
break;
+ case INTUOS5S:
+ case INTUOS5:
+ case INTUOS5L:
+ wacom->led.select[0] = 0;
+ wacom->led.select[1] = 0;
+ wacom->led.llv = 32;
+ wacom->led.hlv = 0;
+ wacom->led.img_lum = 0;
+
+ error = sysfs_create_group(&wacom->intf->dev.kobj,
+ &intuos5_led_attr_group);
+ break;
+
default:
return 0;
}
@@ -819,6 +858,13 @@ static void wacom_destroy_leds(struct wacom *wacom)
sysfs_remove_group(&wacom->intf->dev.kobj,
&cintiq_led_attr_group);
break;
+
+ case INTUOS5S:
+ case INTUOS5:
+ case INTUOS5L:
+ sysfs_remove_group(&wacom->intf->dev.kobj,
+ &intuos5_led_attr_group);
+ break;
}
}
--
1.7.9.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] input: wacom: Intuos5 multitouch sensor support
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
2012-03-10 2:06 ` [PATCH 2/4] input: wacom: Intuos5 Touch Ring/ExpressKey support Jason Gerecke
2012-03-10 2:06 ` [PATCH 3/4] input: wacom: Intous5 Touch Ring LED support Jason Gerecke
@ 2012-03-10 2:06 ` Jason Gerecke
2012-03-12 22:36 ` [PATCH v2 " Jason Gerecke
2012-04-03 18:05 ` [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support Timo Aaltonen
4 siblings, 0 replies; 9+ messages in thread
From: Jason Gerecke @ 2012-03-10 2:06 UTC (permalink / raw)
To: linux-input, dmitry.torokhov, chris, linuxwacom-devel; +Cc: Jason Gerecke
Intuos5 tablets with PTH-* model numbers include a multitouch sensor
which use the same touch reports as the 3rd-generation Bamboo. No
useful information is in the HID descriptor for the touch interface
so hardcoded values are used during setup.
---
drivers/input/tablet/wacom_sys.c | 24 ++++++++++++++
drivers/input/tablet/wacom_wac.c | 63 +++++++++++++++++++++++++++++++++++---
2 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 11b4c05..b1af6c2 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -228,6 +228,9 @@ static int wacom_parse_logical_collection(unsigned char *report,
* 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
* Collection. Instead they define a Logical Collection with a single
* Logical Maximum for both X and Y.
+ *
+ * Intuos5 touch interface does not contain useful data. We deal with
+ * this after returning from this function.
*/
static int wacom_parse_hid(struct usb_interface *intf,
struct hid_descriptor *hid_desc,
@@ -924,6 +927,27 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
if (error)
goto fail3;
+ /* Intuos5 has no useful data about its touch interface in its
+ * HID descriptor. If this is the touch interface (wMaxPacketSize
+ * of WACOM_PKGLEN_BBTOUCH3), override the table values.
+ */
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
+ if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
+ features->device_type = BTN_TOOL_FINGER;
+ features->pktlen = WACOM_PKGLEN_BBTOUCH3;
+
+ features->x_phy =
+ (features->x_max * features->x_resolution) / 100;
+ features->y_phy =
+ (features->y_max * features->y_resolution) / 100;
+
+ features->x_max = 4096;
+ features->y_max = 4096;
+ } else {
+ features->device_type = BTN_TOOL_PEN;
+ }
+ }
+
wacom_setup_device_quirks(features);
strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 86827c7..30067ae 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -321,6 +321,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Enter report */
if ((data[1] & 0xfc) == 0xc0) {
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L)
+ wacom->shared->stylus_in_proximity = true;
+
/* serial number of the tool */
wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
(data[4] << 20) + (data[5] << 12) +
@@ -406,6 +409,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Exit report */
if ((data[1] & 0xfe) == 0x80) {
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L)
+ wacom->shared->stylus_in_proximity = false;
+
/*
* Reset all states otherwise we lose the initial states
* when in-prox next time
@@ -1111,9 +1117,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
case INTUOS4S:
case INTUOS4:
case INTUOS4L:
- case INTUOS5S:
- case INTUOS5:
- case INTUOS5L:
case CINTIQ:
case WACOM_BEE:
case WACOM_21UX2:
@@ -1121,6 +1124,15 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
sync = wacom_intuos_irq(wacom_wac);
break;
+ case INTUOS5S:
+ case INTUOS5:
+ case INTUOS5L:
+ if (len == WACOM_PKGLEN_BBTOUCH3)
+ sync = wacom_bpt3_touch(wacom_wac);
+ else
+ sync = wacom_intuos_irq(wacom_wac);
+ break;
+
case TABLETPC:
case TABLETPC2FG:
sync = wacom_tpc_irq(wacom_wac, len);
@@ -1191,7 +1203,7 @@ void wacom_setup_device_quirks(struct wacom_features *features)
/* these device have multiple inputs */
if (features->type == TABLETPC || features->type == TABLETPC2FG ||
- features->type == BAMBOO_PT)
+ features->type == BAMBOO_PT || (features->type >= INTUOS5S && features->type <= INTUOS5L))
features->quirks |= WACOM_QUIRK_MULTI_INPUT;
/* quirk for bamboo touch with 2 low res touches */
@@ -1350,13 +1362,54 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
case INTUOS5:
case INTUOS5L:
+ if (features->device_type == BTN_TOOL_PEN) {
+ __set_bit(BTN_7, input_dev->keybit);
+ __set_bit(BTN_8, input_dev->keybit);
+ }
+ /* fall through */
+
+ case INTUOS5S:
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+
+ if (features->device_type == BTN_TOOL_PEN) {
+ for (i = 0; i < 7; i++)
+ __set_bit(BTN_0 + i, input_dev->keybit);
+
+ input_set_abs_params(input_dev, ABS_DISTANCE, 0,
+ features->distance_max,
+ 0, 0);
+
+ input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
+
+ wacom_setup_intuos(wacom_wac);
+ } else if (features->device_type == BTN_TOOL_FINGER) {
+ __clear_bit(ABS_MISC, input_dev->absbit);
+
+ __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+ __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+ __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
+
+ input_mt_init_slots(input_dev, 16);
+
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
+ 0, 255, 0, 0);
+
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X,
+ 0, features->x_max,
+ features->x_fuzz, 0);
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
+ 0, features->y_max,
+ features->y_fuzz, 0);
+ }
+ break;
+
case INTUOS4:
case INTUOS4L:
__set_bit(BTN_7, input_dev->keybit);
__set_bit(BTN_8, input_dev->keybit);
/* fall through */
- case INTUOS5S:
case INTUOS4S:
for (i = 0; i < 7; i++)
__set_bit(BTN_0 + i, input_dev->keybit);
--
1.7.9.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] input: wacom: Intuos5 multitouch sensor support
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
` (2 preceding siblings ...)
2012-03-10 2:06 ` [PATCH 4/4] input: wacom: Intuos5 multitouch sensor support Jason Gerecke
@ 2012-03-12 22:36 ` Jason Gerecke
2012-03-13 3:25 ` Chris Bagwell
2012-04-03 18:05 ` [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support Timo Aaltonen
4 siblings, 1 reply; 9+ messages in thread
From: Jason Gerecke @ 2012-03-12 22:36 UTC (permalink / raw)
To: linux-input, dmitry.torokhov, chris, linuxwacom-devel; +Cc: Jason Gerecke
Intuos5 tablets with PTH-* model numbers include a multitouch sensor
which use the same touch reports as the 3rd-generation Bamboo. No
useful information is in the HID descriptor for the touch interface
so hardcoded values are used during setup.
Signed-off-by: Jason Gerecke <killertofu@gmail.com>
---
Changes from v1:
* Fixed calculation of x_phy and y_phy (logic for the 3rd-gen Bamboo
which I copied is incorrect! Patch on the way.)
drivers/input/tablet/wacom_sys.c | 24 ++++++++++++++
drivers/input/tablet/wacom_wac.c | 63 +++++++++++++++++++++++++++++++++++---
2 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 11b4c05..528e3a4 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -228,6 +228,9 @@ static int wacom_parse_logical_collection(unsigned char *report,
* 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
* Collection. Instead they define a Logical Collection with a single
* Logical Maximum for both X and Y.
+ *
+ * Intuos5 touch interface does not contain useful data. We deal with
+ * this after returning from this function.
*/
static int wacom_parse_hid(struct usb_interface *intf,
struct hid_descriptor *hid_desc,
@@ -924,6 +927,27 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
if (error)
goto fail3;
+ /* Intuos5 has no useful data about its touch interface in its
+ * HID descriptor. If this is the touch interface (wMaxPacketSize
+ * of WACOM_PKGLEN_BBTOUCH3), override the table values.
+ */
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
+ if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
+ features->device_type = BTN_TOOL_FINGER;
+ features->pktlen = WACOM_PKGLEN_BBTOUCH3;
+
+ features->x_phy =
+ (features->x_max * 100) / features->x_resolution;
+ features->y_phy =
+ (features->y_max * 100) / features->y_resolution;
+
+ features->x_max = 4096;
+ features->y_max = 4096;
+ } else {
+ features->device_type = BTN_TOOL_PEN;
+ }
+ }
+
wacom_setup_device_quirks(features);
strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 86827c7..30067ae 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -321,6 +321,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Enter report */
if ((data[1] & 0xfc) == 0xc0) {
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L)
+ wacom->shared->stylus_in_proximity = true;
+
/* serial number of the tool */
wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
(data[4] << 20) + (data[5] << 12) +
@@ -406,6 +409,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Exit report */
if ((data[1] & 0xfe) == 0x80) {
+ if (features->type >= INTUOS5S && features->type <= INTUOS5L)
+ wacom->shared->stylus_in_proximity = false;
+
/*
* Reset all states otherwise we lose the initial states
* when in-prox next time
@@ -1111,9 +1117,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
case INTUOS4S:
case INTUOS4:
case INTUOS4L:
- case INTUOS5S:
- case INTUOS5:
- case INTUOS5L:
case CINTIQ:
case WACOM_BEE:
case WACOM_21UX2:
@@ -1121,6 +1124,15 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
sync = wacom_intuos_irq(wacom_wac);
break;
+ case INTUOS5S:
+ case INTUOS5:
+ case INTUOS5L:
+ if (len == WACOM_PKGLEN_BBTOUCH3)
+ sync = wacom_bpt3_touch(wacom_wac);
+ else
+ sync = wacom_intuos_irq(wacom_wac);
+ break;
+
case TABLETPC:
case TABLETPC2FG:
sync = wacom_tpc_irq(wacom_wac, len);
@@ -1191,7 +1203,7 @@ void wacom_setup_device_quirks(struct wacom_features *features)
/* these device have multiple inputs */
if (features->type == TABLETPC || features->type == TABLETPC2FG ||
- features->type == BAMBOO_PT)
+ features->type == BAMBOO_PT || (features->type >= INTUOS5S && features->type <= INTUOS5L))
features->quirks |= WACOM_QUIRK_MULTI_INPUT;
/* quirk for bamboo touch with 2 low res touches */
@@ -1350,13 +1362,54 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
case INTUOS5:
case INTUOS5L:
+ if (features->device_type == BTN_TOOL_PEN) {
+ __set_bit(BTN_7, input_dev->keybit);
+ __set_bit(BTN_8, input_dev->keybit);
+ }
+ /* fall through */
+
+ case INTUOS5S:
+ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+
+ if (features->device_type == BTN_TOOL_PEN) {
+ for (i = 0; i < 7; i++)
+ __set_bit(BTN_0 + i, input_dev->keybit);
+
+ input_set_abs_params(input_dev, ABS_DISTANCE, 0,
+ features->distance_max,
+ 0, 0);
+
+ input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
+
+ wacom_setup_intuos(wacom_wac);
+ } else if (features->device_type == BTN_TOOL_FINGER) {
+ __clear_bit(ABS_MISC, input_dev->absbit);
+
+ __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+ __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+ __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+ __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
+
+ input_mt_init_slots(input_dev, 16);
+
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
+ 0, 255, 0, 0);
+
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X,
+ 0, features->x_max,
+ features->x_fuzz, 0);
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
+ 0, features->y_max,
+ features->y_fuzz, 0);
+ }
+ break;
+
case INTUOS4:
case INTUOS4L:
__set_bit(BTN_7, input_dev->keybit);
__set_bit(BTN_8, input_dev->keybit);
/* fall through */
- case INTUOS5S:
case INTUOS4S:
for (i = 0; i < 7; i++)
__set_bit(BTN_0 + i, input_dev->keybit);
--
1.7.9.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 4/4] input: wacom: Intuos5 multitouch sensor support
2012-03-12 22:36 ` [PATCH v2 " Jason Gerecke
@ 2012-03-13 3:25 ` Chris Bagwell
0 siblings, 0 replies; 9+ messages in thread
From: Chris Bagwell @ 2012-03-13 3:25 UTC (permalink / raw)
To: Jason Gerecke; +Cc: linux-input, dmitry.torokhov, linuxwacom-devel
On Mon, Mar 12, 2012 at 5:36 PM, Jason Gerecke <killertofu@gmail.com> wrote:
> Intuos5 tablets with PTH-* model numbers include a multitouch sensor
> which use the same touch reports as the 3rd-generation Bamboo. No
> useful information is in the HID descriptor for the touch interface
> so hardcoded values are used during setup.
>
> Signed-off-by: Jason Gerecke <killertofu@gmail.com>
> ---
> Changes from v1:
> * Fixed calculation of x_phy and y_phy (logic for the 3rd-gen Bamboo
> which I copied is incorrect! Patch on the way.)
Thanks for catching.
For patches 1, 2, and 4 in this series:
Reviewed-by: Chris Bagwell <chris@cnpbagwell.com>
I did review and didn't see any issues with patch #3 but I'm not
familiar with LED support to comment.
Chris
>
> drivers/input/tablet/wacom_sys.c | 24 ++++++++++++++
> drivers/input/tablet/wacom_wac.c | 63 +++++++++++++++++++++++++++++++++++---
> 2 files changed, 82 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
> index 11b4c05..528e3a4 100644
> --- a/drivers/input/tablet/wacom_sys.c
> +++ b/drivers/input/tablet/wacom_sys.c
> @@ -228,6 +228,9 @@ static int wacom_parse_logical_collection(unsigned char *report,
> * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical
> * Collection. Instead they define a Logical Collection with a single
> * Logical Maximum for both X and Y.
> + *
> + * Intuos5 touch interface does not contain useful data. We deal with
> + * this after returning from this function.
> */
> static int wacom_parse_hid(struct usb_interface *intf,
> struct hid_descriptor *hid_desc,
> @@ -924,6 +927,27 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
> if (error)
> goto fail3;
>
> + /* Intuos5 has no useful data about its touch interface in its
> + * HID descriptor. If this is the touch interface (wMaxPacketSize
> + * of WACOM_PKGLEN_BBTOUCH3), override the table values.
> + */
> + if (features->type >= INTUOS5S && features->type <= INTUOS5L) {
> + if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) {
> + features->device_type = BTN_TOOL_FINGER;
> + features->pktlen = WACOM_PKGLEN_BBTOUCH3;
> +
> + features->x_phy =
> + (features->x_max * 100) / features->x_resolution;
> + features->y_phy =
> + (features->y_max * 100) / features->y_resolution;
> +
> + features->x_max = 4096;
> + features->y_max = 4096;
> + } else {
> + features->device_type = BTN_TOOL_PEN;
> + }
> + }
> +
> wacom_setup_device_quirks(features);
>
> strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
> diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
> index 86827c7..30067ae 100644
> --- a/drivers/input/tablet/wacom_wac.c
> +++ b/drivers/input/tablet/wacom_wac.c
> @@ -321,6 +321,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
>
> /* Enter report */
> if ((data[1] & 0xfc) == 0xc0) {
> + if (features->type >= INTUOS5S && features->type <= INTUOS5L)
> + wacom->shared->stylus_in_proximity = true;
> +
> /* serial number of the tool */
> wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
> (data[4] << 20) + (data[5] << 12) +
> @@ -406,6 +409,9 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
>
> /* Exit report */
> if ((data[1] & 0xfe) == 0x80) {
> + if (features->type >= INTUOS5S && features->type <= INTUOS5L)
> + wacom->shared->stylus_in_proximity = false;
> +
> /*
> * Reset all states otherwise we lose the initial states
> * when in-prox next time
> @@ -1111,9 +1117,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> case INTUOS4S:
> case INTUOS4:
> case INTUOS4L:
> - case INTUOS5S:
> - case INTUOS5:
> - case INTUOS5L:
> case CINTIQ:
> case WACOM_BEE:
> case WACOM_21UX2:
> @@ -1121,6 +1124,15 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> sync = wacom_intuos_irq(wacom_wac);
> break;
>
> + case INTUOS5S:
> + case INTUOS5:
> + case INTUOS5L:
> + if (len == WACOM_PKGLEN_BBTOUCH3)
> + sync = wacom_bpt3_touch(wacom_wac);
> + else
> + sync = wacom_intuos_irq(wacom_wac);
> + break;
> +
> case TABLETPC:
> case TABLETPC2FG:
> sync = wacom_tpc_irq(wacom_wac, len);
> @@ -1191,7 +1203,7 @@ void wacom_setup_device_quirks(struct wacom_features *features)
>
> /* these device have multiple inputs */
> if (features->type == TABLETPC || features->type == TABLETPC2FG ||
> - features->type == BAMBOO_PT)
> + features->type == BAMBOO_PT || (features->type >= INTUOS5S && features->type <= INTUOS5L))
> features->quirks |= WACOM_QUIRK_MULTI_INPUT;
>
> /* quirk for bamboo touch with 2 low res touches */
> @@ -1350,13 +1362,54 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
>
> case INTUOS5:
> case INTUOS5L:
> + if (features->device_type == BTN_TOOL_PEN) {
> + __set_bit(BTN_7, input_dev->keybit);
> + __set_bit(BTN_8, input_dev->keybit);
> + }
> + /* fall through */
> +
> + case INTUOS5S:
> + __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
> +
> + if (features->device_type == BTN_TOOL_PEN) {
> + for (i = 0; i < 7; i++)
> + __set_bit(BTN_0 + i, input_dev->keybit);
> +
> + input_set_abs_params(input_dev, ABS_DISTANCE, 0,
> + features->distance_max,
> + 0, 0);
> +
> + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
> +
> + wacom_setup_intuos(wacom_wac);
> + } else if (features->device_type == BTN_TOOL_FINGER) {
> + __clear_bit(ABS_MISC, input_dev->absbit);
> +
> + __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
> + __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
> + __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
> + __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
> +
> + input_mt_init_slots(input_dev, 16);
> +
> + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
> + 0, 255, 0, 0);
> +
> + input_set_abs_params(input_dev, ABS_MT_POSITION_X,
> + 0, features->x_max,
> + features->x_fuzz, 0);
> + input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
> + 0, features->y_max,
> + features->y_fuzz, 0);
> + }
> + break;
> +
> case INTUOS4:
> case INTUOS4L:
> __set_bit(BTN_7, input_dev->keybit);
> __set_bit(BTN_8, input_dev->keybit);
> /* fall through */
>
> - case INTUOS5S:
> case INTUOS4S:
> for (i = 0; i < 7; i++)
> __set_bit(BTN_0 + i, input_dev->keybit);
> --
> 1.7.9.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
` (3 preceding siblings ...)
2012-03-12 22:36 ` [PATCH v2 " Jason Gerecke
@ 2012-04-03 18:05 ` Timo Aaltonen
2012-04-03 20:31 ` Dmitry Torokhov
4 siblings, 1 reply; 9+ messages in thread
From: Timo Aaltonen @ 2012-04-03 18:05 UTC (permalink / raw)
To: Jason Gerecke; +Cc: linux-input, dmitry.torokhov, chris, linuxwacom-devel
On 10.03.2012 04:06, Jason Gerecke wrote:
> This patch adds support for the basic pen functions of Intuos5
> tablets.
Looks like these haven't been applied upstream yet?
Tested-by: Timo Aaltonen <tjaalton@ubuntu.com>
--
t
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support
2012-04-03 18:05 ` [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support Timo Aaltonen
@ 2012-04-03 20:31 ` Dmitry Torokhov
2012-04-03 21:34 ` Jason Gerecke
0 siblings, 1 reply; 9+ messages in thread
From: Dmitry Torokhov @ 2012-04-03 20:31 UTC (permalink / raw)
To: Timo Aaltonen; +Cc: Jason Gerecke, linux-input, chris, linuxwacom-devel
On Tue, Apr 03, 2012 at 09:05:30PM +0300, Timo Aaltonen wrote:
> On 10.03.2012 04:06, Jason Gerecke wrote:
> > This patch adds support for the basic pen functions of Intuos5
> > tablets.
>
> Looks like these haven't been applied upstream yet?
>
> Tested-by: Timo Aaltonen <tjaalton@ubuntu.com>
>
I was about to commit but then I noticed that they do not have Jason's
signoffs.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support
2012-04-03 20:31 ` Dmitry Torokhov
@ 2012-04-03 21:34 ` Jason Gerecke
0 siblings, 0 replies; 9+ messages in thread
From: Jason Gerecke @ 2012-04-03 21:34 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: Timo Aaltonen, linux-input, chris, linuxwacom-devel
On Tue, Apr 3, 2012 at 1:31 PM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> On Tue, Apr 03, 2012 at 09:05:30PM +0300, Timo Aaltonen wrote:
>> On 10.03.2012 04:06, Jason Gerecke wrote:
>> > This patch adds support for the basic pen functions of Intuos5
>> > tablets.
>>
>> Looks like these haven't been applied upstream yet?
>>
>> Tested-by: Timo Aaltonen <tjaalton@ubuntu.com>
>>
>
> I was about to commit but then I noticed that they do not have Jason's
> signoffs.
>
> Thanks.
>
> --
> Dmitry
Whoops! Give me one second and I'll straighten that out.
Jason
---
Day xee-nee-svsh duu-'ushtlh-ts'it;
nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it.
Huu-chan xuu naa~-gha.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-04-03 21:34 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-10 2:06 [PATCH 1/4] input: wacom: Intuos5 basic support Jason Gerecke
2012-03-10 2:06 ` [PATCH 2/4] input: wacom: Intuos5 Touch Ring/ExpressKey support Jason Gerecke
2012-03-10 2:06 ` [PATCH 3/4] input: wacom: Intous5 Touch Ring LED support Jason Gerecke
2012-03-10 2:06 ` [PATCH 4/4] input: wacom: Intuos5 multitouch sensor support Jason Gerecke
2012-03-12 22:36 ` [PATCH v2 " Jason Gerecke
2012-03-13 3:25 ` Chris Bagwell
2012-04-03 18:05 ` [Linuxwacom-devel] [PATCH 1/4] input: wacom: Intuos5 basic support Timo Aaltonen
2012-04-03 20:31 ` Dmitry Torokhov
2012-04-03 21:34 ` Jason Gerecke
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.