1/*-
  2 * Copyright (c) 2016 Oleksandr Tymoshenko <gonzo@FreeBSD.org>
  3 * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
  4 * All rights reserved.
  5 *
  6 * Redistribution and use in source and binary forms, with or without
  7 * modification, are permitted provided that the following conditions
  8 * are met:
  9 * 1. Redistributions of source code must retain the above copyright
 10 *    notice, this list of conditions and the following disclaimer.
 11 * 2. Redistributions in binary form must reproduce the above copyright
 12 *    notice, this list of conditions and the following disclaimer in the
 13 *    documentation and/or other materials provided with the distribution.
 14 *
 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 25 * SUCH DAMAGE.
 26 */
 27
 28#ifndef	_EVDEV_INPUT_H
 29#define	_EVDEV_INPUT_H
 30
 31#ifndef __KERNEL__
 32#include <sys/ioccom.h>
 33#include <sys/time.h>
 34#include <sys/types.h>
 35#endif
 36
 37#include "input-event-codes.h"
 38
 39#define	input_event_sec		time.tv_sec
 40#define	input_event_usec	time.tv_usec
 41
 42struct input_event {
 43	struct timeval	time;
 44	uint16_t	type;
 45	uint16_t	code;
 46	int32_t		value;
 47};
 48
 49#define	EV_VERSION		0x010001
 50
 51struct input_id {
 52	uint16_t	bustype;
 53	uint16_t	vendor;
 54	uint16_t	product;
 55	uint16_t	version;
 56};
 57
 58struct input_absinfo {
 59	int32_t		value;
 60	int32_t		minimum;
 61	int32_t		maximum;
 62	int32_t		fuzz;
 63	int32_t		flat;
 64	int32_t		resolution;
 65};
 66
 67#define	INPUT_KEYMAP_BY_INDEX	(1 << 0)
 68
 69struct input_keymap_entry {
 70	uint8_t		flags;
 71	uint8_t		len;
 72	uint16_t	index;
 73	uint32_t	keycode;
 74	uint8_t		scancode[32];
 75};
 76
 77#define	EVDEV_IOC_MAGIC	'E'
 78#define	EVIOCGVERSION		_IOR(EVDEV_IOC_MAGIC, 0x01, int)		/* get driver version */
 79#define	EVIOCGID		_IOR(EVDEV_IOC_MAGIC, 0x02, struct input_id)	/* get device ID */
 80#define	EVIOCGREP		_IOR(EVDEV_IOC_MAGIC, 0x03, unsigned int[2])	/* get repeat settings */
 81#define	EVIOCSREP		_IOW(EVDEV_IOC_MAGIC, 0x03, unsigned int[2])	/* set repeat settings */
 82
 83#define	EVIOCGKEYCODE		_IOWR(EVDEV_IOC_MAGIC, 0x04, unsigned int[2])	/* get keycode */
 84#define	EVIOCGKEYCODE_V2	_IOWR(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry)
 85#define	EVIOCSKEYCODE		_IOW(EVDEV_IOC_MAGIC, 0x04, unsigned int[2])	/* set keycode */
 86#define	EVIOCSKEYCODE_V2	_IOW(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry)
 87
 88#define	EVIOCGNAME(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x06, len)	/* get device name */
 89#define	EVIOCGPHYS(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x07, len)	/* get physical location */
 90#define	EVIOCGUNIQ(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x08, len)	/* get unique identifier */
 91#define	EVIOCGPROP(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x09, len)	/* get device properties */
 92
 93#define	EVIOCGMTSLOTS(len)	_IOC(IOC_INOUT,	EVDEV_IOC_MAGIC, 0x0a, len)	/* get MT slots values */
 94
 95#define	EVIOCGKEY(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x18, len)	/* get global key state */
 96#define	EVIOCGLED(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x19, len)	/* get all LEDs */
 97#define	EVIOCGSND(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1a, len)	/* get all sounds status */
 98#define	EVIOCGSW(len)		_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1b, len)	/* get all switch states */
 99
