From: <sk...@us...> - 2010-09-23 11:53:50
|
Revision: 2390 http://linuxconsole.svn.sourceforge.net/linuxconsole/?rev=2390&view=rev Author: skitt Date: 2010-09-23 11:53:44 +0000 (Thu, 23 Sep 2010) Log Message: ----------- Add an inputattach mode for the Sahara Touch-iT213 and options --always and --noinit; patch taken from https://bugs.launchpad.net/ubuntu/+source/inputattach/+bug/338746 Modified Paths: -------------- trunk/utils/inputattach.c Modified: trunk/utils/inputattach.c =================================================================== --- trunk/utils/inputattach.c 2010-09-23 11:47:58 UTC (rev 2389) +++ trunk/utils/inputattach.c 2010-09-23 11:53:44 UTC (rev 2390) @@ -7,6 +7,8 @@ * * Twiddler support Copyright (c) 2001 Arndt Schoenewald * Sponsored by Quelltext AG (http://www.quelltext-ag.de), Dortmund, Germany + * + * Sahara Touchit-213 mode added by Claudio Nieder 2008-05-01. */ /* @@ -33,25 +35,18 @@ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> #include <linux/serio.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/time.h> - +#include "serio-ids.h" #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <sys/ioctl.h> +#include <termios.h> #include <unistd.h> -#include <fcntl.h> -#include <termios.h> -#include <string.h> -#include <errno.h> -#include <assert.h> -#include <ctype.h> -#include "serio-ids.h" - static int readchar(int fd, unsigned char *c, int timeout) { struct timeval tv; @@ -121,7 +116,7 @@ return 0; } -static int spaceball_waitchar(int fd, unsigned char c, unsigned char *d, +static int spaceball_waitchar(int fd, unsigned char c, char *d, int timeout) { unsigned char b = 0; @@ -240,7 +235,7 @@ { int i; unsigned char c; - unsigned char *response = "\r\n0600520058C272"; + unsigned char *response = (unsigned char *)"\r\n0600520058C272"; if (write(fd, " E5E5", 5) != 5) /* Enable command */ return -1; @@ -362,6 +357,52 @@ return 0; } +static int t213_init(int fd, unsigned long *id, unsigned long *extra) +{ + char cmd[]={0x0a,1,'A'}; + int count=10; + int state=0; + unsigned char data; + + /* + * In case the controller is in "ELO-mode" send a few times + * the check active packet to force it into the documented + * touchkit mode. + */ + while (count>0) { + if (write(fd, &cmd, 3) != 3) + return -1; + while (!readchar(fd, &data, 100)) { + switch (state) { + case 0: + if (data==0x0a) { + state=1; + } + break; + case 1: + if (data==1) { + state=2; + } else if (data!=0x0a) { + state=0; + } + break; + case 2: + if (data=='A') { + return 0; + } else if (data==0x0a) { + state=1; + } else { + state=0; + } + break; + } + + } + count--; + } + return -1; +} + static int dump_init(int fd, unsigned long *id, unsigned long *extra) { unsigned char c, o = 0; @@ -480,6 +521,9 @@ { "--mtouch", "-mtouch", "MicroTouch (3M) touchscreen", B9600, CS8 | CRTSCTS, SERIO_MICROTOUCH, 0x00, 0x00, 0, NULL }, +{ "--touchit213", "-t213", "Sahara Touch-iT213 Tablet PC", + B9600, CS8, + SERIO_TOUCHIT213, 0x00, 0x00, 0, t213_init }, { "--touchright", "-tr", "Touchright serial touchscreen", B9600, CS8 | CRTSCTS, SERIO_TOUCHRIGHT, 0x00, 0x00, 0, NULL }, @@ -503,7 +547,7 @@ struct input_types *type; puts(""); - puts("Usage: inputattach [--daemon] <mode> <device>"); + puts("Usage: inputattach [--daemon] [--always] [--noinit] <mode> <device>"); puts(""); puts("Modes:"); @@ -525,8 +569,10 @@ unsigned long id, extra; int fd; int i; - char c; + unsigned char c; int retval; + int ignore_init_res = 0; + int no_init = 0; for (i = 1; i < argc; i++) { if (!strcasecmp(argv[i], "--help")) { @@ -534,6 +580,10 @@ return EXIT_SUCCESS; } else if (!strcasecmp(argv[i], "--daemon")) { daemon_mode = 1; + } else if (!strcasecmp(argv[i], "--always")) { + ignore_init_res = 1; + } else if (!strcasecmp(argv[i], "--noinit")) { + no_init = 1; } else if (need_device) { device = argv[i]; need_device = 0; @@ -586,9 +636,15 @@ id = type->id; extra = type->extra; - if (type->init && type->init(fd, &id, &extra)) { - fprintf(stderr, "inputattach: device initialization failed\n"); - return EXIT_FAILURE; + if (type->init && !no_init) { + if (type->init(fd, &id, &extra)) { + if (ignore_init_res) { + fprintf(stderr, "inputattach: ignored device initialization failure\n"); + } else { + fprintf(stderr, "inputattach: device initialization failed\n"); + return EXIT_FAILURE; + } + } } ldisc = N_MOUSE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |