summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2002-11-01 22:27:49 +0000
committerKeith Packard <keithp@keithp.com>2002-11-01 22:27:49 +0000
commit358d887cbef4d2ec34532a364dd44205eab36c23 (patch)
tree7ad056c56b62a75f8ad748e098c43e2e96c532f7
parentf0a8d06fcaf3fe0a652efa65966f4b0b0d688c12 (diff)
Add support for ARM linux TS lib (disabled by default) in kdrive
-rw-r--r--hw/kdrive/linux/Imakefile7
-rw-r--r--hw/kdrive/linux/tslib.c187
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
+};