xref: /freebsd/sys/dev/evdev/input.h (revision 8d9a5d44b155af7123893a6948ad7e86b48c57b3)
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 
42 struct 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 
51 struct input_id {
52 	uint16_t	bustype;
53 	uint16_t	vendor;
54 	uint16_t	product;
55 	uint16_t	version;
56 };
57 
58 struct 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 
69 struct 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 #define	BUS_AMD_SFH		0x20
146 #define	BUS_SDW			0x21
147 
148 /*
149  * MT_TOOL types
150  */
151 #define	MT_TOOL_FINGER		0x00
152 #define	MT_TOOL_PEN		0x01
153 #define	MT_TOOL_PALM		0x02
154 #define	MT_TOOL_DIAL		0x0a
155 #define	MT_TOOL_MAX		0x0f
156 
157 /*
158  * Values describing the status of a force-feedback effect
159  */
160 #define	FF_STATUS_STOPPED	0x00
161 #define	FF_STATUS_PLAYING	0x01
162 #define	FF_STATUS_MAX		0x01
163 
164 /* scheduling info for force feedback effect */
165 struct ff_replay {
166 	uint16_t	length;		/* length of the effect (ms) */
167 	uint16_t	delay;		/* delay before effect starts (ms) */
168 };
169 
170 /* trigger for force feedback effect */
171 struct ff_trigger {
172 	uint16_t	button;		/* trigger button number */
173 	uint16_t	interval;	/* delay between re-triggers */
174 };
175 
176 /* force feedback effect envelop */
177 struct ff_envelope {
178 	uint16_t	attack_length;	/* duration of the attach (ms) */
179 	uint16_t	attack_level;	/* level at the beginning (0x0000 - 0x7fff) */
180 	uint16_t	fade_length;	/* duratin of fade (ms) */
181 	uint16_t	fade_level;	/* level at the end of fade */
182 };
183 
184 struct ff_constant_effect {
185 	int16_t			level;
186 	struct ff_envelope	envelope;
187 };
188 
189 struct ff_ramp_effect {
190 	int16_t			start_level;
191 	int16_t			end_level;
192 	struct ff_envelope	envelope;
193 };
194 
195 struct ff_condition_effect {
196 	/* maximum level when joystick moved to respective side */
197 	uint16_t	right_saturation;
198 
199 	uint16_t	left_saturation;
200 	/* how fast force grows when joystick move to the respective side */
201 	int16_t		right_coeff;
202 	int16_t		left_coeff;
203 
204 	uint16_t	deadband;	/* size of dead zone when no force is produced */
205 	int16_t		center;		/* center of dead zone */
206 };
207 
208 struct ff_periodic_effect {
209 	uint16_t		waveform;
210 	uint16_t		period;		/* ms */
211 	int16_t			magnitude;	/* peak */
212 	int16_t			offset;		/* mean, roughly */
213 	uint16_t		phase;		/* horizontal shift */
214 	struct ff_envelope	envelope;
215 	uint32_t		custom_len;	/* FF_CUSTOM waveform only */
216 	int16_t			*custom_data;	/* FF_CUSTOM waveform only */
217 };
218 
219 struct ff_rumble_effect {
220 	uint16_t	strong_magnitude;	/* magnitude of the heavy motor */
221 	uint16_t	weak_magnitude;		/* magnitude of the light motor */
222 };
223 
224 struct ff_haptic_effect {
225 	uint16_t	hid_usage;
226 	uint16_t	vendor_id;
227 	uint8_t		vendor_waveform_page;
228 	uint16_t	intensity;
229 	uint16_t	repeat_count;
230 	uint16_t	retrigger_period;
231 };
232 
233 struct ff_effect {
234 	uint16_t		type;
235 	int16_t			id;
236 	uint16_t		direction;	/* [0 .. 360) degrees -> [0 .. 0x10000) */
237 	struct ff_trigger	trigger;
238 	struct ff_replay	replay;
239 
240 	union {
241 		struct ff_constant_effect	constant;
242 		struct ff_ramp_effect		ramp;
243 		struct ff_periodic_effect	periodic;
244 		struct ff_condition_effect	condition[2]; /* One for each axis */
245 		struct ff_rumble_effect		rumble;
246 		struct ff_haptic_effect		haptic;
247 	} u;
248 };
249 
250 /*
251  * Force feedback effect types
252  */
253 
254 #define	FF_HAPTIC	0x4f
255 #define	FF_RUMBLE	0x50
256 #define	FF_PERIODIC	0x51
257 #define	FF_CONSTANT	0x52
258 #define	FF_SPRING	0x53
259 #define	FF_FRICTION	0x54
260 #define	FF_DAMPER	0x55
261 #define	FF_INERTIA	0x56
262 #define	FF_RAMP		0x57
263 
264 #define	FF_EFFECT_MIN	FF_HAPTIC
265 #define	FF_EFFECT_MAX	FF_RAMP
266 
267 /*
268  * Force feedback periodic effect types
269  */
270 
271 #define	FF_SQUARE	0x58
272 #define	FF_TRIANGLE	0x59
273 #define	FF_SINE		0x5a
274 #define	FF_SAW_UP	0x5b
275 #define	FF_SAW_DOWN	0x5c
276 #define	FF_CUSTOM	0x5d
277 
278 #define	FF_WAVEFORM_MIN	FF_SQUARE
279 #define	FF_WAVEFORM_MAX	FF_CUSTOM
280 
281 /*
282  * force feedback device properties
283  */
284 
285 #define	FF_GAIN		0x60
286 #define	FF_AUTOCENTER	0x61
287 
288 #define	FF_MAX_EFFECTS	FF_GAIN
289 
290 #define	FF_MAX		0x7f
291 #define	FF_CNT		(FF_MAX+1)
292 
293 #endif /* _EVDEV_INPUT_H */
294