* [PATCH 2/3] Input: penmount - add PenMount 6000 support
@ 2011-09-06 6:36 John Sung
2011-09-07 23:29 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: John Sung @ 2011-09-06 6:36 UTC (permalink / raw)
To: linux-input, linux-kernel; +Cc: Dmitry Torokhov, John Sung
Add support for PenMount 6000 touch controller.
Signed-off-by: John Sung <penmount.touch@gmail.com>
---
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)) {
+ 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]);
+}
+
+/*
* pm_disconnect() is the opposite of pm_connect()
*/
@@ -120,6 +149,19 @@ static int pm_connect(struct serio *serio, struct serio_driver *drv)
input_set_abs_params(pm->dev, ABS_X, 0, 0x3ff, 0, 0);
input_set_abs_params(pm->dev, ABS_Y, 0, 0x3ff, 0, 0);
+ switch (serio->id.id) {
+ default:
+ case 0:
+ pm->packetsize = 5;
+ input_dev->id.product = 0x9000;
+ break;
+ case 1:
+ pm->packetsize = 6;
+ input_dev->id.product = 0x6000;
+ pm_enable(serio);
+ break;
+ }
+
serio_set_drvdata(serio, pm);
err = serio_open(serio, drv);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/3] Input: penmount - add PenMount 6000 support
2011-09-06 6:36 [PATCH 2/3] Input: penmount - add PenMount 6000 support John Sung
@ 2011-09-07 23:29 ` Dmitry Torokhov
2011-09-19 15:32 ` Matthew Garrett
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Torokhov @ 2011-09-07 23:29 UTC (permalink / raw)
To: John Sung; +Cc: linux-input, linux-kernel
Hi John,
On Tue, Sep 06, 2011 at 02:36:01PM +0800, John Sung wrote:
> Add support for PenMount 6000 touch controller.
>
> Signed-off-by: John Sung <penmount.touch@gmail.com>
> ---
> 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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/3] Input: penmount - add PenMount 6000 support
2011-09-07 23:29 ` Dmitry Torokhov
@ 2011-09-19 15:32 ` Matthew Garrett
2011-09-24 6:02 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: Matthew Garrett @ 2011-09-19 15:32 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: John Sung, linux-input, linux-kernel
On Wed, Sep 07, 2011 at 04:29:47PM -0700, Dmitry Torokhov wrote:
>
> Initializing a device connected to a serport serio port is actually task
> of inputattach utility.
For devices that present a unique pnp ID, we probably ought to support
doing this in-kernel rather than relying on inputattach. It makes it
easier to handle things like suspend/resume.
--
Matthew Garrett | mjg59@srcf.ucam.org
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/3] Input: penmount - add PenMount 6000 support
2011-09-19 15:32 ` Matthew Garrett
@ 2011-09-24 6:02 ` Dmitry Torokhov
0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Torokhov @ 2011-09-24 6:02 UTC (permalink / raw)
To: Matthew Garrett; +Cc: John Sung, linux-input, linux-kernel
On Mon, Sep 19, 2011 at 04:32:25PM +0100, Matthew Garrett wrote:
> On Wed, Sep 07, 2011 at 04:29:47PM -0700, Dmitry Torokhov wrote:
> >
> > Initializing a device connected to a serport serio port is actually task
> > of inputattach utility.
>
> For devices that present a unique pnp ID, we probably ought to support
> doing this in-kernel rather than relying on inputattach. It makes it
> easier to handle things like suspend/resume.
I'd prefer to keep all this logic in one place - inputattach. On resume
inputattack returns so we only need to restart it to get input device
back. Thankfully the rest of our infrastructure is ready to handle
hot-plugged devices by now.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-09-24 6:02 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-06 6:36 [PATCH 2/3] Input: penmount - add PenMount 6000 support John Sung
2011-09-07 23:29 ` Dmitry Torokhov
2011-09-19 15:32 ` Matthew Garrett
2011-09-24 6:02 ` Dmitry Torokhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).