zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

input.h (8424B) - Raw


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