12b3f6d66SOleksandr Tymoshenko /*- 22b3f6d66SOleksandr Tymoshenko * Copyright (c) 2016 Oleksandr Tymoshenko <gonzo@FreeBSD.org> 3e6502802SVladimir Kondratyev * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org> 42b3f6d66SOleksandr Tymoshenko * All rights reserved. 52b3f6d66SOleksandr Tymoshenko * 62b3f6d66SOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 72b3f6d66SOleksandr Tymoshenko * modification, are permitted provided that the following conditions 82b3f6d66SOleksandr Tymoshenko * are met: 92b3f6d66SOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 102b3f6d66SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer. 112b3f6d66SOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 122b3f6d66SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 132b3f6d66SOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 142b3f6d66SOleksandr Tymoshenko * 152b3f6d66SOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 162b3f6d66SOleksandr Tymoshenko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 172b3f6d66SOleksandr Tymoshenko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 182b3f6d66SOleksandr Tymoshenko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 192b3f6d66SOleksandr Tymoshenko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 202b3f6d66SOleksandr Tymoshenko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 212b3f6d66SOleksandr Tymoshenko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 222b3f6d66SOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 232b3f6d66SOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 242b3f6d66SOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 252b3f6d66SOleksandr Tymoshenko * SUCH DAMAGE. 262b3f6d66SOleksandr Tymoshenko */ 272b3f6d66SOleksandr Tymoshenko 282b3f6d66SOleksandr Tymoshenko #ifndef _EVDEV_INPUT_H 292b3f6d66SOleksandr Tymoshenko #define _EVDEV_INPUT_H 302b3f6d66SOleksandr Tymoshenko 312b3f6d66SOleksandr Tymoshenko #ifndef __KERNEL__ 322b3f6d66SOleksandr Tymoshenko #include <sys/ioccom.h> 33ea2e26b1SVladimir Kondratyev #include <sys/time.h> 342b3f6d66SOleksandr Tymoshenko #include <sys/types.h> 352b3f6d66SOleksandr Tymoshenko #endif 362b3f6d66SOleksandr Tymoshenko 372b3f6d66SOleksandr Tymoshenko #include "input-event-codes.h" 382b3f6d66SOleksandr Tymoshenko 396bae6b25SVladimir Kondratyev #define input_event_sec time.tv_sec 406bae6b25SVladimir Kondratyev #define input_event_usec time.tv_usec 416bae6b25SVladimir Kondratyev 422b3f6d66SOleksandr Tymoshenko struct input_event { 432b3f6d66SOleksandr Tymoshenko struct timeval time; 442b3f6d66SOleksandr Tymoshenko uint16_t type; 452b3f6d66SOleksandr Tymoshenko uint16_t code; 462b3f6d66SOleksandr Tymoshenko int32_t value; 472b3f6d66SOleksandr Tymoshenko }; 482b3f6d66SOleksandr Tymoshenko 492b3f6d66SOleksandr Tymoshenko #define EV_VERSION 0x010001 502b3f6d66SOleksandr Tymoshenko 512b3f6d66SOleksandr Tymoshenko struct input_id { 522b3f6d66SOleksandr Tymoshenko uint16_t bustype; 532b3f6d66SOleksandr Tymoshenko uint16_t vendor; 542b3f6d66SOleksandr Tymoshenko uint16_t product; 552b3f6d66SOleksandr Tymoshenko uint16_t version; 562b3f6d66SOleksandr Tymoshenko }; 572b3f6d66SOleksandr Tymoshenko 582b3f6d66SOleksandr Tymoshenko struct input_absinfo { 592b3f6d66SOleksandr Tymoshenko int32_t value; 602b3f6d66SOleksandr Tymoshenko int32_t minimum; 612b3f6d66SOleksandr Tymoshenko int32_t maximum; 622b3f6d66SOleksandr Tymoshenko int32_t fuzz; 632b3f6d66SOleksandr Tymoshenko int32_t flat; 642b3f6d66SOleksandr Tymoshenko int32_t resolution; 652b3f6d66SOleksandr Tymoshenko }; 662b3f6d66SOleksandr Tymoshenko 672b3f6d66SOleksandr Tymoshenko #define INPUT_KEYMAP_BY_INDEX (1 << 0) 682b3f6d66SOleksandr Tymoshenko 692b3f6d66SOleksandr Tymoshenko struct input_keymap_entry { 702b3f6d66SOleksandr Tymoshenko uint8_t flags; 712b3f6d66SOleksandr Tymoshenko uint8_t len; 722b3f6d66SOleksandr Tymoshenko uint16_t index; 732b3f6d66SOleksandr Tymoshenko uint32_t keycode; 742b3f6d66SOleksandr Tymoshenko uint8_t scancode[32]; 752b3f6d66SOleksandr Tymoshenko }; 762b3f6d66SOleksandr Tymoshenko 772b3f6d66SOleksandr Tymoshenko #define EVDEV_IOC_MAGIC 'E' 782b3f6d66SOleksandr Tymoshenko #define EVIOCGVERSION _IOR(EVDEV_IOC_MAGIC, 0x01, int) /* get driver version */ 792b3f6d66SOleksandr Tymoshenko #define EVIOCGID _IOR(EVDEV_IOC_MAGIC, 0x02, struct input_id) /* get device ID */ 802b3f6d66SOleksandr Tymoshenko #define EVIOCGREP _IOR(EVDEV_IOC_MAGIC, 0x03, unsigned int[2]) /* get repeat settings */ 812b3f6d66SOleksandr Tymoshenko #define EVIOCSREP _IOW(EVDEV_IOC_MAGIC, 0x03, unsigned int[2]) /* set repeat settings */ 822b3f6d66SOleksandr Tymoshenko 832b3f6d66SOleksandr Tymoshenko #define EVIOCGKEYCODE _IOWR(EVDEV_IOC_MAGIC, 0x04, unsigned int[2]) /* get keycode */ 842b3f6d66SOleksandr Tymoshenko #define EVIOCGKEYCODE_V2 _IOWR(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry) 852b3f6d66SOleksandr Tymoshenko #define EVIOCSKEYCODE _IOW(EVDEV_IOC_MAGIC, 0x04, unsigned int[2]) /* set keycode */ 862b3f6d66SOleksandr Tymoshenko #define EVIOCSKEYCODE_V2 _IOW(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry) 872b3f6d66SOleksandr Tymoshenko 882b3f6d66SOleksandr Tymoshenko #define EVIOCGNAME(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x06, len) /* get device name */ 892b3f6d66SOleksandr Tymoshenko #define EVIOCGPHYS(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x07, len) /* get physical location */ 902b3f6d66SOleksandr Tymoshenko #define EVIOCGUNIQ(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x08, len) /* get unique identifier */ 912b3f6d66SOleksandr Tymoshenko #define EVIOCGPROP(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x09, len) /* get device properties */ 922b3f6d66SOleksandr Tymoshenko 932b3f6d66SOleksandr Tymoshenko #define EVIOCGMTSLOTS(len) _IOC(IOC_INOUT, EVDEV_IOC_MAGIC, 0x0a, len) /* get MT slots values */ 942b3f6d66SOleksandr Tymoshenko 952b3f6d66SOleksandr Tymoshenko #define EVIOCGKEY(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x18, len) /* get global key state */ 962b3f6d66SOleksandr Tymoshenko #define EVIOCGLED(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x19, len) /* get all LEDs */ 972b3f6d66SOleksandr Tymoshenko #define EVIOCGSND(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1a, len) /* get all sounds status */ 982b3f6d66SOleksandr Tymoshenko #define EVIOCGSW(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1b, len) /* get all switch states */ 992b3f6d66SOleksandr Tymoshenko 1002b3f6d66SOleksandr Tymoshenko #define EVIOCGBIT(ev,len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x20 + (ev), len) /* get event bits */ 1012b3f6d66SOleksandr Tymoshenko #define EVIOCGABS(abs) _IOR(EVDEV_IOC_MAGIC, 0x40 + (abs), struct input_absinfo) /* get abs value/limits */ 1022b3f6d66SOleksandr Tymoshenko #define EVIOCSABS(abs) _IOW(EVDEV_IOC_MAGIC, 0xc0 + (abs), struct input_absinfo) /* set abs value/limits */ 1032b3f6d66SOleksandr Tymoshenko 1042b3f6d66SOleksandr Tymoshenko #define EVIOCSFF _IOW(EVDEV_IOC_MAGIC, 0x80, struct ff_effect) /* send a force effect to a force feedback device */ 1052b3f6d66SOleksandr Tymoshenko #define EVIOCRMFF _IOWINT(EVDEV_IOC_MAGIC, 0x81) /* Erase a force effect */ 1062b3f6d66SOleksandr Tymoshenko #define EVIOCGEFFECTS _IOR(EVDEV_IOC_MAGIC, 0x84, int) /* Report number of effects playable at the same time */ 1072b3f6d66SOleksandr Tymoshenko 1082b3f6d66SOleksandr Tymoshenko #define EVIOCGRAB _IOWINT(EVDEV_IOC_MAGIC, 0x90) /* Grab/Release device */ 1092b3f6d66SOleksandr Tymoshenko #define EVIOCREVOKE _IOWINT(EVDEV_IOC_MAGIC, 0x91) /* Revoke device access */ 1102b3f6d66SOleksandr Tymoshenko 1112b3f6d66SOleksandr Tymoshenko #define EVIOCSCLOCKID _IOW(EVDEV_IOC_MAGIC, 0xa0, int) /* Set clockid to be used for timestamps */ 1122b3f6d66SOleksandr Tymoshenko 1132b3f6d66SOleksandr Tymoshenko /* 1142b3f6d66SOleksandr Tymoshenko * IDs. 1152b3f6d66SOleksandr Tymoshenko */ 1162b3f6d66SOleksandr Tymoshenko 1172b3f6d66SOleksandr Tymoshenko #define ID_BUS 0 1182b3f6d66SOleksandr Tymoshenko #define ID_VENDOR 1 1192b3f6d66SOleksandr Tymoshenko #define ID_PRODUCT 2 1202b3f6d66SOleksandr Tymoshenko #define ID_VERSION 3 1212b3f6d66SOleksandr Tymoshenko 1222b3f6d66SOleksandr Tymoshenko #define BUS_PCI 0x01 1232b3f6d66SOleksandr Tymoshenko #define BUS_ISAPNP 0x02 1242b3f6d66SOleksandr Tymoshenko #define BUS_USB 0x03 1252b3f6d66SOleksandr Tymoshenko #define BUS_HIL 0x04 1262b3f6d66SOleksandr Tymoshenko #define BUS_BLUETOOTH 0x05 1272b3f6d66SOleksandr Tymoshenko #define BUS_VIRTUAL 0x06 1282b3f6d66SOleksandr Tymoshenko 1292b3f6d66SOleksandr Tymoshenko #define BUS_ISA 0x10 1302b3f6d66SOleksandr Tymoshenko #define BUS_I8042 0x11 1312b3f6d66SOleksandr Tymoshenko #define BUS_XTKBD 0x12 1322b3f6d66SOleksandr Tymoshenko #define BUS_RS232 0x13 1332b3f6d66SOleksandr Tymoshenko #define BUS_GAMEPORT 0x14 1342b3f6d66SOleksandr Tymoshenko #define BUS_PARPORT 0x15 1352b3f6d66SOleksandr Tymoshenko #define BUS_AMIGA 0x16 1362b3f6d66SOleksandr Tymoshenko #define BUS_ADB 0x17 1372b3f6d66SOleksandr Tymoshenko #define BUS_I2C 0x18 1382b3f6d66SOleksandr Tymoshenko #define BUS_HOST 0x19 1392b3f6d66SOleksandr Tymoshenko #define BUS_GSC 0x1A 1402b3f6d66SOleksandr Tymoshenko #define BUS_ATARI 0x1B 1412b3f6d66SOleksandr Tymoshenko #define BUS_SPI 0x1C 1426bae6b25SVladimir Kondratyev #define BUS_RMI 0x1D 1436bae6b25SVladimir Kondratyev #define BUS_CEC 0x1E 1446bae6b25SVladimir Kondratyev #define BUS_INTEL_ISHTP 0x1F 1452b3f6d66SOleksandr Tymoshenko 1462b3f6d66SOleksandr Tymoshenko /* 1472b3f6d66SOleksandr Tymoshenko * MT_TOOL types 1482b3f6d66SOleksandr Tymoshenko */ 149*d3165049SVladimir Kondratyev #define MT_TOOL_FINGER 0x00 150*d3165049SVladimir Kondratyev #define MT_TOOL_PEN 0x01 151*d3165049SVladimir Kondratyev #define MT_TOOL_PALM 0x02 152*d3165049SVladimir Kondratyev #define MT_TOOL_DIAL 0x0a 153*d3165049SVladimir Kondratyev #define MT_TOOL_MAX 0x0f 1542b3f6d66SOleksandr Tymoshenko 1552b3f6d66SOleksandr Tymoshenko /* 1562b3f6d66SOleksandr Tymoshenko * Values describing the status of a force-feedback effect 1572b3f6d66SOleksandr Tymoshenko */ 1582b3f6d66SOleksandr Tymoshenko #define FF_STATUS_STOPPED 0x00 1592b3f6d66SOleksandr Tymoshenko #define FF_STATUS_PLAYING 0x01 1602b3f6d66SOleksandr Tymoshenko #define FF_STATUS_MAX 0x01 1612b3f6d66SOleksandr Tymoshenko 1622b3f6d66SOleksandr Tymoshenko /* scheduling info for force feedback effect */ 1632b3f6d66SOleksandr Tymoshenko struct ff_replay { 1642b3f6d66SOleksandr Tymoshenko uint16_t length; /* length of the effect (ms) */ 1652b3f6d66SOleksandr Tymoshenko uint16_t delay; /* delay before effect starts (ms) */ 1662b3f6d66SOleksandr Tymoshenko }; 1672b3f6d66SOleksandr Tymoshenko 1682b3f6d66SOleksandr Tymoshenko /* trigger for force feedback effect */ 1692b3f6d66SOleksandr Tymoshenko struct ff_trigger { 1702b3f6d66SOleksandr Tymoshenko uint16_t button; /* trigger button number */ 1712b3f6d66SOleksandr Tymoshenko uint16_t interval; /* delay between re-triggers */ 1722b3f6d66SOleksandr Tymoshenko }; 1732b3f6d66SOleksandr Tymoshenko 1742b3f6d66SOleksandr Tymoshenko /* force feedback effect envelop */ 1752b3f6d66SOleksandr Tymoshenko struct ff_envelope { 1762b3f6d66SOleksandr Tymoshenko uint16_t attack_length; /* duration of the attach (ms) */ 1772b3f6d66SOleksandr Tymoshenko uint16_t attack_level; /* level at the beginning (0x0000 - 0x7fff) */ 1782b3f6d66SOleksandr Tymoshenko uint16_t fade_length; /* duratin of fade (ms) */ 1792b3f6d66SOleksandr Tymoshenko uint16_t fade_level; /* level at the end of fade */ 1802b3f6d66SOleksandr Tymoshenko }; 1812b3f6d66SOleksandr Tymoshenko 1822b3f6d66SOleksandr Tymoshenko struct ff_constant_effect { 1832b3f6d66SOleksandr Tymoshenko int16_t level; 1842b3f6d66SOleksandr Tymoshenko struct ff_envelope envelope; 1852b3f6d66SOleksandr Tymoshenko }; 1862b3f6d66SOleksandr Tymoshenko 1872b3f6d66SOleksandr Tymoshenko struct ff_ramp_effect { 1882b3f6d66SOleksandr Tymoshenko int16_t start_level; 1892b3f6d66SOleksandr Tymoshenko int16_t end_level; 1902b3f6d66SOleksandr Tymoshenko struct ff_envelope envelope; 1912b3f6d66SOleksandr Tymoshenko }; 1922b3f6d66SOleksandr Tymoshenko 1932b3f6d66SOleksandr Tymoshenko struct ff_condition_effect { 1942b3f6d66SOleksandr Tymoshenko /* maximum level when joystick moved to respective side */ 1952b3f6d66SOleksandr Tymoshenko uint16_t right_saturation; 1962b3f6d66SOleksandr Tymoshenko 1972b3f6d66SOleksandr Tymoshenko uint16_t left_saturation; 1982b3f6d66SOleksandr Tymoshenko /* how fast force grows when joystick move to the respective side */ 1992b3f6d66SOleksandr Tymoshenko int16_t right_coeff; 2002b3f6d66SOleksandr Tymoshenko int16_t left_coeff; 2012b3f6d66SOleksandr Tymoshenko 2022b3f6d66SOleksandr Tymoshenko uint16_t deadband; /* size of dead zone when no force is produced */ 2032b3f6d66SOleksandr Tymoshenko int16_t center; /* center of dead zone */ 2042b3f6d66SOleksandr Tymoshenko }; 2052b3f6d66SOleksandr Tymoshenko 2062b3f6d66SOleksandr Tymoshenko /* 2072b3f6d66SOleksandr Tymoshenko * Force feedback periodic effect types 2082b3f6d66SOleksandr Tymoshenko */ 2092b3f6d66SOleksandr Tymoshenko 2102b3f6d66SOleksandr Tymoshenko #define FF_SQUARE 0x58 2112b3f6d66SOleksandr Tymoshenko #define FF_TRIANGLE 0x59 2122b3f6d66SOleksandr Tymoshenko #define FF_SINE 0x5a 2132b3f6d66SOleksandr Tymoshenko #define FF_SAW_UP 0x5b 2142b3f6d66SOleksandr Tymoshenko #define FF_SAW_DOWN 0x5c 2152b3f6d66SOleksandr Tymoshenko #define FF_CUSTOM 0x5d 2162b3f6d66SOleksandr Tymoshenko 2172b3f6d66SOleksandr Tymoshenko #define FF_WAVEFORM_MIN FF_SQUARE 2182b3f6d66SOleksandr Tymoshenko #define FF_WAVEFORM_MAX FF_CUSTOM 2192b3f6d66SOleksandr Tymoshenko 2202b3f6d66SOleksandr Tymoshenko struct ff_periodic_effect { 2212b3f6d66SOleksandr Tymoshenko uint16_t waveform; 2222b3f6d66SOleksandr Tymoshenko uint16_t period; /* ms */ 2232b3f6d66SOleksandr Tymoshenko int16_t magnitude; /* peak */ 2242b3f6d66SOleksandr Tymoshenko int16_t offset; /* mean, roughly */ 2252b3f6d66SOleksandr Tymoshenko uint16_t phase; /* horizontal shift */ 2262b3f6d66SOleksandr Tymoshenko struct ff_envelope envelope; 2272b3f6d66SOleksandr Tymoshenko uint32_t custom_len; /* FF_CUSTOM waveform only */ 2282b3f6d66SOleksandr Tymoshenko int16_t *custom_data; /* FF_CUSTOM waveform only */ 2292b3f6d66SOleksandr Tymoshenko }; 2302b3f6d66SOleksandr Tymoshenko 2312b3f6d66SOleksandr Tymoshenko struct ff_rumble_effect { 2322b3f6d66SOleksandr Tymoshenko uint16_t strong_magnitude; /* magnitude of the heavy motor */ 2332b3f6d66SOleksandr Tymoshenko uint16_t weak_magnitude; /* magnitude of the light motor */ 2342b3f6d66SOleksandr Tymoshenko }; 2352b3f6d66SOleksandr Tymoshenko 2362b3f6d66SOleksandr Tymoshenko /* 2372b3f6d66SOleksandr Tymoshenko * Force feedback effect types 2382b3f6d66SOleksandr Tymoshenko */ 2392b3f6d66SOleksandr Tymoshenko 2402b3f6d66SOleksandr Tymoshenko #define FF_RUMBLE 0x50 2412b3f6d66SOleksandr Tymoshenko #define FF_PERIODIC 0x51 2422b3f6d66SOleksandr Tymoshenko #define FF_CONSTANT 0x52 2432b3f6d66SOleksandr Tymoshenko #define FF_SPRING 0x53 2442b3f6d66SOleksandr Tymoshenko #define FF_FRICTION 0x54 2452b3f6d66SOleksandr Tymoshenko #define FF_DAMPER 0x55 2462b3f6d66SOleksandr Tymoshenko #define FF_INERTIA 0x56 2472b3f6d66SOleksandr Tymoshenko #define FF_RAMP 0x57 2482b3f6d66SOleksandr Tymoshenko 2492b3f6d66SOleksandr Tymoshenko #define FF_EFFECT_MIN FF_RUMBLE 2502b3f6d66SOleksandr Tymoshenko #define FF_EFFECT_MAX FF_RAMP 2512b3f6d66SOleksandr Tymoshenko 2522b3f6d66SOleksandr Tymoshenko struct ff_effect { 2532b3f6d66SOleksandr Tymoshenko uint16_t type; 2542b3f6d66SOleksandr Tymoshenko int16_t id; 2552b3f6d66SOleksandr Tymoshenko uint16_t direction; /* [0 .. 360) degrees -> [0 .. 0x10000) */ 2562b3f6d66SOleksandr Tymoshenko struct ff_trigger trigger; 2572b3f6d66SOleksandr Tymoshenko struct ff_replay replay; 2582b3f6d66SOleksandr Tymoshenko 2592b3f6d66SOleksandr Tymoshenko union { 2602b3f6d66SOleksandr Tymoshenko struct ff_constant_effect constant; 2612b3f6d66SOleksandr Tymoshenko struct ff_ramp_effect ramp; 2622b3f6d66SOleksandr Tymoshenko struct ff_periodic_effect periodic; 2632b3f6d66SOleksandr Tymoshenko struct ff_condition_effect condition[2]; /* One for each axis */ 2642b3f6d66SOleksandr Tymoshenko struct ff_rumble_effect rumble; 2652b3f6d66SOleksandr Tymoshenko } u; 2662b3f6d66SOleksandr Tymoshenko }; 2672b3f6d66SOleksandr Tymoshenko 2682b3f6d66SOleksandr Tymoshenko /* 2692b3f6d66SOleksandr Tymoshenko * force feedback device properties 2702b3f6d66SOleksandr Tymoshenko */ 2712b3f6d66SOleksandr Tymoshenko 2722b3f6d66SOleksandr Tymoshenko #define FF_GAIN 0x60 2732b3f6d66SOleksandr Tymoshenko #define FF_AUTOCENTER 0x61 2742b3f6d66SOleksandr Tymoshenko 2752b3f6d66SOleksandr Tymoshenko #define FF_MAX 0x7f 2762b3f6d66SOleksandr Tymoshenko #define FF_CNT (FF_MAX+1) 2772b3f6d66SOleksandr Tymoshenko 2782b3f6d66SOleksandr Tymoshenko #endif /* _EVDEV_INPUT_H */ 279