* Getting touchscreen to work on Fujitsu B6210 @ 2007-02-22 6:16 Stephen Hemminger 2007-04-04 5:16 ` Dmitry Torokhov 0 siblings, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2007-02-22 6:16 UTC (permalink / raw) To: linux-input I did a little investigation and the touchscreen on B6210 is attached via the 8250 serial port. I tried enabling it with inputattach but seem to get garbage. I can extract the initialization code from the evtouch driver to a usermode program and read information from /dev/ttyS0. The lifebook psmouse extension won't work because it tries to grab the 8042 (touchpad) rather than the touch screen. Ideas? ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-02-22 6:16 Getting touchscreen to work on Fujitsu B6210 Stephen Hemminger @ 2007-04-04 5:16 ` Dmitry Torokhov 2007-04-05 19:39 ` Stephen Hemminger 2007-04-05 20:36 ` Stephen Hemminger 0 siblings, 2 replies; 13+ messages in thread From: Dmitry Torokhov @ 2007-04-04 5:16 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-input Hi Stephen, On Thursday 22 February 2007 01:16, Stephen Hemminger wrote: > I did a little investigation and the touchscreen on B6210 is > attached via the 8250 serial port. I tried enabling it with > inputattach but seem to get garbage. > > I can extract the initialization code from the evtouch driver > to a usermode program and read information from /dev/ttyS0. > > The lifebook psmouse extension won't work because it tries > to grab the 8042 (touchpad) rather than the touch screen. > > Ideas? > Please try the patch below. You will need to load 8250_pnp, serport and fujitsu_ts modules, then do inputattach -fjt /dev/ttyS0 You can find patched version of inputattach here: http://www.kernel.org/pub/linux/kernel/people/dtor/ Please let me know if it works for you. -- Dmitry Input: add driver for Fujitsu serial touchscreens Such touchscreen are found in Fujitsu lifebook P-series laptops. Signed-off-by: Dmitry Torokhov <dtor@mail.ru> --- drivers/input/touchscreen/Kconfig | 17 ++ drivers/input/touchscreen/Makefile | 15 +- drivers/input/touchscreen/fujitsu_ts.c | 191 +++++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+), 9 deletions(-) Index: linux/drivers/input/touchscreen/Kconfig =================================================================== --- linux.orig/drivers/input/touchscreen/Kconfig +++ linux/drivers/input/touchscreen/Kconfig @@ -44,9 +44,9 @@ config TOUCHSCREEN_BITSY config TOUCHSCREEN_CORGI tristate "SharpSL (Corgi and Spitz series) touchscreen driver" depends on PXA_SHARPSL - default y + default y help - Say Y here to enable the driver for the touchscreen on the + Say Y here to enable the driver for the touchscreen on the Sharp SL-C7xx and SL-Cxx00 series of PDAs. If unsure, say N. @@ -54,6 +54,19 @@ config TOUCHSCREEN_CORGI To compile this driver as a module, choose M here: the module will be called corgi_ts. +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. + + To compile this driver as a module, choose M here: the + module will be called fujitsu-ts. + config TOUCHSCREEN_GUNZE tristate "Gunze AHL-51S touchscreen" select SERIO Index: linux/drivers/input/touchscreen/Makefile =================================================================== --- linux.orig/drivers/input/touchscreen/Makefile +++ linux/drivers/input/touchscreen/Makefile @@ -5,13 +5,14 @@ # Each configuration option enables a list of files. obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o -obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o -obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o -obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o -obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o -obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o -obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o -obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o +obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o +obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o +obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o +obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o +obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o Index: linux/drivers/input/touchscreen/fujitsu_ts.c =================================================================== --- /dev/null +++ linux/drivers/input/touchscreen/fujitsu_ts.c @@ -0,0 +1,190 @@ +/* + * Fujitsu serial touchscreen driver + * + * Copyright (c) Dmitry Torokhov <dtor@mail.ru> + */ + +/* + * 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 <linux/errno.h> +#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 DRIVER_DESC "Fujitsu serial touchscreen driver" + +MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define FUJITSU_PACKET_LENGTH 5 + +#define FUJITSU_MIN_X 0 +#define FUJITSU_MAX_X 4095 +#define FUJITSU_MIN_Y 0 +#define FUJITSU_MAX_Y 4095 + +/* + * Per-touchscreen data. + */ + +struct fujitsu { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[FUJITSU_LENGTH]; + char phys[32]; +}; + +static irqreturn_t fujitsu_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + struct input_dev *dev = fujitsu->dev; + + if (fujitsu->idx == 0) { + if ((data & 0xf8) != 0x80) + return IRQ_HANDLED; + } else { + if ((data & 0x80) != 0x00) { + fujitsu->idx = 0; + return IRQ_HANDLED; + } + } + + fujitsu->data[fujitsu->idx++] = data; + + if (fujitsu->idx == FUJITSU_PACKET_LENGTH) { + + input_report_abs(dev, ABS_X, + (fujitsu->data[2] << 7) | fujitsu->data[1]); + input_report_abs(dev, ABS_Y, + (fujitsu->data[4] << 7) | fujitsu->data[3]); + input_report_key(dev, BTN_TOUCH, + (fujitsu->data[0] & 0x03) != 2); + input_sync(dev); + } + + return IRQ_HANDLED; +} + +/* + * fujitsu_disconnect() is the opposite of fujitsu_connect() + */ + +static void fujitsu_disconnect(struct serio *serio) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + + input_get_device(fujitsu->dev); + input_unregister_device(fujitsu->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(fujitsu->dev); + kfree(fujitsu); +} + +/* + * fujitsu_connect() is the routine that is called when someone adds a + * new serio device that supports the Fujitsu protocol and registers it + * as input device. + */ + +static int fujitsu_connect(struct serio *serio, struct serio_driver *drv) +{ + struct fujitsu *fujitsu; + struct input_dev *input_dev; + int err; + + fujitsu = kzalloc(sizeof(struct fujitsu), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!fujitsu || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + fujitsu->serio = serio; + fujitsu->dev = input_dev; + snprintf(fujitsu->phys, sizeof(fujitsu->phys), + "%s/input0", serio->phys); + + input_dev->name = "Fujitsu Serial Touchscreen"; + input_dev->phys = fujitsu->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_FUJITSU; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); + input_set_abs_params(tw->dev, ABS_X, TW_MIN_XC, TW_MAX_XC, 0, 0); + input_set_abs_params(tw->dev, ABS_Y, TW_MIN_YC, TW_MAX_YC, 0, 0); + + serio_set_drvdata(serio, fujitsu); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(fujitsu->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(fujitsu); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id fujitsu_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_FUJITSU, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, fujitsu_serio_ids); + +static struct serio_driver fujitsu_drv = { + .driver = { + .name = "fujitsu_ts", + }, + .description = DRIVER_DESC, + .id_table = fujitsu_serio_ids, + .interrupt = fujitsu_interrupt, + .connect = fujitsu_connect, + .disconnect = fujitsu_disconnect, +}; + +/* + * The functions for inserting/removing us as a module. + */ + +static int __init fujitsu_init(void) +{ + return serio_register_driver(&fujitsu_drv); +} + +static void __exit fujitsu_exit(void) +{ + serio_unregister_driver(&fujitsu_drv); +} + +module_init(fujitsu_init); +module_exit(fujitsu_exit); ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-04 5:16 ` Dmitry Torokhov @ 2007-04-05 19:39 ` Stephen Hemminger 2007-04-05 20:51 ` Dmitry Torokhov 2007-04-05 20:36 ` Stephen Hemminger 1 sibling, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2007-04-05 19:39 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input Here is a cleaned up version of the patch that at least builds.... ---------------------------------------------------------------------- Input: add driver for Fujitsu serial touchscreens Such touchscreen are found in Fujitsu lifebook P-series laptops. Signed-off-by: Dmitry Torokhov <dtor@mail.ru> --- drivers/input/touchscreen/Kconfig | 13 ++ drivers/input/touchscreen/Makefile | 15 +- drivers/input/touchscreen/fujitsu_ts.c | 194 +++++++++++++++++++++++++++++++++ include/linux/serio.h | 1 4 files changed, 216 insertions(+), 7 deletions(-) --- b6210.orig/drivers/input/touchscreen/Kconfig 2007-04-04 15:40:38.000000000 -0700 +++ b6210/drivers/input/touchscreen/Kconfig 2007-04-04 15:47:03.000000000 -0700 @@ -54,6 +54,19 @@ To compile this driver as a module, choose M here: the module will be called corgi_ts. +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. + + To compile this driver as a module, choose M here: the + module will be called fujitsu-ts. + config TOUCHSCREEN_GUNZE tristate "Gunze AHL-51S touchscreen" select SERIO --- b6210.orig/drivers/input/touchscreen/Makefile 2007-04-04 15:40:38.000000000 -0700 +++ b6210/drivers/input/touchscreen/Makefile 2007-04-04 15:47:03.000000000 -0700 @@ -5,13 +5,14 @@ # Each configuration option enables a list of files. obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o -obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o -obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o -obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o -obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o -obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o -obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o -obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o +obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o +obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o +obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o +obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o +obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ b6210/drivers/input/touchscreen/fujitsu_ts.c 2007-04-05 12:36:11.000000000 -0700 @@ -0,0 +1,194 @@ +/* + * Fujitsu serial touchscreen driver + * + * Copyright (c) Dmitry Torokhov <dtor@mail.ru> + */ + +/* + * 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 <linux/errno.h> +#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 DRIVER_DESC "Fujitsu serial touchscreen driver" + +MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define FUJITSU_LENGTH 5 + +#define FUJITSU_MIN_X 0 +#define FUJITSU_MAX_X 4095 +#define FUJITSU_MIN_Y 0 +#define FUJITSU_MAX_Y 4095 + +/* + * Per-touchscreen data. + */ + +struct fujitsu { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[FUJITSU_LENGTH]; + char phys[32]; +}; + +static irqreturn_t fujitsu_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + struct input_dev *dev = fujitsu->dev; + + printk(KERN_DEBUG "fujitsu ts interrupt data %x\n", data); + if (fujitsu->idx == 0) { + if ((data & 0xf8) != 0x80) + return IRQ_HANDLED; + } else { + if ((data & 0x80) != 0x00) { + fujitsu->idx = 0; + return IRQ_HANDLED; + } + } + + fujitsu->data[fujitsu->idx++] = data; + + if (fujitsu->idx == FUJITSU_LENGTH) { + + input_report_abs(dev, ABS_X, + (fujitsu->data[2] << 7) | fujitsu->data[1]); + input_report_abs(dev, ABS_Y, + (fujitsu->data[4] << 7) | fujitsu->data[3]); + input_report_key(dev, BTN_TOUCH, + (fujitsu->data[0] & 0x03) != 2); + input_sync(dev); + } + + return IRQ_HANDLED; +} + +/* + * fujitsu_disconnect() is the opposite of fujitsu_connect() + */ + +static void fujitsu_disconnect(struct serio *serio) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + + input_get_device(fujitsu->dev); + input_unregister_device(fujitsu->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(fujitsu->dev); + kfree(fujitsu); +} + +/* + * fujitsu_connect() is the routine that is called when someone adds a + * new serio device that supports the Fujitsu protocol and registers it + * as input device. + */ + +static int fujitsu_connect(struct serio *serio, struct serio_driver *drv) +{ + struct fujitsu *fujitsu; + struct input_dev *input_dev; + int err; + + fujitsu = kzalloc(sizeof(struct fujitsu), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!fujitsu || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + fujitsu->serio = serio; + fujitsu->dev = input_dev; + snprintf(fujitsu->phys, sizeof(fujitsu->phys), + "%s/input0", serio->phys); + + input_dev->name = "Fujitsu Serial Touchscreen"; + input_dev->phys = fujitsu->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_FUJITSU; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, FUJITSU_MIN_X, FUJITSU_MAX_X, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, FUJITSU_MIN_Y, FUJITSU_MAX_Y, + 0, 0); + + serio_set_drvdata(serio, fujitsu); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(fujitsu->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(fujitsu); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id fujitsu_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_FUJITSU, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, fujitsu_serio_ids); + +static struct serio_driver fujitsu_drv = { + .driver = { + .name = "fujitsu_ts", + }, + .description = DRIVER_DESC, + .id_table = fujitsu_serio_ids, + .interrupt = fujitsu_interrupt, + .connect = fujitsu_connect, + .disconnect = fujitsu_disconnect, +}; + +/* + * The functions for inserting/removing us as a module. + */ + +static int __init fujitsu_init(void) +{ + return serio_register_driver(&fujitsu_drv); +} + +static void __exit fujitsu_exit(void) +{ + serio_unregister_driver(&fujitsu_drv); +} + +module_init(fujitsu_init); +module_exit(fujitsu_exit); --- b6210.orig/include/linux/serio.h 2007-04-05 11:06:15.000000000 -0700 +++ b6210/include/linux/serio.h 2007-04-05 11:06:40.000000000 -0700 @@ -209,5 +209,6 @@ #define SERIO_PENMOUNT 0x31 #define SERIO_TOUCHRIGHT 0x32 #define SERIO_TOUCHWIN 0x33 +#define SERIO_FUJITSU 0x34 #endif ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-05 19:39 ` Stephen Hemminger @ 2007-04-05 20:51 ` Dmitry Torokhov 0 siblings, 0 replies; 13+ messages in thread From: Dmitry Torokhov @ 2007-04-05 20:51 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-input On 4/5/07, Stephen Hemminger <shemminger@linux-foundation.org> wrote: > Here is a cleaned up version of the patch that at least builds.... Ahem, that will teach me to do "quilt refersh" before sending off patches... Still, more important question - does it work? -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-04 5:16 ` Dmitry Torokhov 2007-04-05 19:39 ` Stephen Hemminger @ 2007-04-05 20:36 ` Stephen Hemminger 2007-04-06 2:27 ` Dmitry Torokhov 1 sibling, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2007-04-05 20:36 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input On Wed, 4 Apr 2007 01:16:57 -0400 Dmitry Torokhov <dtor@insightbb.com> wrote: > Hi Stephen, > > On Thursday 22 February 2007 01:16, Stephen Hemminger wrote: > > I did a little investigation and the touchscreen on B6210 is > > attached via the 8250 serial port. I tried enabling it with > > inputattach but seem to get garbage. > > > > I can extract the initialization code from the evtouch driver > > to a usermode program and read information from /dev/ttyS0. > > > > The lifebook psmouse extension won't work because it tries > > to grab the 8042 (touchpad) rather than the touch screen. > > > > Ideas? > > > > Please try the patch below. You will need to load 8250_pnp, > serport and fujitsu_ts modules, then do > > inputattach -fjt /dev/ttyS0 > inputattach runs (then waits). Data is arriving when I touch the screen. Now what? Do I need an Xorg driver for it? ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-05 20:36 ` Stephen Hemminger @ 2007-04-06 2:27 ` Dmitry Torokhov 2007-04-10 22:40 ` Richard Purdie 2007-05-01 15:49 ` Dmitry Torokhov 0 siblings, 2 replies; 13+ messages in thread From: Dmitry Torokhov @ 2007-04-06 2:27 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-input, Richard Purdie On Thursday 05 April 2007 16:36, Stephen Hemminger wrote: > On Wed, 4 Apr 2007 01:16:57 -0400 > Dmitry Torokhov <dtor@insightbb.com> wrote: > > > Hi Stephen, > > > > On Thursday 22 February 2007 01:16, Stephen Hemminger wrote: > > > I did a little investigation and the touchscreen on B6210 is > > > attached via the 8250 serial port. I tried enabling it with > > > inputattach but seem to get garbage. > > > > > > I can extract the initialization code from the evtouch driver > > > to a usermode program and read information from /dev/ttyS0. > > > > > > The lifebook psmouse extension won't work because it tries > > > to grab the 8042 (touchpad) rather than the touch screen. > > > > > > Ideas? > > > > > > > Please try the patch below. You will need to load 8250_pnp, > > serport and fujitsu_ts modules, then do > > > > inputattach -fjt /dev/ttyS0 > > > > inputattach runs (then waits). Data is arriving when I touch > the screen. Now what? Could ypou please load evbug module or run evtest utility and verify that the driver produces reasonable events? > Do I need an Xorg driver for it? Mousedev (i.e. /dev/input/{mouseX|mice} will provide crude emulation of normal mouse; there is evtouch X driver that should work better. You may also try evdev X driver from recent releases of x.org; as far as I know they want it to supesede evtouch eventually. There are also solutions based on tslib library that allows touchscreen calibrating, etc. but I am not familiar with it so I am CCing Richard Purdie. -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-06 2:27 ` Dmitry Torokhov @ 2007-04-10 22:40 ` Richard Purdie 2007-05-01 15:49 ` Dmitry Torokhov 1 sibling, 0 replies; 13+ messages in thread From: Richard Purdie @ 2007-04-10 22:40 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Stephen Hemminger, linux-input On Thu, 2007-04-05 at 22:27 -0400, Dmitry Torokhov wrote: > > > On Thursday 22 February 2007 01:16, Stephen Hemminger wrote: > > > > I did a little investigation and the touchscreen on B6210 is > > > > attached via the 8250 serial port. I tried enabling it with > > > > inputattach but seem to get garbage. > > > > > > > > I can extract the initialization code from the evtouch driver > > > > to a usermode program and read information from /dev/ttyS0. > > > > > > > > The lifebook psmouse extension won't work because it tries > > > > to grab the 8042 (touchpad) rather than the touch screen. > > Could ypou please load evbug module or run evtest utility and > verify that the driver produces reasonable events? > > > Do I need an Xorg driver for it? > > Mousedev (i.e. /dev/input/{mouseX|mice} will provide crude > emulation of normal mouse; there is evtouch X driver that > should work better. You may also try evdev X driver from > recent releases of x.org; as far as I know they want it to > supesede evtouch eventually. > > There are also solutions based on tslib library that allows > touchscreen calibrating, etc. but I am not familiar with it > so I am CCing Richard Purdie. http://tslib.berlios.de/ It has some test routines (ts_print, ts_test) and a calibration routine (ts_calibrate) which should let you see what's going on. I've found them invaluable for testing kernel touchscreen drivers. Regards, Richard ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-04-06 2:27 ` Dmitry Torokhov 2007-04-10 22:40 ` Richard Purdie @ 2007-05-01 15:49 ` Dmitry Torokhov 2007-05-01 17:39 ` Stephen Hemminger 1 sibling, 1 reply; 13+ messages in thread From: Dmitry Torokhov @ 2007-05-01 15:49 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-input Hi Stephen, On 4/5/07, Dmitry Torokhov <dtor@insightbb.com> wrote: > > Could ypou please load evbug module or run evtest utility and > verify that the driver produces reasonable events? > > > Do I need an Xorg driver for it? > > Mousedev (i.e. /dev/input/{mouseX|mice} will provide crude > emulation of normal mouse; there is evtouch X driver that > should work better. You may also try evdev X driver from > recent releases of x.org; as far as I know they want it to > supesede evtouch eventually. > Did you have any luck with fujitsu_ts module? Is it busted or is it ok for -mm? -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-05-01 15:49 ` Dmitry Torokhov @ 2007-05-01 17:39 ` Stephen Hemminger 2007-05-01 18:02 ` Dmitry Torokhov 0 siblings, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2007-05-01 17:39 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input On Tue, 1 May 2007 11:49:38 -0400 "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > Hi Stephen, > > On 4/5/07, Dmitry Torokhov <dtor@insightbb.com> wrote: > > > > Could ypou please load evbug module or run evtest utility and > > verify that the driver produces reasonable events? > > > > > Do I need an Xorg driver for it? > > > > Mousedev (i.e. /dev/input/{mouseX|mice} will provide crude > > emulation of normal mouse; there is evtouch X driver that > > should work better. You may also try evdev X driver from > > recent releases of x.org; as far as I know they want it to > > supesede evtouch eventually. > > > > Did you have any luck with fujitsu_ts module? Is it busted or is it ok for -mm? > Yes and no. I got the touchscreen to function, but the input is all off. Cursor doesn't line up with stylus etc. Either there is a calibration issue or maybe the data isn't being interpreted correctly. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Getting touchscreen to work on Fujitsu B6210 2007-05-01 17:39 ` Stephen Hemminger @ 2007-05-01 18:02 ` Dmitry Torokhov 2007-05-21 19:02 ` [PATCH] touchscreen: Fujitsu touchscreen driver Stephen Hemminger 0 siblings, 1 reply; 13+ messages in thread From: Dmitry Torokhov @ 2007-05-01 18:02 UTC (permalink / raw) To: Stephen Hemminger; +Cc: linux-input On 5/1/07, Stephen Hemminger <shemminger@linux-foundation.org> wrote: > On Tue, 1 May 2007 11:49:38 -0400 > "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > > > Hi Stephen, > > > > On 4/5/07, Dmitry Torokhov <dtor@insightbb.com> wrote: > > > > > > Could ypou please load evbug module or run evtest utility and > > > verify that the driver produces reasonable events? > > > > > > > Do I need an Xorg driver for it? > > > > > > Mousedev (i.e. /dev/input/{mouseX|mice} will provide crude > > > emulation of normal mouse; there is evtouch X driver that > > > should work better. You may also try evdev X driver from > > > recent releases of x.org; as far as I know they want it to > > > supesede evtouch eventually. > > > > > > > Did you have any luck with fujitsu_ts module? Is it busted or is it ok for -mm? > > > > Yes and no. I got the touchscreen to function, but the input is all off. > Cursor doesn't line up with stylus etc. Either there is a calibration issue or > maybe the data isn't being interpreted correctly. > Hopefully it is the former. Could you please compile and load evbug module or locate evtest utility and run your stylus around the perimeter of your screen, clockwise, starting with upper left corner. This will give us an idea whether the decoding work correctly or not. Thanks! -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] touchscreen: Fujitsu touchscreen driver 2007-05-01 18:02 ` Dmitry Torokhov @ 2007-05-21 19:02 ` Stephen Hemminger 2007-05-22 13:24 ` Dmitry Torokhov 0 siblings, 1 reply; 13+ messages in thread From: Stephen Hemminger @ 2007-05-21 19:02 UTC (permalink / raw) To: Dmitry Torokhov, Andrew Morton; +Cc: linux-input Dmitry wrote this, I just cleaned it up and tried on a B6210 laptop. Serial touchscreen are found on some Fujitsu lifebook P-series laptops, and the B6210. The data stream looks correct but there appear to be calibration issues with both mouse emulation and the evtouch driver. Using this requires a new version of inputattach and doing inputattach -fjt /dev/ttyS0 It should be possible to automatically do this with udev rules. Signed-off-by: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> --- drivers/input/touchscreen/Kconfig | 13 ++ drivers/input/touchscreen/Makefile | 1 + drivers/input/touchscreen/fujitsu_ts.c | 195 ++++++++++++++++++++++++++++++++ include/linux/serio.h | 1 + 4 files changed, 210 insertions(+), 0 deletions(-) diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 5e640ae..8ab916b 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -54,6 +54,19 @@ config TOUCHSCREEN_CORGI To compile this driver as a module, choose M here: the module will be called corgi_ts. +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. + + To compile this driver as a module, choose M here: the + module will be called fujitsu-ts. + config TOUCHSCREEN_GUNZE tristate "Gunze AHL-51S touchscreen" select SERIO diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 2f86d6a..5de8933 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o +obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o diff --git a/drivers/input/touchscreen/fujitsu_ts.c b/drivers/input/touchscreen/fujitsu_ts.c new file mode 100644 index 0000000..8e600fb --- /dev/null +++ b/drivers/input/touchscreen/fujitsu_ts.c @@ -0,0 +1,195 @@ +/* + * Fujitsu serial touchscreen driver + * + * Copyright (c) Dmitry Torokhov <dtor@mail.ru> + */ + +/* + * 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 <linux/errno.h> +#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 DRIVER_DESC "Fujitsu serial touchscreen driver" + +MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define FUJITSU_LENGTH 5 + +#define X_AXIS_MIN 90 +#define X_AXIS_MAX 4000 +#define Y_AXIS_MIN 185 +#define Y_AXIS_MAX 4000 + +/* + * Per-touchscreen data. + */ + +struct fujitsu { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[FUJITSU_LENGTH]; + char phys[32]; +}; + +/* + * Decode serial data + */ + +static irqreturn_t fujitsu_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + struct input_dev *dev = fujitsu->dev; + + if (fujitsu->idx == 0) { + /* resync skip until start of frame */ + if (!(data & 0x80)) + return IRQ_HANDLED; + } else { + /* resync skip garbage */ + if (data & 0x80) { + fujitsu->idx = 0; + return IRQ_HANDLED; + } + } + + fujitsu->data[fujitsu->idx++] = data; + if (fujitsu->idx == FUJITSU_LENGTH) { + input_report_abs(dev, ABS_X, + (fujitsu->data[2] << 7) | fujitsu->data[1]); + input_report_abs(dev, ABS_Y, + (fujitsu->data[4] << 7) | fujitsu->data[3]); + input_report_key(dev, BTN_TOUCH, + (fujitsu->data[0] & 0x03) != 2); + input_sync(dev); + fujitsu->idx = 0; + } + + return IRQ_HANDLED; +} + +/* + * fujitsu_disconnect() is the opposite of fujitsu_connect() + */ + +static void fujitsu_disconnect(struct serio *serio) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + + input_get_device(fujitsu->dev); + input_unregister_device(fujitsu->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(fujitsu->dev); + kfree(fujitsu); +} + +/* + * fujitsu_connect() is the routine that is called when someone adds a + * new serio device that supports the Fujitsu protocol and registers it + * as input device. + */ + +static int fujitsu_connect(struct serio *serio, struct serio_driver *drv) +{ + struct fujitsu *fujitsu; + struct input_dev *input_dev; + int err; + + fujitsu = kzalloc(sizeof(struct fujitsu), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!fujitsu || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + fujitsu->serio = serio; + fujitsu->dev = input_dev; + snprintf(fujitsu->phys, sizeof(fujitsu->phys), + "%s/input0", serio->phys); + + input_dev->name = "Fujitsu Serial Touchscreen"; + input_dev->phys = fujitsu->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_FUJITSU; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); + input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); + serio_set_drvdata(serio, fujitsu); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(fujitsu->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(fujitsu); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id fujitsu_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_FUJITSU, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, fujitsu_serio_ids); + +static struct serio_driver fujitsu_drv = { + .driver = { + .name = "fujitsu_ts", + }, + .description = DRIVER_DESC, + .id_table = fujitsu_serio_ids, + .interrupt = fujitsu_interrupt, + .connect = fujitsu_connect, + .disconnect = fujitsu_disconnect, +}; + +/* + * The functions for inserting/removing us as a module. + */ + +static int __init fujitsu_init(void) +{ + return serio_register_driver(&fujitsu_drv); +} + +static void __exit fujitsu_exit(void) +{ + serio_unregister_driver(&fujitsu_drv); +} + +module_init(fujitsu_init); +module_exit(fujitsu_exit); diff --git a/include/linux/serio.h b/include/linux/serio.h index 1ebf045..fbd3fa0 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -209,5 +209,6 @@ static inline void serio_unpin_driver(struct serio *serio) #define SERIO_PENMOUNT 0x31 #define SERIO_TOUCHRIGHT 0x32 #define SERIO_TOUCHWIN 0x33 +#define SERIO_FUJITSU 0x34 #endif -- 1.4.4.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] touchscreen: Fujitsu touchscreen driver 2007-05-21 19:02 ` [PATCH] touchscreen: Fujitsu touchscreen driver Stephen Hemminger @ 2007-05-22 13:24 ` Dmitry Torokhov 2007-07-10 23:09 ` Stephen Hemminger 0 siblings, 1 reply; 13+ messages in thread From: Dmitry Torokhov @ 2007-05-22 13:24 UTC (permalink / raw) To: Stephen Hemminger; +Cc: Andrew Morton, linux-input Hi Stephen, Thank you for looking at the patch and working out quirks... On 5/21/07, Stephen Hemminger <shemminger@linux-foundation.org> wrote: > + > +#define X_AXIS_MIN 90 > +#define X_AXIS_MAX 4000 > +#define Y_AXIS_MIN 185 > +#define Y_AXIS_MAX 4000 I am not sure that we want to use data from one particular laptop here. Since we don't know a way to query the thouchscreen on a particular box I'd stick with physical protocol limits (0 - 4095) and have user calibrate the screen. Have you tried going through the calibration procedure with evtouch driver? Does it not work or works incorrectly (I have no idea since I don't have the hardware)? > +static irqreturn_t fujitsu_interrupt(struct serio *serio, > + unsigned char data, unsigned int flags) > +{ > + struct fujitsu *fujitsu = serio_get_drvdata(serio); > + struct input_dev *dev = fujitsu->dev; > + > + if (fujitsu->idx == 0) { > + /* resync skip until start of frame */ > + if (!(data & 0x80)) > + return IRQ_HANDLED; The data sheet that I have shows the following for the first byte: 1 C 0 0 R S S S Where C is 1 while in calibration mode (which we don't use) and R is 1 when no coordinate corection was done. My original patch had the check "(data & 0xf8) != 80", did it give you issues with the data stream coming out of the touchscreen? Or the missing fujitsu->idx = 0 is all that is really needed? Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] touchscreen: Fujitsu touchscreen driver 2007-05-22 13:24 ` Dmitry Torokhov @ 2007-07-10 23:09 ` Stephen Hemminger 0 siblings, 0 replies; 13+ messages in thread From: Stephen Hemminger @ 2007-07-10 23:09 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Andrew Morton, linux-input On Tue, 22 May 2007 09:24:20 -0400 "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > Hi Stephen, > > Thank you for looking at the patch and working out quirks... > > On 5/21/07, Stephen Hemminger <shemminger@linux-foundation.org> wrote: > > + > > +#define X_AXIS_MIN 90 > > +#define X_AXIS_MAX 4000 > > +#define Y_AXIS_MIN 185 > > +#define Y_AXIS_MAX 4000 > > I am not sure that we want to use data from one particular laptop > here. Since we don't know a way to query the thouchscreen on a > particular box I'd stick with physical protocol limits (0 - 4095) and > have user calibrate the screen. Went back to 0 by 4096 on followup versions > Have you tried going through the calibration procedure with evtouch > driver? Does it not work or works incorrectly (I have no idea since I > don't have the hardware)? I tried it, and it corrects for offsets. > > +static irqreturn_t fujitsu_interrupt(struct serio *serio, > > + unsigned char data, unsigned int flags) > > +{ > > + struct fujitsu *fujitsu = serio_get_drvdata(serio); > > + struct input_dev *dev = fujitsu->dev; > > + > > + if (fujitsu->idx == 0) { > > + /* resync skip until start of frame */ > > + if (!(data & 0x80)) > > + return IRQ_HANDLED; > > The data sheet that I have shows the following for the first byte: > > 1 C 0 0 R S S S > > Where C is 1 while in calibration mode (which we don't use) and R is 1 > when no coordinate corection was done. My original patch had the check > "(data & 0xf8) != 80", did it give you issues with the data stream > coming out of the touchscreen? Or the missing fujitsu->idx = 0 is all > that is really needed? > The first byte is always: 0x88 Sample touch in middle is 88 72 11 4b 0f 89 71 11 4c 0f 89 72 11 4b 0f 8a 71 11 48 0f So original code that checks for (data & 0xf8) == 0x80 wouldn't work ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2007-07-10 23:09 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-02-22 6:16 Getting touchscreen to work on Fujitsu B6210 Stephen Hemminger 2007-04-04 5:16 ` Dmitry Torokhov 2007-04-05 19:39 ` Stephen Hemminger 2007-04-05 20:51 ` Dmitry Torokhov 2007-04-05 20:36 ` Stephen Hemminger 2007-04-06 2:27 ` Dmitry Torokhov 2007-04-10 22:40 ` Richard Purdie 2007-05-01 15:49 ` Dmitry Torokhov 2007-05-01 17:39 ` Stephen Hemminger 2007-05-01 18:02 ` Dmitry Torokhov 2007-05-21 19:02 ` [PATCH] touchscreen: Fujitsu touchscreen driver Stephen Hemminger 2007-05-22 13:24 ` Dmitry Torokhov 2007-07-10 23:09 ` Stephen Hemminger
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).