diff -urN build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/Imakefile xc/programs/Xserver/hw/xfree86/os-support/linux/Imakefile --- build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/Imakefile 2003-03-26 19:48:51.000000000 -0500 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/Imakefile 2003-03-05 19:22:03.000000000 -0500 @@ -45,15 +45,16 @@ SRCS = lnx_init.c lnx_video.c lnx_io.c libc_wrapper.c bios_mmap.c \ VTsw_usl.c std_kbdEv.c posix_tty.c $(MOUSESRC) \ lnx_pci.c vidmem.c lnx_apm.c $(JOYSTICK_SRC) $(DRI_SRC) $(RES_SRCS) \ - $(AXP_SRC) lnx_kmod.c lnx_agp.c $(KBDSRC) /*wcHelper.c*/ + $(AXP_SRC) lnx_kmod.c lnx_agp.c $(KBDSRC) /*wcHelper.c*/ lnx_evdev.c OBJS = lnx_init.o lnx_video.o lnx_io.o libc_wrapper.o bios_mmap.o \ VTsw_usl.o std_kbdEv.o posix_tty.o $(MOUSEOBJ) \ lnx_pci.o vidmem.o lnx_apm.o $(JOYSTICK_OBJ) $(DRI_OBJ) $(RES_OBJS) \ - $(AXP_OBJ) lnx_kmod.o lnx_agp.o $(KBDOBJ) /*wcHelper.o*/ + $(AXP_OBJ) lnx_kmod.o lnx_agp.o $(KBDOBJ) /*wcHelper.o*/ lnx_evdev.o INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC) -I. -I$(SERVERSRC)/include \ - -I$(XINCLUDESRC) -I$(EXTINCSRC) -I$(XF86OSSRC)/shared + -I$(XINCLUDESRC) -I$(EXTINCSRC) -I$(XF86OSSRC)/shared \ + -I$(SERVERSRC)/mi RESDEFINES = -DUSESTDRES diff -urN build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.c xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.c --- build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.c 1969-12-31 19:00:00.000000000 -0500 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.c 2003-03-05 19:22:03.000000000 -0500 @@ -0,0 +1,278 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_mouse.c,v 1.1 1999/05/17 13:17:18 dawes Exp $ */ + +/* + * Copyright 2003 by Zephaniah E. Hull. + */ + +#include "X.h" +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86_OSlib.h" +#include "xf86Xinput.h" +#include "xf86OSmouse.h" +#include "lnx_evdev.h" +#include "mipointer.h" + +static Bool evdev_alive = FALSE; +static evdevDriverPtr evdev_drivers = NULL; +static char *evdev_buf; +static char evdev_device[23]; + +static int +glob_match(const char *pattern, const char *matchp) +{ + int i, j = 0, ret = 0; + if (!(pattern && matchp)) + return (strlen(pattern) == strlen(matchp)); + + for (i = 0; matchp[i]; i++) { + if (pattern[j] == '\\') + j++; + else if (pattern[j] == '*') { + if (pattern[j + 1]) { + if (!glob_match(pattern+j+1,matchp+i)) + return 0; + } else + return 0; + continue; + } else if (pattern[j] == '?') { + j++; + continue; + } + + if ((ret = (pattern[j] - matchp[i]))) + return ret; + + j++; + } + if (!pattern[j] || ((pattern[j] == '*') && !pattern[j + 1])) + return 0; + else + return 1; +} + + +int +evdevGetFDForDriver (evdevDriverPtr driver) +{ + char dev[20]; + char tmp[256] = ""; + int fd, i; + + if (!driver) + return -1; + + for (i = 0; i < 32; i++) { + snprintf(dev, sizeof(dev), "/dev/input/event%d", i); + SYSCALL(fd = open (dev, O_RDWR | O_NONBLOCK)); + if (fd == -1) + continue; + +#define check(name,get) \ + if (name) { \ + if (ioctl(fd, get, tmp) == -1) \ + tmp[0] = '\0'; \ + if (glob_match(name, tmp)) { \ + close(fd); \ + continue; \ + } \ + } + + check(driver->name, EVIOCGNAME(sizeof(tmp))); + check(driver->phys, EVIOCGPHYS(sizeof(tmp))); +#undef check + return fd; + } + return -1; +} + +static void +evdevReadInput(InputInfoPtr pInfo) +{ + int n; + evdevDriverPtr driver; + char *cur, *end; + char *id, *value, *name, *phys, *action; + Bool up; + + do { + SYSCALL(n = read(pInfo->fd, evdev_buf, 1022)); + evdev_buf[n] = '\n'; /* Just to be extra safe. */ + evdev_buf[n + 1] = '\0';/* Just to be extra safe. */ + + cur = evdev_buf; + while (cur[0] && (end = strchr(cur, '\n')) && (end != cur)) { + name = phys = action = NULL; + if (!strncmp("2.1", cur, 3)) { +#define next_sep(sep,end,clr) while (1) { \ + if ((*cur == '\n') || (*cur == '\0')) { \ + if (end) { \ + goto evdevReadInput__finished; \ + } else if (clr) \ + *cur = '\0'; \ + cur++; \ + break; \ + } else if (*cur == sep) { \ + if (clr) \ + *cur = '\0'; \ + cur++; \ + break; \ + } \ + cur++; \ + } + + next_sep('\002', 1, 0); +loop_start__21: + id = cur; + next_sep('\003', 1, 1); + value = cur; + next_sep('\002', 0, 1); + if (!strcmp(id, "ACTION")) + action = value; + else if (!strcmp(id, "NAME")) + name = value; + else if (!strcmp(id, "PHYS")) + phys = value; + if (*cur != '\n') + goto loop_start__21; +#undef next_sep + } +evdevReadInput__finished: + + if (!(action && name && phys)) { + xf86Msg(X_ERROR,"%s: Incomplete command! -%s-%s-%s-\n", + pInfo->name, action, name, phys); + } else { + if (!strcmp(action, "add")) + up = TRUE; + else + up = FALSE; + + for (driver = evdev_drivers; driver; driver = driver->next) { + if (driver->name && glob_match(name, driver->name)) + continue; + if (driver->phys && glob_match(phys, driver->phys)) + continue; + if (up) + driver->callback(driver->cb_data, DEVICE_ON); + else + driver->callback(driver->cb_data, DEVICE_OFF); + } + } + cur = end + 1; + } + } while (xf86WaitForInput(pInfo->fd, 0)); + return; +} + +static void +evdevSigioReadInput (int fd, void *closure) +{ + evdevReadInput ((InputInfoPtr) closure); +} + +static int +evdevGetControlFD (void) +{ + int i, ret; + + for (i = 0; i < 100; i++) { + snprintf(evdev_device,sizeof(evdev_device),"/tmp/.X11-unix/evdev%d", i); + SYSCALL(ret = mkfifo (evdev_device, 0666)); + if (ret == -1) { + if (errno != EEXIST) + return -1; + continue; + } + SYSCALL(ret = open (evdev_device, O_RDWR | O_NONBLOCK)); + return ret; + } + + return -1; +} + +static void +evdevReleaseControlFD (int fd) +{ + SYSCALL(close(fd)); + SYSCALL(unlink(evdev_device)); +} + +static int +evdevControl(DeviceIntPtr pPointer, int what) +{ + InputInfoPtr pInfo; + + pInfo = pPointer->public.devicePrivate; + + switch (what) { + case DEVICE_INIT: + pPointer->public.on = FALSE; + break; + + case DEVICE_ON: + pInfo->fd = evdevGetControlFD (); + if (pInfo->fd == -1) { + xf86Msg(X_ERROR, "%s: cannot open control FIFO.\n", pInfo->name); + return BadRequest; + } + xf86FlushInput(pInfo->fd); + if (!xf86InstallSIGIOHandler (pInfo->fd, evdevSigioReadInput, pInfo)) + AddEnabledDevice(pInfo->fd); + pPointer->public.on = TRUE; + break; + + case DEVICE_OFF: + case DEVICE_CLOSE: + if (pInfo->fd != -1) { + RemoveEnabledDevice(pInfo->fd); + xf86RemoveSIGIOHandler(pInfo->fd); + evdevReleaseControlFD (pInfo->fd); + pInfo->fd = -1; + } + pPointer->public.on = FALSE; + usleep(300000); + break; + } + return Success; +} + +Bool +evdevStart (InputDriverPtr drv) +{ + InputInfoPtr pInfo; + + if (evdev_alive) + return TRUE; + + if (!(evdev_buf = xcalloc(1024, 1))) + return FALSE; + + if (!(pInfo = xf86AllocateInput(drv, 0))) + return FALSE; + + + pInfo->name = "evdev brain"; + pInfo->type_name = "evdev brain"; + pInfo->device_control = evdevControl; + pInfo->read_input = evdevReadInput; + pInfo->fd = -1; + evdev_alive = TRUE; + pInfo->flags = XI86_CONFIGURED | XI86_OPEN_ON_INIT; + return TRUE; +} + +Bool +evdevNewDriver (evdevDriverPtr driver) +{ + if (!evdev_alive) + return FALSE; + if (!(driver->name || driver->phys)) + return FALSE; + if (!driver->callback) + return FALSE; + + driver->next = evdev_drivers; + evdev_drivers = driver; + return TRUE; +} diff -urN build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.h xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.h --- build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.h 1969-12-31 19:00:00.000000000 -0500 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_evdev.h 2003-03-15 08:47:22.000000000 -0500 @@ -0,0 +1,752 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx.h,v 3.2 2000/02/15 02:00:14 eich Exp $ */ + +#ifndef LNX_EVDEV_H_ +#define LNX_EVDEV_H_ + + +/* Stuff taken from the linux header. (With some minor changes.) */ + +#include +#include +#include + +/* + * The event structure itself + */ + +struct input_event { + struct timeval time; + __u16 type; + __u16 code; + __s32 value; +}; + +/* + * Protocol version. + */ + +#define EV_VERSION 0x010000 + +/* + * IOCTLs (0x00 - 0x7f) + */ + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; +}; + +#define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ +#define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ +#define EVIOCGREP _IOR('E', 0x03, int[2]) /* get repeat settings */ +#define EVIOCSREP _IOW('E', 0x03, int[2]) /* get repeat settings */ +#define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ +#define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ + +#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ +#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ +#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ + +#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ +#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ +#define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ + +#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ +#define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ +#define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ + +#define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ +#define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ +#define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ + +#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ +#define EVIOCGMASK _IOR('E', 0x91, unsigned long *) /* Get our input mask */ +#define EVIOCSMASK _IOW('E', 0x92, unsigned long) /* Set our input mask */ +#define EVIOCGDMASK _IOR('E', 0x93, unsigned long *) /* Get device input mask */ +#define EVIOCSDMASK _IOW('E', 0x94, unsigned long) /* Set device input mask */ + + + +#define BITS_PER_LONG (sizeof(long) * 8) +#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) +#define OFF(x) ((x)%BITS_PER_LONG) +#define LONG(x) ((x)/BITS_PER_LONG) +#define BIT(x) (1UL<<((x)%BITS_PER_LONG)) +#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) + +/* + * Event types + */ + +#define EV_SYN 0x00 +#define EV_KEY 0x01 +#define EV_REL 0x02 +#define EV_ABS 0x03 +#define EV_MSC 0x04 +#define EV_LED 0x11 +#define EV_SND 0x12 +#define EV_REP 0x14 +#define EV_FF 0x15 +#define EV_PWR 0x16 +#define EV_FF_STATUS 0x17 +#define EV_MAX 0x1f + +/* + * Synchronization events. + */ + +#define EV_SYN_REPORT 0 +#define EV_SYN_CONFIG 1 + +/* + * Keys and buttons + */ + +#define EV_KEY_RESERVED 0 +#define EV_KEY_ESC 1 +#define EV_KEY_1 2 +#define EV_KEY_2 3 +#define EV_KEY_3 4 +#define EV_KEY_4 5 +#define EV_KEY_5 6 +#define EV_KEY_6 7 +#define EV_KEY_7 8 +#define EV_KEY_8 9 +#define EV_KEY_9 10 +#define EV_KEY_0 11 +#define EV_KEY_MINUS 12 +#define EV_KEY_EQUAL 13 +#define EV_KEY_BACKSPACE 14 +#define EV_KEY_TAB 15 +#define EV_KEY_Q 16 +#define EV_KEY_W 17 +#define EV_KEY_E 18 +#define EV_KEY_R 19 +#define EV_KEY_T 20 +#define EV_KEY_Y 21 +#define EV_KEY_U 22 +#define EV_KEY_I 23 +#define EV_KEY_O 24 +#define EV_KEY_P 25 +#define EV_KEY_LEFTBRACE 26 +#define EV_KEY_RIGHTBRACE 27 +#define EV_KEY_ENTER 28 +#define EV_KEY_LEFTCTRL 29 +#define EV_KEY_A 30 +#define EV_KEY_S 31 +#define EV_KEY_D 32 +#define EV_KEY_F 33 +#define EV_KEY_G 34 +#define EV_KEY_H 35 +#define EV_KEY_J 36 +#define EV_KEY_K 37 +#define EV_KEY_L 38 +#define EV_KEY_SEMICOLON 39 +#define EV_KEY_APOSTROPHE 40 +#define EV_KEY_GRAVE 41 +#define EV_KEY_LEFTSHIFT 42 +#define EV_KEY_BACKSLASH 43 +#define EV_KEY_Z 44 +#define EV_KEY_X 45 +#define EV_KEY_C 46 +#define EV_KEY_V 47 +#define EV_KEY_B 48 +#define EV_KEY_N 49 +#define EV_KEY_M 50 +#define EV_KEY_COMMA 51 +#define EV_KEY_DOT 52 +#define EV_KEY_SLASH 53 +#define EV_KEY_RIGHTSHIFT 54 +#define EV_KEY_KPASTERISK 55 +#define EV_KEY_LEFTALT 56 +#define EV_KEY_SPACE 57 +#define EV_KEY_CAPSLOCK 58 +#define EV_KEY_F1 59 +#define EV_KEY_F2 60 +#define EV_KEY_F3 61 +#define EV_KEY_F4 62 +#define EV_KEY_F5 63 +#define EV_KEY_F6 64 +#define EV_KEY_F7 65 +#define EV_KEY_F8 66 +#define EV_KEY_F9 67 +#define EV_KEY_F10 68 +#define EV_KEY_NUMLOCK 69 +#define EV_KEY_SCROLLLOCK 70 +#define EV_KEY_KP7 71 +#define EV_KEY_KP8 72 +#define EV_KEY_KP9 73 +#define EV_KEY_KPMINUS 74 +#define EV_KEY_KP4 75 +#define EV_KEY_KP5 76 +#define EV_KEY_KP6 77 +#define EV_KEY_KPPLUS 78 +#define EV_KEY_KP1 79 +#define EV_KEY_KP2 80 +#define EV_KEY_KP3 81 +#define EV_KEY_KP0 82 +#define EV_KEY_KPDOT 83 +#define EV_KEY_103RD 84 +#define EV_KEY_F13 85 +#define EV_KEY_102ND 86 +#define EV_KEY_F11 87 +#define EV_KEY_F12 88 +#define EV_KEY_F14 89 +#define EV_KEY_F15 90 +#define EV_KEY_F16 91 +#define EV_KEY_F17 92 +#define EV_KEY_F18 93 +#define EV_KEY_F19 94 +#define EV_KEY_F20 95 +#define EV_KEY_KPENTER 96 +#define EV_KEY_RIGHTCTRL 97 +#define EV_KEY_KPSLASH 98 +#define EV_KEY_SYSRQ 99 +#define EV_KEY_RIGHTALT 100 +#define EV_KEY_LINEFEED 101 +#define EV_KEY_HOME 102 +#define EV_KEY_UP 103 +#define EV_KEY_PAGEUP 104 +#define EV_KEY_LEFT 105 +#define EV_KEY_RIGHT 106 +#define EV_KEY_END 107 +#define EV_KEY_DOWN 108 +#define EV_KEY_PAGEDOWN 109 +#define EV_KEY_INSERT 110 +#define EV_KEY_DELETE 111 +#define EV_KEY_MACRO 112 +#define EV_KEY_MUTE 113 +#define EV_KEY_VOLUMEDOWN 114 +#define EV_KEY_VOLUMEUP 115 +#define EV_KEY_POWER 116 +#define EV_KEY_KPEQUAL 117 +#define EV_KEY_KPPLUSMINUS 118 +#define EV_KEY_PAUSE 119 +#define EV_KEY_F21 120 +#define EV_KEY_F22 121 +#define EV_KEY_F23 122 +#define EV_KEY_F24 123 +#define EV_KEY_KPCOMMA 124 +#define EV_KEY_LEFTMETA 125 +#define EV_KEY_RIGHTMETA 126 +#define EV_KEY_COMPOSE 127 + +#define EV_KEY_STOP 128 +#define EV_KEY_AGAIN 129 +#define EV_KEY_PROPS 130 +#define EV_KEY_UNDO 131 +#define EV_KEY_FRONT 132 +#define EV_KEY_COPY 133 +#define EV_KEY_OPEN 134 +#define EV_KEY_PASTE 135 +#define EV_KEY_FIND 136 +#define EV_KEY_CUT 137 +#define EV_KEY_HELP 138 +#define EV_KEY_MENU 139 +#define EV_KEY_CALC 140 +#define EV_KEY_SETUP 141 +#define EV_KEY_SLEEP 142 +#define EV_KEY_WAKEUP 143 +#define EV_KEY_FILE 144 +#define EV_KEY_SENDFILE 145 +#define EV_KEY_DELETEFILE 146 +#define EV_KEY_XFER 147 +#define EV_KEY_PROG1 148 +#define EV_KEY_PROG2 149 +#define EV_KEY_WWW 150 +#define EV_KEY_MSDOS 151 +#define EV_KEY_COFFEE 152 +#define EV_KEY_DIRECTION 153 +#define EV_KEY_CYCLEWINDOWS 154 +#define EV_KEY_MAIL 155 +#define EV_KEY_BOOKMARKS 156 +#define EV_KEY_COMPUTER 157 +#define EV_KEY_BACK 158 +#define EV_KEY_FORWARD 159 +#define EV_KEY_CLOSECD 160 +#define EV_KEY_EJECTCD 161 +#define EV_KEY_EJECTCLOSECD 162 +#define EV_KEY_NEXTSONG 163 +#define EV_KEY_PLAYPAUSE 164 +#define EV_KEY_PREVIOUSSONG 165 +#define EV_KEY_STOPCD 166 +#define EV_KEY_RECORD 167 +#define EV_KEY_REWIND 168 +#define EV_KEY_PHONE 169 +#define EV_KEY_ISO 170 +#define EV_KEY_CONFIG 171 +#define EV_KEY_HOMEPAGE 172 +#define EV_KEY_REFRESH 173 +#define EV_KEY_EXIT 174 +#define EV_KEY_MOVE 175 +#define EV_KEY_EDIT 176 +#define EV_KEY_SCROLLUP 177 +#define EV_KEY_SCROLLDOWN 178 +#define EV_KEY_KPLEFTPAREN 179 +#define EV_KEY_KPRIGHTPAREN 180 + +#define EV_KEY_INTL1 181 +#define EV_KEY_INTL2 182 +#define EV_KEY_INTL3 183 +#define EV_KEY_INTL4 184 +#define EV_KEY_INTL5 185 +#define EV_KEY_INTL6 186 +#define EV_KEY_INTL7 187 +#define EV_KEY_INTL8 188 +#define EV_KEY_INTL9 189 +#define EV_KEY_LANG1 190 +#define EV_KEY_LANG2 191 +#define EV_KEY_LANG3 192 +#define EV_KEY_LANG4 193 +#define EV_KEY_LANG5 194 +#define EV_KEY_LANG6 195 +#define EV_KEY_LANG7 196 +#define EV_KEY_LANG8 197 +#define EV_KEY_LANG9 198 + +#define EV_KEY_PLAYCD 200 +#define EV_KEY_PAUSECD 201 +#define EV_KEY_PROG3 202 +#define EV_KEY_PROG4 203 +#define EV_KEY_SUSPEND 205 +#define EV_KEY_CLOSE 206 +#define EV_KEY_PLAY 207 +#define EV_KEY_FASTFORWARD 208 +#define EV_KEY_BASSBOOST 209 +#define EV_KEY_PRINT 210 +#define EV_KEY_HP 211 +#define EV_KEY_CAMERA 212 +#define EV_KEY_SOUND 213 +#define EV_KEY_QUESTION 214 +#define EV_KEY_EMAIL 215 +#define EV_KEY_CHAT 216 +#define EV_KEY_SEARCH 217 +#define EV_KEY_CONNECT 218 +#define EV_KEY_FINANCE 219 +#define EV_KEY_SPORT 220 +#define EV_KEY_SHOP 221 +#define EV_KEY_ALTERASE 222 +#define EV_KEY_CANCEL 223 +#define EV_KEY_BRIGHTNESSDOWN 224 +#define EV_KEY_BRIGHTNESSUP 225 +#define EV_KEY_MEDIA 226 + +#define EV_KEY_UNKNOWN 240 + +#define EV_BTN_MISC 0x100 +#define EV_BTN_0 0x100 +#define EV_BTN_1 0x101 +#define EV_BTN_2 0x102 +#define EV_BTN_3 0x103 +#define EV_BTN_4 0x104 +#define EV_BTN_5 0x105 +#define EV_BTN_6 0x106 +#define EV_BTN_7 0x107 +#define EV_BTN_8 0x108 +#define EV_BTN_9 0x109 + +#define EV_BTN_MOUSE 0x110 +#define EV_BTN_LEFT 0x110 +#define EV_BTN_RIGHT 0x111 +#define EV_BTN_MIDDLE 0x112 +#define EV_BTN_SIDE 0x113 +#define EV_BTN_EXTRA 0x114 +#define EV_BTN_FORWARD 0x115 +#define EV_BTN_BACK 0x116 + +#define EV_BTN_JOYSTICK 0x120 +#define EV_BTN_TRIGGER 0x120 +#define EV_BTN_THUMB 0x121 +#define EV_BTN_THUMB2 0x122 +#define EV_BTN_TOP 0x123 +#define EV_BTN_TOP2 0x124 +#define EV_BTN_PINKIE 0x125 +#define EV_BTN_BASE 0x126 +#define EV_BTN_BASE2 0x127 +#define EV_BTN_BASE3 0x128 +#define EV_BTN_BASE4 0x129 +#define EV_BTN_BASE5 0x12a +#define EV_BTN_BASE6 0x12b +#define EV_BTN_DEAD 0x12f + +#define EV_BTN_GAMEPAD 0x130 +#define EV_BTN_A 0x130 +#define EV_BTN_B 0x131 +#define EV_BTN_C 0x132 +#define EV_BTN_X 0x133 +#define EV_BTN_Y 0x134 +#define EV_BTN_Z 0x135 +#define EV_BTN_TL 0x136 +#define EV_BTN_TR 0x137 +#define EV_BTN_TL2 0x138 +#define EV_BTN_TR2 0x139 +#define EV_BTN_SELECT 0x13a +#define EV_BTN_START 0x13b +#define EV_BTN_MODE 0x13c +#define EV_BTN_THUMBL 0x13d +#define EV_BTN_THUMBR 0x13e + +#define EV_BTN_DIGI 0x140 +#define EV_BTN_TOOL_PEN 0x140 +#define EV_BTN_TOOL_RUBBER 0x141 +#define EV_BTN_TOOL_BRUSH 0x142 +#define EV_BTN_TOOL_PENCIL 0x143 +#define EV_BTN_TOOL_AIRBRUSH 0x144 +#define EV_BTN_TOOL_FINGER 0x145 +#define EV_BTN_TOOL_MOUSE 0x146 +#define EV_BTN_TOOL_LENS 0x147 +#define EV_BTN_TOUCH 0x14a +#define EV_BTN_STYLUS 0x14b +#define EV_BTN_STYLUS2 0x14c + +#define EV_BTN_WHEEL 0x150 +#define EV_BTN_GEAR_DOWN 0x150 +#define EV_BTN_GEAR_UP 0x151 + +#define EV_KEY_OK 0x160 +#define EV_KEY_SELECT 0x161 +#define EV_KEY_GOTO 0x162 +#define EV_KEY_CLEAR 0x163 +#define EV_KEY_POWER2 0x164 +#define EV_KEY_OPTION 0x165 +#define EV_KEY_INFO 0x166 +#define EV_KEY_TIME 0x167 +#define EV_KEY_VENDOR 0x168 +#define EV_KEY_ARCHIVE 0x169 +#define EV_KEY_PROGRAM 0x16a +#define EV_KEY_CHANNEL 0x16b +#define EV_KEY_FAVORITES 0x16c +#define EV_KEY_EPG 0x16d +#define EV_KEY_PVR 0x16e +#define EV_KEY_MHP 0x16f +#define EV_KEY_LANGUAGE 0x170 +#define EV_KEY_TITLE 0x171 +#define EV_KEY_SUBTITLE 0x172 +#define EV_KEY_ANGLE 0x173 +#define EV_KEY_ZOOM 0x174 +#define EV_KEY_MODE 0x175 +#define EV_KEY_KEYBOARD 0x176 +#define EV_KEY_SCREEN 0x177 +#define EV_KEY_PC 0x178 +#define EV_KEY_TV 0x179 +#define EV_KEY_TV2 0x17a +#define EV_KEY_VCR 0x17b +#define EV_KEY_VCR2 0x17c +#define EV_KEY_SAT 0x17d +#define EV_KEY_SAT2 0x17e +#define EV_KEY_CD 0x17f +#define EV_KEY_TAPE 0x180 +#define EV_KEY_RADIO 0x181 +#define EV_KEY_TUNER 0x182 +#define EV_KEY_PLAYER 0x183 +#define EV_KEY_TEXT 0x184 +#define EV_KEY_DVD 0x185 +#define EV_KEY_AUX 0x186 +#define EV_KEY_MP3 0x187 +#define EV_KEY_AUDIO 0x188 +#define EV_KEY_VIDEO 0x189 +#define EV_KEY_DIRECTORY 0x18a +#define EV_KEY_LIST 0x18b +#define EV_KEY_MEMO 0x18c +#define EV_KEY_CALENDAR 0x18d +#define EV_KEY_RED 0x18e +#define EV_KEY_GREEN 0x18f +#define EV_KEY_YELLOW 0x190 +#define EV_KEY_BLUE 0x191 +#define EV_KEY_CHANNELUP 0x192 +#define EV_KEY_CHANNELDOWN 0x193 +#define EV_KEY_FIRST 0x194 +#define EV_KEY_LAST 0x195 +#define EV_KEY_AB 0x196 +#define EV_KEY_NEXT 0x197 +#define EV_KEY_RESTART 0x198 +#define EV_KEY_SLOW 0x199 +#define EV_KEY_SHUFFLE 0x19a +#define EV_KEY_BREAK 0x19b +#define EV_KEY_PREVIOUS 0x19c +#define EV_KEY_DIGITS 0x19d +#define EV_KEY_TEEN 0x19e +#define EV_KEY_TWEN 0x19f + +#define EV_KEY_MAX 0x1ff + +/* + * Relative axes + */ + +#define EV_REL_X 0x00 +#define EV_REL_Y 0x01 +#define EV_REL_Z 0x02 +#define EV_REL_HWHEEL 0x06 +#define EV_REL_DIAL 0x07 +#define EV_REL_WHEEL 0x08 +#define EV_REL_MISC 0x09 +#define EV_REL_MAX 0x0f + +/* + * Absolute axes + */ + +#define EV_ABS_X 0x00 +#define EV_ABS_Y 0x01 +#define EV_ABS_Z 0x02 +#define EV_ABS_RX 0x03 +#define EV_ABS_RY 0x04 +#define EV_ABS_RZ 0x05 +#define EV_ABS_THROTTLE 0x06 +#define EV_ABS_RUDDER 0x07 +#define EV_ABS_WHEEL 0x08 +#define EV_ABS_GAS 0x09 +#define EV_ABS_BRAKE 0x0a +#define EV_ABS_HAT0X 0x10 +#define EV_ABS_HAT0Y 0x11 +#define EV_ABS_HAT1X 0x12 +#define EV_ABS_HAT1Y 0x13 +#define EV_ABS_HAT2X 0x14 +#define EV_ABS_HAT2Y 0x15 +#define EV_ABS_HAT3X 0x16 +#define EV_ABS_HAT3Y 0x17 +#define EV_ABS_PRESSURE 0x18 +#define EV_ABS_DISTANCE 0x19 +#define EV_ABS_TILT_X 0x1a +#define EV_ABS_TILT_Y 0x1b +#define EV_ABS_VOLUME 0x20 +#define EV_ABS_MISC 0x28 +#define EV_ABS_MAX 0x3f + +/* + * Misc events + */ + +#define EV_MSG_SERIAL 0x00 +#define EV_MSG_PULSELED 0x01 +#define EV_MSG_MAX 0x07 + +/* + * LEDs + */ + +#define EV_LED_NUML 0x00 +#define EV_LED_CAPSL 0x01 +#define EV_LED_SCROLLL 0x02 +#define EV_LED_COMPOSE 0x03 +#define EV_LED_KANA 0x04 +#define EV_LED_SLEEP 0x05 +#define EV_LED_SUSPEND 0x06 +#define EV_LED_MUTE 0x07 +#define EV_LED_MISC 0x08 +#define EV_LED_MAX 0x0f + +/* + * Autorepeat values + */ + +#define EV_REP_DELAY 0x00 +#define EV_REP_PERIOD 0x01 +#define EV_REP_MAX 0x01 + +/* + * Sounds + */ + +#define EV_SND_CLICK 0x00 +#define EV_SND_BELL 0x01 +#define EV_SND_TONE 0x02 +#define EV_SND_MAX 0x07 + +/* + * IDs. + */ + +#define EV_ID_BUS 0 +#define EV_ID_VENDOR 1 +#define EV_ID_PRODUCT 2 +#define EV_ID_VERSION 3 + +#define EV_BUS_PCI 0x01 +#define EV_BUS_ISAPNP 0x02 +#define EV_BUS_USB 0x03 +#define EV_BUS_HIL 0x04 + +#define EV_BUS_ISA 0x10 +#define EV_BUS_I8042 0x11 +#define EV_BUS_XTKBD 0x12 +#define EV_BUS_RS232 0x13 +#define EV_BUS_GAMEPORT 0x14 +#define EV_BUS_PARPORT 0x15 +#define EV_BUS_AMIGA 0x16 +#define EV_BUS_ADB 0x17 +#define EV_BUS_I2C 0x18 +#define EV_BUS_HOST 0x19 + +/* + * Values describing the status of an effect + */ +#define EV_FF_STATUS_STOPPED 0x00 +#define EV_FF_STATUS_PLAYING 0x01 +#define EV_FF_STATUS_MAX 0x01 + +/* + * Structures used in ioctls to upload effects to a device + * The first structures are not passed directly by using ioctls. + * They are sub-structures of the actually sent structure (called ff_effect) + */ + +struct ff_replay { + __u16 length; /* Duration of an effect in ms. All other times are also expressed in ms */ + __u16 delay; /* Time to wait before to start playing an effect */ +}; + +struct ff_trigger { + __u16 button; /* Number of button triggering an effect */ + __u16 interval; /* Time to wait before an effect can be re-triggered (ms) */ +}; + +struct ff_envelope { + __u16 attack_length; /* Duration of attack (ms) */ + __u16 attack_level; /* Level at beginning of attack */ + __u16 fade_length; /* Duration of fade (ms) */ + __u16 fade_level; /* Level at end of fade */ +}; + +/* EV_FF_CONSTANT */ +struct ff_constant_effect { + __s16 level; /* Strength of effect. Negative values are OK */ + struct ff_envelope envelope; +}; + +/* EV_FF_RAMP */ +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +/* EV_FF_SPRING of FF_FRICTION */ +struct ff_condition_effect { + __u16 right_saturation; /* Max level when joystick is on the right */ + __u16 left_saturation; /* Max level when joystick in on the left */ + + __s16 right_coeff; /* Indicates how fast the force grows when the + joystick moves to the right */ + __s16 left_coeff; /* Same for left side */ + + __u16 deadband; /* Size of area where no force is produced */ + __s16 center; /* Position of dead zone */ + +}; + +/* EV_FF_PERIODIC */ +struct ff_periodic_effect { + __u16 waveform; /* Kind of wave (sine, square...) */ + __u16 period; /* in ms */ + __s16 magnitude; /* Peak value */ + __s16 offset; /* Mean value of wave (roughly) */ + __u16 phase; /* 'Horizontal' shift */ + + struct ff_envelope envelope; + +/* Only used if waveform == EV_FF_CUSTOM */ + __u32 custom_len; /* Number of samples */ + __s16 *custom_data; /* Buffer of samples */ +/* Note: the data pointed by custom_data is copied by the driver. You can + * therefore dispose of the memory after the upload/update */ +}; + +/* EV_FF_RUMBLE */ +/* Some rumble pads have two motors of different weight. + strong_magnitude represents the magnitude of the vibration generated + by the heavy motor. +*/ +struct ff_rumble_effect { + __u16 strong_magnitude; /* Magnitude of the heavy motor */ + __u16 weak_magnitude; /* Magnitude of the light one */ +}; + +/* + * Structure sent through ioctl from the application to the driver + */ +struct ff_effect { + __u16 type; +/* Following field denotes the unique id assigned to an effect. + * If user sets if to -1, a new effect is created, and its id is returned in the same field + * Else, the user sets it to the effect id it wants to update. + */ + __s16 id; + + __u16 direction; /* Direction. 0 deg -> 0x0000 (down) + 90 deg -> 0x4000 (left) + 180 deg -> 0x8000 (up) + 270 deg -> 0xC000 (right) + */ + + struct ff_trigger trigger; + struct ff_replay replay; + + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; /* One for each axis */ + struct ff_rumble_effect rumble; + } u; +}; + +/* + * Force feedback effect types + */ + +#define EV_FF_RUMBLE 0x50 +#define EV_FF_PERIODIC 0x51 +#define EV_FF_CONSTANT 0x52 +#define EV_FF_SPRING 0x53 +#define EV_FF_FRICTION 0x54 +#define EV_FF_DAMPER 0x55 +#define EV_FF_INERTIA 0x56 +#define EV_FF_RAMP 0x57 + +/* + * Force feedback periodic effect types + */ + +#define EV_FF_SQUARE 0x58 +#define EV_FF_TRIANGLE 0x59 +#define EV_FF_SINE 0x5a +#define EV_FF_SAW_UP 0x5b +#define EV_FF_SAW_DOWN 0x5c +#define EV_FF_CUSTOM 0x5d + +/* + * Set ff device properties + */ + +#define EV_FF_GAIN 0x60 +#define EV_FF_AUTOCENTER 0x61 + +#define EV_FF_MAX 0x7f + + + +typedef struct _evdevDriver { + const char *name; + const char *phys; + void *cb_data; + int (*callback)(void *cb_data, int what); + struct _evdevDriver *next; +} evdevDriver, *evdevDriverPtr; + +int evdevGetFDForDriver (evdevDriverPtr driver); +Bool evdevStart (InputDriverPtr drv); +Bool evdevNewDriver (evdevDriverPtr driver); + +#endif /* LNX_EVDEV_H_ */