cregit-Linux how code gets into the kernel

Release 4.7 include/uapi/linux/input.h

/*
 * Copyright (c) 1999-2002 Vojtech Pavlik
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 */
#ifndef _UAPI_INPUT_H

#define _UAPI_INPUT_H


#ifndef __KERNEL__
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/types.h>
#endif

#include "input-event-codes.h"

/*
 * The event structure itself
 */


struct input_event {
	
struct timeval time;
	
__u16 type;
	
__u16 code;
	
__s32 value;
};

/*
 * Protocol version.
 */


#define EV_VERSION		0x010001

/*
 * IOCTLs (0x00 - 0x7f)
 */


struct input_id {
	
__u16 bustype;
	
__u16 vendor;
	
__u16 product;
	
__u16 version;
};

/**
 * struct input_absinfo - used by EVIOCGABS/EVIOCSABS ioctls
 * @value: latest reported value for the axis.
 * @minimum: specifies minimum value for the axis.
 * @maximum: specifies maximum value for the axis.
 * @fuzz: specifies fuzz value that is used to filter noise from
 *      the event stream.
 * @flat: values that are within this value will be discarded by
 *      joydev interface and reported as 0 instead.
 * @resolution: specifies resolution for the values reported for
 *      the axis.
 *
 * Note that input core does not clamp reported values to the
 * [minimum, maximum] limits, such task is left to userspace.
 *
 * Resolution for main axes (ABS_X, ABS_Y, ABS_Z) is reported in
 * units per millimeter (units/mm), resolution for rotational axes
 * (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian.
 */

struct input_absinfo {
	
__s32 value;
	
__s32 minimum;
	
__s32 maximum;
	
__s32 fuzz;
	
__s32 flat;
	
__s32 resolution;
};

/**
 * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls
 * @scancode: scancode represented in machine-endian form.
 * @len: length of the scancode that resides in @scancode buffer.
 * @index: index in the keymap, may be used instead of scancode
 * @flags: allows to specify how kernel should handle the request. For
 *      example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel
 *      should perform lookup in keymap by @index instead of @scancode
 * @keycode: key code assigned to this scancode
 *
 * The structure is used to retrieve and modify keymap data. Users have
 * option of performing lookup either by @scancode itself or by @index
 * in keymap entry. EVIOCGKEYCODE will also return scancode or index
 * (depending on which element was used to perform lookup).
 */

struct input_keymap_entry {

#define INPUT_KEYMAP_BY_INDEX	(1 << 0)
	
__u8  flags;
	
__u8  len;
	
__u16 index;
	
__u32 keycode;
	
__u8  scancode[32];
};


struct input_mask {
	
__u32 type;
	
__u32 codes_size;
	
__u64 codes_ptr;
};


#define EVIOCGVERSION		_IOR('E', 0x01, int)			
/* get driver version */

#define EVIOCGID		_IOR('E', 0x02, struct input_id)	
/* get device ID */

#define EVIOCGREP		_IOR('E', 0x03, unsigned int[2])	
/* get repeat settings */

#define EVIOCSREP		_IOW('E', 0x03, unsigned int[2])	
/* set repeat settings */


#define EVIOCGKEYCODE		_IOR('E', 0x04, unsigned int[2])        
/* get keycode */

#define EVIOCGKEYCODE_V2	_IOR('E', 0x04, struct input_keymap_entry)

#define EVIOCSKEYCODE		_IOW('E', 0x04, unsigned int[2])        
/* set keycode */

#define EVIOCSKEYCODE_V2	_IOW('E', 0x04, struct input_keymap_entry)


#define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		
/* get device name */

#define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		
/* get physical location */

#define EVIOCGUNIQ(len)		_IOC(_IOC_READ, 'E', 0x08, len)		
/* get unique identifier */

#define EVIOCGPROP(len)		_IOC(_IOC_READ, 'E', 0x09, len)		
/* get device properties */

/**
 * EVIOCGMTSLOTS(len) - get MT slot values
 * @len: size of the data buffer in bytes
 *
 * The ioctl buffer argument should be binary equivalent to
 *
 * struct input_mt_request_layout {
 *      __u32 code;
 *      __s32 values[num_slots];
 * };
 *
 * where num_slots is the (arbitrary) number of MT slots to extract.
 *
 * The ioctl size argument (len) is the size of the buffer, which
 * should satisfy len = (num_slots + 1) * sizeof(__s32).  If len is
 * too small to fit all available slots, the first num_slots are
 * returned.
 *
 * Before the call, code is set to the wanted ABS_MT event type. On
 * return, values[] is filled with the slot values for the specified
 * ABS_MT code.
 *
 * If the request code is not an ABS_MT value, -EINVAL is returned.
 */

#define EVIOCGMTSLOTS(len)	_IOC(_IOC_READ, 'E', 0x0a, len)


#define EVIOCGKEY(len)		_IOC(_IOC_READ, 'E', 0x18, len)		
/* get global key state */

#define EVIOCGLED(len)		_IOC(_IOC_READ, 'E', 0x19, len)		
/* get all LEDs */

#define EVIOCGSND(len)		_IOC(_IOC_READ, 'E', 0x1a, len)		
/* get all sounds status */

#define EVIOCGSW(len)		_IOC(_IOC_READ, 'E', 0x1b, len)		
/* get all switch states */


#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + (ev), len)	
/* get event bits */

#define EVIOCGABS(abs)		_IOR('E', 0x40 + (abs), struct input_absinfo)	
/* get abs value/limits */

#define EVIOCSABS(abs)		_IOW('E', 0xc0 + (abs), struct input_absinfo)	
/* set abs value/limits */


#define EVIOCSFF		_IOW('E', 0x80, struct ff_effect)	
/* send a force effect to a force feedback device */

#define EVIOCRMFF		_IOW('E', 0x81, int)			
/* Erase a force effect */

#define EVIOCGEFFECTS		_IOR('E', 0x84, int)			
/* Report number of effects playable at the same time */


#define EVIOCGRAB		_IOW('E', 0x90, int)			
/* Grab/Release device */

#define EVIOCREVOKE		_IOW('E', 0x91, int)			
/* Revoke device access */

/**
 * EVIOCGMASK - Retrieve current event mask
 *
 * This ioctl allows user to retrieve the current event mask for specific
 * event type. The argument must be of type "struct input_mask" and
 * specifies the event type to query, the address of the receive buffer and
 * the size of the receive buffer.
 *
 * The event mask is a per-client mask that specifies which events are
 * forwarded to the client. Each event code is represented by a single bit
 * in the event mask. If the bit is set, the event is passed to the client
 * normally. Otherwise, the event is filtered and will never be queued on
 * the client's receive buffer.
 *
 * Event masks do not affect global state of the input device. They only
 * affect the file descriptor they are applied to.
 *
 * The default event mask for a client has all bits set, i.e. all events
 * are forwarded to the client. If the kernel is queried for an unknown
 * event type or if the receive buffer is larger than the number of
 * event codes known to the kernel, the kernel returns all zeroes for those
 * codes.
 *
 * At maximum, codes_size bytes are copied.
 *
 * This ioctl may fail with ENODEV in case the file is revoked, EFAULT
 * if the receive-buffer points to invalid memory, or EINVAL if the kernel
 * does not implement the ioctl.
 */

#define EVIOCGMASK		_IOR('E', 0x92, struct input_mask)	
/* Get event-masks */

/**
 * EVIOCSMASK - Set event mask
 *
 * This ioctl is the counterpart to EVIOCGMASK. Instead of receiving the
 * current event mask, this changes the client's event mask for a specific
 * type.  See EVIOCGMASK for a description of event-masks and the
 * argument-type.
 *
 * This ioctl provides full forward compatibility. If the passed event type
 * is unknown to the kernel, or if the number of event codes specified in
 * the mask is bigger than what is known to the kernel, the ioctl is still
 * accepted and applied. However, any unknown codes are left untouched and
 * stay cleared. That means, the kernel always filters unknown codes
 * regardless of what the client requests.  If the new mask doesn't cover
 * all known event-codes, all remaining codes are automatically cleared and
 * thus filtered.
 *
 * This ioctl may fail with ENODEV in case the file is revoked. EFAULT is
 * returned if the receive-buffer points to invalid memory. EINVAL is returned
 * if the kernel does not implement the ioctl.
 */

#define EVIOCSMASK		_IOW('E', 0x93, struct input_mask)	
/* Set event-masks */


#define EVIOCSCLOCKID		_IOW('E', 0xa0, int)			
/* Set clockid to be used for timestamps */

/*
 * IDs.
 */


#define ID_BUS			0

#define ID_VENDOR		1

#define ID_PRODUCT		2

