master
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 */