Re: [PATCH] input/touchscreen: New EETI eGalaxTouch serial touchscreen driver

2015-12-16 Thread Boszormenyi Zoltan
2015-12-15 22:21 keltezéssel, Dmitry Torokhov írta:
> Hi Zoltán,
>
> On Tue, Dec 15, 2015 at 12:22:07PM +0100, Böszörményi Zoltán wrote:
>> From: Böszörményi Zoltán 
>>
>> There are two EETI touchscreen drivers in the kernel (eeti_ts and egalax_ts)
>> but both are for I2C-connected panels. This is for a different, serial
>> and not multi-touch touchscreen panel. The protocol documentation is at
>> http://www.eeti.com.tw/pdf/Software%20Programming%20Guide_v2.0.pdf
>>
>> Signed-off-by: Böszörményi Zoltán 
>>
> Thank you for your patch, it looks pretty good, just a few comments
> below.
>
>> +config TOUCHSCREEN_EGALAX_SERIO
> I'd rather called it TOUCHSCREEN_EGALAX_SERIAL

It doesn't matter, I am not attached to names.

>> +obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIO)  += egalax.o
> I think better name is egalax_ts_serial.

Sure, I was thinking about it myself.

>>  obj-$(CONFIG_TOUCHSCREEN_FT6236)+= ft6236.o
>>  obj-$(CONFIG_TOUCHSCREEN_FUJITSU)   += fujitsu_ts.o
>>  obj-$(CONFIG_TOUCHSCREEN_GOODIX)+= goodix.o
>>  obj-$(CONFIG_TOUCHSCREEN_ILI210X)   += ili210x.o
>>  obj-$(CONFIG_TOUCHSCREEN_IMX6UL_TSC)+= imx6ul_tsc.o
>>  obj-$(CONFIG_TOUCHSCREEN_INEXIO)+= inexio.o
>>  obj-$(CONFIG_TOUCHSCREEN_INTEL_MID) += intel-mid-touch.o
>>  obj-$(CONFIG_TOUCHSCREEN_IPROC) += bcm_iproc_tsc.o
>>  obj-$(CONFIG_TOUCHSCREEN_LPC32XX)   += lpc32xx_ts.o
>>  obj-$(CONFIG_TOUCHSCREEN_MAX11801)  += max11801_ts.o
>> diff --git a/drivers/input/touchscreen/egalax.c 
>> b/drivers/input/touchscreen/egalax.c
>> new file mode 100644
>> index 000..94ac9bd
>> --- /dev/null
>> +++ b/drivers/input/touchscreen/egalax.c
>> @@ -0,0 +1,210 @@
>> +/*
>> + * EETI Egalax serial touchscreen driver
>> + *
>> + * Copyright (c) 2015 Zoltán Böszörményi 
>> + *
>> + * based on the
>> + *
>> + * Hampshire serial touchscreen driver (Copyright (c) 2010 Adam Bennett)
>> + */
>> +
>> +/*
>> + * This program is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License version 2 as published 
>> by
>> + * the Free Software Foundation.
>> + */
>> +
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +
>> +#define DRIVER_DESC "EETI Egalax serial touchscreen driver"
>> +
>> +MODULE_AUTHOR("Zoltán Böszörményi ");
>> +MODULE_DESCRIPTION(DRIVER_DESC);
>> +MODULE_LICENSE("GPL");
>> +
>> +/*
>> + * Definitions & global arrays.
>> + */
>> +
>> +#define EGALAX_FORMAT_MAX_LENGTH 6
>> +#define EGALAX_RESPONSE_BEGIN_BYTE 0x80
>> +#define EGALAX_FORMAT_PRESSURE_BIT 0x40
>> +#define EGALAX_FORMAT_TOUCH_BIT 0x01
> We have BIT() macro that would be very useful here.
>
>> +#define EGALAX_FORMAT_RESOLUTION 0x06
>> +
>> +#define EGALAX_MIN_XC 0
>> +#define EGALAX_MAX_XC 0x4000
>> +#define EGALAX_MIN_YC 0
>> +#define EGALAX_MAX_YC 0x4000
>> +
>> +#define EGALAX_GET_XC(data, resbits, shift) data[1] & (resbits)) << 7) 
>> | (data[2] & 0x7f)) << shift)
>> +#define EGALAX_GET_YC(data, resbits, shift) data[3] & (resbits)) << 7) 
>> | (data[4] & 0x7f)) << shift)
>> +#define EGALAX_GET_TOUCHED(data) (EGALAX_FORMAT_TOUCH_BIT & data[0])
>> +
>> +/*
>> + * Per-touchscreen data.
>> + */
>> +
>> +struct egalax {
>> +struct input_dev *dev;
>> +struct serio *serio;
>> +int idx;
>> +int bytes;
>> +int resbits;
>> +int shift;
>> +unsigned char data[EGALAX_FORMAT_MAX_LENGTH];
>> +char phys[32];
>> +};
>> +
>> +static void egalax_process_data(struct egalax *pegalax)
>> +{
>> +struct input_dev *dev = pegalax->dev;
>> +
>> +if (++pegalax->idx == pegalax->bytes) {
>> +input_report_abs(dev, ABS_X, EGALAX_GET_XC(pegalax->data, 
>> pegalax->resbits, pegalax->shift));
>> +input_report_abs(dev, ABS_Y, EGALAX_GET_YC(pegalax->data, 
>> pegalax->resbits, pegalax->shift));
>> +input_report_key(dev, BTN_TOUCH, 
>> EGALAX_GET_TOUCHED(pegalax->data));
>> +input_sync(dev);
>> +
>> +pegalax->idx = 0;
>> +}
>> +}
>> +
>> +static irqreturn_t egalax_interrupt(struct serio *serio,
>> +unsigned char data, unsigned int flags)
>> +{
>> +struct egalax *pegalax = serio_get_drvdata(serio);
>> +
>> +pegalax->data[pegalax->idx] = data;
>> +
>> +if (EGALAX_RESPONSE_BEGIN_BYTE & pegalax->data[0]) {
>> +pegalax->bytes = (EGALAX_FORMAT_PRESSURE_BIT & pegalax->data[0] 
>> ? 6 : 5);
>> +switch ((EGALAX_FORMAT_RESOLUTION & pegalax->data[0]) >> 1) {
>> +case 0:
>> +pegalax->resbits = 0x0f;
>> +pegalax->shift = 3;
>> +break;
>> +case 1:
>> +pegalax->resbits = 0x1f;
>> +pegalax->shift = 2;
>> +break;
>> +case 2:
>> +pegalax->resbits = 0x3f;
>> +pegalax->shift = 1;
>> +break;
>> +  

[PATCH] input/touchscreen: New EETI eGalaxTouch serial touchscreen driver

2015-12-15 Thread Böszörményi Zoltán
From: Böszörményi Zoltán 

There are two EETI touchscreen drivers in the kernel (eeti_ts and egalax_ts)
but both are for I2C-connected panels. This is for a different, serial
and not multi-touch touchscreen panel. The protocol documentation is at
http://www.eeti.com.tw/pdf/Software%20Programming%20Guide_v2.0.pdf

Signed-off-by: Böszörményi Zoltán 

---
 drivers/input/touchscreen/Kconfig  |  10 ++
 drivers/input/touchscreen/Makefile |   1 +
 drivers/input/touchscreen/egalax.c | 210 +
 include/uapi/linux/serio.h |   1 +
 4 files changed, 222 insertions(+)
 create mode 100644 drivers/input/touchscreen/egalax.c

diff --git a/drivers/input/touchscreen/Kconfig 
b/drivers/input/touchscreen/Kconfig
index ae33da7..816a9dc 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -301,20 +301,30 @@ config TOUCHSCREEN_FT6236
depends on GPIOLIB || COMPILE_TEST
help
  Say Y here to enable support for the I2C connected FT6x06 and
  FT6x36 family of capacitive touchscreen drivers.
 
  If unsure, say N.
 
  To compile this driver as a module, choose M here: the
  module will be called ft6236.
 
+config TOUCHSCREEN_EGALAX_SERIO
+   tristate "EETI eGalax serial touchscreen"
+   select SERIO
+   help
+ Say Y here to enable support for serial connected EETI
+ eGalax touch panels.
+
+ To compile this driver as a module, choose M here: the
+ module will be called egalax.
+
 config TOUCHSCREEN_FUJITSU
tristate "Fujitsu serial touchscreen"
select SERIO
help
  Say Y here if you have the Fujitsu touchscreen (such as one
  installed in Lifebook P series laptop) connected to your
  system.
 
  If unsure, say N.
 
diff --git a/drivers/input/touchscreen/Makefile 
b/drivers/input/touchscreen/Makefile
index cbaa6ab..6f63b51 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -28,20 +28,21 @@ obj-$(CONFIG_TOUCHSCREEN_CYTTSP4_SPI)   += cyttsp4_spi.o
 obj-$(CONFIG_TOUCHSCREEN_DA9034)   += da9034-ts.o
 obj-$(CONFIG_TOUCHSCREEN_DA9052)   += da9052_tsi.o
 obj-$(CONFIG_TOUCHSCREEN_DYNAPRO)  += dynapro.o
 obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06)   += edt-ft5x06.o
 obj-$(CONFIG_TOUCHSCREEN_HAMPSHIRE)+= hampshire.o
 obj-$(CONFIG_TOUCHSCREEN_GUNZE)+= gunze.o
 obj-$(CONFIG_TOUCHSCREEN_EETI) += eeti_ts.o
 obj-$(CONFIG_TOUCHSCREEN_ELAN) += elants_i2c.o
 obj-$(CONFIG_TOUCHSCREEN_ELO)  += elo.o
 obj-$(CONFIG_TOUCHSCREEN_EGALAX)   += egalax_ts.o
+obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIO) += egalax.o
 obj-$(CONFIG_TOUCHSCREEN_FT6236)   += ft6236.o
 obj-$(CONFIG_TOUCHSCREEN_FUJITSU)  += fujitsu_ts.o
 obj-$(CONFIG_TOUCHSCREEN_GOODIX)   += goodix.o
 obj-$(CONFIG_TOUCHSCREEN_ILI210X)  += ili210x.o
 obj-$(CONFIG_TOUCHSCREEN_IMX6UL_TSC)   += imx6ul_tsc.o
 obj-$(CONFIG_TOUCHSCREEN_INEXIO)   += inexio.o
 obj-$(CONFIG_TOUCHSCREEN_INTEL_MID)+= intel-mid-touch.o
 obj-$(CONFIG_TOUCHSCREEN_IPROC)+= bcm_iproc_tsc.o
 obj-$(CONFIG_TOUCHSCREEN_LPC32XX)  += lpc32xx_ts.o
 obj-$(CONFIG_TOUCHSCREEN_MAX11801) += max11801_ts.o
diff --git a/drivers/input/touchscreen/egalax.c 
b/drivers/input/touchscreen/egalax.c
new file mode 100644
index 000..94ac9bd
--- /dev/null
+++ b/drivers/input/touchscreen/egalax.c
@@ -0,0 +1,210 @@
+/*
+ * EETI Egalax serial touchscreen driver
+ *
+ * Copyright (c) 2015 Zoltán Böszörményi 
+ *
+ * based on the
+ *
+ * Hampshire serial touchscreen driver (Copyright (c) 2010 Adam Bennett)
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DRIVER_DESC"EETI Egalax serial touchscreen driver"
+
+MODULE_AUTHOR("Zoltán Böszörményi ");
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");
+
+/*
+ * Definitions & global arrays.
+ */
+
+#define EGALAX_FORMAT_MAX_LENGTH 6
+#define EGALAX_RESPONSE_BEGIN_BYTE 0x80
+#define EGALAX_FORMAT_PRESSURE_BIT 0x40
+#define EGALAX_FORMAT_TOUCH_BIT 0x01
+#define EGALAX_FORMAT_RESOLUTION 0x06
+
+#define EGALAX_MIN_XC 0
+#define EGALAX_MAX_XC 0x4000
+#define EGALAX_MIN_YC 0
+#define EGALAX_MAX_YC 0x4000
+
+#define EGALAX_GET_XC(data, resbits, shift) data[1] & (resbits)) << 7) | 
(data[2] & 0x7f)) << shift)
+#define EGALAX_GET_YC(data, resbits, shift) data[3] & (resbits)) << 7) | 
(data[4] & 0x7f)) << shift)
+#define EGALAX_GET_TOUCHED(data) (EGALAX_FORMAT_TOUCH_BIT & data[0])
+
+/*
+ * Per-touchscreen data.
+ */
+
+struct egalax {
+   struct input_dev *dev;
+   struct serio *serio;
+   int idx;
+   int bytes;
+   int resbits;
+   

Re: [PATCH] input/touchscreen: New EETI eGalaxTouch serial touchscreen driver

2015-12-15 Thread Dmitry Torokhov
Hi Zoltán,

On Tue, Dec 15, 2015 at 12:22:07PM +0100, Böszörményi Zoltán wrote:
> From: Böszörményi Zoltán 
> 
> There are two EETI touchscreen drivers in the kernel (eeti_ts and egalax_ts)
> but both are for I2C-connected panels. This is for a different, serial
> and not multi-touch touchscreen panel. The protocol documentation is at
> http://www.eeti.com.tw/pdf/Software%20Programming%20Guide_v2.0.pdf
> 
> Signed-off-by: Böszörményi Zoltán 
> 

Thank you for your patch, it looks pretty good, just a few comments
below.

> ---
>  drivers/input/touchscreen/Kconfig  |  10 ++
>  drivers/input/touchscreen/Makefile |   1 +
>  drivers/input/touchscreen/egalax.c | 210 
> +
>  include/uapi/linux/serio.h |   1 +
>  4 files changed, 222 insertions(+)
>  create mode 100644 drivers/input/touchscreen/egalax.c
> 
> diff --git a/drivers/input/touchscreen/Kconfig 
> b/drivers/input/touchscreen/Kconfig
> index ae33da7..816a9dc 100644
> --- a/drivers/input/touchscreen/Kconfig
> +++ b/drivers/input/touchscreen/Kconfig
> @@ -301,20 +301,30 @@ config TOUCHSCREEN_FT6236
>   depends on GPIOLIB || COMPILE_TEST
>   help
> Say Y here to enable support for the I2C connected FT6x06 and
> FT6x36 family of capacitive touchscreen drivers.
>  
> If unsure, say N.
>  
> To compile this driver as a module, choose M here: the
> module will be called ft6236.
>  
> +config TOUCHSCREEN_EGALAX_SERIO

I'd rather called it TOUCHSCREEN_EGALAX_SERIAL

> + tristate "EETI eGalax serial touchscreen"
> + select SERIO
> + help
> +   Say Y here to enable support for serial connected EETI
> +   eGalax touch panels.
> +
> +   To compile this driver as a module, choose M here: the
> +   module will be called egalax.
> +
>  config TOUCHSCREEN_FUJITSU
>   tristate "Fujitsu serial touchscreen"
>   select SERIO
>   help
> Say Y here if you have the Fujitsu touchscreen (such as one
> installed in Lifebook P series laptop) connected to your
> system.
>  
> If unsure, say N.
>  
> diff --git a/drivers/input/touchscreen/Makefile 
> b/drivers/input/touchscreen/Makefile
> index cbaa6ab..6f63b51 100644
> --- a/drivers/input/touchscreen/Makefile
> +++ b/drivers/input/touchscreen/Makefile
> @@ -28,20 +28,21 @@ obj-$(CONFIG_TOUCHSCREEN_CYTTSP4_SPI) += cyttsp4_spi.o
>  obj-$(CONFIG_TOUCHSCREEN_DA9034) += da9034-ts.o
>  obj-$(CONFIG_TOUCHSCREEN_DA9052) += da9052_tsi.o
>  obj-$(CONFIG_TOUCHSCREEN_DYNAPRO)+= dynapro.o
>  obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06) += edt-ft5x06.o
>  obj-$(CONFIG_TOUCHSCREEN_HAMPSHIRE)  += hampshire.o
>  obj-$(CONFIG_TOUCHSCREEN_GUNZE)  += gunze.o
>  obj-$(CONFIG_TOUCHSCREEN_EETI)   += eeti_ts.o
>  obj-$(CONFIG_TOUCHSCREEN_ELAN)   += elants_i2c.o
>  obj-$(CONFIG_TOUCHSCREEN_ELO)+= elo.o
>  obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o
> +obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIO)   += egalax.o

