xref: /dragonfly/sys/dev/misc/evdev/input.h (revision a162a738eca94f99d45d88429e86cfd0fbfbe95d)
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  * $FreeBSD$
28  */
29 
30 #ifndef   _EVDEV_INPUT_H
31 #define   _EVDEV_INPUT_H
32 
33 #include <sys/ioccom.h>
34 #include <sys/time.h>
35 #include <sys/types.h>
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 
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 */
163 struct 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 */
169 struct ff_trigger {
170           uint16_t  button;             /* trigger button number */
171           uint16_t  interval; /* delay between re-triggers */
172 };
173 
174 /* force feedback effect envelop */
175 struct 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 
182 struct ff_constant_effect {
183           int16_t                       level;
184           struct ff_envelope  envelope;
185 };
186 
187 struct ff_ramp_effect {
188           int16_t                       start_level;
189           int16_t                       end_level;
190           struct ff_envelope  envelope;
191 };
192 
193 struct 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 
220 struct 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 
231 struct 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 
252 struct 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 */
279