summaryrefslogtreecommitdiffstats
path: root/meta/recipes-graphics/tslib
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:14:24 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:29:45 +0100
commit29d6678fd546377459ef75cf54abeef5b969b5cf (patch)
tree8edd65790e37a00d01c3f203f773fe4b5012db18 /meta/recipes-graphics/tslib
parentda49de6885ee1bc424e70bc02f21f6ab920efb55 (diff)
downloadopenembedded-core-contrib-29d6678fd546377459ef75cf54abeef5b969b5cf.tar.gz
Major layout change to the packages directory
Having one monolithic packages directory makes it hard to find things and is generally overwhelming. This commit splits it into several logical sections roughly based on function, recipes.txt gives more information about the classifications used. The opportunity is also used to switch from "packages" to "recipes" as used in OpenEmbedded as the term "packages" can be confusing to people and has many different meanings. Not all recipes have been classified yet, this is just a first pass at separating things out. Some packages are moved to meta-extras as they're no longer actively used or maintained. Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'meta/recipes-graphics/tslib')
-rw-r--r--meta/recipes-graphics/tslib/tslib/a780/tslib.sh6
-rw-r--r--meta/recipes-graphics/tslib/tslib/collie/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/collie/tslib.sh13
-rw-r--r--meta/recipes-graphics/tslib/tslib/devfs.patch18
-rw-r--r--meta/recipes-graphics/tslib/tslib/e680/tslib.sh6
-rw-r--r--meta/recipes-graphics/tslib/tslib/event1.patch80
-rw-r--r--meta/recipes-graphics/tslib/tslib/fix_version.patch32
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada56x/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada56x/tslib.sh5
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada6xx/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada6xx/tslib.sh5
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada7xx/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/jornada7xx/tslib.sh5
-rw-r--r--meta/recipes-graphics/tslib/tslib/mnci/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/mnci/tslib.sh1
-rw-r--r--meta/recipes-graphics/tslib/tslib/multievent.patch843
-rw-r--r--meta/recipes-graphics/tslib/tslib/netbook-pro/ts.conf5
-rw-r--r--meta/recipes-graphics/tslib/tslib/netbook-pro/tslib.sh5
-rw-r--r--meta/recipes-graphics/tslib/tslib/omap1610h2/tslib.sh5
-rw-r--r--meta/recipes-graphics/tslib/tslib/omap5912osk/tslib.sh4
-rw-r--r--meta/recipes-graphics/tslib/tslib/simpad/tslib.sh14
-rw-r--r--meta/recipes-graphics/tslib/tslib/ts.conf25
-rw-r--r--meta/recipes-graphics/tslib/tslib/ts.conf-collie-2.45
-rw-r--r--meta/recipes-graphics/tslib/tslib/ts.conf-simpad-2.45
-rw-r--r--meta/recipes-graphics/tslib/tslib/tslib.sh8
-rw-r--r--meta/recipes-graphics/tslib/tslib_1.0.bb78
26 files changed, 1193 insertions, 0 deletions
diff --git a/meta/recipes-graphics/tslib/tslib/a780/tslib.sh b/meta/recipes-graphics/tslib/tslib/a780/tslib.sh
new file mode 100644
index 0000000000..51cd0f1f36
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/a780/tslib.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/event1
+TSLIB_CONFFILE=/etc/ts.conf
+
+export TSLIB_TSDEVICE TSLIB_CONFFILE
diff --git a/meta/recipes-graphics/tslib/tslib/collie/ts.conf b/meta/recipes-graphics/tslib/tslib/collie/ts.conf
new file mode 100644
index 0000000000..2099b9b414
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/collie/ts.conf
@@ -0,0 +1,5 @@
+module_raw collie
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/collie/tslib.sh b/meta/recipes-graphics/tslib/tslib/collie/tslib.sh
new file mode 100644
index 0000000000..664bda426a
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/collie/tslib.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/touchscreen0
+TSLIB_CONFFILE=/etc/ts.conf
+
+case `uname -r` in
+2.4*)
+ TSLIB_TSDEVICE=/dev/ts
+ TSLIB_CONFFILE=/usr/share/tslib/ts.conf-collie-2.4
+ ;;
+esac
+
+export TSLIB_TSDEVICE TSLIB_CONFFILE
diff --git a/meta/recipes-graphics/tslib/tslib/devfs.patch b/meta/recipes-graphics/tslib/tslib/devfs.patch
new file mode 100644
index 0000000000..d7ef0a9589
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/devfs.patch
@@ -0,0 +1,18 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- tslib/tests/fbutils.c~devfs.patch
++++ tslib/tests/fbutils.c
+@@ -44,8 +44,8 @@
+ static unsigned colormap [256];
+ int xres, yres;
+
+-static char *defaultfbdevice = "/dev/fb0";
+-static char *defaultconsoledevice = "/dev/tty";
++static char *defaultfbdevice = "/dev/fb/0";
++static char *defaultconsoledevice = "/dev/vc/";
+ static char *fbdevice = NULL;
+ static char *consoledevice = NULL;
+
diff --git a/meta/recipes-graphics/tslib/tslib/e680/tslib.sh b/meta/recipes-graphics/tslib/tslib/e680/tslib.sh
new file mode 100644
index 0000000000..51cd0f1f36
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/e680/tslib.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/event1
+TSLIB_CONFFILE=/etc/ts.conf
+
+export TSLIB_TSDEVICE TSLIB_CONFFILE
diff --git a/meta/recipes-graphics/tslib/tslib/event1.patch b/meta/recipes-graphics/tslib/tslib/event1.patch
new file mode 100644
index 0000000000..88cc3f3a2a
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/event1.patch
@@ -0,0 +1,80 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- tslib/tests/ts_calibrate.c~event1
++++ tslib/tests/ts_calibrate.c
+@@ -179,11 +179,7 @@
+ if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) {
+ ts = ts_open(tsdevice,0);
+ } else {
+-#ifdef USE_INPUT_API
+- ts = ts_open("/dev/input/event0", 0);
+-#else
+- ts = ts_open("/dev/touchscreen/ucb1x00", 0);
+-#endif /* USE_INPUT_API */
++ ts = ts_open("/dev/input/event1", 0);
+ }
+
+ if (!ts) {
+--- tslib/tests/ts_print.c~event1
++++ tslib/tests/ts_print.c
+@@ -28,11 +28,7 @@
+ if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) {
+ ts = ts_open(tsdevice,0);
+ } else {
+-#ifdef USE_INPUT_API
+- ts = ts_open("/dev/input/event0", 0);
+-#else
+- ts = ts_open("/dev/touchscreen/ucb1x00", 0);
+-#endif /* USE_INPUT_API */
++ ts = ts_open("/dev/input/event1", 0);
+ }
+
+ if (!ts) {
+--- tslib/tests/ts_test.c~event1
++++ tslib/tests/ts_test.c
+@@ -120,11 +120,7 @@
+ signal(SIGTERM, sig);
+
+ if ((tsdevice = getenv("TSLIB_TSDEVICE")) == NULL) {
+-#ifdef USE_INPUT_API
+- tsdevice = strdup ("/dev/input/event0");
+-#else
+- tsdevice = strdup ("/dev/touchscreen/ucb1x00");
+-#endif /* USE_INPUT_API */
++ tsdevice = strdup ("/dev/input/event1");
+ }
+
+ ts = ts_open (tsdevice, 0);
+--- tslib/tests/ts_print_raw.c~event1
++++ tslib/tests/ts_print_raw.c
+@@ -28,11 +28,7 @@
+ if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) {
+ ts = ts_open(tsdevice,0);
+ } else {
+-#ifdef USE_INPUT_API
+- ts = ts_open("/dev/input/event0", 0);
+-#else
+- ts = ts_open("/dev/touchscreen/ucb1x00", 0);
+-#endif /* USE_INPUT_API */
++ ts = ts_open("/dev/input/event1", 0);
+ }
+
+ if (!ts) {
+--- tslib/tests/ts_harvest.c~event1
++++ tslib/tests/ts_harvest.c
+@@ -75,11 +75,7 @@
+ signal(SIGTERM, sig);
+
+ if ((tsdevice = getenv("TSLIB_TSDEVICE")) == NULL) {
+-#ifdef USE_INPUT_API
+- tsdevice = strdup ("/dev/input/event0");
+-#else
+- tsdevice = strdup ("/dev/touchscreen/ucb1x00");
+-#endif /* USE_INPUT_API */
++ tsdevice = strdup ("/dev/input/event1");
+ }
+
+ ts = ts_open (tsdevice, 0);
diff --git a/meta/recipes-graphics/tslib/tslib/fix_version.patch b/meta/recipes-graphics/tslib/tslib/fix_version.patch
new file mode 100644
index 0000000000..d6a0ebd0f3
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/fix_version.patch
@@ -0,0 +1,32 @@
+---
+ configure.ac | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+Index: tslib-1.0/configure.ac
+===================================================================
+--- tslib-1.0.orig/configure.ac 2006-08-24 22:02:55.000000000 +0100
++++ tslib-1.0/configure.ac 2007-07-09 21:04:38.000000000 +0100
+@@ -2,7 +2,7 @@
+ # Process this file with autoconf to produce a configure script.
+
+ AC_PREREQ(2.57)
+-AC_INIT(tslib, 0.0.2, kergoth@handhelds.org)
++AC_INIT(tslib, 1.0.0, kergoth@handhelds.org)
+ # AC_CONFIG_AUX_DIR(config)
+ AM_INIT_AUTOMAKE(dist-bzip2)
+ AC_CONFIG_SRCDIR([src/ts_close.c])
+@@ -193,10 +193,10 @@ TS_CONF='${sysconfdir}/ts.conf'
+ AC_SUBST(TS_CONF)
+
+ # Library versioning
+-LT_RELEASE=0.0
+-LT_CURRENT=1
+-LT_REVISION=1
+-LT_AGE=1
++LT_RELEASE=1.0
++LT_CURRENT=0
++LT_REVISION=0
++LT_AGE=0
+ AC_SUBST(LT_RELEASE)
+ AC_SUBST(LT_CURRENT)
+ AC_SUBST(LT_REVISION)
diff --git a/meta/recipes-graphics/tslib/tslib/jornada56x/ts.conf b/meta/recipes-graphics/tslib/tslib/jornada56x/ts.conf
new file mode 100644
index 0000000000..20729b6154
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada56x/ts.conf
@@ -0,0 +1,5 @@
+module_raw h3600
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/jornada56x/tslib.sh b/meta/recipes-graphics/tslib/tslib/jornada56x/tslib.sh
new file mode 100644
index 0000000000..8f907b0755
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada56x/tslib.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/tsraw0
+
+export TSLIB_TSDEVICE
diff --git a/meta/recipes-graphics/tslib/tslib/jornada6xx/ts.conf b/meta/recipes-graphics/tslib/tslib/jornada6xx/ts.conf
new file mode 100644
index 0000000000..20729b6154
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada6xx/ts.conf
@@ -0,0 +1,5 @@
+module_raw h3600
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/jornada6xx/tslib.sh b/meta/recipes-graphics/tslib/tslib/jornada6xx/tslib.sh
new file mode 100644
index 0000000000..1b5db781c1
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada6xx/tslib.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/ts0
+
+export TSLIB_TSDEVICE
diff --git a/meta/recipes-graphics/tslib/tslib/jornada7xx/ts.conf b/meta/recipes-graphics/tslib/tslib/jornada7xx/ts.conf
new file mode 100644
index 0000000000..09309719f2
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada7xx/ts.conf
@@ -0,0 +1,5 @@
+module_raw input
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/jornada7xx/tslib.sh b/meta/recipes-graphics/tslib/tslib/jornada7xx/tslib.sh
new file mode 100644
index 0000000000..040f4de3d5
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/jornada7xx/tslib.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/event1
+
+export TSLIB_TSDEVICE
diff --git a/meta/recipes-graphics/tslib/tslib/mnci/ts.conf b/meta/recipes-graphics/tslib/tslib/mnci/ts.conf
new file mode 100644
index 0000000000..adff17717b
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/mnci/ts.conf
@@ -0,0 +1,5 @@
+module_raw input
+module pthres pmin=600
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/mnci/tslib.sh b/meta/recipes-graphics/tslib/tslib/mnci/tslib.sh
new file mode 100644
index 0000000000..07928f226d
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/mnci/tslib.sh
@@ -0,0 +1 @@
+export TSLIB_TSDEVICE=/dev/input/event1
diff --git a/meta/recipes-graphics/tslib/tslib/multievent.patch b/meta/recipes-graphics/tslib/tslib/multievent.patch
new file mode 100644
index 0000000000..854e7af5dd
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/multievent.patch
@@ -0,0 +1,843 @@
+--- tslib/plugins/linear.c~multievent
++++ tslib/plugins/linear.c
+@@ -39,14 +39,12 @@
+ linear_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
+ {
+ struct tslib_linear *lin = (struct tslib_linear *)info;
+- int ret;
++ int ret, i = 0;
+ int xtemp,ytemp;
+
+ ret = info->next->ops->read(info->next, samp, nr);
+ if (ret >= 0) {
+- int nr;
+-
+- for (nr = 0; nr < ret; nr++, samp++) {
++ for (i = 0; i < ret; i++, samp++) {
+ #ifdef DEBUG
+ fprintf(stderr,"BEFORE CALIB--------------------> %d %d %d\n",samp->x, samp->y, samp->pressure);
+ #endif /*DEBUG*/
+@@ -66,6 +64,7 @@
+ samp->y = tmp;
+ }
+ }
++ ret = i;
+ }
+
+ return ret;
+--- tslib/plugins/dejitter.c~multievent
++++ tslib/plugins/dejitter.c
+@@ -24,7 +24,6 @@
+
+ struct tslib_threshold {
+ struct tslib_module_info module;
+- int pthreshold;
+ int xdelta;
+ int ydelta;
+ int delta2;
+@@ -36,40 +35,28 @@
+ static int threshold_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
+ {
+ struct tslib_threshold *thr = (struct tslib_threshold *)info;
+- struct ts_sample *s;
+- int ret;
++ struct ts_sample *src = samp, *dest = samp;
++ int ret, i = 0;
+
+ ret = info->next->ops->read(info->next, samp, nr);
+ if (ret >= 0) {
+- int nr = 0;
+-
+- for (s = samp; s < samp + ret; s++) {
++ for (i = 0; i < ret; i++, samp++) {
+ int dr2;
+ #ifdef DEBUG
+- fprintf(stderr,"BEFORE DEJITTER---------------> %d %d %d\n",s->x,s->y,s->pressure);
++ fprintf(stderr,"BEFORE DEJITTER---------------> %d %d %d\n", samp->x, samp->y, samp->pressure);
+ #endif /*DEBUG*/
+- thr->down = (s->pressure >= thr->pthreshold);
+- if (thr->down) {
+- dr2 = (thr->x - s->x)*(thr->x - s->x)
+- + (thr->y - s->y)*(thr->y - s->y);
+- if(dr2 < thr->delta2) {
+- s->x = thr->x;
+- s->y = thr->y;
+- } else {
+- thr->x = s->x;
+- thr->y = s->y;
+- }
+-
++ dr2 = (thr->x - samp->x)*(thr->x - samp->x)
++ + (thr->y - samp->y)*(thr->y - samp->y);
++ if(dr2 < thr->delta2) {
++ samp->x = thr->x;
++ samp->y = thr->y;
+ } else {
+- s->x = thr->x;
+- s->y = thr->y;
++ thr->x = samp->x;
++ thr->y = samp->y;
+ }
+-
+-
+- samp[nr++] = *s;
+ }
+
+- ret = nr;
++ ret = i;
+ }
+ return ret;
+ }
+@@ -106,10 +93,6 @@
+ thr->ydelta = v;
+ break;
+
+- case 3:
+- thr->pthreshold = v;
+- break;
+-
+ default:
+ return -1;
+ }
+@@ -120,7 +103,6 @@
+ {
+ { "xdelta", (void *)1, threshold_limit },
+ { "ydelta", (void *)2, threshold_limit },
+- { "pthreshold", (void *)3, threshold_limit }
+ };
+
+ //#define NR_VARS (sizeof(threshold_vars) / sizeof(threshold_vars[0]))
+@@ -138,7 +120,6 @@
+
+ thr->xdelta = 10;
+ thr->ydelta = 10;
+- thr->pthreshold = 100;
+
+ if (tslib_parse_vars(&thr->module, threshold_vars, NR_VARS, params)) {
+ free(thr);
+--- tslib/plugins/variance.c~multievent
++++ tslib/plugins/variance.c
+@@ -9,25 +9,36 @@
+ * $Id: variance.c,v 1.3 2002/11/08 23:28:55 dlowder Exp $
+ *
+ * Variance filter for touchscreen values
++ *
++ * Policy question (applies to all tslib modules that consume events):
++ * 1) User requests a read of 5 events using nr.
++ * 2) Lower layers return us 4 events.
++ * 3) Perform variance calculation, we now only have _1_ event.
++ * 4) Do we, a) duplicate this data across the user requested 4 events,
++ * b) push up the single event
++ * c) loop on the read from the lower layers to obtain
++ * the user's requested number of events, unless we hit
++ * a pen_up.
+ */
++
+ #include <errno.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <limits.h>
+-
+ #include <stdio.h>
+
+ #include "tslib.h"
+ #include "tslib-filter.h"
+
++#define NR_INIT -1
+ #define NR_LAST 4
+
+ struct tslib_variance {
+ struct tslib_module_info module;
+ int nr;
+- unsigned int pthreshold;
+ unsigned int xlimit;
+ unsigned int ylimit;
++ unsigned int pthreshold;
+ struct ts_sample last[NR_LAST];
+ };
+
+@@ -37,8 +48,7 @@
+ * least variance, and average them.
+ */
+ static int
+-variance_calculate(struct tslib_variance *var, struct ts_sample *samp,
+- struct ts_sample *s)
++variance_calculate(struct tslib_variance *var, struct ts_sample *dest, struct ts_sample *src)
+ {
+ int i, j;
+ int diff_x, min_x, i_x, j_x;
+@@ -100,11 +110,11 @@
+ }
+ }
+
+- samp->x = (var->last[i_x].x + var->last[j_x].x) / 2;
+- samp->y = (var->last[i_y].y + var->last[j_y].y) / 2;
+- samp->pressure = (var->last[i_p].pressure + var->last[j_p].pressure) / 2;
+- samp->tv.tv_sec = s->tv.tv_sec;
+- samp->tv.tv_usec = s->tv.tv_usec;
++ dest->x = (var->last[i_x].x + var->last[j_x].x) / 2;
++ dest->y = (var->last[i_y].y + var->last[j_y].y) / 2;
++ dest->pressure = (var->last[i_p].pressure + var->last[j_p].pressure) / 2;
++ dest->tv.tv_sec = src->tv.tv_sec;
++ dest->tv.tv_usec = src->tv.tv_usec;
+
+ return 1;
+ }
+@@ -112,55 +122,57 @@
+ static int variance_read(struct tslib_module_info *info, struct ts_sample *samp, int nr)
+ {
+ struct tslib_variance *var = (struct tslib_variance *)info;
+- struct ts_sample *s;
+- int ret;
+-
+- ret = info->next->ops->read(info->next, samp, nr);
+- if (ret >= 0) {
+- int nr = 0;
+-
+- for (s = samp; s < samp + ret; s++) {
+- if (s->pressure < var->pthreshold) {
+- /*
+- * Pen was released. Reset our state and
+- * pass up the release information.
+- */
+-// samp[nr].x = 0;
+-// samp[nr].y = 0;
+- samp[nr].pressure = s->pressure;
+- samp[nr].tv.tv_sec = s->tv.tv_sec;
+- samp[nr].tv.tv_usec = s->tv.tv_usec;
+-
+- nr++;
+-
+- var->nr = 0;
+- continue;
+- } else if (var->nr == -1) {
+- /*
+- * Pen was pressed. Inform upper layers
+- * immediately.
+- */
+- samp[nr] = *s;
+- nr++;
+- }
+-
+- if (var->nr >= 0) {
+- var->last[var->nr].x = s->x;
+- var->last[var->nr].y = s->y;
+- var->last[var->nr].pressure = s->pressure;
+- }
+-
+- var->nr++;
++ struct ts_sample *src = samp, *dest = samp;
++ int ret, i = 0;
+
+- if (var->nr == NR_LAST) {
+- if (variance_calculate(var, samp + nr, s))
+- nr++;
+- var->nr = 0;
++ /*
++ * NOTES:
++ *
++ * Loop on read, collecting events until we hit nr, unless
++ * we hit a pen up or encounter a failure.
++ */
++ while ((i < nr) && (ret != -1)) {
++ ret = info->next->ops->read(info->next, dest + i, nr - i);
++ if (ret >= 0) {
++ for (src = dest + i; src < dest + ret; src++) {
++ if (src->pressure < var->pthreshold) {
++ /* pen released, reset var->nr,
++ * do a calc based on what we have so
++ * far, and let this event flow up */
++ if (variance_calculate(var, dest + i, src))
++ i++;
++ var->nr = NR_INIT;
++ ret = -1; /* break outer loop, push up event */
++ break;
++ } else if (var->nr == NR_INIT) {
++ /*
++ * First pen down event. Inform upper layers
++ * immediately for responsiveness.
++ */
++ var->nr = 0;
++ i++;
++ ret = -1; /* break outer loop */
++ break;
++ }
++
++ if (var->nr >= 0) {
++ var->last[var->nr].x = src->x;
++ var->last[var->nr].y = src->y;
++ var->last[var->nr].pressure = src->pressure;
++ }
++
++ var->nr++;
++
++ if (var->nr == NR_LAST) {
++ if (variance_calculate(var, dest + i, src))
++ i++;
++ var->nr = 0;
++ }
+ }
+ }
+-
+- ret = nr;
+ }
++ /* if we've collected at least one event, send it up */
++ if (i != 0) ret = i;
+ return ret;
+ }
+
+@@ -196,10 +208,6 @@
+ var->ylimit = v;
+ break;
+
+- case 3:
+- var->pthreshold = v;
+- break;
+-
+ default:
+ return -1;
+ }
+@@ -210,7 +218,6 @@
+ {
+ { "xlimit", (void *)1, variance_limit },
+ { "ylimit", (void *)2, variance_limit },
+- { "pthreshold", (void *)3, variance_limit }
+ };
+
+ #define NR_VARS (sizeof(variance_vars) / sizeof(variance_vars[0]))
+@@ -218,6 +225,7 @@
+ struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
+ {
+ struct tslib_variance *var;
++ char *pthresvar;
+
+ var = malloc(sizeof(struct tslib_variance));
+ if (var == NULL)
+@@ -225,10 +233,15 @@
+
+ var->module.ops = &variance_ops;
+
+- var->nr = -1;
++ var->nr = NR_INIT;
+ var->xlimit = 160;
+ var->ylimit = 160;
+ var->pthreshold = 100;
++ pthresvar = getenv("TSLIB_PTHRES");
++ if (pthresvar != NULL) {
++ int p = strtol(pthresvar, (char **)NULL, 10);
++ if (p != -1) var->pthreshold = p;
++ }
+
+ if (tslib_parse_vars(&var->module, variance_vars, NR_VARS, params)) {
+ free(var);
+--- tslib/README~multievent
++++ tslib/README
+@@ -36,6 +36,19 @@
+ usages. They are by no means exhaustive, nor probably even good examples.
+ They are basically the programs I used to test this library.
+
++Module Creation Notes
++=====================
++
++For those creating tslib modules, it is important to note a couple things with
++regard to handling of the ability for a user to request more than one ts event
++at a time. The first thing to note is that the lower layers may send up less
++events than the user requested, but only if that was a result of a pen release.
++Next, your module should send up just as many events as the user requested in
++nr. If your module is one that consumes events, such as variance, then you
++loop on the read from the lower layers, and only send the events up when
++1) you have the number of events requested by the user, or 2) one of the events
++from the lower layers was a pen release.
++
+
+ Module Parameters
+ =================
+--- tslib/src/ts_read_raw.c~multievent
++++ tslib/src/ts_read_raw.c
+@@ -14,10 +14,10 @@
+ *
+ * Read raw pressure, x, y, and timestamp from a touchscreen device.
+ */
++
+ #include "config.h"
+
+ #include <stdio.h>
+-
+ #include <stdlib.h>
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+@@ -25,79 +25,27 @@
+ #include <sys/time.h>
+ #include <sys/types.h>
+
+-#ifdef USE_INPUT_API
+-#include <linux/input.h>
+-#else
+-struct ts_event { /* Used in UCB1x00 style touchscreens (the default) */
+- unsigned short pressure;
+- unsigned short x;
+- unsigned short y;
+- unsigned short pad;
+- struct timeval stamp;
+-};
+-struct h3600_ts_event { /* Used in the Compaq IPAQ */
+- unsigned short pressure;
+- unsigned short x;
+- unsigned short y;
+- unsigned short pad;
+-};
+-struct mk712_ts_event { /* Used in the Hitachi Webpad */
+- unsigned int header;
+- unsigned int x;
+- unsigned int y;
+- unsigned int reserved;
+-};
+-struct arctic2_ts_event { /* Used in the IBM Arctic II */
+- signed short pressure;
+- signed int x;
+- signed int y;
+- int millisecs;
+- int flags;
+-};
+-struct collie_ts_event { /* Used in the Sharp Zaurus SL-5000d and SL-5500 */
+- long y;
+- long x;
+- long pressure;
+- long long millisecs;
+-};
+-struct corgi_ts_event { /* Used in the Sharp Zaurus SL-C700 */
+- short pressure;
+- short x;
+- short y;
+- short millisecs;
+-};
+-#endif /* USE_INPUT_API */
+-
+ #include "tslib-private.h"
+
+-int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr)
+-{
+ #ifdef USE_INPUT_API
++#include <linux/input.h>
++
++static inline int get_input_event(struct tsdev *ts, struct ts_sample *samp) {
+ struct input_event ev;
+-#else
+- struct ts_event *evt;
+- struct h3600_ts_event *hevt;
+- struct mk712_ts_event *mevt;
+- struct arctic2_ts_event *aevt;
+- struct collie_ts_event *collie_evt;
+- struct corgi_ts_event *corgi_evt;
+-#endif /* USE_INPUT_API */
+- int ret;
+- int total = 0;
++ struct timeval tv = {0, 0};
++ fd_set fdset;
++ int ret = 0;
+
+- char *tseventtype=NULL;
+- char *defaulttseventtype="UCB1x00";
++ /* event vars */
++ static int curr_x = 0, curr_y = 0;
++ int curr_p = 0, next_x = 0, next_y = 0;
+
+-#ifdef USE_INPUT_API
+- /* warning: maybe those static vars should be part of the tsdev struct? */
+- static int curr_x = 0, curr_y = 0, curr_p = 0;
+- static int got_curr_x = 0, got_curr_y = 0;
+- int got_curr_p = 0;
+- int next_x, next_y;
++ /* state variables */
++ int got_curr_x = 0, got_curr_y = 0, got_curr_p = 0;
+ int got_next_x = 0, got_next_y = 0;
+ int got_tstamp = 0;
+
+- while (total < nr) {
++ while (1) {
+ ret = read(ts->fd, &ev, sizeof(struct input_event));
+ if (ret < sizeof(struct input_event)) break;
+
+@@ -146,177 +94,231 @@
+ samp->tv = ev.time;
+ }
+
+- if ( (!got_curr_x || !got_curr_y) && !got_curr_p &&
+- !got_next_x && !got_next_y ) {
+- /*
+- * The current event is not complete yet.
+- * Give the kernel a chance to feed us more.
+- */
+- struct timeval tv = {0, 0};
+- fd_set fdset;
+- FD_ZERO(&fdset);
+- FD_SET(ts->fd, &fdset);
+- ret = select(ts->fd+1, &fdset, NULL, NULL, &tv);
+- if (ret == 1) continue;
+- if (ret == -1) break;
++ if (got_curr_x && got_curr_y && got_curr_p) {
++ /* we have a complete event */
++ samp->x = curr_x;
++ samp->y = curr_y;
++ samp->pressure = curr_p;
++ ret = 0; /* indicate success */
++ if (got_next_x) curr_x = next_x;
++ if (got_next_y) curr_y = next_y;
++ break;
+ }
+
+- /* We consider having a complete ts event */
+- samp->x = curr_x;
+- samp->y = curr_y;
+- samp->pressure = curr_p;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- samp++;
+- total++;
+-
+- /* get ready for next event */
+- if (got_next_x) curr_x = next_x; else got_curr_x = 0;
+- if (got_next_y) curr_y = next_y; else got_curr_y = 0;
+- got_next_x = got_next_y = got_tstamp = 0;
++ /*
++ * The current event is not complete yet.
++ * Give the kernel a chance to feed us more.
++ */
++ FD_ZERO(&fdset);
++ FD_SET(ts->fd, &fdset);
++ ret = select(ts->fd+1, &fdset, NULL, NULL, &tv);
++ if (ret == 1) continue;
++ if (ret == -1) break;
+ }
+
+- if (ret) ret = -1;
+- if (total) ret = total;
++// fprintf(stdout, "%s: returning %d\n", __FUNCTION__, ret);
++ if (ret != 0) ret = -1;
++ return ret;
++}
++
+ #else
++
++struct ucb1x00_ts_event { /* Used in UCB1x00 style touchscreens (the default) */
++ unsigned short pressure;
++ unsigned short x;
++ unsigned short y;
++ unsigned short pad;
++ struct timeval stamp;
++};
++struct h3600_ts_event { /* Used in the Compaq IPAQ */
++ unsigned short pressure;
++ unsigned short x;
++ unsigned short y;
++ unsigned short pad;
++};
++struct mk712_ts_event { /* Used in the Hitachi Webpad */
++ unsigned int header;
++ unsigned int x;
++ unsigned int y;
++ unsigned int reserved;
++};
++struct arctic2_ts_event { /* Used in the IBM Arctic II */
++ signed short pressure;
++ signed int x;
++ signed int y;
++ int millisecs;
++ int flags;
++};
++struct collie_ts_event { /* Used in the Sharp Zaurus SL-5000d and SL-5500 */
++ long y;
++ long x;
++ long pressure;
++ long long millisecs;
++};
++struct corgi_ts_event { /* Used in the Sharp Zaurus SL-C700 */
++ short pressure;
++ short x;
++ short y;
++ short millisecs;
++};
++
++static inline int get_ucb1x00_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct ucb1x00_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct ucb1x00_ts_event));
++ if (ret > 0) {
++ samp->x = evt.x;
++ samp->y = evt.y;
++ samp->pressure = evt.pressure;
++ samp->tv.tv_usec = evt.stamp.tv_usec;
++ samp->tv.tv_sec = evt.stamp.tv_sec;
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++static inline int get_h3600_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct h3600_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct h3600_ts_event));
++ if (ret > 0) {
++ samp->x = evt.x;
++ samp->y = evt.y;
++ samp->pressure = evt.pressure;
++ gettimeofday(&samp->tv, NULL);
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++static inline int get_mk712_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct mk712_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct mk712_ts_event));
++ if (ret > 0) {
++ samp->x = (short)evt.x;
++ samp->y = (short)evt.y;
++ if(evt.header==0)
++ samp->pressure=1;
++ else
++ samp->pressure=0;
++ gettimeofday(&samp->tv, NULL);
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++static inline int get_arctic2_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct arctic2_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct arctic2_ts_event));
++ if (ret > 0) {
++ samp->x = (short)evt.x;
++ samp->y = (short)evt.y;
++ samp->pressure = evt.pressure;
++ gettimeofday(&samp->tv, NULL);
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++static inline int get_collie_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct collie_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct collie_ts_event));
++ if (ret > 0) {
++ samp->x = evt.x;
++ samp->y = evt.y;
++ samp->pressure = evt.pressure;
++ samp->tv.tv_usec = evt.millisecs % 1000;
++ samp->tv.tv_sec = evt.millisecs / 1000;
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++static inline int get_corgi_event(struct tsdev *ts, struct ts_sample *samp) {
++ struct corgi_ts_event evt;
++ int ret = read(ts->fd, &evt, sizeof(struct corgi_ts_event));
++ if (ret > 0) {
++ samp->x = evt.x;
++ samp->y = evt.y;
++ samp->pressure = evt.pressure;
++ samp->tv.tv_usec = evt.millisecs % 1000;
++ samp->tv.tv_sec = evt.millisecs / 1000;
++ ret = 0; /* success */
++ }
++ return ret;
++}
++
++#endif
++
++int ts_read_raw(struct tsdev *ts, struct ts_sample *samp, int nr)
++{
++ int ret;
++ int total = 0;
++ int pen_down = 1;
++ static short x_save = 0, y_save = 0;
++ static int pthres = -1;
++
++#ifndef USE_INPUT_API
++ char *tseventtype=NULL;
++ char *defaulttseventtype="UCB1x00";
+ tseventtype = getenv("TSLIB_TSEVENTTYPE");
+ if(tseventtype==NULL) tseventtype=defaulttseventtype;
++#endif
+
+- if( strcmp(tseventtype,"H3600") == 0) { /* iPAQ style h3600 touchscreen events */
+- hevt = alloca(sizeof(*hevt) * nr);
+- ret = read(ts->fd, hevt, sizeof(*hevt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*hevt);
+- while(ret >= sizeof(*hevt)) {
+- samp->x = hevt->x;
+- samp->y = hevt->y;
+- samp->pressure = hevt->pressure;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- gettimeofday(&samp->tv,NULL);
+- samp++;
+- hevt++;
+- ret -= sizeof(*hevt);
+- }
+- } else {
+- return -1;
+- }
+- } else if( strcmp(tseventtype,"MK712") == 0) { /* Hitachi Webpad events */
+- mevt = alloca(sizeof(*mevt) * nr);
+- ret = read(ts->fd, mevt, sizeof(*mevt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*mevt);
+- while(ret >= sizeof(*mevt)) {
+- samp->x = (short)mevt->x;
+- samp->y = (short)mevt->y;
+- if(mevt->header==0)
+- samp->pressure=1;
+- else
+- samp->pressure=0;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- gettimeofday(&samp->tv,NULL);
+- samp++;
+- mevt++;
+- ret -= sizeof(*mevt);
+- }
+- } else {
+- return -1;
+- }
+-
+- } else if( strcmp(tseventtype,"ARCTIC2") == 0) { /* IBM Arctic II events */
+- aevt = alloca(sizeof(*aevt) * nr);
+- ret = read(ts->fd, aevt, sizeof(*aevt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*aevt);
+- while(ret >= sizeof(*aevt)) {
+- samp->x = (short)aevt->x;
+- samp->y = (short)aevt->y;
+- samp->pressure = aevt->pressure;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- gettimeofday(&samp->tv,NULL);
+- samp++;
+- aevt++;
+- ret -= sizeof(*aevt);
+- }
++ while ((total < nr) && pen_down) {
++// fprintf(stdout, "total: %d, nr: %d\n", total, nr);
++#ifdef USE_INPUT_API
++ ret = get_input_event(ts, samp);
++#else
++ if (strcmp(tseventtype, "H3600") == 0) {
++ /* iPAQ style h3600 touchscreen events */
++ ret = get_h3600_event(ts, samp);
++ } else if (strcmp(tseventtype, "MK712") == 0) {
++ /* Hitachi Webpad events */
++ ret = get_mk712_event(ts, samp);
++ } else if (strcmp(tseventtype, "ARCTIC2") == 0) {
++ /* IBM Arctic II events */
++ ret = get_arctic2_event(ts, samp);
++ } else if (strcmp(tseventtype, "COLLIE") == 0) {
++ /* Sharp Zaurus SL-5000d/5500 events */
++ ret = get_collie_event(ts, samp);
++ } else if (strcmp(tseventtype,"CORGI") == 0) {
++ /* Sharp Zaurus SL-C700 events */
++ ret = get_corgi_event(ts, samp);
+ } else {
+- return -1;
++ /* Use normal UCB1x00 type events */
++ ret = get_ucb1x00_event(ts, samp);
+ }
++#endif
++ if (ret != 0) break;
+
+- } else if( strcmp(tseventtype,"COLLIE") == 0) { /* Sharp Zaurus SL-5000d/5500 events */
+- collie_evt = alloca(sizeof(*collie_evt) * nr);
+- ret = read(ts->fd, collie_evt, sizeof(*collie_evt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*collie_evt);
+- while(ret >= sizeof(*collie_evt)) {
+- samp->x = collie_evt->x;
+- samp->y = collie_evt->y;
+- samp->pressure = collie_evt->pressure;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- samp->tv.tv_usec = collie_evt->millisecs % 1000;
+- samp->tv.tv_sec = collie_evt->millisecs / 1000;
+- samp++;
+- collie_evt++;
+- ret -= sizeof(*collie_evt);
++ if (pthres == -1) {
++ char *pthresvar = getenv("TSLIB_PTHRES");
++ pthres = 100;
++ if (pthresvar != NULL) {
++ int p = strtol(pthresvar, (char **)NULL, 10);
++ if (p != -1) pthres = p;
+ }
+- } else {
+- return -1;
+ }
+
+- } else if( strcmp(tseventtype,"CORGI") == 0) { /* Sharp Zaurus SL-C700 events */
+- corgi_evt = alloca(sizeof(*corgi_evt) * nr);
+- ret = read(ts->fd, corgi_evt, sizeof(*corgi_evt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*corgi_evt);
+- while(ret >= sizeof(*corgi_evt)) {
+- samp->x = corgi_evt->x;
+- samp->y = corgi_evt->y;
+- samp->pressure = corgi_evt->pressure;
+-#ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
+-#endif /*DEBUG*/
+- samp->tv.tv_usec = corgi_evt->millisecs % 1000;
+- samp->tv.tv_sec = corgi_evt->millisecs / 1000;
+- samp++;
+- corgi_evt++;
+- ret -= sizeof(*corgi_evt);
+- }
++ if (samp->pressure < pthres) {
++ /* pen released, send events up */
++ pen_down = 0;
++ /* set x and y to previous values */
++ samp->x = x_save;
++ samp->y = y_save;
+ } else {
+- return -1;
++ pen_down = 1;
++ x_save = samp->x;
++ y_save = samp->y;
+ }
+-
+- } else { /* Use normal UCB1x00 type events */
+- evt = alloca(sizeof(*evt) * nr);
+- ret = read(ts->fd, evt, sizeof(*evt) * nr);
+- if(ret > 0) {
+- int nr = ret / sizeof(*evt);
+- while(ret >= sizeof(*evt)) {
+- samp->x = evt->x;
+- samp->y = evt->y;
+- samp->pressure = evt->pressure;
+ #ifdef DEBUG
+- fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure);
++ fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x, samp->y, samp->pressure);
+ #endif /*DEBUG*/
+- samp->tv.tv_usec = evt->stamp.tv_usec;
+- samp->tv.tv_sec = evt->stamp.tv_sec;
+- samp++;
+- evt++;
+- ret -= sizeof(*evt);
+- }
+- } else {
+- return -1;
+- }
++ samp++;
++ total++;
+ }
+- ret = nr;
+-#endif /* USE_INPUT_API */
+
++ if (ret != 0) ret = -1;
++ if (total) ret = total;
+ return ret;
+ }
+
diff --git a/meta/recipes-graphics/tslib/tslib/netbook-pro/ts.conf b/meta/recipes-graphics/tslib/tslib/netbook-pro/ts.conf
new file mode 100644
index 0000000000..6d94a8f468
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/netbook-pro/ts.conf
@@ -0,0 +1,5 @@
+module_raw input
+module variance delta=80
+#module dejitter delta=2
+module linear
+
diff --git a/meta/recipes-graphics/tslib/tslib/netbook-pro/tslib.sh b/meta/recipes-graphics/tslib/tslib/netbook-pro/tslib.sh
new file mode 100644
index 0000000000..d31bc76368
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/netbook-pro/tslib.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=`detect-stylus --device`
+
+export TSLIB_TSDEVICE
diff --git a/meta/recipes-graphics/tslib/tslib/omap1610h2/tslib.sh b/meta/recipes-graphics/tslib/tslib/omap1610h2/tslib.sh
new file mode 100644
index 0000000000..040f4de3d5
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/omap1610h2/tslib.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/event1
+
+export TSLIB_TSDEVICE
diff --git a/meta/recipes-graphics/tslib/tslib/omap5912osk/tslib.sh b/meta/recipes-graphics/tslib/tslib/omap5912osk/tslib.sh
new file mode 100644
index 0000000000..6bb56651f8
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/omap5912osk/tslib.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+export TSLIB_TSDEVICE=/dev/input/event1
+export QWS_MOUSE_PROTO=TPanel
diff --git a/meta/recipes-graphics/tslib/tslib/simpad/tslib.sh b/meta/recipes-graphics/tslib/tslib/simpad/tslib.sh
new file mode 100644
index 0000000000..9c4eb1e0f9
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/simpad/tslib.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+TSLIB_TSDEVICE=/dev/input/touchscreen0
+TSLIB_CONFFILE=/etc/ts.conf
+
+case `uname -r` in
+2.4*)
+ TSLIB_TSDEVICE=/dev/touchscreen/ucb1x00
+ TSLIB_CONFFILE=/usr/share/tslib/ts.conf-simpad-2.4
+ ;;
+esac
+
+export TSLIB_TSDEVICE TSLIB_CONFFILE
+
diff --git a/meta/recipes-graphics/tslib/tslib/ts.conf b/meta/recipes-graphics/tslib/tslib/ts.conf
new file mode 100644
index 0000000000..1b0da937e8
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/ts.conf
@@ -0,0 +1,25 @@
+# Uncomment if you wish to use the linux input layer event interface
+module_raw input
+
+# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
+# module_raw collie
+
+# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860
+# module_raw corgi
+
+# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface
+# module_raw ucb1x00
+
+# Uncomment if you're using an HP iPaq h3600 or similar
+# module_raw h3600
+
+# Uncomment if you're using a Hitachi Webpad
+# module_raw mk712
+
+# Uncomment if you're using an IBM Arctic II
+# module_raw arctic2
+
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/ts.conf-collie-2.4 b/meta/recipes-graphics/tslib/tslib/ts.conf-collie-2.4
new file mode 100644
index 0000000000..2099b9b414
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/ts.conf-collie-2.4
@@ -0,0 +1,5 @@
+module_raw collie
+module pthres pmin=1
+module variance delta=30
+module dejitter delta=100
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/ts.conf-simpad-2.4 b/meta/recipes-graphics/tslib/tslib/ts.conf-simpad-2.4
new file mode 100644
index 0000000000..035e794cb4
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/ts.conf-simpad-2.4
@@ -0,0 +1,5 @@
+module_raw ucb1x00
+module pthres pmin=1
+module variance delta=10
+module dejitter delta=150
+module linear
diff --git a/meta/recipes-graphics/tslib/tslib/tslib.sh b/meta/recipes-graphics/tslib/tslib/tslib.sh
new file mode 100644
index 0000000000..7068e8d922
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib/tslib.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+if [ -e /dev/input/touchscreen0 ]; then
+ TSLIB_TSDEVICE=/dev/input/touchscreen0
+
+ export TSLIB_TSDEVICE
+fi
+
diff --git a/meta/recipes-graphics/tslib/tslib_1.0.bb b/meta/recipes-graphics/tslib/tslib_1.0.bb
new file mode 100644
index 0000000000..12c0ace8f8
--- /dev/null
+++ b/meta/recipes-graphics/tslib/tslib_1.0.bb
@@ -0,0 +1,78 @@
+DESCRIPTION = "tslib is a plugin-based flexible touchscreen access library."
+HOMEPAGE = "http://tslib.berlios.de/"
+
+AUTHOR = "Russell King w/ plugins by Chris Larson et. al."
+SECTION = "base"
+LICENSE = "LGPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=f30a9716ef3762e3467a2f62bf790f0a"
+
+PR = "r15"
+
+SRC_URI = "http://download.berlios.de/tslib/tslib-${PV}.tar.bz2 \
+ file://fix_version.patch;patch=1 \
+ file://ts.conf \
+ file://ts.conf-simpad-2.4 \
+ file://ts.conf-collie-2.4 \
+ file://tslib.sh"
+SRC_URI_append_mnci += " file://devfs.patch;patch=1"
+SRC_URI_append_mnci += " file://event1.patch;patch=1"
+
+inherit autotools pkgconfig
+
+EXTRA_OECONF = "--enable-shared --disable-h3600 --enable-input --disable-corgi --disable-collie --disable-mk712 --disable-arctic2 --disable-ucb1x00"
+
+do_install_prepend() {
+ install -m 0644 ${WORKDIR}/ts.conf ${S}/etc/ts.conf
+}
+
+do_install_append() {
+ install -d ${D}${sysconfdir}/profile.d/
+ install -m 0755 ${WORKDIR}/tslib.sh ${D}${sysconfdir}/profile.d/
+ case ${MACHINE} in
+ collie )
+ install -d ${D}${datadir}/tslib
+ install -m 0644 ${WORKDIR}/ts.conf-collie-2.4 ${D}${datadir}/tslib/
+ ;;
+ simpad )
+ install -d ${D}${datadir}/tslib
+ install -m 0644 ${WORKDIR}/ts.conf-simpad-2.4 ${D}${datadir}/tslib/
+ ;;
+ *)
+ ;;
+ esac
+}
+
+SRC_URI_OVERRIDES_PACKAGE_ARCH = "0"
+
+# People should consider using udev's /dev/input/touchscreen0 symlink
+# instead of detect-stylus
+#RDEPENDS_tslib-conf_weird-machine = "detect-stylus"
+RPROVIDES_tslib-conf = "libts-0.0-conf"
+
+# Machines with machine specific patches
+PACKAGE_ARCH_mnci = "${MACHINE_ARCH}"
+# Machines with machine specific config files (tslib.sh)
+PACKAGE_ARCH_tslib-conf_a780 = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_collie = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_e680 = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_jornada56x = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_jornada6xx = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_jornada7xx = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_netbook-pro = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_omap1610h2 = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_omap5912osk = "${MACHINE_ARCH}"
+PACKAGE_ARCH_tslib-conf_simpad = "${MACHINE_ARCH}"
+
+PACKAGES =+ "tslib-conf tslib-tests tslib-calibrate"
+DEBIAN_NOAUTONAME_tslib-conf = "1"
+DEBIAN_NOAUTONAME_tslib-tests = "1"
+DEBIAN_NOAUTONAME_tslib-calibrate = "1"
+
+RDEPENDS_${PN} = "tslib-conf"
+RRECOMMENDS_${PN} = "pointercal"
+
+FILES_${PN}-dbg += "${libdir}/ts/.debug*"
+FILES_tslib-conf = "${sysconfdir}/ts.conf ${sysconfdir}/profile.d/tslib.sh ${datadir}/tslib"
+FILES_${PN} = "${libdir}/*.so.* ${libdir}/ts/*.so*"
+FILES_tslib-calibrate += "${bindir}/ts_calibrate"
+FILES_tslib-tests = "${bindir}/ts_harvest ${bindir}/ts_print ${bindir}/ts_print_raw ${bindir}/ts_test"