#define ID_VERSION		3


#define BUS_PCI			0x01

#define BUS_ISAPNP		0x02

#define BUS_USB			0x03

#define BUS_HIL			0x04

#define BUS_BLUETOOTH		0x05

#define BUS_VIRTUAL		0x06


#define BUS_ISA			0x10

#define BUS_I8042		0x11

#define BUS_XTKBD		0x12

#define BUS_RS232		0x13

#define BUS_GAMEPORT		0x14

#define BUS_PARPORT		0x15

#define BUS_AMIGA		0x16

#define BUS_ADB			0x17

#define BUS_I2C			0x18

#define BUS_HOST		0x19

#define BUS_GSC			0x1A

#define BUS_ATARI		0x1B

#define BUS_SPI			0x1C

#define BUS_RMI			0x1D

#define BUS_CEC			0x1E

/*
 * MT_TOOL types
 */

#define MT_TOOL_FINGER		0

#define MT_TOOL_PEN		1

#define MT_TOOL_PALM		2

#define MT_TOOL_MAX		2

/*
 * Values describing the status of a force-feedback effect
 */

#define FF_STATUS_STOPPED	0x00

#define FF_STATUS_PLAYING	0x01

#define FF_STATUS_MAX		0x01

/*
 * Structures used in ioctls to upload effects to a device
 * They are pieces of a bigger structure (called ff_effect)
 */

/*
 * All duration values are expressed in ms. Values above 32767 ms (0x7fff)
 * should not be used and have unspecified results.
 */

/**
 * struct ff_replay - defines scheduling of the force-feedback effect
 * @length: duration of the effect
 * @delay: delay before effect should start playing
 */

struct ff_replay {
	
__u16 length;
	
__u16 delay;
};

/**
 * struct ff_trigger - defines what triggers the force-feedback effect
 * @button: number of the button triggering the effect
 * @interval: controls how soon the effect can be re-triggered
 */

struct ff_trigger {
	
__u16 button;
	
__u16 interval;
};

/**
 * struct ff_envelope - generic force-feedback effect envelope
 * @attack_length: duration of the attack (ms)
 * @attack_level: level at the beginning of the attack
 * @fade_length: duration of fade (ms)
 * @fade_level: level at the end of fade
 *
 * The @attack_level and @fade_level are absolute values; when applying
 * envelope force-feedback core will convert to positive/negative
 * value based on polarity of the default level of the effect.
 * Valid range for the attack and fade levels is 0x0000 - 0x7fff
 */

struct ff_envelope {
	
__u16 attack_length;
	
__u16 attack_level;
	
__u16 fade_length;
	
__u16 fade_level;
};

/**
 * struct ff_constant_effect - defines parameters of a constant force-feedback effect
 * @level: strength of the effect; may be negative
 * @envelope: envelope data
 */

struct ff_constant_effect {
	
__s16 level;
	
struct ff_envelope envelope;
};

/**
 * struct ff_ramp_effect - defines parameters of a ramp force-feedback effect
 * @start_level: beginning strength of the effect; may be negative
 * @end_level: final strength of the effect; may be negative
 * @envelope: envelope data
 */

struct ff_ramp_effect {
	
__s16 start_level;
	
__s16 end_level;
	
struct ff_envelope envelope;
};

/**
 * struct ff_condition_effect - defines a spring or friction force-feedback effect
 * @right_saturation: maximum level when joystick moved all way to the right
 * @left_saturation: same for the left side
 * @right_coeff: controls how fast the force grows when the joystick moves
 *      to the right
 * @left_coeff: same for the left side
 * @deadband: size of the dead zone, where no force is produced
 * @center: position of the dead zone
 */

struct ff_condition_effect {
	
__u16 right_saturation;
	
__u16 left_saturation;

	
__s16 right_coeff;
	
__s16 left_coeff;

	
__u16 deadband;
	
__s16 center;
};

/**
 * struct ff_periodic_effect - defines parameters of a periodic force-feedback effect
 * @waveform: kind of the effect (wave)
 * @period: period of the wave (ms)
 * @magnitude: peak value
 * @offset: mean value of the wave (roughly)
 * @phase: 'horizontal' shift
 * @envelope: envelope data
 * @custom_len: number of samples (FF_CUSTOM only)
 * @custom_data: buffer of samples (FF_CUSTOM only)
 *
 * Known waveforms - FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP,
 * FF_SAW_DOWN, FF_CUSTOM. The exact syntax FF_CUSTOM is undefined
 * for the time being as no driver supports it yet.
 *
 * Note: the data pointed by custom_data is copied by the driver.
 * You can therefore dispose of the memory after the upload/update.
 */

