mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
![Arnd Bergmann](/assets/img/avatar_default.png)
Going through all uses of timeval, I noticed that we screwed up input_event in the previous attempts to fix it: The time fields now match between kernel and user space, but all following fields are in the wrong place. Add the required padding that is implied by the glibc timeval definition to fix the layout, and use a struct initializer to avoid leaking kernel stack data. Fixes:141e5dcaa7
("Input: input_event - fix the CONFIG_SPARC64 mixup") Fixes:2e746942eb
("Input: input_event - provide override for sparc64") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Link: https://lore.kernel.org/r/20191213204936.3643476-2-arnd@arndb.de Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
514 lines
16 KiB
C
514 lines
16 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
/*
|
|
* 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
|
|
* Note that __USE_TIME_BITS64 is defined by libc based on
|
|
* application's request to use 64 bit time_t.
|
|
*/
|
|
|
|
struct input_event {
|
|
#if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) && !defined(__KERNEL__)
|
|
struct timeval time;
|
|
#define input_event_sec time.tv_sec
|
|
#define input_event_usec time.tv_usec
|
|
#else
|
|
__kernel_ulong_t __sec;
|
|
#if defined(__sparc__) && defined(__arch64__)
|
|
unsigned int __usec;
|
|
unsigned int __pad;
|
|
#else
|
|
__kernel_ulong_t __usec;
|
|
#endif
|
|
#define input_event_sec __sec
|
|
#define input_event_usec __usec
|
|
#endif
|
|
__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.
|
|
*
|
|
* The default 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.
|
|
* When INPUT_PROP_ACCELEROMETER is set the resolution changes.
|
|
* The main axes (ABS_X, ABS_Y, ABS_Z) are then reported in
|
|
* in units per g (units/g) and in units per degree per second
|
|
* (units/deg/s) for rotational axes (ABS_RX, ABS_RY, ABS_RZ).
|
|
*/
|
|
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
|
|
#define BUS_INTEL_ISHTP 0x1F
|
|
|
|
/*
|
|
* MT_TOOL types
|
|
*/
|
|
#define MT_TOOL_FINGER 0x00
|
|
#define MT_TOOL_PEN 0x01
|
|
#define MT_TOOL_PALM 0x02
|
|
#define MT_TOOL_DIAL 0x0a
|
|
#define MT_TOOL_MAX 0x0f
|
|
|
|
/*
|
|
* 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 */
|