diff options
Diffstat (limited to 'tslib/tslib/raw-hwread.patch')
-rw-r--r-- | tslib/tslib/raw-hwread.patch | 706 |
1 files changed, 706 insertions, 0 deletions
diff --git a/tslib/tslib/raw-hwread.patch b/tslib/tslib/raw-hwread.patch index e69de29bb2..fff8045f13 100644 --- a/tslib/tslib/raw-hwread.patch +++ b/tslib/tslib/raw-hwread.patch @@ -0,0 +1,706 @@ + +# +# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher +# + +--- tslib/plugins/Makefile.am~raw-hwread ++++ tslib/plugins/Makefile.am +@@ -19,9 +19,10 @@ + LIBS = + plugindir = $(PLUGIN_DIR) + +-EXTRA_LTLIBRARIES = variance.la dejitter.la linear.la pthres.la ++EXTRA_LTLIBRARIES = variance.la dejitter.la linear.la pthres.la corgi.la collie.la ucb1x00.la h3600.la mk712.la arctic2.la + plugin_LTLIBRARIES = $(PLUGINS) + ++# filters + variance_la_SOURCES = variance.c + variance_la_LDFLAGS = -module $(LTVSN) + +@@ -33,3 +34,22 @@ + + pthres_la_SOURCES = pthres.c + pthres_la_LDFLAGS = -module $(LTVSN) ++ ++# hw access ++corgi_la_SOURCES = corgi-raw.c ++corgi_la_LDFLAGS = -module $(LTVSN) ++ ++collie_la_SOURCES = collie-raw.c ++collie_la_LDFLAGS = -module $(LTVSN) ++ ++ucb1x00_la_SOURCES = ucb1x00-raw.c ++ucb1x00_la_LDFLAGS = -module $(LTVSN) ++ ++h3600_la_SOURCES = h3600-raw.c ++h3600_la_LDFLAGS = -module $(LTVSN) ++ ++mk712_la_SOURCES = mk712-raw.c ++mk712_la_LDFLAGS = -module $(LTVSN) ++ ++arctic2_la_SOURCES = arctic2-raw.c ++arctic2_la_LDFLAGS = -module $(LTVSN) +--- /dev/null ++++ tslib/plugins/corgi-raw.c +@@ -0,0 +1,60 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct corgi_ts_event { /* Used in the Sharp Zaurus SL-C700 */ ++ short pressure; ++ short x; ++ short y; ++ short millisecs; ++}; ++ ++static int corgi_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct corgi_ts_event *corgi_evt; ++ int ret; ++ int total = 0; ++ 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); ++ } ++ } else { ++ return -1; ++ } ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops corgi_ops = ++{ ++ read: corgi_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &corgi_ops; ++ return m; ++} +--- tslib/src/ts_read_raw_module.c~raw-hwread ++++ tslib/src/ts_read_raw_module.c +@@ -28,44 +28,6 @@ + #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" +@@ -75,17 +37,8 @@ + struct tsdev *ts = inf->dev; + #ifdef USE_INPUT_API + 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; +- char *tseventtype=NULL; +- char *defaulttseventtype="UCB1x00"; + #endif /* USE_INPUT_API */ +- int ret; ++ int ret = nr; + int total = 0; + + #ifdef USE_INPUT_API +@@ -220,143 +173,6 @@ + if (ret) ret = -1; + if (total) ret = total; + #endif +- +-#else +- tseventtype = getenv("TSLIB_TSEVENTTYPE"); +- if(tseventtype==NULL) tseventtype=defaulttseventtype; +- +- 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); +- } +- } else { +- return -1; +- } +- +- } 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); +- } +- } 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); +- } +- } else { +- return -1; +- } +- +- } 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); +-#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; +- } +- } +- ret = nr; + #endif /* USE_INPUT_API */ + + return ret; +--- /dev/null ++++ tslib/plugins/collie-raw.c +@@ -0,0 +1,61 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct collie_ts_event { /* Used in the Sharp Zaurus SL-5000d and SL-5500 */ ++ long y; ++ long x; ++ long pressure; ++ long long millisecs; ++}; ++ ++static int collie_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct collie_ts_event *collie_evt; ++ int ret; ++ int total = 0; ++ 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); ++ } ++ } else { ++ return -1; ++ } ++ ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops collie_ops = ++{ ++ read: collie_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &collie_ops; ++ return m; ++} +--- tslib/configure.in~raw-hwread ++++ tslib/configure.in +@@ -4,15 +4,30 @@ + AM_INIT_AUTOMAKE(libts,0.0.1) + AM_CONFIG_HEADER(config.h) + ++# filters + AC_ARG_ENABLE(linear, [ --enable-linear Enable building of linear scaling [default=yes]], + [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS linear.la", PLUGINS="$PLUGINS linear.la") + AC_ARG_ENABLE(dejitter, [ --enable-dejitter Enable building of dejitter filter [default=yes]], + [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS dejitter.la", PLUGINS="$PLUGINS dejitter.la") + AC_ARG_ENABLE(variance, [ --enable-variance Enable building of variance filter [default=yes]], + [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS variance.la", PLUGINS="$PLUGINS variance.la") +-AC_ARG_ENABLE(pthres, [ --enable-pthres Enable building of pthres filter [default=yes]], ++AC_ARG_ENABLE(pthres, [ --enable-pthres Enable building of pthres filter [default=yes]], + [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS pthres.la", PLUGINS="$PLUGINS pthres.la") + ++# hardware access modules ++AC_ARG_ENABLE(ucb1x00, [ --enable-ucb1x00 Enable building of ucb1x00 raw module (UCB1x00 support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS ucb1x00.la", PLUGINS="$PLUGINS ucb1x00.la") ++AC_ARG_ENABLE(corgi, [ --enable-corgi Enable building of corgi raw module (Sharp Zaurus sl-c7x0 support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS corgi.la", PLUGINS="$PLUGINS corgi.la") ++AC_ARG_ENABLE(collie, [ --enable-collie Enable building of collie raw module (Sharp Zaurus sl-5500/5000d support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS collie.la", PLUGINS="$PLUGINS collie.la") ++AC_ARG_ENABLE(h3600, [ --enable-h3600 Enable building of h3600 raw module (HP iPaq H3600 support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS h3600.la", PLUGINS="$PLUGINS h3600.la") ++AC_ARG_ENABLE(mk712, [ --enable-mk712 Enable building of mk712 raw module (Hitachi Webpad support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS mk712.la", PLUGINS="$PLUGINS mk712.la") ++AC_ARG_ENABLE(arctic2, [ --enable-arctic2 Enable building of arctic2 raw module (IBM Arctic II support) [default=yes]], ++ [ "x$enableval" = "xyes" ] && PLUGINS="$PLUGINS arctic2.la", PLUGINS="$PLUGINS arctic2.la") ++ + AC_MSG_CHECKING(--enable-debug argument) + AC_ARG_ENABLE(debug, [ --enable-debug Enable debug messages from filters [default=no]], + , [enable_debug="no"]) +--- /dev/null ++++ tslib/plugins/h3600-raw.c +@@ -0,0 +1,60 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct h3600_ts_event { /* Used in the Compaq IPAQ */ ++ unsigned short pressure; ++ unsigned short x; ++ unsigned short y; ++ unsigned short pad; ++}; ++ ++static int h3600_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct h3600_ts_event *h3600_evt; ++ int ret; ++ int total = 0; ++ h3600_evt = alloca(sizeof(*h3600_evt) * nr); ++ ret = read(ts->fd, h3600_evt, sizeof(*h3600_evt) * nr); ++ if(ret > 0) { ++ int nr = ret / sizeof(*h3600_evt); ++ while(ret >= sizeof(*h3600_evt)) { ++ samp->x = h3600_evt->x; ++ samp->y = h3600_evt->y; ++ samp->pressure = h3600_evt->pressure; ++#ifdef DEBUG ++ fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); ++#endif /*DEBUG*/ ++ gettimeofday(&samp->tv,NULL); ++ samp++; ++ h3600_evt++; ++ ret -= sizeof(*h3600_evt); ++ } ++ } else { ++ return -1; ++ } ++ ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops h3600_ops = ++{ ++ read: h3600_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &h3600_ops; ++ return m; ++} +--- tslib/etc/ts.conf~raw-hwread ++++ tslib/etc/ts.conf +@@ -1,3 +1,21 @@ ++# Uncomment collie if you're using a Sharp Zaurus SL-5500/SL-5000d ++# module_raw collie ++ ++# Uncomment corgi if you're using a Sharp Zaurus SL-C700/C750/C760/C860 ++# module_raw corgi ++ ++# Uncomment ucb1x00 if you're using a device with a UCB1200/1300/1400 TS interface ++# module_raw ucb1x00 ++ ++# Uncomment h3600 if you're using an HP iPaq h3600 or similar ++# module_raw h3600 ++ ++# Uncomment mk712 if you're using a Hitachi Webpad ++# module_raw mk712 ++ ++# Uncomment arctic2 if you're using an IBM Arctic II ++# module_raw arctic2 ++ + module pthres pmin=1 + module variance delta=30 + module dejitter delta=100 +--- /dev/null ++++ tslib/plugins/mk712-raw.c +@@ -0,0 +1,63 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct mk712_ts_event { /* Used in the Hitachi Webpad */ ++ unsigned int header; ++ unsigned int x; ++ unsigned int y; ++ unsigned int reserved; ++}; ++ ++static int mk712_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct mk712_ts_event *mk712_evt; ++ int ret; ++ int total = 0; ++ mk712_evt = alloca(sizeof(*mk712_evt) * nr); ++ ret = read(ts->fd, mk712_evt, sizeof(*mk712_evt) * nr); ++ if(ret > 0) { ++ int nr = ret / sizeof(*mk712_evt); ++ while(ret >= sizeof(*mk712_evt)) { ++ samp->x = (short)mk712_evt->x; ++ samp->y = (short)mk712_evt->y; ++ if(mk712_evt->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++; ++ mk712_evt++; ++ ret -= sizeof(*mk712_evt); ++ } ++ } else { ++ return -1; ++ } ++ ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops mk712_ops = ++{ ++ read: mk712_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &mk712_ops; ++ return m; ++} +--- /dev/null ++++ tslib/plugins/arctic2-raw.c +@@ -0,0 +1,61 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct arctic2_ts_event { /* Used in the IBM Arctic II */ ++ signed short pressure; ++ signed int x; ++ signed int y; ++ int millisecs; ++ int flags; ++}; ++ ++static int arctic2_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct arctic2_ts_event *arctic2_evt; ++ int ret; ++ int total = 0; ++ arctic2_evt = alloca(sizeof(*arctic2_evt) * nr); ++ ret = read(ts->fd, arctic2_evt, sizeof(*arctic2_evt) * nr); ++ if(ret > 0) { ++ int nr = ret / sizeof(*arctic2_evt); ++ while(ret >= sizeof(*arctic2_evt)) { ++ samp->x = (short)arctic2_evt->x; ++ samp->y = (short)arctic2_evt->y; ++ samp->pressure = arctic2_evt->pressure; ++#ifdef DEBUG ++ fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); ++#endif /*DEBUG*/ ++ gettimeofday(&samp->tv,NULL); ++ samp++; ++ arctic2_evt++; ++ ret -= sizeof(*arctic2_evt); ++ } ++ } else { ++ return -1; ++ } ++ ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops arctic2_ops = ++{ ++ read: arctic2_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &arctic2_ops; ++ return m; ++} +--- tslib/README~raw-hwread ++++ tslib/README +@@ -40,8 +40,6 @@ + Environment Variables + ===================== + +-TSLIB_TSEVENTTYPE Event type for non input api raw reads. +- Default: UCB1x00 + TSLIB_TSDEVICE TS device file name. + Default (non inputapi): /dev/touchscreen/ucb1x00 + Default (inputapi): /dev/input/event0 +--- /dev/null ++++ tslib/plugins/ucb1x00-raw.c +@@ -0,0 +1,62 @@ ++#include <stdlib.h> ++#include <stdio.h> ++#include <unistd.h> ++ ++#include "config.h" ++#include "tslib-private.h" ++ ++struct ucb1x00_ts_event { /* Used in UCB1x00 style touchscreens */ ++ unsigned short pressure; ++ unsigned short x; ++ unsigned short y; ++ unsigned short pad; ++ struct timeval stamp; ++}; ++ ++static int ucb1x00_read(struct tslib_module_info *inf, struct ts_sample *samp, int nr) ++{ ++ struct tsdev *ts = inf->dev; ++ struct ucb1x00_ts_event *ucb1x00_evt; ++ int ret; ++ int total = 0; ++ ucb1x00_evt = alloca(sizeof(*ucb1x00_evt) * nr); ++ ret = read(ts->fd, ucb1x00_evt, sizeof(*ucb1x00_evt) * nr); ++ if(ret > 0) { ++ int nr = ret / sizeof(*ucb1x00_evt); ++ while(ret >= sizeof(*ucb1x00_evt)) { ++ samp->x = ucb1x00_evt->x; ++ samp->y = ucb1x00_evt->y; ++ samp->pressure = ucb1x00_evt->pressure; ++#ifdef DEBUG ++ fprintf(stderr,"RAW---------------------------> %d %d %d\n",samp->x,samp->y,samp->pressure); ++#endif /*DEBUG*/ ++ samp->tv.tv_usec = ucb1x00_evt->stamp.tv_usec; ++ samp->tv.tv_sec = ucb1x00_evt->stamp.tv_sec; ++ samp++; ++ ucb1x00_evt++; ++ ret -= sizeof(*ucb1x00_evt); ++ } ++ } else { ++ return -1; ++ } ++ ++ ret = nr; ++ return ret; ++} ++ ++static const struct tslib_ops ucb1x00_ops = ++{ ++ read: ucb1x00_read, ++}; ++ ++struct tslib_module_info *mod_init(struct tsdev *dev, const char *params) ++{ ++ struct tslib_module_info *m; ++ ++ m = malloc(sizeof(struct tslib_module_info)); ++ if (m == NULL) ++ return NULL; ++ ++ m->ops = &ucb1x00_ops; ++ return m; ++} |