struct ff_periodic_effect {
	
__u16 waveform;
	
__u16 period;
	
__s16 magnitude;
	
__s16 offset;
	
__u16 phase;

	
struct ff_envelope envelope;

	
__u32 custom_len;
	
__s16 __user *custom_data;
};

/**
 * struct ff_rumble_effect - defines parameters of a periodic force-feedback effect
 * @strong_magnitude: magnitude of the heavy motor
 * @weak_magnitude: magnitude of the light one
 *
 * Some rumble pads have two motors of different weight. Strong_magnitude
 * represents the magnitude of the vibration generated by the heavy one.
 */

struct ff_rumble_effect {
	
__u16 strong_magnitude;
	
__u16 weak_magnitude;
};

/**
 * struct ff_effect - defines force feedback effect
 * @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING,
 *      FF_FRICTION, FF_DAMPER, FF_RUMBLE, FF_INERTIA, or FF_CUSTOM)
 * @id: an unique id assigned to an effect
 * @direction: direction of the effect
 * @trigger: trigger conditions (struct ff_trigger)
 * @replay: scheduling of the effect (struct ff_replay)
 * @u: effect-specific structure (one of ff_constant_effect, ff_ramp_effect,
 *      ff_periodic_effect, ff_condition_effect, ff_rumble_effect) further
 *      defining effect parameters
 *
 * This structure is sent through ioctl from the application to the driver.
 * To create a new effect application should set its @id to -1; the kernel
 * will return assigned @id which can later be used to update or delete
 * this effect.
 *
 * Direction of the effect is encoded as follows:
 *      0 deg -> 0x0000 (down)
 *      90 deg -> 0x4000 (left)
 *      180 deg -> 0x8000 (up)
 *      270 deg -> 0xC000 (right)
 */

struct ff_effect {
	
__u16 type;
	
__s16 id;
	
__u16 direction;
	
struct ff_trigger trigger;
	
struct ff_replay replay;

	union {
		
struct ff_constant_effect constant;
		
struct ff_ramp_effect ramp;
		
struct ff_periodic_effect periodic;
		
struct ff_condition_effect condition[2]; /* One for each axis */
		
struct ff_rumble_effect rumble;
	} 
u;
};

/*
 * Force feedback effect types
 */


#define FF_RUMBLE	0x50

#define FF_PERIODIC	0x51

#define FF_CONSTANT	0x52

#define FF_SPRING	0x53

#define FF_FRICTION	0x54

#define FF_DAMPER	0x55

#define FF_INERTIA	0x56

#define FF_RAMP		0x57


#define FF_EFFECT_MIN	FF_RUMBLE

#define FF_EFFECT_MAX	FF_RAMP

/*
 * Force feedback periodic effect types
 */


#define FF_SQUARE	0x58

#define FF_TRIANGLE	0x59

#define FF_SINE		0x5a

#define FF_SAW_UP	0x5b

#define FF_SAW_DOWN	0x5c

#define FF_CUSTOM	0x5d


#define FF_WAVEFORM_MIN	FF_SQUARE

#define FF_WAVEFORM_MAX	FF_CUSTOM

/*
 * Set ff device properties
 */


#define FF_GAIN		0x60

#define FF_AUTOCENTER	0x61

/*
 * ff->playback(effect_id = FF_GAIN) is the first effect_id to
 * cause a collision with another ff method, in this case ff->set_gain().
 * Therefore the greatest safe value for effect_id is FF_GAIN - 1,
 * and thus the total number of effects should never exceed FF_GAIN.
 */

#define FF_MAX_EFFECTS	FF_GAIN


#define FF_MAX		0x7f

#define FF_CNT		(FF_MAX+1)

#endif /* _UAPI_INPUT_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
david howellsdavid howells68492.81%111.11%
david herrmanndavid herrmann314.21%222.22%
elias vanderstuyftelias vanderstuyft60.81%222.22%
charlie mooneycharlie mooney50.68%111.11%
hans verkuilhans verkuil40.54%111.11%
andrew dugganandrew duggan40.54%111.11%
hans de goedehans de goede30.41%111.11%
Total737100.00%9100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}