diff options
author | Keith Packard <keithp@keithp.com> | 2002-11-01 22:27:49 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2002-11-01 22:27:49 +0000 |
commit | 358d887cbef4d2ec34532a364dd44205eab36c23 (patch) | |
tree | 7ad056c56b62a75f8ad748e098c43e2e96c532f7 | |
parent | f0a8d06fcaf3fe0a652efa65966f4b0b0d688c12 (diff) |
Add support for ARM linux TS lib (disabled by default) in kdrive
-rw-r--r-- | hw/kdrive/linux/Imakefile | 7 | ||||
-rw-r--r-- | hw/kdrive/linux/tslib.c | 187 |
2 files changed, 193 insertions, 1 deletions
diff --git a/hw/kdrive/linux/Imakefile b/hw/kdrive/linux/Imakefile index 69a08d2e0..744b8c21d 100644 --- a/hw/kdrive/linux/Imakefile +++ b/hw/kdrive/linux/Imakefile @@ -1,12 +1,17 @@ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ -XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/linux/Imakefile,v 1.7 2001/09/29 04:16:39 keithp Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/linux/Imakefile,v 1.8 2001/10/12 06:33:09 keithp Exp $ KDRIVE=.. #include "../Kdrive.tmpl" #if TouchScreen +#if HasTsLib +TSSRCS = tslib.c +TSOBJS = tslib.o +#else TSSRCS = ts.c TSOBJS = ts.o #endif +#endif SRCS = keyboard.c linux.c mouse.c ps2.c bus.c ms.c agp.c $(TSSRCS) diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c new file mode 100644 index 000000000..e8719d926 --- /dev/null +++ b/hw/kdrive/linux/tslib.c @@ -0,0 +1,187 @@ +/* + * $XFree86$ + * TSLIB based touchscreen driver for TinyX + * Derived from ts.c by Keith Packard + * Derived from ps2.c by Jim Gettys + * + * Copyright © 1999 Keith Packard + * Copyright © 2000 Compaq Computer Corporation + * Copyright © 2002 MontaVista Software Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard or Compaq not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard and Compaq makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD AND COMPAQ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Michael Taht or MontaVista not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Michael Taht and Montavista make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * MICHAEL TAHT AND MONTAVISTA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + + +#define NEED_EVENTS +#include "X.h" +#include "Xproto.h" +#include "inputstr.h" +#include "scrnintstr.h" +#include "kdrive.h" +#include "Xpoll.h" +#include <sys/ioctl.h> +#include <tslib.h> + +static long lastx = 0, lasty = 0; +int TsScreen; +extern int TsFbdev; +static struct tsdev *tsDev = NULL; + +void +TsRead (int tsPort, void *closure) +{ + KdMouseInfo *mi = closure; + int fd = (int) mi->driver; + struct ts_sample event; + int n; + long pressure; + long x, y; + unsigned long flags; + unsigned long buttons; + + n = ts_read(tsDev, &event, 1); + if (n == 1) + { + if (event.pressure) + { + /* + * HACK ATTACK. (static global variables used !) + * Here we test for the touch screen driver actually being on the + * touch screen, if it is we send absolute coordinates. If not, + * then we send delta's so that we can track the entire vga screen. + */ + if (TsScreen == TsFbdev) { + flags = KD_BUTTON_1; + x = event.x; + y = event.y; + } else { + flags = /* KD_BUTTON_1 |*/ KD_MOUSE_DELTA; + if ((lastx == 0) || (lasty == 0)) { + x = 0; + y = 0; + } else { + x = event.x - lastx; + y = event.y - lasty; + } + lastx = event.x; + lasty = event.y; + } + } else { + flags = KD_MOUSE_DELTA; + x = 0; + y = 0; + lastx = 0; + lasty = 0; + } + KdEnqueueMouseEvent (mi, flags, x, y); + } +} + +static char *TsNames[] = { + "/dev/ts", + "/dev/touchscreen/0", +}; + +#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) + +int TsInputType; + +int +TslibInit (void) +{ + int i; + KdMouseInfo *mi, *next; + int fd= 0; + int n = 0; + + if (!TsInputType) + TsInputType = KdAllocInputType (); + + for (mi = kdMouseInfo; mi; mi = next) + { + next = mi->next; + if (mi->inputType) + continue; + + if (!mi->name) + { + for (i = 0; i < NUM_TS_NAMES; i++) + { + if(!(tsDev = ts_open(TsNames[i],0))) continue; + ts_config(tsDev); + fd=ts_fd(tsDev); + if (fd >= 0) + { + mi->name = KdSaveString (TsNames[i]); + break; + } + } + } + + if (fd > 0 && tsDev != 0) + { + mi->driver = (void *) fd; + mi->inputType = TsInputType; + if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi)) + n++; + } + else + if (fd > 0) close(fd); + } +} + +void +TslibFini (void) +{ + KdMouseInfo *mi; + + KdUnregisterFds (TsInputType, TRUE); + for (mi = kdMouseInfo; mi; mi = mi->next) + { + if (mi->inputType == TsInputType) + { + if(mi->driver) ts_close(tsDev); + mi->driver = 0; + mi->inputType = 0; + } + } +} + +KdMouseFuncs TsFuncs = { + TslibInit, + TslibFini +}; |