xref: /freebsd/sys/dev/evdev/input.h (revision ea2e26b1ed8bb6f30264e8af66bb206c7b4970fc)
12b3f6d66SOleksandr Tymoshenko /*-
22b3f6d66SOleksandr Tymoshenko  * Copyright (c) 2016 Oleksandr Tymoshenko <gonzo@FreeBSD.org>
32b3f6d66SOleksandr Tymoshenko  * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@cicgroup.ru>
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  * $FreeBSD$
282b3f6d66SOleksandr Tymoshenko  */
292b3f6d66SOleksandr Tymoshenko 
302b3f6d66SOleksandr Tymoshenko #ifndef	_EVDEV_INPUT_H
312b3f6d66SOleksandr Tymoshenko #define	_EVDEV_INPUT_H
322b3f6d66SOleksandr Tymoshenko 
332b3f6d66SOleksandr Tymoshenko #ifndef __KERNEL__
342b3f6d66SOleksandr Tymoshenko #include <sys/ioccom.h>
35*ea2e26b1SVladimir Kondratyev #include <sys/time.h>
362b3f6d66SOleksandr Tymoshenko #include <sys/types.h>
372b3f6d66SOleksandr Tymoshenko #endif
382b3f6d66SOleksandr Tymoshenko 
392b3f6d66SOleksandr Tymoshenko #include "input-event-codes.h"
402b3f6d66SOleksandr Tymoshenko 
412b3f6d66SOleksandr Tymoshenko struct input_event {
422b3f6d66SOleksandr Tymoshenko 	struct timeval	time;
432b3f6d66SOleksandr Tymoshenko 	uint16_t	type;
442b3f6d66SOleksandr Tymoshenko 	uint16_t	code;
452b3f6d66SOleksandr Tymoshenko 	int32_t		value;
462b3f6d66SOleksandr Tymoshenko };
472b3f6d66SOleksandr Tymoshenko 
482b3f6d66SOleksandr Tymoshenko #define	EV_VERSION		0x010001
492b3f6d66SOleksandr Tymoshenko 
502b3f6d66SOleksandr Tymoshenko struct input_id {
512b3f6d66SOleksandr Tymoshenko 	uint16_t	bustype;
522b3f6d66SOleksandr Tymoshenko 	uint16_t	vendor;
532b3f6d66SOleksandr Tymoshenko 	uint16_t	product;
542b3f6d66SOleksandr Tymoshenko 	uint16_t	version;
552b3f6d66SOleksandr Tymoshenko };
562b3f6d66SOleksandr Tymoshenko 
572b3f6d66SOleksandr Tymoshenko struct input_absinfo {
582b3f6d66SOleksandr Tymoshenko 	int32_t		value;
592b3f6d66SOleksandr Tymoshenko 	int32_t		minimum;
602b3f6d66SOleksandr Tymoshenko 	int32_t		maximum;
612b3f6d66SOleksandr Tymoshenko 	int32_t		fuzz;
622b3f6d66SOleksandr Tymoshenko 	int32_t		flat;
632b3f6d66SOleksandr Tymoshenko 	int32_t		resolution;
642b3f6d66SOleksandr Tymoshenko };
652b3f6d66SOleksandr Tymoshenko 
662b3f6d66SOleksandr Tymoshenko #define	INPUT_KEYMAP_BY_INDEX	(1 << 0)
672b3f6d66SOleksandr Tymoshenko 
682b3f6d66SOleksandr Tymoshenko struct input_keymap_entry {
692b3f6d66SOleksandr Tymoshenko 	uint8_t		flags;
702b3f6d66SOleksandr Tymoshenko 	uint8_t		len;
712b3f6d66SOleksandr Tymoshenko 	uint16_t	index;
722b3f6d66SOleksandr Tymoshenko 	uint32_t	keycode;
732b3f6d66SOleksandr Tymoshenko 	uint8_t		scancode[32];
742b3f6d66SOleksandr Tymoshenko };
752b3f6d66SOleksandr Tymoshenko 
762b3f6d66SOleksandr Tymoshenko #define	EVDEV_IOC_MAGIC	'E'
772b3f6d66SOleksandr Tymoshenko #define	EVIOCGVERSION		_IOR(EVDEV_IOC_MAGIC, 0x01, int)		/* get driver version */
782b3f6d66SOleksandr Tymoshenko #define	EVIOCGID		_IOR(EVDEV_IOC_MAGIC, 0x02, struct input_id)	/* get device ID */
792b3f6d66SOleksandr Tymoshenko #define	EVIOCGREP		_IOR(EVDEV_IOC_MAGIC, 0x03, unsigned int[2])	/* get repeat settings */
802b3f6d66SOleksandr Tymoshenko #define	EVIOCSREP		_IOW(EVDEV_IOC_MAGIC, 0x03, unsigned int[2])	/* set repeat settings */
812b3f6d66SOleksandr Tymoshenko 
822b3f6d66SOleksandr Tymoshenko #define	EVIOCGKEYCODE		_IOWR(EVDEV_IOC_MAGIC, 0x04, unsigned int[2])	/* get keycode */
832b3f6d66SOleksandr Tymoshenko #define	EVIOCGKEYCODE_V2	_IOWR(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry)
842b3f6d66SOleksandr Tymoshenko #define	EVIOCSKEYCODE		_IOW(EVDEV_IOC_MAGIC, 0x04, unsigned int[2])	/* set keycode */
852b3f6d66SOleksandr Tymoshenko #define	EVIOCSKEYCODE_V2	_IOW(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry)
862b3f6d66SOleksandr Tymoshenko 
872b3f6d66SOleksandr Tymoshenko #define	EVIOCGNAME(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x06, len)	/* get device name */
882b3f6d66SOleksandr Tymoshenko #define	EVIOCGPHYS(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x07, len)	/* get physical location */
892b3f6d66SOleksandr Tymoshenko #define	EVIOCGUNIQ(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x08, len)	/* get unique identifier */
902b3f6d66SOleksandr Tymoshenko #define	EVIOCGPROP(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x09, len)	/* get device properties */
912b3f6d66SOleksandr Tymoshenko 
922b3f6d66SOleksandr Tymoshenko #define	EVIOCGMTSLOTS(len)	_IOC(IOC_INOUT,	EVDEV_IOC_MAGIC, 0x0a, len)	/* get MT slots values */
932b3f6d66SOleksandr Tymoshenko 
942b3f6d66SOleksandr Tymoshenko #define	EVIOCGKEY(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x18, len)	/* get global key state */
952b3f6d66SOleksandr Tymoshenko #define	EVIOCGLED(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x19, len)	/* get all LEDs */
962b3f6d66SOleksandr Tymoshenko #define	EVIOCGSND(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1a, len)	/* get all sounds status */
972b3f6d66SOleksandr Tymoshenko #define	EVIOCGSW(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1b, len)	/* get all switch states */
982b3f6d66SOleksandr Tymoshenko 
992b3f6d66SOleksandr Tymoshenko #define	EVIOCGBIT(ev,len)	_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x20 + (ev), len)	/* get event bits */
1002b3f6d66SOleksandr Tymoshenko #define	EVIOCGABS(abs)		_IOR(EVDEV_IOC_MAGIC, 0x40 + (abs), struct input_absinfo)	/* get abs value/limits */
1012b3f6d66SOleksandr Tymoshenko #define	EVIOCSABS(abs)		_IOW(EVDEV_IOC_MAGIC, 0xc0 + (abs), struct input_absinfo)	/* set abs value/limits */
1022b3f6d66SOleksandr Tymoshenko 
1032b3f6d66SOleksandr Tymoshenko #define	EVIOCSFF		_IOW(EVDEV_IOC_MAGIC, 0x80, struct ff_effect)	/* send a force effect to a force feedback device */
1042b3f6d66SOleksandr Tymoshenko #define	EVIOCRMFF		_IOWINT(EVDEV_IOC_MAGIC, 0x81)			/* Erase a force effect */
1052b3f6d66SOleksandr Tymoshenko #define	EVIOCGEFFECTS		_IOR(EVDEV_IOC_MAGIC, 0x84, int)		/* Report number of effects playable at the same time */
1062b3f6d66SOleksandr Tymoshenko 
1072b3f6d66SOleksandr Tymoshenko #define	EVIOCGRAB		_IOWINT(EVDEV_IOC_MAGIC, 0x90)			/* Grab/Release device */
1082b3f6d66SOleksandr Tymoshenko #define	EVIOCREVOKE		_IOWINT(EVDEV_IOC_MAGIC, 0x91)			/* Revoke device access */
1092b3f6d66SOleksandr Tymoshenko 
1102b3f6d66SOleksandr Tymoshenko #define	EVIOCSCLOCKID		_IOW(EVDEV_IOC_MAGIC, 0xa0, int)		/* Set clockid to be used for timestamps */
1112b3f6d66SOleksandr Tymoshenko 
1122b3f6d66SOleksandr Tymoshenko /*
1132b3f6d66SOleksandr Tymoshenko  * IDs.
1142b3f6d66SOleksandr Tymoshenko  */
1152b3f6d66SOleksandr Tymoshenko 
1162b3f6d66SOleksandr Tymoshenko #define	ID_BUS			0
1172b3f6d66SOleksandr Tymoshenko #define	ID_VENDOR		1
1182b3f6d66SOleksandr Tymoshenko #define	ID_PRODUCT		2
1192b3f6d66SOleksandr Tymoshenko #define	ID_VERSION		3
1202b3f6d66SOleksandr Tymoshenko 
1212b3f6d66SOleksandr Tymoshenko #define	BUS_PCI			0x01
1222b3f6d66SOleksandr Tymoshenko #define	BUS_ISAPNP		0x02
1232b3f6d66SOleksandr Tymoshenko #define	BUS_USB			0x03
1242b3f6d66SOleksandr Tymoshenko #define	BUS_HIL			0x04
1252b3f6d66SOleksandr Tymoshenko #define	BUS_BLUETOOTH		0x05
1262b3f6d66SOleksandr Tymoshenko #define	BUS_VIRTUAL		0x06
1272b3f6d66SOleksandr Tymoshenko 
1282b3f6d66SOleksandr Tymoshenko #define	BUS_ISA			0x10
1292b3f6d66SOleksandr Tymoshenko #define	BUS_I8042		0x11
1302b3f6d66SOleksandr Tymoshenko #define	BUS_XTKBD		0x12
1312b3f6d66SOleksandr Tymoshenko #define	BUS_RS232		0x13
1322b3f6d66SOleksandr Tymoshenko #define	BUS_GAMEPORT		0x14
1332b3f6d66SOleksandr Tymoshenko #define	BUS_PARPORT		0x15
1342b3f6d66SOleksandr Tymoshenko #define	BUS_AMIGA		0x16
1352b3f6d66SOleksandr Tymoshenko #define	BUS_ADB			0x17
1362b3f6d66SOleksandr Tymoshenko #define	BUS_I2C			0x18
1372b3f6d66SOleksandr Tymoshenko #define	BUS_HOST		0x19
1382b3f6d66SOleksandr Tymoshenko #define	BUS_GSC			0x1A
1392b3f6d66SOleksandr Tymoshenko #define	BUS_ATARI		0x1B
1402b3f6d66SOleksandr Tymoshenko #define	BUS_SPI			0x1C
1412b3f6d66SOleksandr Tymoshenko 
1422b3f6d66SOleksandr Tymoshenko /*
1432b3f6d66SOleksandr Tymoshenko  * MT_TOOL types
1442b3f6d66SOleksandr Tymoshenko  */
1452b3f6d66SOleksandr Tymoshenko #define	MT_TOOL_FINGER		0
1462b3f6d66SOleksandr Tymoshenko #define	MT_TOOL_PEN		1
1472b3f6d66SOleksandr Tymoshenko #define	MT_TOOL_PALM		2
1482b3f6d66SOleksandr Tymoshenko #define	MT_TOOL_MAX		2
1492b3f6d66SOleksandr Tymoshenko 
1502b3f6d66SOleksandr Tymoshenko /*
1512b3f6d66SOleksandr Tymoshenko  * Values describing the status of a force-feedback effect
1522b3f6d66SOleksandr Tymoshenko  */
1532b3f6d66SOleksandr Tymoshenko #define	FF_STATUS_STOPPED	0x00
1542b3f6d66SOleksandr Tymoshenko #define	FF_STATUS_PLAYING	0x01
1552b3f6d66SOleksandr Tymoshenko #define	FF_STATUS_MAX		0x01
1562b3f6d66SOleksandr Tymoshenko 
1572b3f6d66SOleksandr Tymoshenko /* scheduling info for force feedback effect */
1582b3f6d66SOleksandr Tymoshenko struct ff_replay {
1592b3f6d66SOleksandr Tymoshenko 	uint16_t	length;		/* length of the effect (ms) */
1602b3f6d66SOleksandr Tymoshenko 	uint16_t	delay;		/* delay before effect starts (ms) */
1612b3f6d66SOleksandr Tymoshenko };
1622b3f6d66SOleksandr Tymoshenko 
1632b3f6d66SOleksandr Tymoshenko /* trigger for force feedback effect */
1642b3f6d66SOleksandr Tymoshenko struct ff_trigger {
1652b3f6d66SOleksandr Tymoshenko 	uint16_t	button;		/* trigger button number */
1662b3f6d66SOleksandr Tymoshenko 	uint16_t	interval;	/* delay between re-triggers */
1672b3f6d66SOleksandr Tymoshenko };
1682b3f6d66SOleksandr Tymoshenko 
1692b3f6d66SOleksandr Tymoshenko /* force feedback effect envelop */
1702b3f6d66SOleksandr Tymoshenko struct ff_envelope {
1712b3f6d66SOleksandr Tymoshenko 	uint16_t	attack_length;	/* duration of the attach (ms) */
1722b3f6d66SOleksandr Tymoshenko 	uint16_t	attack_level;	/* level at the beginning (0x0000 - 0x7fff) */
1732b3f6d66SOleksandr Tymoshenko 	uint16_t	fade_length;	/* duratin of fade (ms) */
1742b3f6d66SOleksandr Tymoshenko 	uint16_t	fade_level;	/* level at the end of fade */
1752b3f6d66SOleksandr Tymoshenko };
1762b3f6d66SOleksandr Tymoshenko 
1772b3f6d66SOleksandr Tymoshenko struct ff_constant_effect {
1782b3f6d66SOleksandr Tymoshenko 	int16_t			level;
1792b3f6d66SOleksandr Tymoshenko 	struct ff_envelope	envelope;
1802b3f6d66SOleksandr Tymoshenko };
1812b3f6d66SOleksandr Tymoshenko 
1822b3f6d66SOleksandr Tymoshenko struct ff_ramp_effect {
1832b3f6d66SOleksandr Tymoshenko 	int16_t			start_level;
1842b3f6d66SOleksandr Tymoshenko 	int16_t			end_level;
1852b3f6d66SOleksandr Tymoshenko 	struct ff_envelope	envelope;
1862b3f6d66SOleksandr Tymoshenko };
1872b3f6d66SOleksandr Tymoshenko 
1882b3f6d66SOleksandr Tymoshenko struct ff_condition_effect {
1892b3f6d66SOleksandr Tymoshenko 	/* maximum level when joystick moved to respective side */
1902b3f6d66SOleksandr Tymoshenko 	uint16_t	right_saturation;
1912b3f6d66SOleksandr Tymoshenko 
1922b3f6d66SOleksandr Tymoshenko 	uint16_t	left_saturation;
1932b3f6d66SOleksandr Tymoshenko 	/* how fast force grows when joystick move to the respective side */
1942b3f6d66SOleksandr Tymoshenko 	int16_t		right_coeff;
1952b3f6d66SOleksandr Tymoshenko 	int16_t		left_coeff;
1962b3f6d66SOleksandr Tymoshenko 
1972b3f6d66SOleksandr Tymoshenko 	uint16_t	deadband;	/* size of dead zone when no force is produced */
1982b3f6d66SOleksandr Tymoshenko 	int16_t		center;		/* center of dead zone */
1992b3f6d66SOleksandr Tymoshenko };
2002b3f6d66SOleksandr Tymoshenko 
2012b3f6d66SOleksandr Tymoshenko /*
2022b3f6d66SOleksandr Tymoshenko  * Force feedback periodic effect types
2032b3f6d66SOleksandr Tymoshenko  */
2042b3f6d66SOleksandr Tymoshenko 
2052b3f6d66SOleksandr Tymoshenko #define	FF_SQUARE	0x58
2062b3f6d66SOleksandr Tymoshenko #define	FF_TRIANGLE	0x59
2072b3f6d66SOleksandr Tymoshenko #define	FF_SINE		0x5a
2082b3f6d66SOleksandr Tymoshenko #define	FF_SAW_UP	0x5b
2092b3f6d66SOleksandr Tymoshenko #define	FF_SAW_DOWN	0x5c
2102b3f6d66SOleksandr Tymoshenko #define	FF_CUSTOM	0x5d
2112b3f6d66SOleksandr Tymoshenko 
2122b3f6d66SOleksandr Tymoshenko #define	FF_WAVEFORM_MIN	FF_SQUARE
2132b3f6d66SOleksandr Tymoshenko #define	FF_WAVEFORM_MAX	FF_CUSTOM
2142b3f6d66SOleksandr Tymoshenko 
2152b3f6d66SOleksandr Tymoshenko struct ff_periodic_effect {
2162b3f6d66SOleksandr Tymoshenko 	uint16_t		waveform;
2172b3f6d66SOleksandr Tymoshenko 	uint16_t		period;		/* ms */
2182b3f6d66SOleksandr Tymoshenko 	int16_t			magnitude;	/* peak */
2192b3f6d66SOleksandr Tymoshenko 	int16_t			offset;		/* mean, roughly */
2202b3f6d66SOleksandr Tymoshenko 	uint16_t		phase;		/* horizontal shift */
2212b3f6d66SOleksandr Tymoshenko 	struct ff_envelope	envelope;
2222b3f6d66SOleksandr Tymoshenko 	uint32_t		custom_len;	/* FF_CUSTOM waveform only */
2232b3f6d66SOleksandr Tymoshenko 	int16_t			*custom_data;	/* FF_CUSTOM waveform only */
2242b3f6d66SOleksandr Tymoshenko };
2252b3f6d66SOleksandr Tymoshenko 
2262b3f6d66SOleksandr Tymoshenko struct ff_rumble_effect {
2272b3f6d66SOleksandr Tymoshenko 	uint16_t	strong_magnitude;	/* magnitude of the heavy motor */
2282b3f6d66SOleksandr Tymoshenko 	uint16_t	weak_magnitude;		/* magnitude of the light motor */
2292b3f6d66SOleksandr Tymoshenko };
2302b3f6d66SOleksandr Tymoshenko 
2312b3f6d66SOleksandr Tymoshenko /*
2322b3f6d66SOleksandr Tymoshenko  * Force feedback effect types
2332b3f6d66SOleksandr Tymoshenko  */
2342b3f6d66SOleksandr Tymoshenko 
2352b3f6d66SOleksandr Tymoshenko #define	FF_RUMBLE	0x50
2362b3f6d66SOleksandr Tymoshenko #define	FF_PERIODIC	0x51
2372b3f6d66SOleksandr Tymoshenko #define	FF_CONSTANT	0x52
2382b3f6d66SOleksandr Tymoshenko #define	FF_SPRING	0x53
2392b3f6d66SOleksandr Tymoshenko #define	FF_FRICTION	0x54
2402b3f6d66SOleksandr Tymoshenko #define	FF_DAMPER	0x55
2412b3f6d66SOleksandr Tymoshenko #define	FF_INERTIA	0x56
2422b3f6d66SOleksandr Tymoshenko #define	FF_RAMP		0x57
2432b3f6d66SOleksandr Tymoshenko 
2442b3f6d66SOleksandr Tymoshenko #define	FF_EFFECT_MIN	FF_RUMBLE
2452b3f6d66SOleksandr Tymoshenko #define	FF_EFFECT_MAX	FF_RAMP
2462b3f6d66SOleksandr Tymoshenko 
2472b3f6d66SOleksandr Tymoshenko struct ff_effect {
2482b3f6d66SOleksandr Tymoshenko 	uint16_t		type;
2492b3f6d66SOleksandr Tymoshenko 	int16_t			id;
2502b3f6d66SOleksandr Tymoshenko 	uint16_t		direction;	/* [0 .. 360) degrees -> [0 .. 0x10000) */
2512b3f6d66SOleksandr Tymoshenko 	struct ff_trigger	trigger;
2522b3f6d66SOleksandr Tymoshenko 	struct ff_replay	replay;
2532b3f6d66SOleksandr Tymoshenko 
2542b3f6d66SOleksandr Tymoshenko 	union {
2552b3f6d66SOleksandr Tymoshenko 		struct ff_constant_effect	constant;
2562b3f6d66SOleksandr Tymoshenko 		struct ff_ramp_effect		ramp;
2572b3f6d66SOleksandr Tymoshenko 		struct ff_periodic_effect	periodic;
2582b3f6d66SOleksandr Tymoshenko 		struct ff_condition_effect	condition[2]; /* One for each axis */
2592b3f6d66SOleksandr Tymoshenko 		struct ff_rumble_effect		rumble;
2602b3f6d66SOleksandr Tymoshenko 	} u;
2612b3f6d66SOleksandr Tymoshenko };
2622b3f6d66SOleksandr Tymoshenko 
2632b3f6d66SOleksandr Tymoshenko /*
2642b3f6d66SOleksandr Tymoshenko  * force feedback device properties
2652b3f6d66SOleksandr Tymoshenko  */
2662b3f6d66SOleksandr Tymoshenko 
2672b3f6d66SOleksandr Tymoshenko #define	FF_GAIN		0x60
2682b3f6d66SOleksandr Tymoshenko #define	FF_AUTOCENTER	0x61
2692b3f6d66SOleksandr Tymoshenko 
2702b3f6d66SOleksandr Tymoshenko #define	FF_MAX		0x7f
2712b3f6d66SOleksandr Tymoshenko #define	FF_CNT		(FF_MAX+1)
2722b3f6d66SOleksandr Tymoshenko 
2732b3f6d66SOleksandr Tymoshenko #endif /* _EVDEV_INPUT_H */
274