100#define	EVIOCGBIT(ev,len)	_IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x20 + (ev), len)	/* get event bits */
101#define	EVIOCGABS(abs)		_IOR(EVDEV_IOC_MAGIC, 0x40 + (abs), struct input_absinfo)	/* get abs value/limits */
102#define	EVIOCSABS(abs)		_IOW(EVDEV_IOC_MAGIC, 0xc0 + (abs), struct input_absinfo)	/* set abs value/limits */
103
104#define	EVIOCSFF		_IOW(EVDEV_IOC_MAGIC, 0x80, struct ff_effect)	/* send a force effect to a force feedback device */
105#define	EVIOCRMFF		_IOWINT(EVDEV_IOC_MAGIC, 0x81)			/* Erase a force effect */
106#define	EVIOCGEFFECTS		_IOR(EVDEV_IOC_MAGIC, 0x84, int)		/* Report number of effects playable at the same time */
107
108#define	EVIOCGRAB		_IOWINT(EVDEV_IOC_MAGIC, 0x90)			/* Grab/Release device */
109#define	EVIOCREVOKE		_IOWINT(EVDEV_IOC_MAGIC, 0x91)			/* Revoke device access */
110
111#define	EVIOCSCLOCKID		_IOW(EVDEV_IOC_MAGIC, 0xa0, int)		/* Set clockid to be used for timestamps */
112
113/*
114 * IDs.
115 */
116
117#define	ID_BUS			0
118#define	ID_VENDOR		1
119#define	ID_PRODUCT		2
120#define	ID_VERSION		3
121
122#define	BUS_PCI			0x01
123#define	BUS_ISAPNP		0x02
124#define	BUS_USB			0x03
125#define	BUS_HIL			0x04
126#define	BUS_BLUETOOTH		0x05
127#define	BUS_VIRTUAL		0x06
128
129#define	BUS_ISA			0x10
130#define	BUS_I8042		0x11
131#define	BUS_XTKBD		0x12
132#define	BUS_RS232		0x13
133#define	BUS_GAMEPORT		0x14
134#define	BUS_PARPORT		0x15
135#define	BUS_AMIGA		0x16
136#define	BUS_ADB			0x17
137#define	BUS_I2C			0x18
138#define	BUS_HOST		0x19
139#define	BUS_GSC			0x1A
140#define	BUS_ATARI		0x1B
141#define	BUS_SPI			0x1C
142#define	BUS_RMI			0x1D
143#define	BUS_CEC			0x1E
144#define	BUS_INTEL_ISHTP		0x1F
145
146/*
147 * MT_TOOL types
148 */
149#define	MT_TOOL_FINGER		0x00
150#define	MT_TOOL_PEN		0x01
151#define	MT_TOOL_PALM		0x02
152#define	MT_TOOL_DIAL		0x0a
153#define	MT_TOOL_MAX		0x0f
154
155/*
156 * Values describing the status of a force-feedback effect
157 */
158#define	FF_STATUS_STOPPED	0x00
159#define	FF_STATUS_PLAYING	0x01
160#define	FF_STATUS_MAX		0x01
161
162/* scheduling info for force feedback effect */
163struct ff_replay {
164	uint16_t	length;		/* length of the effect (ms) */
165	uint16_t	delay;		/* delay before effect starts (ms) */
166};
167
168/* trigger for force feedback effect */
169struct ff_trigger {
170	uint16_t	button;		/* trigger button number */
171	uint16_t	interval;	/* delay between re-triggers */
172};
173
174/* force feedback effect envelop */
175struct ff_envelope {
176	uint16_t	attack_length;	/* duration of the attach (ms) */
177	uint16_t	attack_level;	/* level at the beginning (0x0000 - 0x7fff) */
178	uint16_t	fade_length;	/* duratin of fade (ms) */
179	uint16_t	fade_level;	/* level at the end of fade */
180};
181
182struct ff_constant_effect {
183	int16_t			level;
184	struct ff_envelope	envelope;
185};
186
187struct ff_ramp_effect {
188	int16_t			start_level;
189	int16_t			end_level;
190	struct ff_envelope	envelope;
191};
192
193struct ff_condition_effect {
194	/* maximum level when joystick moved to respective side */
195	uint16_t	right_saturation;
196
197	uint16_t	left_saturation;
198	/* how fast force grows when joystick move to the respective side */
199	int16_t		right_coeff;
200	int16_t		left_coeff;
201
202	uint16_t	deadband;	/* size of dead zone when no force is produced */
203	int16_t		center;		/* center of dead zone */
204};
205
206/*
207 * Force feedback periodic effect types
208 */
209
210#define	FF_SQUARE	0x58
211#define	FF_TRIANGLE	0x59
212#define	FF_SINE		0x5a
213#define	FF_SAW_UP	0x5b
214#define	FF_SAW_DOWN	0x5c
215#define	FF_CUSTOM	0x5d
216
217#define	FF_WAVEFORM_MIN	FF_SQUARE
218#define	FF_WAVEFORM_MAX	FF_CUSTOM
219
220struct ff_periodic_effect {
221	uint16_t		waveform;
222	uint16_t		period;		/* ms */
223	int16_t			magnitude;	/* peak */
224	int16_t			offset;		/* mean, roughly */
225	uint16_t		phase;		/* horizontal shift */
226	struct ff_envelope	envelope;
227	uint32_t		custom_len;	/* FF_CUSTOM waveform only */
228	int16_t			*custom_data;	/* FF_CUSTOM waveform only */
229};
230
231struct ff_rumble_effect {
232	uint16_t	strong_magnitude;	/* magnitude of the heavy motor */
233	uint16_t	weak_magnitude;		/* magnitude of the light motor */
234};
235
236/*
237 * Force feedback effect types
238 */
239
240#define	FF_RUMBLE	0x50
241#define	FF_PERIODIC	0x51
242#define	FF_CONSTANT	0x52
243#define	FF_SPRING	0x53
244#define	FF_FRICTION	0x54
245#define	FF_DAMPER	0x55
246#define	FF_INERTIA	0x56
247#define	FF_RAMP		0x57
248
249#define	FF_EFFECT_MIN	FF_RUMBLE
250#define	FF_EFFECT_MAX	FF_RAMP
251
252struct ff_effect {
253	uint16_t		type;
254	int16_t			id;
255	uint16_t		direction;	/* [0 .. 360) degrees -> [0 .. 0x10000) */
256	struct ff_trigger	trigger;
257	struct ff_replay	replay;
258
259	union {
260		struct ff_constant_effect	constant;
261		struct ff_ramp_effect		ramp;
262		struct ff_periodic_effect	periodic;
263		struct ff_condition_effect	condition[2]; /* One for each axis */
264		struct ff_rumble_effect		rumble;
265	} u;
266};
267
268/*
269 * force feedback device properties
270 */
271
272#define	FF_GAIN		0x60
273#define	FF_AUTOCENTER	0x61
274
275#define	FF_MAX		0x7f
276#define	FF_CNT		(FF_MAX+1)
277
278#endif /* _EVDEV_INPUT_H */