I think better name is egalax_ts_serial.

>  obj-$(CONFIG_TOUCHSCREEN_FT6236) += ft6236.o
>  obj-$(CONFIG_TOUCHSCREEN_FUJITSU)+= fujitsu_ts.o
>  obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix.o
>  obj-$(CONFIG_TOUCHSCREEN_ILI210X)+= ili210x.o
>  obj-$(CONFIG_TOUCHSCREEN_IMX6UL_TSC) += imx6ul_tsc.o
>  obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o
>  obj-$(CONFIG_TOUCHSCREEN_INTEL_MID)  += intel-mid-touch.o
>  obj-$(CONFIG_TOUCHSCREEN_IPROC)  += bcm_iproc_tsc.o
>  obj-$(CONFIG_TOUCHSCREEN_LPC32XX)+= lpc32xx_ts.o
>  obj-$(CONFIG_TOUCHSCREEN_MAX11801)   += max11801_ts.o
> diff --git a/drivers/input/touchscreen/egalax.c 
> b/drivers/input/touchscreen/egalax.c
> new file mode 100644
> index 000..94ac9bd
> --- /dev/null
> +++ b/drivers/input/touchscreen/egalax.c
> @@ -0,0 +1,210 @@
> +/*
> + * EETI Egalax serial touchscreen driver
> + *
> + * Copyright (c) 2015 Zoltán Böszörményi 
> + *
> + * based on the
> + *
> + * Hampshire serial touchscreen driver (Copyright (c) 2010 Adam Bennett)
> + */
> +
> +/*
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published 
> by
> + * the Free Software Foundation.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define DRIVER_DESC  "EETI Egalax serial touchscreen driver"
> +
> +MODULE_AUTHOR("Zoltán Böszörményi ");
> +MODULE_DESCRIPTION(DRIVER_DESC);
> +MODULE_LICENSE("GPL");
> +
> +/*
> + * Definitions & global arrays.
> + */
> +
> +#define EGALAX_FORMAT_MAX_LENGTH 6
> +#define EGALAX_RESPONSE_BEGIN_BYTE 0x80
> +#define EGALAX_FORMAT_PRESSURE_BIT 0x40
> +#define EGALAX_FORMAT_TOUCH_BIT 0x01

We have BIT() macro that would be very useful here.

> +#define EGALAX_FORMAT_RESOLUTION 0x06
> +
> +#define EGALAX_MIN_XC 0
> +#define EGALAX_MAX_XC 0x4000
> +#define