📄 touchserial.c
字号:
/* $XConsortium: xf86Elo.c /main/13 1996/10/25 14:11:31 kaleb $ */
/*
* Copyright 1995, 1999 by Patrick Lecoanet, France. <lecoanet@cena.dgac.fr>
*
* 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 Patrick Lecoanet not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Patrick Lecoanet makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* PATRICK LECOANET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL PATRICK LECOANET 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.
*
*/
/* $XFree86: xc/programs/Xserver/hw/xfree86/input/elographics/xf86Elo.c,v 1.7 1999/12/13 23:38:13 robin Exp $ */
/*
*******************************************************************************
*******************************************************************************
*
* This driver is able to deal with Elographics SmartSet serial controllers.
* It uses only a subset of the functions provided through the protocol.
*
* SUPPORT FOR E281-2310 and compatible controllers added with help of:
* 1996/01/17 Juergen P. Meier (jpm@mailserv.rz.fh-muenchen.de) and
* 1998/03/25 G.Felkel@edelmann.de
*
* The E281-2310 is a somewhat lobotomized 2210.
* It does not support the c,g,h,k,l,p,q,s and t commands.
* Especially the P command, which is used to check the baud rate.
* The E281-2310 however semms to use always 9600bps, 8bit, 1stop
* no parity, Hardwarehandshake (RTS-CTS) (which are the drivers
* default values)
*
*******************************************************************************
*******************************************************************************
*/
#include <xf86Version.h>
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(3,9,0,0,0)
#define XFREE86_V4
#endif
#ifdef XFREE86_V4
#ifndef XFree86LOADER
#include <unistd.h>
#include <errno.h>
#endif
#include <misc.h>
#include <xf86.h>
#if !defined(DGUX)
#include <xf86_ansic.h>
#endif
#include <xf86_OSproc.h>
#include <xf86Xinput.h>
#include <exevents.h>
#ifdef XFree86LOADER
#include <xf86Module.h>
#endif
#else /* XFREE86_V4 */
#include "Xos.h"
#include <signal.h>
#include <stdio.h>
#define NEED_EVENTS
#include "X.h"
#include "Xproto.h"
#include "inputstr.h"
#include "scrnintstr.h"
#include "XI.h"
#include "XIproto.h"
#if defined(sun) && !defined(i386)
#include <errno.h>
#include <termio.h>
#include <fcntl.h>
#include <ctype.h>
#include "extio.h"
#else /* defined(sun) && !defined(i386) */
#include "compiler.h"
#include "xf86.h"
#include "xf86Procs.h"
#include "xf86_OSlib.h"
#include "xf86_Config.h"
#include "xf86Xinput.h"
#include "xf86Version.h"
#endif /* defined(sun) && !defined(i386) */
#if !defined(sun) || defined(i386)
#include "os.h"
#include "osdep.h"
#include "exevents.h"
#include "extnsionst.h"
#include "extinit.h"
#endif /* !defined(sun) || defined(i386) */
#endif /* XFREE86_V4 */
#ifndef XFREE86_V4
#if !defined(sun) || defined(i386)
/*
***************************************************************************
*
* Configuration descriptor.
*
***************************************************************************
*/
#define PORT 1
#define ELO_DEVICE_NAME 2
#define SCREEN_NO 3
#define UNTOUCH_DELAY 4
#define REPORT_DELAY 5
#define MAXX 6
#define MAXY 7
#define MINX 8
#define MINY 9
#define DEBUG_LEVEL 10
#define HISTORY_SIZE 11
#define LINK_SPEED 12
#define ALWAYS_CORE 13
#define SWAP_AXES 14
#define PORTRAIT_MODE 15
static SymTabRec EloTab[] = {
{ ENDSUBSECTION, "endsubsection" },
{ PORT, "port" },
{ ELO_DEVICE_NAME, "devicename" },
{ SCREEN_NO, "screenno" },
{ UNTOUCH_DELAY, "untouchdelay" },
{ REPORT_DELAY, "reportdelay"},
{ MAXX, "maximumxposition" },
{ MAXY, "maximumyposition" },
{ MINX, "minimumxposition" },
{ MINY, "minimumyposition" },
{ DEBUG_LEVEL, "debuglevel" },
{ HISTORY_SIZE, "historysize" },
{ LINK_SPEED, "linkspeed" },
{ ALWAYS_CORE, "alwayscore" },
{ SWAP_AXES, "swapxy" },
{ PORTRAIT_MODE, "portraitmode" },
{ -1, "" },
};
#define LS300 1
#define LS1200 2
#define LS2400 3
#define LS9600 4
#define LS19200 5
static SymTabRec LinkSpeedTab[] = {
{ LS300, "b300" },
{ LS1200, "b1200" },
{ LS2400, "b2400" },
{ LS9600, "b9600" },
{ LS19200, "b19200" }
};
#endif /* !defined(sun) || defined(i386) */
/*
* This struct connects a line speed with
* a compatible motion packet delay. The
* driver will attempt to enforce a correct
* delay (according to this table) in order to
* avoid losing data in the touchscreen controller.
* LinkSpeedValues should be kept in sync with
* LinkSpeedTab.
*/
typedef struct {
int speed;
int delay;
} LinkParameterStruct;
static LinkParameterStruct LinkSpeedValues[] = {
{ B300, 32 },
{ B1200, 8 },
{ B2400, 4 },
{ B9600, 1 },
{ B19200, 0 }
};
#endif /* XFREE86_V4 */
/*
***************************************************************************
*
* Default constants.
*
***************************************************************************
*/
#define ELO_MAX_TRIALS 3 /* Number of timeouts waiting for a */
/* pending reply. */
#define ELO_MAX_WAIT 100000 /* Max wait time for a reply (microsec) */
#define ELO_UNTOUCH_DELAY 5 /* 100 ms */
#define ELO_REPORT_DELAY 1 /* 40 ms or 25 motion reports/s */
#define ELO_LINK_SPEED B9600 /* 9600 Bauds */
#define ELO_PORT "/dev/ttyS1"
#define DEFAULT_MAX_X 3000
#define DEFAULT_MIN_X 600
#define DEFAULT_MAX_Y 3000
#define DEFAULT_MIN_Y 600
/*
***************************************************************************
*
* Protocol constants.
*
***************************************************************************
*/
#define ELO_PACKET_SIZE 10
#define ELO_SYNC_BYTE 'U' /* Sync byte. First of a packet. */
#define ELO_TOUCH 'T' /* Report of touchs and motions. Not *
* used by 2310. */
#define ELO_OWNER 'O' /* Report vendor name. */
#define ELO_ID 'I' /* Report of type and features. */
#define ELO_MODE 'M' /* Set current operating mode. */
#define ELO_PARAMETER 'P' /* Set the serial parameters. */
#define ELO_REPORT 'B' /* Set touch reports timings. */
#define ELO_ACK 'A' /* Acknowledge packet */
#define ELO_INIT_CHECKSUM 0xAA /* Initial value of checksum. */
#define ELO_PRESS 0x01 /* Flags in ELO_TOUCH status byte */
#define ELO_STREAM 0x02
#define ELO_RELEASE 0x04
#define ELO_TOUCH_MODE 0x01 /* Flags in ELO_MODE command */
#define ELO_STREAM_MODE 0x02
#define ELO_UNTOUCH_MODE 0x04
#define ELO_RANGE_CHECK_MODE 0x40
#define ELO_TRIM_MODE 0x02
#define ELO_CALIB_MODE 0x04
#define ELO_SCALING_MODE 0x08
#define ELO_TRACKING_MODE 0x40
#define ELO_SERIAL_SPEED 0x06 /* Flags for high speed serial (19200) */
#define ELO_SERIAL_MASK 0xF8
#define ELO_SERIAL_IO '0' /* Indicator byte for PARAMETER command */
/*
***************************************************************************
*
* Usefull macros.
*
***************************************************************************
*/
#define WORD_ASSEMBLY(byte1, byte2) (((byte2) << 8) | (byte1))
#define SYSCALL(call) while(((call) == -1) && (errno == EINTR))
/* This one is handy, thanx Fred ! */
#ifdef DBG
#undef DBG
#endif
#ifdef DEBUG
#undef DEBUG
#endif
static int debug_level = 0;
#define DEBUG 1
#if DEBUG
#define DBG(lvl, f) {if ((lvl) <= debug_level) f;}
#else
#define DBG(lvl, f)
#endif
#ifdef XFREE86_V4
#undef SYSCALL
#undef read
#undef write
#undef close
#undef strdup
#define SYSCALL(call) call
#define read(fd, ptr, num) xf86ReadSerial(fd, ptr, num)
#define write(fd, ptr, num) xf86WriteSerial(fd, ptr, num)
#define close(fd) xf86CloseSerial(fd)
#define strdup(str) xf86strdup(str)
#endif
/*
***************************************************************************
*
* Device private records.
*
***************************************************************************
*/
typedef struct _EloPrivateRec {
char *input_dev; /* The touchscreen input tty */
int min_x; /* Minimum x reported by calibration */
int max_x; /* Maximum x */
int min_y; /* Minimum y reported by calibration */
int max_y; /* Maximum y */
int untouch_delay; /* Delay before reporting an untouch (in ms) */
int report_delay; /* Delay between touch report packets */
#ifndef XFREE86_V4
int link_speed; /* Speed of the RS232 link connecting the ts. */
#endif
int screen_no; /* Screen associated with the device */
int screen_width; /* Width of the associated X screen */
int screen_height; /* Height of the screen */
Bool inited; /* The controller has already been configured ? */
Bool is_a_2310; /* Set if the smartset is a 2310. */
int checksum; /* Current checksum of data in assembly buffer */
int packet_buf_p; /* Assembly buffer pointer */
int swap_axes; /* Swap X an Y axes if != 0 */
unsigned char packet_buf[ELO_PACKET_SIZE]; /* Assembly buffer */
} EloPrivateRec, *EloPrivatePtr;
#ifndef XFREE86_V4
#if !defined(sun) || defined(i386)
/*
***************************************************************************
*
* xf86EloConfig --
* Configure the driver from the configuration data.
*
***************************************************************************
*/
static Bool
xf86EloConfig(LocalDevicePtr *array,
int inx,
int max,
LexPtr val)
{
LocalDevicePtr local = array[inx];
EloPrivatePtr priv = (EloPrivatePtr)(local->private);
int token;
int portrait=0;
while ((token = xf86GetToken(EloTab)) != ENDSUBSECTION) {
switch(token) {
case PORT:
if (xf86GetToken(NULL) != STRING) {
xf86ConfigError("Elographics input port expected");
}
priv->input_dev = strdup(val->str);
if (xf86Verbose) {
ErrorF("%s Elographics input port: %s\n",
XCONFIG_GIVEN, priv->input_dev);
}
break;
case ELO_DEVICE_NAME:
if (xf86GetToken(NULL) != STRING) {
xf86ConfigError("Elographics device name expected");
}
local->name = strdup(val->str);
if (xf86Verbose) {
ErrorF("%s Elographics X device name: %s\n",
XCONFIG_GIVEN, local->name);
}
break;
case SCREEN_NO:
if (xf86GetToken(NULL) != NUMBER) {
xf86ConfigError("Elographics screen number expected");
}
priv->screen_no = val->num;
if (xf86Verbose) {
ErrorF("%s Elographics associated screen: %d\n",
XCONFIG_GIVEN, priv->screen_no);
}
break;
case UNTOUCH_DELAY:
if (xf86GetToken(NULL) != NUMBER) {
xf86ConfigError("Elographics untouch delay expected");
}
priv->untouch_delay = val->num;
if (xf86Verbose) {
ErrorF("%s Elographics untouch delay: %d ms\n",
XCONFIG_GIVEN, priv->untouch_delay*10);
}
break;
case REPORT_DELAY:
if (xf86GetToken(NULL) != NUMBER) {
xf86ConfigError("Elographics report delay expected");
}
priv->report_delay = val->num;
if (xf86Verbose) {
ErrorF("%s Elographics report delay: %d ms\n",
XCONFIG_GIVEN, priv->report_delay*10);
}
break;
case LINK_SPEED:
{
int ltoken = xf86GetToken(LinkSpeedTab);
if (ltoken == EOF ||
ltoken == STRING ||
ltoken == NUMBER) {
xf86ConfigError("Elographics link speed expected");
}
priv->link_speed = LinkSpeedValues[ltoken-1].speed;
if (xf86Verbose) {
ErrorF("%s Elographics link speed: %s bps\n",
XCONFIG_GIVEN, (LinkSpeedTab[ltoken-1].name)+1);
}
}
break;
case MAXX:
if (xf86GetToken(NULL) != NUMBER) {
xf86ConfigError("Elographics maximum x position expected");
}
priv->max_x = val->num;
if (xf86Verbose) {
ErrorF("%s Elographics maximum x position: %d\n",
XCONFIG_GIVEN, priv->max_x);
}
break;
case MAXY:
if (xf86GetToken(NULL) != NUMBER) {
xf86ConfigError("Elographics maximum y position expected");
}
priv->max_y = val->num;
if (xf86Verbose) {
ErrorF("%s Elographics maximum y position: %d\n",
XCONFIG_GIVEN, priv->max_y);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -