1 | /*- |
---|
2 | * Copyright (c) 2016 Oleksandr Tymoshenko <gonzo@FreeBSD.org> |
---|
3 | * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@cicgroup.ru> |
---|
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 | * $FreeBSD$ |
---|
28 | */ |
---|
29 | |
---|
30 | #ifndef _EVDEV_INPUT_H |
---|
31 | #define _EVDEV_INPUT_H |
---|
32 | |
---|
33 | #ifndef __KERNEL__ |
---|
34 | #include <sys/time.h> |
---|
35 | #include <sys/ioccom.h> |
---|
36 | #include <sys/types.h> |
---|
37 | #endif |
---|
38 | |
---|
39 | #include "input-event-codes.h" |
---|
40 | |
---|
41 | struct input_event { |
---|
42 | struct timeval time; |
---|
43 | uint16_t type; |
---|
44 | uint16_t code; |
---|
45 | int32_t value; |
---|
46 | }; |
---|
47 | |
---|
48 | #define EV_VERSION 0x010001 |
---|
49 | |
---|
50 | struct input_id { |
---|
51 | uint16_t bustype; |
---|
52 | uint16_t vendor; |
---|
53 | uint16_t product; |
---|
54 | uint16_t version; |
---|
55 | }; |
---|
56 | |
---|
57 | struct input_absinfo { |
---|
58 | int32_t value; |
---|
59 | int32_t minimum; |
---|
60 | int32_t maximum; |
---|
61 | int32_t fuzz; |
---|
62 | int32_t flat; |
---|
63 | int32_t resolution; |
---|
64 | }; |
---|
65 | |
---|
66 | #define INPUT_KEYMAP_BY_INDEX (1 << 0) |
---|
67 | |
---|
68 | struct input_keymap_entry { |
---|
69 | uint8_t flags; |
---|
70 | uint8_t len; |
---|
71 | uint16_t index; |
---|
72 | uint32_t keycode; |
---|
73 | uint8_t scancode[32]; |
---|
74 | }; |
---|
75 | |
---|
76 | #define EVDEV_IOC_MAGIC 'E' |
---|
77 | #define EVIOCGVERSION _IOR(EVDEV_IOC_MAGIC, 0x01, int) /* get driver version */ |
---|
78 | #define EVIOCGID _IOR(EVDEV_IOC_MAGIC, 0x02, struct input_id) /* get device ID */ |
---|
79 | #define EVIOCGREP _IOR(EVDEV_IOC_MAGIC, 0x03, unsigned int[2]) /* get repeat settings */ |
---|
80 | #define EVIOCSREP _IOW(EVDEV_IOC_MAGIC, 0x03, unsigned int[2]) /* set repeat settings */ |
---|
81 | |
---|
82 | #define EVIOCGKEYCODE _IOWR(EVDEV_IOC_MAGIC, 0x04, unsigned int[2]) /* get keycode */ |
---|
83 | #define EVIOCGKEYCODE_V2 _IOWR(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry) |
---|
84 | #define EVIOCSKEYCODE _IOW(EVDEV_IOC_MAGIC, 0x04, unsigned int[2]) /* set keycode */ |
---|
85 | #define EVIOCSKEYCODE_V2 _IOW(EVDEV_IOC_MAGIC, 0x04, struct input_keymap_entry) |
---|
86 | |
---|
87 | #define EVIOCGNAME(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x06, len) /* get device name */ |
---|
88 | #define EVIOCGPHYS(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x07, len) /* get physical location */ |
---|
89 | #define EVIOCGUNIQ(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x08, len) /* get unique identifier */ |
---|
90 | #define EVIOCGPROP(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x09, len) /* get device properties */ |
---|
91 | |
---|
92 | #define EVIOCGMTSLOTS(len) _IOC(IOC_INOUT, EVDEV_IOC_MAGIC, 0x0a, len) /* get MT slots values */ |
---|
93 | |
---|
94 | #define EVIOCGKEY(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x18, len) /* get global key state */ |
---|
95 | #define EVIOCGLED(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x19, len) /* get all LEDs */ |
---|
96 | #define EVIOCGSND(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1a, len) /* get all sounds status */ |
---|
97 | #define EVIOCGSW(len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x1b, len) /* get all switch states */ |
---|
98 | |
---|
99 | #define EVIOCGBIT(ev,len) _IOC(IOC_OUT, EVDEV_IOC_MAGIC, 0x20 + (ev), len) /* get event bits */ |
---|
100 | #define EVIOCGABS(abs) _IOR(EVDEV_IOC_MAGIC, 0x40 + (abs), struct input_absinfo) /* get abs value/limits */ |
---|
101 | #define EVIOCSABS(abs) _IOW(EVDEV_IOC_MAGIC, 0xc0 + (abs), struct input_absinfo) /* set abs value/limits */ |
---|
102 | |
---|
103 | #define EVIOCSFF _IOW(EVDEV_IOC_MAGIC, 0x80, struct ff_effect) /* send a force effect to a force feedback device */ |
---|
104 | #define EVIOCRMFF _IOWINT(EVDEV_IOC_MAGIC, 0x81) /* Erase a force effect */ |
---|
105 | #define EVIOCGEFFECTS _IOR(EVDEV_IOC_MAGIC, 0x84, int) /* Report number of effects playable at the same time */ |
---|
106 | |
---|
107 | #define EVIOCGRAB _IOWINT(EVDEV_IOC_MAGIC, 0x90) /* Grab/Release device */ |
---|
108 | #define EVIOCREVOKE _IOWINT(EVDEV_IOC_MAGIC, 0x91) /* Revoke device access */ |
---|
109 | |
---|
110 | #define EVIOCSCLOCKID _IOW(EVDEV_IOC_MAGIC, 0xa0, int) /* Set clockid to be used for timestamps */ |
---|
111 | |
---|
112 | /* |
---|
113 | * IDs. |
---|
114 | */ |
---|
115 | |
---|
116 | #define ID_BUS 0 |
---|
117 | #define ID_VENDOR 1 |
---|
118 | #define ID_PRODUCT 2 |
---|
119 | #define ID_VERSION 3 |
---|
120 | |
---|
121 | #define BUS_PCI 0x01 |
---|
122 | #define BUS_ISAPNP 0x02 |
---|
123 | #define BUS_USB 0x03 |
---|
124 | #define BUS_HIL 0x04 |
---|
125 | #define BUS_BLUETOOTH 0x05 |
---|
126 | #define BUS_VIRTUAL 0x06 |
---|
127 | |
---|
128 | #define BUS_ISA 0x10 |
---|
129 | #define BUS_I8042 0x11 |
---|
130 | #define BUS_XTKBD 0x12 |
---|
131 | #define BUS_RS232 0x13 |
---|
132 | #define BUS_GAMEPORT 0x14 |
---|
133 | #define BUS_PARPORT 0x15 |
---|
134 | #define BUS_AMIGA 0x16 |
---|
135 | #define BUS_ADB 0x17 |
---|
136 | #define BUS_I2C 0x18 |
---|
137 | #define BUS_HOST 0x19 |
---|
138 | #define BUS_GSC 0x1A |
---|
139 | #define BUS_ATARI 0x1B |
---|
140 | #define BUS_SPI 0x1C |
---|
141 | |
---|
142 | /* |
---|
143 | * MT_TOOL types |
---|
144 | */ |
---|
145 | #define MT_TOOL_FINGER 0 |
---|
146 | #define MT_TOOL_PEN 1 |
---|
147 | #define MT_TOOL_PALM 2 |
---|
148 | #define MT_TOOL_MAX 2 |
---|
149 | |
---|
150 | /* |
---|
151 | * Values describing the status of a force-feedback effect |
---|
152 | */ |
---|
153 | #define FF_STATUS_STOPPED 0x00 |
---|
154 | #define FF_STATUS_PLAYING 0x01 |
---|
155 | #define FF_STATUS_MAX 0x01 |
---|
156 | |
---|
157 | /* scheduling info for force feedback effect */ |
---|
158 | struct ff_replay { |
---|
159 | uint16_t length; /* length of the effect (ms) */ |
---|
160 | uint16_t delay; /* delay before effect starts (ms) */ |
---|
161 | }; |
---|
162 | |
---|
163 | /* trigger for force feedback effect */ |
---|
164 | struct ff_trigger { |
---|
165 | uint16_t button; /* trigger button number */ |
---|
166 | uint16_t interval; /* delay between re-triggers */ |
---|
167 | }; |
---|
168 | |
---|
169 | /* force feedback effect envelop */ |
---|
170 | struct ff_envelope { |
---|
171 | uint16_t attack_length; /* duration of the attach (ms) */ |
---|
172 | uint16_t attack_level; /* level at the beginning (0x0000 - 0x7fff) */ |
---|
173 | uint16_t fade_length; /* duratin of fade (ms) */ |
---|
174 | uint16_t fade_level; /* level at the end of fade */ |
---|
175 | }; |
---|
176 | |
---|
177 | struct ff_constant_effect { |
---|
178 | int16_t level; |
---|
179 | struct ff_envelope envelope; |
---|
180 | }; |
---|
181 | |
---|
182 | struct ff_ramp_effect { |
---|
183 | int16_t start_level; |
---|
184 | int16_t end_level; |
---|
185 | struct ff_envelope envelope; |
---|
186 | }; |
---|
187 | |
---|
188 | struct ff_condition_effect { |
---|
189 | /* maximum level when joystick moved to respective side */ |
---|
190 | uint16_t right_saturation; |
---|
191 | |
---|
192 | uint16_t left_saturation; |
---|
193 | /* how fast force grows when joystick move to the respective side */ |
---|
194 | int16_t right_coeff; |
---|
195 | int16_t left_coeff; |
---|
196 | |
---|
197 | uint16_t deadband; /* size of dead zone when no force is produced */ |
---|
198 | int16_t center; /* center of dead zone */ |
---|
199 | }; |
---|
200 | |
---|
201 | /* |
---|
202 | * Force feedback periodic effect types |
---|
203 | */ |
---|
204 | |
---|
205 | #define FF_SQUARE 0x58 |
---|
206 | #define FF_TRIANGLE 0x59 |
---|
207 | #define FF_SINE 0x5a |
---|
208 | #define FF_SAW_UP 0x5b |
---|
209 | #define FF_SAW_DOWN 0x5c |
---|
210 | #define FF_CUSTOM 0x5d |
---|
211 | |
---|
212 | #define FF_WAVEFORM_MIN FF_SQUARE |
---|
213 | #define FF_WAVEFORM_MAX FF_CUSTOM |
---|
214 | |
---|
215 | struct ff_periodic_effect { |
---|
216 | uint16_t waveform; |
---|
217 | uint16_t period; /* ms */ |
---|
218 | int16_t magnitude; /* peak */ |
---|
219 | int16_t offset; /* mean, roughly */ |
---|
220 | uint16_t phase; /* horizontal shift */ |
---|
221 | struct ff_envelope envelope; |
---|
222 | uint32_t custom_len; /* FF_CUSTOM waveform only */ |
---|
223 | int16_t *custom_data; /* FF_CUSTOM waveform only */ |
---|
224 | }; |
---|
225 | |
---|
226 | struct ff_rumble_effect { |
---|
227 | uint16_t strong_magnitude; /* magnitude of the heavy motor */ |
---|
228 | uint16_t weak_magnitude; /* magnitude of the light motor */ |
---|
229 | }; |
---|
230 | |
---|
231 | /* |
---|
232 | * Force feedback effect types |
---|
233 | */ |
---|
234 | |
---|
235 | #define FF_RUMBLE 0x50 |
---|
236 | #define FF_PERIODIC 0x51 |
---|
237 | #define FF_CONSTANT 0x52 |
---|
238 | #define FF_SPRING 0x53 |
---|
239 | #define FF_FRICTION 0x54 |
---|
240 | #define FF_DAMPER 0x55 |
---|
241 | #define FF_INERTIA 0x56 |
---|
242 | #define FF_RAMP 0x57 |
---|
243 | |
---|
244 | #define FF_EFFECT_MIN FF_RUMBLE |
---|
245 | #define FF_EFFECT_MAX FF_RAMP |
---|
246 | |
---|
247 | struct ff_effect { |
---|
248 | uint16_t type; |
---|
249 | int16_t id; |
---|
250 | uint16_t direction; /* [0 .. 360) degrees -> [0 .. 0x10000) */ |
---|
251 | struct ff_trigger trigger; |
---|
252 | struct ff_replay replay; |
---|
253 | |
---|
254 | union { |
---|
255 | struct ff_constant_effect constant; |
---|
256 | struct ff_ramp_effect ramp; |
---|
257 | struct ff_periodic_effect periodic; |
---|
258 | struct ff_condition_effect condition[2]; /* One for each axis */ |
---|
259 | struct ff_rumble_effect rumble; |
---|
260 | } u; |
---|
261 | }; |
---|
262 | |
---|
263 | /* |
---|
264 | * force feedback device properties |
---|
265 | */ |
---|
266 | |
---|
267 | #define FF_GAIN 0x60 |
---|
268 | #define FF_AUTOCENTER 0x61 |
---|
269 | |
---|
270 | #define FF_MAX 0x7f |
---|
271 | #define FF_CNT (FF_MAX+1) |
---|
272 | |
---|
273 | #endif /* _EVDEV_INPUT_H */ |
---|