Re: [PATCH] input/touchscreen: New EETI eGalaxTouch serial touchscreen driver
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; >> +
Re: [PATCH] input/touchscreen: New EETI eGalaxTouch serial touchscreen driver
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