Skip to contentSkip to conversation

input: wacom - retrieve maximum number of contacts

PATCH In review Ping Cheng 3 participants 3 messages Aug 13, 2011 – Aug 17, 2011 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

Ping Cheng

author
#0 lore raw

PATCH 5/5 input: wacom - retrieve maximum number of contacts

Retrieve it from the HID descriptor when it is available

---
 drivers/input/tablet/wacom_sys.c |   23 ++++++++++++++++++++++-
 drivers/input/tablet/wacom_wac.h |    1 +
 2 files changed, 23 insertions(+), 1 deletions(-)
drivers/input/tablet/wacom_sys.c +22 -1
index 958b4eb..6fb292d 100644
@@ -28,6 +28,7 @@
 #define HID_USAGE_Y_TILT		0x3e
 #define HID_USAGE_FINGER		0x22
 #define HID_USAGE_STYLUS		0x20
+#define HID_MT_CONTACTMAX		0x55
 #define HID_COLLECTION			0xc0
 
 enum {
@@ -151,11 +152,16 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
 	int result = 0;
 	int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
 	unsigned char *report;
+	unsigned char *rep_data;
 
 	report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
 	if (!report)
 		return -ENOMEM;
 
+	rep_data = kmalloc(2, GFP_KERNEL);
+	if (!rep_data)
+		return -ENOMEM;
+
 	/* retrive report descriptors */
 	do {
 		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
@@ -284,6 +290,19 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
 				pen = 1;
 				i++;
 				break;
+
+			case HID_MT_CONTACTMAX:
+				do {
+					rep_data[0] = 12;
+					result = usb_get_report(intf,
+						WAC_HID_FEATURE_REPORT, rep_data[0],
+						rep_data, 2);
+				} while ((result < 0) && (limit++ < WAC_MSG_RETRIES));
+
+				if ((result >= 0) && (rep_data[1] > 2))
+					features->touch_max = rep_data[1];
+				i++;
+				break;
 			}
 			break;
 
@@ -297,6 +316,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
  out:
 	result = 0;
 	kfree(report);
+	kfree(rep_data);
 	return result;
 }
 
@@ -505,7 +525,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
 
 	endpoint = &intf->cur_altsetting->endpoint[0].desc;
 
-	/* Retrieve the physical and logical size for OEM devices */
+	/* Retrieve the physical and logical size for touch devices */
+	features->touch_max = 0;
 	error = wacom_retrieve_hid_descriptor(intf, features);
 	if (error)
 		goto fail3;
drivers/input/tablet/wacom_wac.h +1 -0
index 53eb71b..e19e435 100644
@@ -86,6 +86,7 @@ struct wacom_features {
 	int pressure_fuzz;
 	int distance_fuzz;
 	unsigned quirks;
+	unsigned touch_max;
 };
 
 struct wacom_shared {
Signature · 1 line
1.7.6
#1 lore raw
Quoted 1 line · Ping Cheng

Retrieve it from the HID descriptor when it is available

Were you going to use touch_max for something (since its not referenced)?

Related to Bamboo's and pressure, does this happen to report 4 touches on the newer Bamboo's that do not support pressure? I haven't looked at my 0xd1 Bamboo but I suspect either contact count is not returned or returns 2 (or maybe 3) contacts.

I'm hoping there is a way to detect differences in touch packet format besides resorting to a quirks list.

Chris

A message that is not in the archive (sent off-list or not yet received): CAF8JNhLOQo_HdrXrjbDJqx_M6Mcb0puXJ80vNPaQeY1kOr-UNA@mail.gmail.com

maintainer
#3 lore raw
Quoted 10 lines · Ping Cheng
Quoted 5 lines · Chris Bagwell
Quoted 1 line · Ping Cheng

Retrieve it from the HID descriptor when it is available

Were you going to use touch_max for something (since its not referenced)?

This set of patches is only a clean-up and preparation for the coming set of patches. The value will be used then.

OK, then I think it is best to submit this one with that set. I applied the other 3 patches, but not the 'pressure' one.

Signature · 1 line
Dmitry