diff mbox

[5/5] input: wacom - retrieve maximum number of contacts

Message ID 1313194205-5098-1-git-send-email-pinglinux@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ping Cheng Aug. 13, 2011, 12:10 a.m. UTC
Retrieve it from the HID descriptor when it is available

Signed-off-by: Ping Cheng <pingc@wacom.com>
---
 drivers/input/tablet/wacom_sys.c |   23 ++++++++++++++++++++++-
 drivers/input/tablet/wacom_wac.h |    1 +
 2 files changed, 23 insertions(+), 1 deletions(-)

Comments

chris@cnpbagwell.com Aug. 15, 2011, 3:37 a.m. UTC | #1
On Fri, Aug 12, 2011 at 7:10 PM, Ping Cheng <pinglinux@gmail.com> wrote:
> 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
--
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
Dmitry Torokhov Aug. 17, 2011, 6:52 a.m. UTC | #2
On Mon, Aug 15, 2011 at 09:12:16PM -0700, Ping Cheng wrote:
> On Sun, Aug 14, 2011 at 8:37 PM, Chris Bagwell <chris@cnpbagwell.com> wrote:
> 
> > On Fri, Aug 12, 2011 at 7:10 PM, Ping Cheng <pinglinux@gmail.com> wrote:
> > > 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.
diff mbox

Patch

diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c
index 958b4eb..6fb292d 100644
--- a/drivers/input/tablet/wacom_sys.c
+++ b/drivers/input/tablet/wacom_sys.c
@@ -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;
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h
index 53eb71b..e19e435 100644
--- a/drivers/input/tablet/wacom_wac.h
+++ b/drivers/input/tablet/wacom_wac.h
@@ -86,6 +86,7 @@  struct wacom_features {
 	int pressure_fuzz;
 	int distance_fuzz;
 	unsigned quirks;
+	unsigned touch_max;
 };
 
 struct wacom_shared {