diff options
Diffstat (limited to 'hw/kdrive/linux')
-rw-r--r-- | hw/kdrive/linux/Imakefile | 25 | ||||
-rw-r--r-- | hw/kdrive/linux/Makefile.am | 39 | ||||
-rw-r--r-- | hw/kdrive/linux/agp.c | 355 | ||||
-rw-r--r-- | hw/kdrive/linux/agp.h | 71 | ||||
-rw-r--r-- | hw/kdrive/linux/bus.c | 101 | ||||
-rw-r--r-- | hw/kdrive/linux/keyboard.c | 487 | ||||
-rw-r--r-- | hw/kdrive/linux/klinux.h | 34 | ||||
-rw-r--r-- | hw/kdrive/linux/linux.c | 481 | ||||
-rw-r--r-- | hw/kdrive/linux/mouse.c | 1013 | ||||
-rw-r--r-- | hw/kdrive/linux/ms.c | 163 | ||||
-rw-r--r-- | hw/kdrive/linux/ps2.c | 153 | ||||
-rw-r--r-- | hw/kdrive/linux/ts.c | 223 | ||||
-rw-r--r-- | hw/kdrive/linux/tslib.c | 250 |
13 files changed, 0 insertions, 3395 deletions
diff --git a/hw/kdrive/linux/Imakefile b/hw/kdrive/linux/Imakefile deleted file mode 100644 index c4fc2642f..000000000 --- a/hw/kdrive/linux/Imakefile +++ /dev/null @@ -1,25 +0,0 @@ -XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ -XCOMM $RCSId: 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) - -OBJS = keyboard.o linux.o mouse.o ps2.o bus.o ms.o agp.o $(TSOBJS) - -INCLUDES = -I. $(KDINCS) - -NormalLibraryObjectRule() -NormalLibraryTarget(linux,$(OBJS)) - -DependTarget() diff --git a/hw/kdrive/linux/Makefile.am b/hw/kdrive/linux/Makefile.am deleted file mode 100644 index 1edd7713f..000000000 --- a/hw/kdrive/linux/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -INCLUDES = \ - @KDRIVE_INCS@ \ - @XSERVER_CFLAGS@ - - -noinst_LIBRARIES = liblinux.a - -if TSLIB -TSLIB_C = tslib.c -endif - -if H3600_TS -TS_C = ts.c -endif - -liblinux_a_SOURCES = \ - agp.c \ - agp.h \ - bus.c \ - keyboard.c \ - klinux.h \ - linux.c \ - mouse.c \ - ms.c \ - ps2.c \ - $(TSLIB_C) \ - $(TS_C) - -liblinux_a_DEPENDENCIES = \ - agp.c \ - bus.c \ - keyboard.c \ - linux.c \ - mouse.c \ - ms.c \ - ps2.c \ - $(TSLIB_C) \ - $(TS_C) - diff --git a/hw/kdrive/linux/agp.c b/hw/kdrive/linux/agp.c deleted file mode 100644 index d401e03a1..000000000 --- a/hw/kdrive/linux/agp.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Abstraction of the AGP GART interface. - * - * This version is for both Linux and FreeBSD. - * - * Copyright © 2000-2001 Nokia Home Communications - * Copyright © 2000 VA Linux Systems, Inc. - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, provided that the above -copyright notice(s) and this permission notice appear in all copies of -the Software and that both the above copyright notice(s) and this -permission notice appear in supporting documentation. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR 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. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, use -or other dealings in this Software without prior written authorization -of the copyright holder. - - */ - -/* $RCSId: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_agp.c,v 3.4 2000/08/28 18:12:56 dawes Exp $ */ - -/* - * Author: Pontus Lidman <pontus.lidman@nokia.com> (adaption to KDrive) and others - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <X11/X.h> - -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/ioctl.h> - -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <stdlib.h> - -#include "agp.h" - -#if defined(linux) -#include <asm/ioctl.h> - -#include <linux/agpgart.h> - -#elif defined(__FreeBSD__) -#include <sys/ioctl.h> -#include <sys/agpio.h> -#endif - -#ifndef AGP_DEVICE -#define AGP_DEVICE "/dev/agpgart" -#endif -/* AGP page size is independent of the host page size. */ -#ifndef AGP_PAGE_SIZE -#define AGP_PAGE_SIZE 4096 -#endif -#define AGPGART_MAJOR_VERSION 0 -#define AGPGART_MINOR_VERSION 99 - -static int gartFd = -1; -static int acquiredScreen = -1; - -/* - * Open /dev/agpgart. Keep it open until server exit. - */ - -static Bool -GARTInit(void) -{ - static Bool initDone = FALSE; - struct _agp_info agpinf; - - if (initDone) - return (gartFd != -1); - - initDone = TRUE; - - if (gartFd == -1) - gartFd = open(AGP_DEVICE, O_RDWR, 0); - else - return FALSE; - - if (gartFd == -1) { - fprintf(stderr, "Unable to open " AGP_DEVICE " (%s)\n", - strerror(errno)); - return FALSE; - } - - KdAcquireGART(-1); - /* Check the kernel driver version. */ - if (ioctl(gartFd, AGPIOC_INFO, &agpinf) != 0) { - fprintf(stderr, "GARTInit: AGPIOC_INFO failed (%s)\n", - strerror(errno)); - close(gartFd); - gartFd = -1; - return FALSE; - } - KdReleaseGART(-1); - -#if defined(linux) - /* Per Dave Jones, every effort will be made to keep the - * agpgart interface backwards compatible, so allow all - * future versions. - */ - if ( -#if (AGPGART_MAJOR_VERSION > 0) /* quiet compiler */ - agpinf.version.major < AGPGART_MAJOR_VERSION || -#endif - (agpinf.version.major == AGPGART_MAJOR_VERSION && - agpinf.version.minor < AGPGART_MINOR_VERSION)) { - fprintf(stderr, - "Kernel agpgart driver version is not current" - " (%d.%d vs %d.%d)\n", - agpinf.version.major, agpinf.version.minor, - AGPGART_MAJOR_VERSION, AGPGART_MINOR_VERSION); - close(gartFd); - gartFd = -1; - return FALSE; - } -#endif - - return TRUE; -} - -Bool -KdAgpGARTSupported() -{ - return GARTInit(); -} - -AgpInfoPtr -KdGetAGPInfo(int screenNum) -{ - struct _agp_info agpinf; - AgpInfoPtr info; - - if (!GARTInit()) - return NULL; - - - if ((info = calloc(sizeof(AgpInfo), 1)) == NULL) { - fprintf(stderr, "Failed to allocate AgpInfo\n"); - return NULL; - } - - if (ioctl(gartFd, AGPIOC_INFO, &agpinf) != 0) { - fprintf(stderr, - "xf86GetAGPInfo: AGPIOC_INFO failed (%s)\n", - strerror(errno)); - return NULL; - } - - info->bridgeId = agpinf.bridge_id; - info->agpMode = agpinf.agp_mode; - info->base = agpinf.aper_base; - info->size = agpinf.aper_size; - info->totalPages = agpinf.pg_total; - info->systemPages = agpinf.pg_system; - info->usedPages = agpinf.pg_used; - - return info; -} - -/* - * XXX If multiple screens can acquire the GART, should we have a reference - * count instead of using acquiredScreen? - */ - -Bool -KdAcquireGART(int screenNum) -{ - if (screenNum != -1 && !GARTInit()) - return FALSE; - - if (screenNum == -1 || acquiredScreen != screenNum) { - if (ioctl(gartFd, AGPIOC_ACQUIRE, 0) != 0) { - fprintf(stderr, - "AGPIOC_ACQUIRE failed (%s)\n", - strerror(errno)); - return FALSE; - } - acquiredScreen = screenNum; - } - - return TRUE; -} - -Bool -KdReleaseGART(int screenNum) -{ - if (screenNum != -1 && !GARTInit()) - return FALSE; - - if (acquiredScreen == screenNum) { - if (ioctl(gartFd, AGPIOC_RELEASE, 0) != 0) { - fprintf(stderr, - "AGPIOC_RELEASE failed (%s)\n", - strerror(errno)); - return FALSE; - } - acquiredScreen = -1; - return TRUE; - } - return FALSE; -} - -int -KdAllocateGARTMemory(int screenNum, unsigned long size, int type, - unsigned long *physical) -{ - struct _agp_allocate alloc; - int pages; - - /* - * Allocates "size" bytes of GART memory (rounds up to the next - * page multiple) or type "type". A handle (key) for the allocated - * memory is returned. On error, the return value is -1. - */ - - if (!GARTInit() || acquiredScreen != screenNum) - return -1; - - pages = (size / AGP_PAGE_SIZE); - if (size % AGP_PAGE_SIZE != 0) - pages++; - - /* XXX check for pages == 0? */ - - alloc.pg_count = pages; - alloc.type = type; - - if (ioctl(gartFd, AGPIOC_ALLOCATE, &alloc) != 0) { - fprintf(stderr, "KdAllocateGARTMemory: " - "allocation of %d pages failed\n\t(%s)\n", pages, - strerror(errno)); - return -1; - } - - if (physical) - *physical = alloc.physical; - - return alloc.key; -} - - -/* Bind GART memory with "key" at "offset" */ -Bool -KdBindGARTMemory(int screenNum, int key, unsigned long offset) -{ - struct _agp_bind bind; - int pageOffset; - - if (!GARTInit() || acquiredScreen != screenNum) - return FALSE; - - if (acquiredScreen != screenNum) { - fprintf(stderr, - "AGP not acquired by this screen\n"); - return FALSE; - } - - if (offset % AGP_PAGE_SIZE != 0) { - fprintf(stderr, "KdBindGARTMemory: " - "offset (0x%lx) is not page-aligned (%d)\n", - offset, AGP_PAGE_SIZE); - return FALSE; - } - pageOffset = offset / AGP_PAGE_SIZE; - - bind.pg_start = pageOffset; - bind.key = key; - - if (ioctl(gartFd, AGPIOC_BIND, &bind) != 0) { - fprintf(stderr, "KdBindGARTMemory: " - "binding of gart memory with key %d\n" - "\tat offset 0x%lx failed (%s)\n", - key, offset, strerror(errno)); - return FALSE; - } - - return TRUE; -} - - -/* Unbind GART memory with "key" */ -Bool -KdUnbindGARTMemory(int screenNum, int key) -{ - struct _agp_unbind unbind; - - if (!GARTInit() || acquiredScreen != screenNum) - return FALSE; - - if (acquiredScreen != screenNum) { - fprintf(stderr, - "AGP not acquired by this screen\n"); - return FALSE; - } - - unbind.priority = 0; - unbind.key = key; - - if (ioctl(gartFd, AGPIOC_UNBIND, &unbind) != 0) { - fprintf(stderr, "KdUnbindGARTMemory: " - "unbinding of gart memory with key %d " - "failed (%s)\n", key, strerror(errno)); - return FALSE; - } - - return TRUE; -} - - -/* XXX Interface may change. */ -Bool -KdEnableAGP(int screenNum, CARD32 mode) -{ - agp_setup setup; - - if (!GARTInit() || acquiredScreen != screenNum) - return FALSE; - - setup.agp_mode = mode; - if (ioctl(gartFd, AGPIOC_SETUP, &setup) != 0) { - fprintf(stderr, "KdEnableAGP: " - "AGPIOC_SETUP with mode %ld failed (%s)\n", - mode, strerror(errno)); - return FALSE; - } - - return TRUE; -} - diff --git a/hw/kdrive/linux/agp.h b/hw/kdrive/linux/agp.h deleted file mode 100644 index 419dee1b4..000000000 --- a/hw/kdrive/linux/agp.h +++ /dev/null @@ -1,71 +0,0 @@ -/* COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 2000, 2001 Nokia Home Communications - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, provided that the above -copyright notice(s) and this permission notice appear in all copies of -the Software and that both the above copyright notice(s) and this -permission notice appear in supporting documentation. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR 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. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, use -or other dealings in this Software without prior written authorization -of the copyright holder. - -X Window System is a trademark of The Open Group */ - -/* agp.h - header file for KDrive AGP GART interface - * - * Author: Pontus Lidman <pontus.lidman@nokia.com> - * - */ - -#ifndef _AGP_H_ -#define _AGP_H_ - -#include <X11/Xdefs.h> -#include <X11/Xmd.h> - -/* These two definitions must be consistent with the kernel's, - but using 1 or 2 in driver code is even uglier */ -#define AGP_DCACHE_MEMORY 1 -#define AGP_PHYS_MEMORY 2 - -typedef struct _AgpInfo { - unsigned long bridgeId; - unsigned long agpMode; - unsigned long base; - unsigned long size; - unsigned long totalPages; - unsigned long systemPages; - unsigned long usedPages; -} AgpInfo, *AgpInfoPtr; - -extern Bool KdAgpGARTSupported(void); -extern AgpInfoPtr KdGetAGPInfo(int screenNum); -extern Bool KdAcquireGART(int screenNum); -extern Bool KdReleaseGART(int screenNum); -extern int KdAllocateGARTMemory(int screenNum, unsigned long size, int type, - unsigned long *physical); -extern Bool KdBindGARTMemory(int screenNum, int key, unsigned long offset); -extern Bool KdUnbindGARTMemory(int screenNum, int key); -extern Bool KdEnableAGP(int screenNum, CARD32 mode); - -#endif /* _AGP_H_ */ diff --git a/hw/kdrive/linux/bus.c b/hw/kdrive/linux/bus.c deleted file mode 100644 index 15d2ba846..000000000 --- a/hw/kdrive/linux/bus.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/bus.c,v 1.2 2001/06/29 14:00:41 keithp Exp $ - * - * Copyright © 2000 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" - -/* /dev/adbmouse is a busmouse */ - -static void -BusRead (int adbPort, void *closure) -{ - unsigned char buf[3]; - int n; - int dx, dy; - unsigned long flags; - - n = read (adbPort, buf, 3); - if (n == 3) - { - flags = KD_MOUSE_DELTA; - dx = (char) buf[1]; - dy = -(char) buf[2]; - if ((buf[0] & 4) == 0) - flags |= KD_BUTTON_1; - if ((buf[0] & 2) == 0) - flags |= KD_BUTTON_2; - if ((buf[0] & 1) == 0) - flags |= KD_BUTTON_3; - KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); - } -} - -char *BusNames[] = { - "/dev/adbmouse", - "/dev/mouse", -}; - -#define NUM_BUS_NAMES (sizeof (BusNames) / sizeof (BusNames[0])) - -int BusInputType; - -static int -BusInit (void) -{ - int i; - int busPort; - int n = 0; - - if (!BusInputType) - BusInputType = KdAllocInputType (); - - for (i = 0; i < NUM_BUS_NAMES; i++) - { - busPort = open (BusNames[i], 0); - { - KdRegisterFd (BusInputType, busPort, BusRead, 0); - n++; - } - } - return n; -} - -static void -BusFini (void) -{ - KdUnregisterFds (BusInputType, TRUE); -} - -KdMouseFuncs BusMouseFuncs = { - BusInit, - BusFini -}; diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c deleted file mode 100644 index 97b0683de..000000000 --- a/hw/kdrive/linux/keyboard.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/keyboard.c,v 1.10 2001/11/08 10:26:24 keithp Exp $ - * - * Copyright © 1999 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "kdrive.h" -#include "kkeymap.h" -#include <linux/keyboard.h> -#include <linux/kd.h> -#define XK_PUBLISHING -#include <X11/keysym.h> -#include <termios.h> -#include <sys/ioctl.h> - -extern int LinuxConsoleFd; - -static const KeySym linux_to_x[256] = { - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - XK_BackSpace, XK_Tab, XK_Linefeed, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, XK_Escape, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - XK_space, XK_exclam, XK_quotedbl, XK_numbersign, - XK_dollar, XK_percent, XK_ampersand, XK_apostrophe, - XK_parenleft, XK_parenright, XK_asterisk, XK_plus, - XK_comma, XK_minus, XK_period, XK_slash, - XK_0, XK_1, XK_2, XK_3, - XK_4, XK_5, XK_6, XK_7, - XK_8, XK_9, XK_colon, XK_semicolon, - XK_less, XK_equal, XK_greater, XK_question, - XK_at, XK_A, XK_B, XK_C, - XK_D, XK_E, XK_F, XK_G, - XK_H, XK_I, XK_J, XK_K, - XK_L, XK_M, XK_N, XK_O, - XK_P, XK_Q, XK_R, XK_S, - XK_T, XK_U, XK_V, XK_W, - XK_X, XK_Y, XK_Z, XK_bracketleft, - XK_backslash, XK_bracketright,XK_asciicircum, XK_underscore, - XK_grave, XK_a, XK_b, XK_c, - XK_d, XK_e, XK_f, XK_g, - XK_h, XK_i, XK_j, XK_k, - XK_l, XK_m, XK_n, XK_o, - XK_p, XK_q, XK_r, XK_s, - XK_t, XK_u, XK_v, XK_w, - XK_x, XK_y, XK_z, XK_braceleft, - XK_bar, XK_braceright, XK_asciitilde, XK_BackSpace, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - NoSymbol, NoSymbol, NoSymbol, NoSymbol, - XK_nobreakspace,XK_exclamdown, XK_cent, XK_sterling, - XK_currency, XK_yen, XK_brokenbar, XK_section, - XK_diaeresis, XK_copyright, XK_ordfeminine, XK_guillemotleft, - XK_notsign, XK_hyphen, XK_registered, XK_macron, - XK_degree, XK_plusminus, XK_twosuperior, XK_threesuperior, - XK_acute, XK_mu, XK_paragraph, XK_periodcentered, - XK_cedilla, XK_onesuperior, XK_masculine, XK_guillemotright, - XK_onequarter, XK_onehalf, XK_threequarters,XK_questiondown, - XK_Agrave, XK_Aacute, XK_Acircumflex, XK_Atilde, - XK_Adiaeresis, XK_Aring, XK_AE, XK_Ccedilla, - XK_Egrave, XK_Eacute, XK_Ecircumflex, XK_Ediaeresis, - XK_Igrave, XK_Iacute, XK_Icircumflex, XK_Idiaeresis, - XK_ETH, XK_Ntilde, XK_Ograve, XK_Oacute, - XK_Ocircumflex, XK_Otilde, XK_Odiaeresis, XK_multiply, - XK_Ooblique, XK_Ugrave, XK_Uacute, XK_Ucircumflex, - XK_Udiaeresis, XK_Yacute, XK_THORN, XK_ssharp, - XK_agrave, XK_aacute, XK_acircumflex, XK_atilde, - XK_adiaeresis, XK_aring, XK_ae, XK_ccedilla, - XK_egrave, XK_eacute, XK_ecircumflex, XK_ediaeresis, - XK_igrave, XK_iacute, XK_icircumflex, XK_idiaeresis, - XK_eth, XK_ntilde, XK_ograve, XK_oacute, - XK_ocircumflex, XK_otilde, XK_odiaeresis, XK_division, - XK_oslash, XK_ugrave, XK_uacute, XK_ucircumflex, - XK_udiaeresis, XK_yacute, XK_thorn, XK_ydiaeresis -}; - -static unsigned char tbl[KD_MAX_WIDTH] = -{ - 0, - 1 << KG_SHIFT, - (1 << KG_ALTGR), - (1 << KG_ALTGR) | (1 << KG_SHIFT) -}; - -static void -readKernelMapping(void) -{ - KeySym *k; - int i, j; - struct kbentry kbe; - int minKeyCode, maxKeyCode; - int row; - - minKeyCode = NR_KEYS; - maxKeyCode = 0; - row = 0; - for (i = 0; i < NR_KEYS && row < KD_MAX_LENGTH; ++i) - { - kbe.kb_index = i; - - k = kdKeymap + row * KD_MAX_WIDTH; - - for (j = 0; j < KD_MAX_WIDTH; ++j) - { - unsigned short kval; - - k[j] = NoSymbol; - - kbe.kb_table = tbl[j]; - kbe.kb_value = 0; - if (ioctl(LinuxConsoleFd, KDGKBENT, &kbe)) - continue; - - kval = KVAL(kbe.kb_value); - switch (KTYP(kbe.kb_value)) - { - case KT_LATIN: - case KT_LETTER: - k[j] = linux_to_x[kval]; - break; - - case KT_FN: - if (kval <= 19) - k[j] = XK_F1 + kval; - else switch (kbe.kb_value) - { - case K_FIND: - k[j] = XK_Home; /* or XK_Find */ - break; - case K_INSERT: - k[j] = XK_Insert; - break; - case K_REMOVE: - k[j] = XK_Delete; - break; - case K_SELECT: - k[j] = XK_End; /* or XK_Select */ - break; - case K_PGUP: - k[j] = XK_Prior; - break; - case K_PGDN: - k[j] = XK_Next; - break; - case K_HELP: - k[j] = XK_Help; - break; - case K_DO: - k[j] = XK_Execute; - break; - case K_PAUSE: - k[j] = XK_Pause; - break; - case K_MACRO: - k[j] = XK_Menu; - break; - default: - break; - } - break; - - case KT_SPEC: - switch (kbe.kb_value) - { - case K_ENTER: - k[j] = XK_Return; - break; - case K_BREAK: - k[j] = XK_Break; - break; - case K_CAPS: - k[j] = XK_Caps_Lock; - break; - case K_NUM: - k[j] = XK_Num_Lock; - break; - case K_HOLD: - k[j] = XK_Scroll_Lock; - break; - case K_COMPOSE: - k[j] = XK_Multi_key; - break; - default: - break; - } - break; - - case KT_PAD: - switch (kbe.kb_value) - { - case K_PPLUS: - k[j] = XK_KP_Add; - break; - case K_PMINUS: - k[j] = XK_KP_Subtract; - break; - case K_PSTAR: - k[j] = XK_KP_Multiply; - break; - case K_PSLASH: - k[j] = XK_KP_Divide; - break; - case K_PENTER: - k[j] = XK_KP_Enter; - break; - case K_PCOMMA: - k[j] = XK_KP_Separator; - break; - case K_PDOT: - k[j] = XK_KP_Decimal; - break; - case K_PPLUSMINUS: - k[j] = XK_KP_Subtract; - break; - default: - if (kval <= 9) - k[j] = XK_KP_0 + kval; - break; - } - break; - - /* - * KT_DEAD keys are for accelerated diacritical creation. - */ - case KT_DEAD: - switch (kbe.kb_value) - { - case K_DGRAVE: - k[j] = XK_dead_grave; - break; - case K_DACUTE: - k[j] = XK_dead_acute; - break; - case K_DCIRCM: - k[j] = XK_dead_circumflex; - break; - case K_DTILDE: - k[j] = XK_dead_tilde; - break; - case K_DDIERE: - k[j] = XK_dead_diaeresis; - break; - } - break; - - case KT_CUR: - switch (kbe.kb_value) - { - case K_DOWN: - k[j] = XK_Down; - break; - case K_LEFT: - k[j] = XK_Left; - break; - case K_RIGHT: - k[j] = XK_Right; - break; - case K_UP: - k[j] = XK_Up; - break; - } - break; - - case KT_SHIFT: - switch (kbe.kb_value) - { - case K_ALTGR: - k[j] = XK_Mode_switch; - break; - case K_ALT: - k[j] = (kbe.kb_index == 0x64 ? - XK_Alt_R : XK_Alt_L); - break; - case K_CTRL: - k[j] = (kbe.kb_index == 0x61 ? - XK_Control_R : XK_Control_L); - break; - case K_CTRLL: - k[j] = XK_Control_L; - break; - case K_CTRLR: - k[j] = XK_Control_R; - break; - case K_SHIFT: - k[j] = (kbe.kb_index == 0x36 ? - XK_Shift_R : XK_Shift_L); - break; - case K_SHIFTL: - k[j] = XK_Shift_L; - break; - case K_SHIFTR: - k[j] = XK_Shift_R; - break; - default: - break; - } - break; - - /* - * KT_ASCII keys accumulate a 3 digit decimal number that gets - * emitted when the shift state changes. We can't emulate that. - */ - case KT_ASCII: - break; - - case KT_LOCK: - if (kbe.kb_value == K_SHIFTLOCK) - k[j] = XK_Shift_Lock; - break; - -#ifdef KT_X - case KT_X: - /* depends on new keyboard symbols in file linux/keyboard.h */ - if(kbe.kb_value == K_XMENU) k[j] = XK_Menu; - if(kbe.kb_value == K_XTELEPHONE) k[j] = XK_telephone; - break; -#endif -#ifdef KT_XF - case KT_XF: - /* special linux keysyms which map directly to XF86 keysyms */ - k[j] = (kbe.kb_value & 0xFF) + 0x1008FF00; - break; -#endif - - default: - break; - } - if (i < minKeyCode) - minKeyCode = i; - if (i > maxKeyCode) - maxKeyCode = i; - } - - if (minKeyCode == NR_KEYS) - continue; - - if (k[3] == k[2]) k[3] = NoSymbol; - if (k[2] == k[1]) k[2] = NoSymbol; - if (k[1] == k[0]) k[1] = NoSymbol; - if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol; - if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] =NoSymbol; - row++; - } - kdMinScanCode = minKeyCode; - kdMaxScanCode = maxKeyCode; -} - -static void -LinuxKeyboardLoad (void) -{ - readKernelMapping (); -} - -static void -LinuxKeyboardRead (int fd, void *closure) -{ - unsigned char buf[256], *b; - int n; - - while ((n = read (fd, buf, sizeof (buf))) > 0) - { - b = buf; - while (n--) - { - KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80); - b++; - } - } -} - -static int LinuxKbdTrans; -static struct termios LinuxTermios; -static int LinuxKbdType; - -static int -LinuxKeyboardEnable (int fd, void *closure) -{ - struct termios nTty; - unsigned char buf[256]; - int n; - - ioctl (fd, KDGKBMODE, &LinuxKbdTrans); - tcgetattr (fd, &LinuxTermios); - - ioctl(fd, KDSKBMODE, K_MEDIUMRAW); - nTty = LinuxTermios; - nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP); - nTty.c_oflag = 0; - nTty.c_cflag = CREAD | CS8; - nTty.c_lflag = 0; - nTty.c_cc[VTIME]=0; - nTty.c_cc[VMIN]=1; - cfsetispeed(&nTty, 9600); - cfsetospeed(&nTty, 9600); - tcsetattr(fd, TCSANOW, &nTty); - /* - * Flush any pending keystrokes - */ - while ((n = read (fd, buf, sizeof (buf))) > 0) - ; - return fd; -} - -static void -LinuxKeyboardDisable (int fd, void *closure) -{ - ioctl(LinuxConsoleFd, KDSKBMODE, LinuxKbdTrans); - tcsetattr(LinuxConsoleFd, TCSANOW, &LinuxTermios); -} - -static int -LinuxKeyboardInit (void) -{ - if (!LinuxKbdType) - LinuxKbdType = KdAllocInputType (); - - KdRegisterFd (LinuxKbdType, LinuxConsoleFd, LinuxKeyboardRead, 0); - LinuxKeyboardEnable (LinuxConsoleFd, 0); - KdRegisterFdEnableDisable (LinuxConsoleFd, - LinuxKeyboardEnable, - LinuxKeyboardDisable); - return 1; -} - -static void -LinuxKeyboardFini (void) -{ - LinuxKeyboardDisable (LinuxConsoleFd, 0); - KdUnregisterFds (LinuxKbdType, FALSE); -} - -static void -LinuxKeyboardLeds (int leds) -{ - ioctl (LinuxConsoleFd, KDSETLED, leds & 7); -} - -static void -LinuxKeyboardBell (int volume, int pitch, int duration) -{ - if (volume && pitch) - { - ioctl(LinuxConsoleFd, KDMKTONE, - ((1193190 / pitch) & 0xffff) | - (((unsigned long)duration * - volume / 50) << 16)); - - } -} - -KdKeyboardFuncs LinuxKeyboardFuncs = { - LinuxKeyboardLoad, - LinuxKeyboardInit, - LinuxKeyboardLeds, - LinuxKeyboardBell, - LinuxKeyboardFini, - 3, -}; diff --git a/hw/kdrive/linux/klinux.h b/hw/kdrive/linux/klinux.h deleted file mode 100644 index 29ebe3aa9..000000000 --- a/hw/kdrive/linux/klinux.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * $Id$ - * - * Copyright © 2003 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifndef _KLINUX_H_ -#define _KLINUX_H_ - -Bool -LinuxFindPci (CARD16 vendor, CARD16 device, CARD32 count, KdCardAttr *attr); - -unsigned char * -LinuxGetPciCfg(KdCardAttr *attr); - -#endif /* _KLINUX_H_ */ diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c deleted file mode 100644 index 23ae50452..000000000 --- a/hw/kdrive/linux/linux.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/linux.c,v 1.6 2001/07/24 21:26:17 keithp Exp $ - * - * Copyright © 1999 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "kdrive.h" -#include "klinux.h" -#include <errno.h> -#include <signal.h> -#include <linux/vt.h> -#include <linux/kd.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <X11/keysym.h> -#include <linux/apm_bios.h> - -static int vtno; -int LinuxConsoleFd; -int LinuxApmFd = -1; -static int activeVT; -static Bool enabled; - -static void -LinuxVTRequest (int sig) -{ - kdSwitchPending = TRUE; -} - -/* Check before chowning -- this avoids touching the file system */ -static void -LinuxCheckChown (char *file) -{ - struct stat st; - __uid_t u; - __gid_t g; - - if (stat (file, &st) < 0) - return; - u = getuid (); - g = getgid (); - if (st.st_uid != u || st.st_gid != g) - chown (file, u, g); -} - -static int -LinuxInit (void) -{ - int fd = -1; - char vtname[11]; - struct vt_stat vts; - - LinuxConsoleFd = -1; - /* check if we're run with euid==0 */ - if (geteuid() != 0) - { - FatalError("LinuxInit: Server must be suid root\n"); - } - - if (kdVirtualTerminal >= 0) - vtno = kdVirtualTerminal; - else - { - if ((fd = open("/dev/tty0",O_WRONLY,0)) < 0) - { - FatalError( - "LinuxInit: Cannot open /dev/tty0 (%s)\n", - strerror(errno)); - } - if ((ioctl(fd, VT_OPENQRY, &vtno) < 0) || - (vtno == -1)) - { - FatalError("xf86OpenConsole: Cannot find a free VT\n"); - } - } - close(fd); - - sprintf(vtname,"/dev/tty%d",vtno); /* /dev/tty1-64 */ - - if ((LinuxConsoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) < 0) - { - FatalError("LinuxInit: Cannot open %s (%s)\n", - vtname, strerror(errno)); - } - - /* change ownership of the vt */ - LinuxCheckChown (vtname); - - /* - * the current VT device we're running on is not "console", we want - * to grab all consoles too - * - * Why is this needed? - */ - LinuxCheckChown ("/dev/tty0"); - /* - * Linux doesn't switch to an active vt after the last close of a vt, - * so we do this ourselves by remembering which is active now. - */ - memset (&vts, '\0', sizeof (vts)); /* valgrind */ - if (ioctl(LinuxConsoleFd, VT_GETSTATE, &vts) == 0) - { - activeVT = vts.v_active; - } - - return 1; -} - -Bool -LinuxFindPci (CARD16 vendor, CARD16 device, CARD32 count, KdCardAttr *attr) -{ - FILE *f; - char line[2048], *l, *end; - CARD32 bus, id, addr; - int n; - CARD32 ven_dev; - Bool ret = FALSE; - int i; - - attr->vendorID = vendor; - attr->deviceID = device; - ven_dev = (((CARD32) vendor) << 16) | ((CARD32) device); - f = fopen ("/proc/bus/pci/devices", "r"); - if (!f) - return FALSE; - attr->io = 0; - while (fgets (line, sizeof (line)-1, f)) - { - line[sizeof(line)-1] = '\0'; - l = line; - bus = strtoul (l, &end, 16); - if (end == l) - continue; - l = end; - id = strtoul (l, &end, 16); - if (end == l) - continue; - l = end; - if (id != ven_dev) - continue; - if (count--) - continue; - (void) strtoul (l, &end, 16); /* IRQ */ - if (end == l) - continue; - l = end; - n = 0; - for (i = 0; i < 6; i++) - { - addr = strtoul (l, &end, 16); - if (end == l) - break; - if (addr & 1) - attr->io = addr & ~0xf; - else - { - if (n == KD_MAX_CARD_ADDRESS) - break; - attr->address[n++] = addr & ~0xf; - } - l = end; - } - while (n > 0) - { - if (attr->address[n-1] != 0) - break; - n--; - } - attr->naddr = n; - attr->domain = 0; /* XXX */ - attr->bus = (bus >> 8) & 0xff; - attr->slot = (bus >> 3) & 0x1f; - attr->func = bus & 0x07; - ret = TRUE; - break; - } - fclose (f); - return ret; -} - -unsigned char * -LinuxGetPciCfg(KdCardAttr *attr) -{ - char filename[256]; - FILE *f; - unsigned char *cfg; - int r; - - snprintf(filename, 255, "/proc/bus/pci/%02x/%02x.%x", - attr->bus >> 8, (attr->bus & 0xff) >> 3, attr->bus & 7); -/* fprintf(stderr,"Find card on path %s\n",filename); */ - - if (!(f=fopen(filename,"r"))) - return NULL; - - if (!(cfg=xalloc(256))) - { - fclose(f); - return NULL; - } - - if (256 != (r=fread(cfg, 1, 256, f))) - { - fprintf(stderr,"LinuxGetPciCfg: read %d, expected 256\n",r); - free(cfg); - cfg=NULL; - } - fclose(f); -/* fprintf(stderr,"LinuxGetPciCfg: success, returning %p\n",cfg); */ - return cfg; -} - -static void -LinuxSetSwitchMode (int mode) -{ - struct sigaction act; - struct vt_mode VT; - - if (ioctl(LinuxConsoleFd, VT_GETMODE, &VT) < 0) - { - FatalError ("LinuxInit: VT_GETMODE failed\n"); - } - - if (mode == VT_PROCESS) - { - act.sa_handler = LinuxVTRequest; - sigemptyset (&act.sa_mask); - act.sa_flags = 0; - sigaction (SIGUSR1, &act, 0); - - VT.mode = mode; - VT.relsig = SIGUSR1; - VT.acqsig = SIGUSR1; - } - else - { - act.sa_handler = SIG_IGN; - sigemptyset (&act.sa_mask); - act.sa_flags = 0; - sigaction (SIGUSR1, &act, 0); - - VT.mode = mode; - VT.relsig = 0; - VT.acqsig = 0; - } - if (ioctl(LinuxConsoleFd, VT_SETMODE, &VT) < 0) - { - FatalError("LinuxInit: VT_SETMODE failed\n"); - } -} - -static void -LinuxApmBlock (pointer blockData, OSTimePtr pTimeout, pointer pReadmask) -{ -} - -static Bool LinuxApmRunning; - -static void -LinuxApmWakeup (pointer blockData, int result, pointer pReadmask) -{ - fd_set *readmask = (fd_set *) pReadmask; - - if (result > 0 && LinuxApmFd >= 0 && FD_ISSET (LinuxApmFd, readmask)) - { - apm_event_t event; - Bool running = LinuxApmRunning; - int cmd = APM_IOC_SUSPEND; - - while (read (LinuxApmFd, &event, sizeof (event)) == sizeof (event)) - { - switch (event) { - case APM_SYS_STANDBY: - case APM_USER_STANDBY: - running = FALSE; - cmd = APM_IOC_STANDBY; - break; - case APM_SYS_SUSPEND: - case APM_USER_SUSPEND: - case APM_CRITICAL_SUSPEND: - running = FALSE; - cmd = APM_IOC_SUSPEND; - break; - case APM_NORMAL_RESUME: - case APM_CRITICAL_RESUME: - case APM_STANDBY_RESUME: - running = TRUE; - break; - } - } - if (running && !LinuxApmRunning) - { - KdResume (); - LinuxApmRunning = TRUE; - } - else if (!running && LinuxApmRunning) - { - KdSuspend (); - LinuxApmRunning = FALSE; - ioctl (LinuxApmFd, cmd, 0); - } - } -} - -#ifdef FNONBLOCK -#define NOBLOCK FNONBLOCK -#else -#define NOBLOCK FNDELAY -#endif - -static void -LinuxEnable (void) -{ - if (enabled) - return; - if (kdSwitchPending) - { - kdSwitchPending = FALSE; - ioctl (LinuxConsoleFd, VT_RELDISP, VT_ACKACQ); - } - /* - * Open the APM driver - */ - LinuxApmFd = open ("/dev/apm_bios", 2); - if (LinuxApmFd < 0 && errno == ENOENT) - LinuxApmFd = open ("/dev/misc/apm_bios", 2); - if (LinuxApmFd >= 0) - { - LinuxApmRunning = TRUE; - fcntl (LinuxApmFd, F_SETFL, fcntl (LinuxApmFd, F_GETFL) | NOBLOCK); - RegisterBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); - AddEnabledDevice (LinuxApmFd); - } - - /* - * now get the VT - */ - LinuxSetSwitchMode (VT_AUTO); - if (ioctl(LinuxConsoleFd, VT_ACTIVATE, vtno) != 0) - { - FatalError("LinuxInit: VT_ACTIVATE failed\n"); - } - if (ioctl(LinuxConsoleFd, VT_WAITACTIVE, vtno) != 0) - { - FatalError("LinuxInit: VT_WAITACTIVE failed\n"); - } - LinuxSetSwitchMode (VT_PROCESS); - if (ioctl(LinuxConsoleFd, KDSETMODE, KD_GRAPHICS) < 0) - { - FatalError("LinuxInit: KDSETMODE KD_GRAPHICS failed\n"); - } - enabled = TRUE; -} - -static Bool -LinuxSpecialKey (KeySym sym) -{ - struct vt_stat vts; - int con; - - if (XK_F1 <= sym && sym <= XK_F12) - { - con = sym - XK_F1 + 1; - memset (&vts, '\0', sizeof (vts)); /* valgrind */ - ioctl (LinuxConsoleFd, VT_GETSTATE, &vts); - if (con != vts.v_active && (vts.v_state & (1 << con))) - { - ioctl (LinuxConsoleFd, VT_ACTIVATE, con); - return TRUE; - } - } - return FALSE; -} - -static void -LinuxDisable (void) -{ - ioctl(LinuxConsoleFd, KDSETMODE, KD_TEXT); /* Back to text mode ... */ - if (kdSwitchPending) - { - kdSwitchPending = FALSE; - ioctl (LinuxConsoleFd, VT_RELDISP, 1); - } - enabled = FALSE; - if (LinuxApmFd >= 0) - { - RemoveBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0); - RemoveEnabledDevice (LinuxApmFd); - close (LinuxApmFd); - LinuxApmFd = -1; - } -} - -static void -LinuxFini (void) -{ - struct vt_mode VT; - struct vt_stat vts; - int fd; - - if (LinuxConsoleFd < 0) - return; - - if (ioctl(LinuxConsoleFd, VT_GETMODE, &VT) != -1) - { - VT.mode = VT_AUTO; - ioctl(LinuxConsoleFd, VT_SETMODE, &VT); /* set dflt vt handling */ - } - memset (&vts, '\0', sizeof (vts)); /* valgrind */ - ioctl (LinuxConsoleFd, VT_GETSTATE, &vts); - /* - * Find a legal VT to switch to, either the one we started from - * or the lowest active one that isn't ours - */ - if (activeVT < 0 || - activeVT == vts.v_active || - !(vts.v_state & (1 << activeVT))) - { - for (activeVT = 1; activeVT < 16; activeVT++) - if (activeVT != vtno && (vts.v_state & (1 << activeVT))) - break; - if (activeVT == 16) - activeVT = -1; - } - /* - * Perform a switch back to the active VT when we were started - */ - if (activeVT >= -1) - { - ioctl (LinuxConsoleFd, VT_ACTIVATE, activeVT); - ioctl (LinuxConsoleFd, VT_WAITACTIVE, activeVT); - activeVT = -1; - } - close(LinuxConsoleFd); /* make the vt-manager happy */ - fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0); - if (fd >= 0) - { - memset (&vts, '\0', sizeof (vts)); /* valgrind */ - ioctl (fd, VT_GETSTATE, &vts); - if (ioctl (fd, VT_DISALLOCATE, vtno) < 0) - fprintf (stderr, "Can't deallocate console %d errno %d\n", vtno, errno); - close (fd); - } - return; -} - -KdOsFuncs LinuxFuncs = { - LinuxInit, - LinuxEnable, - LinuxSpecialKey, - LinuxDisable, - LinuxFini, - 0 -}; - -void -OsVendorInit (void) -{ - KdOsInit (&LinuxFuncs); -} diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c deleted file mode 100644 index 4a0c09a3e..000000000 --- a/hw/kdrive/linux/mouse.c +++ /dev/null @@ -1,1013 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/mouse.c,v 1.6 2002/08/02 16:11:35 keithp Exp $ - * - * Copyright © 2001 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <errno.h> -#include <termios.h> -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" - -#undef DEBUG -#undef DEBUG_BYTES -#define KBUFIO_SIZE 256 -#define MOUSE_TIMEOUT 100 - -typedef struct _kbufio { - int fd; - unsigned char buf[KBUFIO_SIZE]; - int avail; - int used; -} Kbufio; - -static Bool -MouseWaitForReadable (int fd, int timeout) -{ - fd_set set; - struct timeval tv, *tp; - int n; - CARD32 done; - - done = GetTimeInMillis () + timeout; - for (;;) - { - FD_ZERO (&set); - FD_SET (fd, &set); - if (timeout == -1) - tp = 0; - else - { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - tp = &tv; - } - n = select (fd + 1, &set, 0, 0, tp); - if (n > 0) - return TRUE; - if (n < 0 && (errno == EAGAIN || errno == EINTR)) - { - timeout = (int) (done - GetTimeInMillis ()); - if (timeout > 0) - continue; - } - break; - } - return FALSE; -} - -static int -MouseReadByte (Kbufio *b, int timeout) -{ - int n; - if (b->avail <= b->used) - { - if (timeout && !MouseWaitForReadable (b->fd, timeout)) - { -#ifdef DEBUG_BYTES - ErrorF ("\tTimeout %d\n", timeout); -#endif - return -1; - } - n = read (b->fd, b->buf, KBUFIO_SIZE); - if (n <= 0) - return -1; - b->avail = n; - b->used = 0; - } -#ifdef DEBUG_BYTES - ErrorF ("\tget %02x\n", b->buf[b->used]); -#endif - return b->buf[b->used++]; -} - -#if NOTUSED -static int -MouseFlush (Kbufio *b, char *buf, int size) -{ - CARD32 now = GetTimeInMillis (); - CARD32 done = now + 100; - int c; - int n = 0; - - while ((c = MouseReadByte (b, done - now)) != -1) - { - if (buf) - { - if (n == size) - { - memmove (buf, buf + 1, size - 1); - n--; - } - buf[n++] = c; - } - now = GetTimeInMillis (); - if ((INT32) (now - done) >= 0) - break; - } - return n; -} - -static int -MousePeekByte (Kbufio *b, int timeout) -{ - int c; - - c = MouseReadByte (b, timeout); - if (c != -1) - --b->used; - return c; -} -#endif /* NOTUSED */ - -static Bool -MouseWaitForWritable (int fd, int timeout) -{ - fd_set set; - struct timeval tv, *tp; - int n; - - FD_ZERO (&set); - FD_SET (fd, &set); - if (timeout == -1) - tp = 0; - else - { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - tp = &tv; - } - n = select (fd + 1, 0, &set, 0, tp); - if (n > 0) - return TRUE; - return FALSE; -} - -static Bool -MouseWriteByte (int fd, unsigned char c, int timeout) -{ - int ret; - -#ifdef DEBUG_BYTES - ErrorF ("\tput %02x\n", c); -#endif - for (;;) - { - ret = write (fd, &c, 1); - if (ret == 1) - return TRUE; - if (ret == 0) - return FALSE; - if (errno != EWOULDBLOCK) - return FALSE; - if (!MouseWaitForWritable (fd, timeout)) - return FALSE; - } -} - -static Bool -MouseWriteBytes (int fd, unsigned char *c, int n, int timeout) -{ - while (n--) - if (!MouseWriteByte (fd, *c++, timeout)) - return FALSE; - return TRUE; -} - -#define MAX_MOUSE 10 /* maximum length of mouse protocol */ -#define MAX_SKIP 16 /* number of error bytes before switching */ -#define MAX_VALID 4 /* number of valid packets before accepting */ - -typedef struct _kmouseProt { - char *name; - Bool (*Complete) (KdMouseInfo *mi, unsigned char *ev, int ne); - int (*Valid) (KdMouseInfo *mi, unsigned char *ev, int ne); - Bool (*Parse) (KdMouseInfo *mi, unsigned char *ev, int ne); - Bool (*Init) (KdMouseInfo *mi); - unsigned char headerMask, headerValid; - unsigned char dataMask, dataValid; - Bool tty; - unsigned int c_iflag; - unsigned int c_oflag; - unsigned int c_lflag; - unsigned int c_cflag; - unsigned int speed; - unsigned char *init; - unsigned long state; -} KmouseProt; - -typedef enum _kmouseStage { - MouseBroken, MouseTesting, MouseWorking -} KmouseStage; - -typedef struct _kmouse { - Kbufio iob; - const KmouseProt *prot; - int i_prot; - KmouseStage stage; /* protocol verification stage */ - Bool tty; /* mouse device is a tty */ - int valid; /* sequential valid events */ - int tested; /* bytes scanned during Testing phase */ - int invalid;/* total invalid bytes for this protocol */ - unsigned long state; /* private per protocol, init to prot->state */ -} Kmouse; - -static int mouseValid (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - const KmouseProt *prot = km->prot; - int i; - - for (i = 0; i < ne; i++) - if ((ev[i] & prot->headerMask) == prot->headerValid) - break; - if (i != 0) - return i; - for (i = 1; i < ne; i++) - if ((ev[i] & prot->dataMask) != prot->dataValid) - return -1; - return 0; -} - -static Bool threeComplete (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - return ne == 3; -} - -static Bool fourComplete (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - return ne == 4; -} - -static Bool fiveComplete (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - return ne == 5; -} - -static Bool MouseReasonable (KdMouseInfo *mi, unsigned long flags, int dx, int dy) -{ - Kmouse *km = mi->driver; - - if (km->stage == MouseWorking) - return TRUE; - if (dx < -50 || dx > 50) - { -#ifdef DEBUG - ErrorF ("Large X %d\n", dx); -#endif - return FALSE; - } - if (dy < -50 || dy > 50) - { -#ifdef DEBUG - ErrorF ("Large Y %d\n", dy); -#endif - return FALSE; - } - return TRUE; -} - -/* - * Standard PS/2 mouse protocol - */ -static Bool ps2Parse (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - int dx, dy, dz; - unsigned long flags; - unsigned long flagsrelease = 0; - - flags = KD_MOUSE_DELTA; - if (ev[0] & 4) - flags |= KD_BUTTON_2; - if (ev[0] & 2) - flags |= KD_BUTTON_3; - if (ev[0] & 1) - flags |= KD_BUTTON_1; - - if (ne > 3) - { - dz = (int) (signed char) ev[3]; - if (dz < 0) - { - flags |= KD_BUTTON_4; - flagsrelease = KD_BUTTON_4; - } - else if (dz > 0) - { - flags |= KD_BUTTON_5; - flagsrelease = KD_BUTTON_5; - } - } - - dx = ev[1]; - if (ev[0] & 0x10) - dx -= 256; - dy = ev[2]; - if (ev[0] & 0x20) - dy -= 256; - dy = -dy; - if (!MouseReasonable (mi, flags, dx, dy)) - return FALSE; - if (km->stage == MouseWorking) - { - KdEnqueueMouseEvent (mi, flags, dx, dy); - if (flagsrelease) - { - flags &= ~flagsrelease; - KdEnqueueMouseEvent (mi, flags, dx, dy); - } - } - return TRUE; -} - -static Bool ps2Init (KdMouseInfo *mi); - -static const KmouseProt ps2Prot = { - "ps/2", - threeComplete, mouseValid, ps2Parse, ps2Init, - 0x08, 0x08, 0x00, 0x00, - FALSE -}; - -static const KmouseProt imps2Prot = { - "imps/2", - fourComplete, mouseValid, ps2Parse, ps2Init, - 0x08, 0x08, 0x00, 0x00, - FALSE -}; - -static const KmouseProt exps2Prot = { - "exps/2", - fourComplete, mouseValid, ps2Parse, ps2Init, - 0x08, 0x08, 0x00, 0x00, - FALSE -}; - -/* - * Once the mouse is known to speak ps/2 protocol, go and find out - * what advanced capabilities it has and turn them on - */ - -/* these extracted from FreeBSD 4.3 sys/dev/kbd/atkbdcreg.h */ - -/* aux device commands (sent to KBD_DATA_PORT) */ -#define PSMC_SET_SCALING11 0x00e6 -#define PSMC_SET_SCALING21 0x00e7 -#define PSMC_SET_RESOLUTION 0x00e8 -#define PSMC_SEND_DEV_STATUS 0x00e9 -#define PSMC_SET_STREAM_MODE 0x00ea -#define PSMC_SEND_DEV_DATA 0x00eb -#define PSMC_SET_REMOTE_MODE 0x00f0 -#define PSMC_SEND_DEV_ID 0x00f2 -#define PSMC_SET_SAMPLING_RATE 0x00f3 -#define PSMC_ENABLE_DEV 0x00f4 -#define PSMC_DISABLE_DEV 0x00f5 -#define PSMC_SET_DEFAULTS 0x00f6 -#define PSMC_RESET_DEV 0x00ff - -/* PSMC_SET_RESOLUTION argument */ -#define PSMD_RES_LOW 0 /* typically 25ppi */ -#define PSMD_RES_MEDIUM_LOW 1 /* typically 50ppi */ -#define PSMD_RES_MEDIUM_HIGH 2 /* typically 100ppi (default) */ -#define PSMD_RES_HIGH 3 /* typically 200ppi */ -#define PSMD_MAX_RESOLUTION PSMD_RES_HIGH - -/* PSMC_SET_SAMPLING_RATE */ -#define PSMD_MAX_RATE 255 /* FIXME: not sure if it's possible */ - -/* aux device ID */ -#define PSM_MOUSE_ID 0 -#define PSM_BALLPOINT_ID 2 -#define PSM_INTELLI_ID 3 -#define PSM_EXPLORER_ID 4 -#define PSM_4DMOUSE_ID 6 -#define PSM_4DPLUS_ID 8 - -static unsigned char ps2_init[] = { - PSMC_ENABLE_DEV, - 0, -}; - -#define NINIT_PS2 1 - -static unsigned char wheel_3button_init[] = { - PSMC_SET_SAMPLING_RATE, 200, - PSMC_SET_SAMPLING_RATE, 100, - PSMC_SET_SAMPLING_RATE, 80, - PSMC_SEND_DEV_ID, - 0, -}; - -#define NINIT_IMPS2 4 - -static unsigned char wheel_5button_init[] = { - PSMC_SET_SAMPLING_RATE, 200, - PSMC_SET_SAMPLING_RATE, 100, - PSMC_SET_SAMPLING_RATE, 80, - PSMC_SET_SAMPLING_RATE, 200, - PSMC_SET_SAMPLING_RATE, 200, - PSMC_SET_SAMPLING_RATE, 80, - PSMC_SEND_DEV_ID, - 0 -}; - -#define NINIT_EXPS2 7 - -static unsigned char intelli_init[] = { - PSMC_SET_SAMPLING_RATE, 200, - PSMC_SET_SAMPLING_RATE, 100, - PSMC_SET_SAMPLING_RATE, 80, - 0 -}; - -#define NINIT_INTELLI 3 - -static int -ps2SkipInit (KdMouseInfo *mi, int ninit, Bool ret_next) -{ - Kmouse *km = mi->driver; - int c = -1; - int skipping; - Bool waiting; - - skipping = 0; - waiting = FALSE; - while (ninit || ret_next) - { - c = MouseReadByte (&km->iob, MOUSE_TIMEOUT); - if (c == -1) - break; - /* look for ACK */ - if (c == 0xfa) - { - ninit--; - if (ret_next) - waiting = TRUE; - } - /* look for packet start -- not the response */ - else if ((c & 0x08) == 0x08) - waiting = FALSE; - else if (waiting) - break; - } - return c; -} - -static Bool -ps2Init (KdMouseInfo *mi) -{ - Kmouse *km = mi->driver; - int skipping; - Bool waiting; - int id; - unsigned char *init; - int ninit; - - /* Send Intellimouse initialization sequence */ - MouseWriteBytes (km->iob.fd, intelli_init, strlen (intelli_init), 100); - /* - * Send ID command - */ - if (!MouseWriteByte (km->iob.fd, PSMC_SEND_DEV_ID, 100)) - return FALSE; - skipping = 0; - waiting = FALSE; - id = ps2SkipInit (mi, 0, TRUE); - switch (id) { - case 3: - init = wheel_3button_init; - ninit = NINIT_IMPS2; - km->prot = &imps2Prot; - break; - case 4: - init = wheel_5button_init; - ninit = NINIT_EXPS2; - km->prot = &exps2Prot; - break; - default: - init = ps2_init; - ninit = NINIT_PS2; - km->prot = &ps2Prot; - break; - } - if (init) - MouseWriteBytes (km->iob.fd, init, strlen (init), 100); - /* - * Flush out the available data to eliminate responses to the - * initialization string. Make sure any partial event is - * skipped - */ - (void) ps2SkipInit (mi, ninit, FALSE); - return TRUE; -} - -static Bool busParse (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - int dx, dy; - unsigned long flags; - - flags = KD_MOUSE_DELTA; - dx = (signed char) ev[1]; - dy = -(signed char) ev[2]; - if ((ev[0] & 4) == 0) - flags |= KD_BUTTON_1; - if ((ev[0] & 2) == 0) - flags |= KD_BUTTON_2; - if ((ev[0] & 1) == 0) - flags |= KD_BUTTON_3; - if (!MouseReasonable (mi, flags, dx, dy)) - return FALSE; - if (km->stage == MouseWorking) - KdEnqueueMouseEvent (mi, flags, dx, dy); - return TRUE; -} - -static const KmouseProt busProt = { - "bus", - threeComplete, mouseValid, busParse, 0, - 0xf8, 0x00, 0x00, 0x00, - FALSE -}; - -/* - * Standard MS serial protocol, three bytes - */ - -static Bool msParse (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - int dx, dy; - unsigned long flags; - - flags = KD_MOUSE_DELTA; - - if (ev[0] & 0x20) - flags |= KD_BUTTON_1; - if (ev[0] & 0x10) - flags |= KD_BUTTON_3; - - dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F)); - dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F)); - if (!MouseReasonable (mi, flags, dx, dy)) - return FALSE; - if (km->stage == MouseWorking) - KdEnqueueMouseEvent (mi, flags, dx, dy); - return TRUE; -} - -static const KmouseProt msProt = { - "ms", - threeComplete, mouseValid, msParse, 0, - 0xc0, 0x40, 0xc0, 0x00, - TRUE, - IGNPAR, - 0, - 0, - CS7 | CSTOPB | CREAD | CLOCAL, - B1200, -}; - -/* - * Logitech mice send 3 or 4 bytes, the only way to tell is to look at the - * first byte of a synchronized protocol stream and see if it's got - * any bits turned on that can't occur in that fourth byte - */ -static Bool logiComplete (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - - if ((ev[0] & 0x40) == 0x40) - return ne == 3; - if (km->stage != MouseBroken && (ev[0] & ~0x23) == 0) - return ne == 1; - return FALSE; -} - -static int logiValid (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - const KmouseProt *prot = km->prot; - int i; - - for (i = 0; i < ne; i++) - { - if ((ev[i] & 0x40) == 0x40) - break; - if (km->stage != MouseBroken && (ev[i] & ~0x23) == 0) - break; - } - if (i != 0) - return i; - for (i = 1; i < ne; i++) - if ((ev[i] & prot->dataMask) != prot->dataValid) - return -1; - return 0; -} - -static Bool logiParse (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - int dx, dy; - unsigned long flags; - - flags = KD_MOUSE_DELTA; - - if (ne == 3) - { - if (ev[0] & 0x20) - flags |= KD_BUTTON_1; - if (ev[0] & 0x10) - flags |= KD_BUTTON_3; - - dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F)); - dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F)); - flags |= km->state & KD_BUTTON_2; - } - else - { - if (ev[0] & 0x20) - flags |= KD_BUTTON_2; - dx = 0; - dy = 0; - flags |= km->state & (KD_BUTTON_1|KD_BUTTON_3); - } - - if (!MouseReasonable (mi, flags, dx, dy)) - return FALSE; - if (km->stage == MouseWorking) - KdEnqueueMouseEvent (mi, flags, dx, dy); - return TRUE; -} - -static const KmouseProt logiProt = { - "logitech", - logiComplete, logiValid, logiParse, 0, - 0xc0, 0x40, 0xc0, 0x00, - TRUE, - IGNPAR, - 0, - 0, - CS7 | CSTOPB | CREAD | CLOCAL, - B1200, -}; - -/* - * Mouse systems protocol, 5 bytes - */ -static Bool mscParse (KdMouseInfo *mi, unsigned char *ev, int ne) -{ - Kmouse *km = mi->driver; - int dx, dy; - unsigned long flags; - - flags = KD_MOUSE_DELTA; - - if (!(ev[0] & 0x4)) - flags |= KD_BUTTON_1; - if (!(ev[0] & 0x2)) - flags |= KD_BUTTON_2; - if (!(ev[0] & 0x1)) - flags |= KD_BUTTON_3; - dx = (signed char)(ev[1]) + (signed char)(ev[3]); - dy = - ((signed char)(ev[2]) + (signed char)(ev[4])); - - if (!MouseReasonable (mi, flags, dx, dy)) - return FALSE; - if (km->stage == MouseWorking) - KdEnqueueMouseEvent (mi, flags, dx, dy); - return TRUE; -} - -static const KmouseProt mscProt = { - "msc", - fiveComplete, mouseValid, mscParse, 0, - 0xf8, 0x80, 0x00, 0x00, - TRUE, - IGNPAR, - 0, - 0, - CS8 | CSTOPB | CREAD | CLOCAL, - B1200, -}; - -/* - * Use logitech before ms -- they're the same except that - * logitech sometimes has a fourth byte - */ -static const KmouseProt *kmouseProts[] = { - &ps2Prot, &imps2Prot, &exps2Prot, &busProt, &logiProt, &msProt, &mscProt, -}; - -#define NUM_PROT (sizeof (kmouseProts) / sizeof (kmouseProts[0])) - -static void -MouseInitProtocol (Kmouse *km) -{ - int ret; - struct termios t; - - if (km->prot->tty) - { - ret = tcgetattr (km->iob.fd, &t); - - if (ret >= 0) - { - t.c_iflag = km->prot->c_iflag; - t.c_oflag = km->prot->c_oflag; - t.c_lflag = km->prot->c_lflag; - t.c_cflag = km->prot->c_cflag; - cfsetispeed (&t, km->prot->speed); - cfsetospeed (&t, km->prot->speed); - ret = tcsetattr (km->iob.fd, TCSANOW, &t); - } - } - km->stage = MouseBroken; - km->valid = 0; - km->tested = 0; - km->invalid = 0; - km->state = km->prot->state; -} - -static void -MouseFirstProtocol (Kmouse *km, char *prot) -{ - if (prot) - { - for (km->i_prot = 0; km->i_prot < NUM_PROT; km->i_prot++) - if (!strcmp (prot, kmouseProts[km->i_prot]->name)) - break; - if (km->i_prot == NUM_PROT) - { - int i; - ErrorF ("Unknown mouse protocol \"%s\". Pick one of:", prot); - for (i = 0; i < NUM_PROT; i++) - ErrorF (" %s", kmouseProts[i]->name); - ErrorF ("\n"); - } - else - { - km->prot = kmouseProts[km->i_prot]; - if (km->tty && !km->prot->tty) - ErrorF ("Mouse device is serial port, protocol %s is not serial protocol\n", - prot); - else if (!km->tty && km->prot->tty) - ErrorF ("Mouse device is not serial port, protocol %s is serial protocol\n", - prot); - } - } - if (!km->prot) - { - for (km->i_prot = 0; kmouseProts[km->i_prot]->tty != km->tty; km->i_prot++) - ; - km->prot = kmouseProts[km->i_prot]; - } - MouseInitProtocol (km); -} - -static void -MouseNextProtocol (Kmouse *km) -{ - do - { - if (!km->prot) - km->i_prot = 0; - else - if (++km->i_prot == NUM_PROT) km->i_prot = 0; - km->prot = kmouseProts[km->i_prot]; - } while (km->prot->tty != km->tty); - MouseInitProtocol (km); - ErrorF ("Switching to mouse protocol \"%s\"\n", km->prot->name); -} - -static void -MouseRead (int mousePort, void *closure) -{ - KdMouseInfo *mi = closure; - Kmouse *km = mi->driver; - unsigned char event[MAX_MOUSE]; - int ne; - int c; - int i; - int timeout; - - timeout = 0; - ne = 0; - for(;;) - { - c = MouseReadByte (&km->iob, timeout); - if (c == -1) - { - if (ne) - { - km->invalid += ne + km->tested; - km->valid = 0; - km->tested = 0; - km->stage = MouseBroken; - } - break; - } - event[ne++] = c; - i = (*km->prot->Valid) (mi, event, ne); - if (i != 0) - { -#ifdef DEBUG - ErrorF ("Mouse protocol %s broken %d of %d bytes bad\n", - km->prot->name, i > 0 ? i : ne, ne); -#endif - if (i > 0 && i < ne) - { - ne -= i; - memmove (event, event + i, ne); - } - else - { - i = ne; - ne = 0; - } - km->invalid += i + km->tested; - km->valid = 0; - km->tested = 0; - if (km->stage == MouseWorking) - km->i_prot--; - km->stage = MouseBroken; - if (km->invalid > MAX_SKIP) - { - MouseNextProtocol (km); - ne = 0; - } - timeout = 0; - } - else - { - if ((*km->prot->Complete) (mi, event, ne)) - { - if ((*km->prot->Parse) (mi, event, ne)) - { - switch (km->stage) - { - case MouseBroken: -#ifdef DEBUG - ErrorF ("Mouse protocol %s seems OK\n", - km->prot->name); -#endif - /* do not zero invalid to accumulate invalid bytes */ - km->valid = 0; - km->tested = 0; - km->stage = MouseTesting; - /* fall through ... */ - case MouseTesting: - km->valid++; - km->tested += ne; - if (km->valid > MAX_VALID) - { -#ifdef DEBUG - ErrorF ("Mouse protocol %s working\n", - km->prot->name); -#endif - km->stage = MouseWorking; - km->invalid = 0; - km->tested = 0; - km->valid = 0; - if (km->prot->Init && !(*km->prot->Init) (mi)) - km->stage = MouseBroken; - } - break; - case MouseWorking: - break; - } - } - else - { - km->invalid += ne + km->tested; - km->valid = 0; - km->tested = 0; - km->stage = MouseBroken; - } - ne = 0; - timeout = 0; - } - else - timeout = MOUSE_TIMEOUT; - } - } -} - -int MouseInputType; - -char *kdefaultMouse[] = { - "/dev/mouse", - "/dev/psaux", - "/dev/input/mice", - "/dev/adbmouse", - "/dev/ttyS0", - "/dev/ttyS1", -}; - -#define NUM_DEFAULT_MOUSE (sizeof (kdefaultMouse) / sizeof (kdefaultMouse[0])) - -static Bool -MouseInit (void) -{ - int i; - int fd; - Kmouse *km; - KdMouseInfo *mi, *next; - int n = 0; - char *prot; - - if (!MouseInputType) - MouseInputType = KdAllocInputType (); - - for (mi = kdMouseInfo; mi; mi = next) - { - next = mi->next; - prot = mi->prot; - if (mi->inputType) - continue; - if (!mi->name) - { - for (i = 0; i < NUM_DEFAULT_MOUSE; i++) - { - fd = open (kdefaultMouse[i], 2); - if (fd >= 0) - { - mi->name = KdSaveString (kdefaultMouse[i]); - break; - } - } - } - else - fd = open (mi->name, 2); - - if (fd >= 0) - { - km = (Kmouse *) xalloc (sizeof (Kmouse)); - if (km) - { - km->iob.fd = fd; - km->iob.avail = km->iob.used = 0; - km->prot = 0; - km->i_prot = 0; - km->tty = isatty (fd); - mi->driver = km; - mi->inputType = MouseInputType; - MouseFirstProtocol (km, mi->prot); - if (KdRegisterFd (MouseInputType, fd, MouseRead, (void *) mi)) - n++; - } - else - close (fd); - } - } - return TRUE; -} - -static void -MouseFini (void) -{ - KdMouseInfo *mi; - - KdUnregisterFds (MouseInputType, TRUE); - for (mi = kdMouseInfo; mi; mi = mi->next) - { - if (mi->inputType == MouseInputType) - { - xfree (mi->driver); - mi->driver = 0; - mi->inputType = 0; - } - } -} - -KdMouseFuncs LinuxMouseFuncs = { - MouseInit, - MouseFini, -}; diff --git a/hw/kdrive/linux/ms.c b/hw/kdrive/linux/ms.c deleted file mode 100644 index b29f6527b..000000000 --- a/hw/kdrive/linux/ms.c +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright (c) 2001 by Juliusz Chroboczek -Copyright (c) 1999 by Keith Packard - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -/* $RCSId: xc/programs/Xserver/hw/kdrive/linux/ms.c,v 1.1 2001/08/09 20:45:15 dawes Exp $ */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <errno.h> -#include <termios.h> -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" - -static int -MsReadBytes (int fd, char *buf, int len, int min) -{ - int n, tot; - fd_set set; - struct timeval tv; - - tot = 0; - while (len) - { - n = read (fd, buf, len); - if (n > 0) - { - tot += n; - buf += n; - len -= n; - } - if (tot % min == 0) - break; - FD_ZERO (&set); - FD_SET (fd, &set); - tv.tv_sec = 0; - tv.tv_usec = 100 * 1000; - n = select (fd + 1, &set, 0, 0, &tv); - if (n <= 0) - break; - } - return tot; -} - -static void -MsRead (int port, void *closure) -{ - unsigned char buf[3 * 200]; - unsigned char *b; - int n; - int dx, dy; - unsigned long flags; - - while ((n = MsReadBytes (port, buf, sizeof (buf), 3)) > 0) - { - b = buf; - while (n >= 3) - { - flags = KD_MOUSE_DELTA; - - if (b[0] & 0x20) - flags |= KD_BUTTON_1; - if (b[0] & 0x10) - flags |= KD_BUTTON_3; - - dx = (char)(((b[0] & 0x03) << 6) | (b[1] & 0x3F)); - dy = (char)(((b[0] & 0x0C) << 4) | (b[2] & 0x3F)); - n -= 3; - b += 3; - KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); - } - } -} - -int MsInputType; - -static int -MsInit (void) -{ - int port; - char *device = "/dev/mouse"; - struct termios t; - int ret; - - if (!MsInputType) - MsInputType = KdAllocInputType (); - port = open (device, O_RDWR | O_NONBLOCK); - if(port < 0) { - ErrorF("Couldn't open %s (%d)\n", device, (int)errno); - return 0; - } else if (port == 0) { - ErrorF("Opening %s returned 0! Please complain to Keith.\n", - device); - goto bail; - } - - if(!isatty(port)) { - ErrorF("%s is not a tty\n", device); - goto bail; - } - - ret = tcgetattr(port, &t); - if(ret < 0) { - ErrorF("Couldn't tcgetattr(%s): %d\n", device, errno); - goto bail; - } - t.c_iflag &= ~ (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | - IGNCR | ICRNL | IXON | IXOFF); - t.c_oflag &= ~ OPOST; - t.c_lflag &= ~ (ECHO | ECHONL | ICANON | ISIG | IEXTEN); - t.c_cflag &= ~ (CSIZE | PARENB); - t.c_cflag |= CS8 | CLOCAL | CSTOPB; - - cfsetispeed (&t, B1200); - cfsetospeed (&t, B1200); - t.c_cc[VMIN] = 1; - t.c_cc[VTIME] = 0; - ret = tcsetattr(port, TCSANOW, &t); - if(ret < 0) { - ErrorF("Couldn't tcsetattr(%s): %d\n", device, errno); - goto bail; - } - if (KdRegisterFd (MsInputType, port, MsRead, (void *) 0)) - return 1; - - bail: - close(port); - return 0; -} - -static void -MsFini (void) -{ - KdUnregisterFds (MsInputType, TRUE); -} - -KdMouseFuncs MsMouseFuncs = { - MsInit, - MsFini -}; diff --git a/hw/kdrive/linux/ps2.c b/hw/kdrive/linux/ps2.c deleted file mode 100644 index da3372011..000000000 --- a/hw/kdrive/linux/ps2.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/ps2.c,v 1.6 2001/10/12 06:33:10 keithp Exp $ - * - * Copyright © 1999 Keith Packard - * - * 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 not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" - -static int -Ps2ReadBytes (int fd, char *buf, int len, int min) -{ - int n, tot; - fd_set set; - struct timeval tv; - - tot = 0; - while (len) - { - n = read (fd, buf, len); - if (n > 0) - { - tot += n; - buf += n; - len -= n; - } - if (tot % min == 0) - break; - FD_ZERO (&set); - FD_SET (fd, &set); - tv.tv_sec = 0; - tv.tv_usec = 100 * 1000; - n = select (fd + 1, &set, 0, 0, &tv); - if (n <= 0) - break; - } - return tot; -} - -char *Ps2Names[] = { - "/dev/psaux", -/* "/dev/mouse", */ - "/dev/input/mice", -}; - -#define NUM_PS2_NAMES (sizeof (Ps2Names) / sizeof (Ps2Names[0])) - -static void -Ps2Read (int ps2Port, void *closure) -{ - unsigned char buf[3 * 200]; - unsigned char *b; - int n; - int dx, dy; - unsigned long flags; - unsigned long left_button = KD_BUTTON_1; - unsigned long right_button = KD_BUTTON_3; - -#undef SWAP_USB -#ifdef SWAP_USB - if (id == 2) - { - left_button = KD_BUTTON_3; - right_button = KD_BUTTON_1; - } -#endif - while ((n = Ps2ReadBytes (ps2Port, buf, sizeof (buf), 3)) > 0) - { - b = buf; - while (n >= 3) - { - flags = KD_MOUSE_DELTA; - if (b[0] & 4) - flags |= KD_BUTTON_2; - if (b[0] & 2) - flags |= right_button; - if (b[0] & 1) - flags |= left_button; - - dx = b[1]; - if (b[0] & 0x10) - dx -= 256; - dy = b[2]; - if (b[0] & 0x20) - dy -= 256; - dy = -dy; - n -= 3; - b += 3; - KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy); - } - } -} - -int Ps2InputType; - -static int -Ps2Init (void) -{ - int i; - int ps2Port; - int n; - - if (!Ps2InputType) - Ps2InputType = KdAllocInputType (); - n = 0; - for (i = 0; i < NUM_PS2_NAMES; i++) - { - ps2Port = open (Ps2Names[i], 0); - if (ps2Port >= 0) - { - if (KdRegisterFd (Ps2InputType, ps2Port, Ps2Read, (void *) i)) - n++; - } - } - return n; -} - -static void -Ps2Fini (void) -{ - KdUnregisterFds (Ps2InputType, TRUE); -} - -KdMouseFuncs Ps2MouseFuncs = { - Ps2Init, - Ps2Fini -}; diff --git a/hw/kdrive/linux/ts.c b/hw/kdrive/linux/ts.c deleted file mode 100644 index 9051c0d61..000000000 --- a/hw/kdrive/linux/ts.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/ts.c,v 1.9 2002/08/15 18:07:48 keithp Exp $ - * - * Derived from ps2.c by Jim Gettys - * - * Copyright © 1999 Keith Packard - * Copyright © 2000 Compaq Computer Corporation - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" -#include <sys/ioctl.h> -#include <linux/h3600_ts.h> /* touch screen events */ - -static long lastx = 0, lasty = 0; - -int KdTsPhyScreen = 0; - -static int -TsReadBytes (int fd, char *buf, int len, int min) -{ - int n, tot; - fd_set set; - struct timeval tv; - - tot = 0; - while (len) - { - n = read (fd, buf, len); - if (n > 0) - { - tot += n; - buf += n; - len -= n; - } - if (tot % min == 0) - break; - FD_ZERO (&set); - FD_SET (fd, &set); - tv.tv_sec = 0; - tv.tv_usec = 100 * 1000; - n = select (fd + 1, &set, 0, 0, &tv); - if (n <= 0) - break; - } - return tot; -} - -static void -TsRead (int tsPort, void *closure) -{ - KdMouseInfo *mi = closure; - TS_EVENT event; - int n; - long x, y; - unsigned long flags; - - n = TsReadBytes (tsPort, (char *) &event, sizeof (event), sizeof (event)); - if (n == sizeof (event)) - { - 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 (KdCurScreen == KdTsPhyScreen) { - 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); - } -} - -char *TsNames[] = { - "/dev/ts", - "/dev/h3600_ts" /* temporary name; note this code can try - to open more than one device */ -}; - -#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) - -int TsInputType; - -static int -TsEnable (int fd, void *closure) -{ - KdMouseInfo *mi = (KdMouseInfo *)closure; - - return open (mi->name, 0); -} - -static void -TsDisable (int fd, void *closure) -{ - close (fd); -} - -static int -TsInit (void) -{ - int i; - int fd; - KdMouseInfo *mi, *next; - 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++) - { - fd = open (TsNames[i], 0); - if (fd >= 0) - { - mi->name = KdSaveString (TsNames[i]); - break; - } - } - } - else - fd = open (mi->name, 0); - if (fd >= 0) - { - struct h3600_ts_calibration cal; - /* - * Check to see if this is a touch screen - */ - if (ioctl (fd, TS_GET_CAL, &cal) != -1) - { - mi->driver = (void *) fd; - mi->inputType = TsInputType; - if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi)) - { - /* Set callbacks for vt switches etc */ - KdRegisterFdEnableDisable (fd, TsEnable, TsDisable); - - n++; - } - } - else - close (fd); - } - } - - return 0; -} - -static void -TsFini (void) -{ - KdMouseInfo *mi; - - KdUnregisterFds (TsInputType, TRUE); - for (mi = kdMouseInfo; mi; mi = mi->next) - { - if (mi->inputType == TsInputType) - { - mi->driver = 0; - mi->inputType = 0; - } - } -} - -KdMouseFuncs TsFuncs = { - TsInit, - TsFini -}; diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c deleted file mode 100644 index e22ebd93f..000000000 --- a/hw/kdrive/linux/tslib.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * $RCSId: xc/programs/Xserver/hw/kdrive/linux/tslib.c,v 1.1 2002/11/01 22:27:49 keithp Exp $ - * 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. - */ - - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#define NEED_EVENTS -#include <X11/X.h> -#include <X11/Xproto.h> -#include <X11/Xpoll.h> -#include "inputstr.h" -#include "scrnintstr.h" -#include "kdrive.h" -#include <sys/ioctl.h> -#include <tslib.h> - -static long lastx = 0, lasty = 0; -static struct tsdev *tsDev = NULL; - -void (*tslib_raw_event_hook)(int x, int y, int pressure, void *closure); -void *tslib_raw_event_closure; - -int KdTsPhyScreen = 0; - -static void -TsRead (int tsPort, void *closure) -{ - KdMouseInfo *mi = closure; - struct ts_sample event; - int n; - long x, y; - unsigned long flags; - - if (tslib_raw_event_hook) - { - if (ts_read_raw(tsDev, &event, 1) == 1) - { - tslib_raw_event_hook (event.x, event.y, event.pressure, tslib_raw_event_closure); - } - return; - } - - while (ts_read(tsDev, &event, 1) == 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 (KdCurScreen == KdTsPhyScreen) { - 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[] = { - NULL, - "/dev/ts", - "/dev/touchscreen/0", -}; - -#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) - -int TsInputType; - -static int -TslibEnable (int not_needed_fd, void *closure) -{ - KdMouseInfo *mi = closure; - int fd = 0; - - fprintf(stderr, "%s() called\n", __func__); - - if(!(tsDev = ts_open(mi->name, 0))) { - fprintf(stderr, "%s() failed to open %s\n", __func__, mi->name ); - return -1; /* XXX Not sure what to return here */ - } - - ts_config(tsDev); - fd=ts_fd(tsDev); - - return fd; -} - -static void -TslibDisable (int fd, void *closure) -{ - ts_close(tsDev); -} - -static int -TslibInit (void) -{ - int i, j = 0; - 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; - - /* Check for tslib env var device setting */ - if ((TsNames[0] = getenv("TSLIB_TSDEVICE")) == NULL) - j++; - - if (!mi->name) - { - for (i = j; i < NUM_TS_NAMES; i++) - { - - /* XXX Should check for */ - - if(!(tsDev = ts_open(TsNames[i],0))) continue; - ts_config(tsDev); - fd=ts_fd(tsDev); - if (fd >= 0) - { - mi->name = KdSaveString (TsNames[i]); - break; - } - } - } else { - - if(!(tsDev = ts_open(mi->name,0))) - continue; - ts_config(tsDev); - fd=ts_fd(tsDev); - - } - - if (fd > 0 && tsDev != 0) - { - mi->driver = (void *) fd; - mi->inputType = TsInputType; - if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi)) - n++; - - /* Set callbacks for vt switches etc */ - KdRegisterFdEnableDisable (fd, TslibEnable, TslibDisable); - - } - else - { - fprintf(stderr, "%s() failed to open tslib\n", __func__); - if (fd > 0) close(fd); - } - - - } - - return n; -} - -static 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 -}; |