Re: [PATCH 2/3] Input: penmount - add PenMount 6000 support
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2011-09-07 23:29:56
Also in:
lkml
Hi John, On Tue, Sep 06, 2011 at 02:36:01PM +0800, John Sung wrote:
quoted hunk ↗ jump to hunk
Add support for PenMount 6000 touch controller. Signed-off-by: John Sung <redacted> --- drivers/input/touchscreen/penmount.c | 58 +++++++++++++++++++++++++++++----- 1 files changed, 50 insertions(+), 8 deletions(-)diff --git a/drivers/input/touchscreen/penmount.c b/drivers/input/touchscreen/penmount.c index 3342c6d..b60796b 100644 --- a/drivers/input/touchscreen/penmount.c +++ b/drivers/input/touchscreen/penmount.c@@ -33,7 +33,7 @@ MODULE_LICENSE("GPL"); * Definitions & global arrays. */ -#define PM_MAX_LENGTH 5 +#define PM_MAX_LENGTH 6 /* * Per-touchscreen data.@@ -45,6 +45,7 @@ struct pm { int idx; unsigned char data[PM_MAX_LENGTH]; char phys[32]; + unsigned char packetsize; }; static irqreturn_t pm_interrupt(struct serio *serio,@@ -55,20 +56,48 @@ static irqreturn_t pm_interrupt(struct serio *serio, pm->data[pm->idx] = data; - if (pm->data[0] & 0x80) { - if (PM_MAX_LENGTH == ++pm->idx) { - input_report_abs(dev, ABS_X, pm->data[1] * 128 + pm->data[2]); - input_report_abs(dev, ABS_Y, pm->data[3] * 128 + pm->data[4]); - input_report_key(dev, BTN_TOUCH, !!(pm->data[0] & 0x40)); - input_sync(dev); - pm->idx = 0; + switch (pm->dev->id.product) { + case 0x9000: + if (pm->data[0] & 0x80) { + if (pm->packetsize == ++pm->idx) { + input_report_abs(dev, ABS_X, pm->data[1] * 128 + pm->data[2]); + input_report_abs(dev, ABS_Y, pm->data[3] * 128 + pm->data[4]); + input_report_key(dev, BTN_TOUCH, !!(pm->data[0] & 0x40)); + input_sync(dev); + pm->idx = 0; + } } + break; + case 0x6000: + if ((pm->data[0] == 0x70) || (pm->data[0] == 0x30)) {
Should it be: if ((pm->data[0] & 0xbf) == 0x30) to avoid 2 comparisons and branches?
+ if (pm->packetsize == ++pm->idx) {
+ input_report_abs(dev, ABS_X, pm->data[2] * 256 + pm->data[1]);
+ input_report_abs(dev, ABS_Y, pm->data[4] * 256 + pm->data[3]);
+ input_report_key(dev, BTN_TOUCH, (pm->data[0] == 0x70));
+ input_sync(dev);
+ pm->idx = 0;
+ }
+ }
+ break;
}
return IRQ_HANDLED;
}
/*
+ * pm_enable() sends command that can enable the PenMount 6000 controller
+ */
+
+static void pm_enable(struct serio *serio)
+{
+ int i = 0;
+ unsigned char command[6] = { 0xF1, 0x00, 0x00, 0x00, 0x00, 0x0E };
+
+ for (i = 0; i < 6; i++)
+ serio_write(serio, command[i]);
+}Initializing a device connected to a serport serio port is actually task of inputattach utility. Thanks. -- Dmitry