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 #ifndef __KERNEL__ 34 #include <sys/ioccom.h> 35 #include <sys/time.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 */ 274