xref: /freebsd/sys/dev/evdev/input.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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