Re: [PATCH v2] input: Add a driver TSC-40 (serial)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Christian,

On Fri, Sep 23, 2011 at 12:35:31PM +0200, Christian Gmeiner wrote:
> From 7fc3295f1a4d987af846851f13d185e5f5877411 Mon Sep 17 00:00:00 2001
> From: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
> Date: Fri, 23 Sep 2011 14:22:18 +0200
> Subject: [PATCH v2] input: Add a driver TSC40 (serial)
> 
> This patch adds the TSC-40 serial touchscreen driver and
> should be compatible with TSC-10 and TSC-25.
> 
> The driver was written by Linutronix on behalf of
> Bachmann electronic GmbH.
> 
> Changes v1 -> v2:
> - initialisation of the controller moved to inputattach

Was the patch to inputattach posted here?

> - incorporated feedback from Dmitry Torokhov and
>   Sebastian Andrzej Siewior
> 
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
> Signed-off-by: Christian Gmeiner <christian.gmeiner@xxxxxxxxx>
> ---
>  drivers/input/touchscreen/Kconfig  |    7 ++
>  drivers/input/touchscreen/Makefile |    1 +
>  drivers/input/touchscreen/tsc40.c  |  176 ++++++++++++++++++++++++++++++++++++
>  include/linux/serio.h              |    1 +
>  4 files changed, 185 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/input/touchscreen/tsc40.c
> 
> diff --git a/drivers/input/touchscreen/Kconfig
> b/drivers/input/touchscreen/Kconfig
> index cabd9e5..c1b6ed9 100644
> --- a/drivers/input/touchscreen/Kconfig
> +++ b/drivers/input/touchscreen/Kconfig
> @@ -651,6 +651,13 @@ config TOUCHSCREEN_TOUCHIT213
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called touchit213.
> 
> +config TOUCHSCREEN_TSC_SERIO
> +	tristate "TSC-10/25/40 serial touchscreen"
> +	select SERIO
> +	help
> +	  Say Y here if you have a TSC-10, 25 or 40 serial touchscreen connected
> +	  to your system.
> +

"To compile this driver as a module..."

>  config TOUCHSCREEN_TSC2005
>          tristate "TSC2005 based touchscreens"
>          depends on SPI_MASTER && GENERIC_HARDIRQS
> diff --git a/drivers/input/touchscreen/Makefile
> b/drivers/input/touchscreen/Makefile
> index 282d6f7..f957676 100644
> --- a/drivers/input/touchscreen/Makefile
> +++ b/drivers/input/touchscreen/Makefile
> @@ -46,6 +46,7 @@ obj-$(CONFIG_TOUCHSCREEN_TNETV107X)	+= tnetv107x-ts.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213)	+= touchit213.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT)	+= touchright.o
>  obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN)	+= touchwin.o
> +obj-$(CONFIG_TOUCHSCREEN_TSC_SERIO)	+= tsc40.o
>  obj-$(CONFIG_TOUCHSCREEN_TSC2005)	+= tsc2005.o
>  obj-$(CONFIG_TOUCHSCREEN_TSC2007)	+= tsc2007.o
>  obj-$(CONFIG_TOUCHSCREEN_UCB1400)	+= ucb1400_ts.o
> diff --git a/drivers/input/touchscreen/tsc40.c
> b/drivers/input/touchscreen/tsc40.c
> new file mode 100644
> index 0000000..eeb53a8
> --- /dev/null
> +++ b/drivers/input/touchscreen/tsc40.c
> @@ -0,0 +1,176 @@
> +/*
> + * TSC-40 serial touchscreen driver. It should be compatiible with
> TSC-10 and 25.
> + * Author: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
> + * License: GPLv2 as published by the FSF.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/input.h>
> +#include <linux/serio.h>
> +#include <linux/init.h>
> +
> +#define PACKET_LENGTH  5
> +struct tsc_ser {
> +	struct input_dev *dev;
> +	struct serio *serio;
> +	u32 idx;
> +	unsigned char data[PACKET_LENGTH];
> +	char phys[32];
> +};
> +
> +static void tsc_process_data(struct tsc_ser *ptsc)
> +{
> +	struct input_dev *dev = ptsc->dev;
> +	u8 *data = ptsc->data;
> +	u32 x;
> +	u32 y;
> +	u32 touch;
> +
> +	x = ((data[1] & 0x03) << 8) | data[2];
> +	y = ((data[3] & 0x03) << 8) | data[4];
> +	touch = data[0] & 0x01;
> +
> +	input_report_abs(dev, ABS_X, x);
> +	input_report_abs(dev, ABS_Y, y);
> +	input_report_abs(dev, ABS_PRESSURE, touch << 7);

The device does not seem to produce valud pressure readings so please do
not fake ABS_PRESSURE events. Tslib has been updated several years ago
so that it does not require ABS_PRESSURE.

> +	input_report_key(dev, BTN_TOUCH, touch);
> +
> +	input_sync(dev);
> +
> +	ptsc->idx = 0;
> +}
> +
> +static int pen_is_up(u8 data)

bool.

> +{
> +	/* SW[01] are unknown */
> +	u8 val = data & 0x3f;
> +	u8 up_val = 1 << 4;
> +
> +	return val == up_val;
> +}
> +
> +static irqreturn_t tsc_interrupt(struct serio *serio,
> +		unsigned char data, unsigned int flags)
> +{
> +	struct tsc_ser *ptsc = serio_get_drvdata(serio);
> +	struct input_dev *dev = ptsc->dev;
> +
> +	if (!ptsc->idx && pen_is_up(data)) {

I am curious, does the device really transmit single byte when pen is
lifted up?

Thanks.

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux