Add decoding for evdev ioctls

This patch introduces decoding for evdev ioctls.  For EVIOCSFF the five
first members are decoded, the union is not.  The code was compiled and
tested on x86_64 with Linux 3.13.

* evdev.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* defs.h (evdev_ioctl): New prototype.
* ioctl.c (ioctl_decode): Call evdev_ioctl for 'E' ioctl commands.
* xlat/evdev_autorepeat.in: New file.
* xlat/evdev_ff_status.in: New file.
* xlat/evdev_ff_types.in: New file.
* xlat/evdev_keycode.in: New file.
* xlat/evdev_leds.in: New file.
* xlat/evdev_misc.in: New file.
* xlat/evdev_mtslots.in: New file.
* xlat/evdev_prop.in: New file.
* xlat/evdev_relative_axes.in: New file.
* xlat/evdev_snd.in: New file.
* xlat/evdev_switch.in: New file.
* xlat/evdev_sync.in: New file.

Signed-off-by: Etienne Gemsa <etienne.gemsa@lse.epita.fr>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
This commit is contained in:
Etienne Gemsa 2015-02-20 17:14:10 +01:00 committed by Dmitry V. Levin
parent 0f4ad30bdc
commit 4f750b9ad1
16 changed files with 800 additions and 0 deletions

View File

@ -41,6 +41,7 @@ strace_SOURCES = \
count.c \
desc.c \
dirent.c \
evdev.c \
execve.c \
exit.c \
fadvise.c \

1
defs.h
View File

@ -551,6 +551,7 @@ extern void ioctl_print_code(const unsigned int);
extern int ioctl_decode(struct tcb *, const unsigned int, long);
extern int ioctl_decode_command_number(const unsigned int);
extern int block_ioctl(struct tcb *, const unsigned int, long);
extern int evdev_ioctl(struct tcb *, const unsigned int, long);
extern int loop_ioctl(struct tcb *, const unsigned int, long);
extern int mtd_ioctl(struct tcb *, const unsigned int, long);
extern int ptp_ioctl(struct tcb *, const unsigned int, long);

445
evdev.c Normal file
View File

@ -0,0 +1,445 @@
/*
* Copyright (c) 2015 Etienne Gemsa <etienne.gemsa@lse.epita.fr>
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_LINUX_INPUT_H
#include <linux/input.h>
#include "xlat/evdev_abs.h"
#include "xlat/evdev_autorepeat.h"
#include "xlat/evdev_ff_status.h"
#include "xlat/evdev_ff_types.h"
#include "xlat/evdev_keycode.h"
#include "xlat/evdev_leds.h"
#include "xlat/evdev_misc.h"
#include "xlat/evdev_mtslots.h"
#include "xlat/evdev_prop.h"
#include "xlat/evdev_relative_axes.h"
#include "xlat/evdev_snd.h"
#include "xlat/evdev_switch.h"
#include "xlat/evdev_sync.h"
static void
decode_envelope(struct ff_envelope *envelope)
{
tprintf(", envelope={attack_length=%" PRIu16 ", attack_level=%" PRIu16
", fade_length=%" PRIu16 ", fade_level=%" PRIx32 "}",
envelope->attack_length,
envelope->attack_level,
envelope->fade_length,
envelope->fade_level);
}
static int
ff_effect_ioctl(struct tcb *tcp, long arg)
{
struct ff_effect ffe;
if (!verbose(tcp) || umove(tcp, arg, &ffe) < 0)
return 0;
tprints(", {type=");
printxval(evdev_ff_types, ffe.type, "FF_???");
tprintf(", id=%" PRIu16 ", direction=%" PRIu16,
ffe.id, ffe.direction);
if (!abbrev(tcp)) {
tprintf(", trigger={button=%" PRIu16 ", interval=%" PRIu16 "}",
ffe.trigger.button, ffe.trigger.interval);
tprintf(", replay={lenght=%" PRIu16 ", delay=%" PRIu16 "}",
ffe.replay.length, ffe.replay.delay);
switch (ffe.type) {
case FF_CONSTANT:
tprintf(", constant_ef={%" PRIi16,
ffe.u.constant.level);
decode_envelope(&ffe.u.constant.envelope);
tprints("}");
return 1;
case FF_RAMP:
tprintf(", ramp={start_level=%" PRIi16
", end_level=%" PRIi16,
ffe.u.ramp.start_level,
ffe.u.ramp.end_level);
decode_envelope(&ffe.u.ramp.envelope);
tprints("}");
return 1;
case FF_PERIODIC:
tprintf(", periodic_ef={waveform=%" PRIu16
", period=%" PRIu16
", magnitude=%" PRIi16
", offset=%" PRIi16
", phase=%" PRIu16,
ffe.u.periodic.waveform,
ffe.u.periodic.period,
ffe.u.periodic.magnitude,
ffe.u.periodic.offset,
ffe.u.periodic.phase);
decode_envelope(&ffe.u.periodic.envelope);
tprintf(", custom_len=%" PRIu32
", *custom_data=%#lx}",
ffe.u.periodic.custom_len,
(unsigned long)ffe.u.periodic.custom_data);
return 1;
case FF_RUMBLE:
tprintf(", rumble={strong_magnitude=%" PRIu16
", weak_magnitude=%" PRIu16 "}",
ffe.u.rumble.strong_magnitude,
ffe.u.rumble.weak_magnitude);
return 1;
case FF_SPRING:
case FF_FRICTION:
case FF_DAMPER:
case FF_INERTIA:
case FF_CUSTOM:
break;
default :
break;
}
}
tprints(", ...}");
return 1;
}
static int
abs_ioctl(struct tcb *tcp, long arg)
{
struct input_absinfo absinfo;
if (!verbose(tcp) || umove(tcp, arg, &absinfo) < 0)
return 0;
tprintf(", {value=%" PRIu32 ", minimum=%" PRIu32,
absinfo.value, absinfo.minimum);
if (!abbrev(tcp)) {
tprintf(", maximum=%" PRIu32 ", fuzz=%" PRIu32,
absinfo.maximum, absinfo.fuzz);
tprintf(", flat=%" PRIu32 ", resolution=%" PRIu32,
absinfo.flat, absinfo.resolution);
tprints("}");
} else {
tprints(", ...}");
}
return 1;
}
static int
keycode_ioctl(struct tcb *tcp, long arg)
{
unsigned int keycode[2];
if (!arg) {
tprints(", NULL");
return 1;
}
if (!verbose(tcp) || umove(tcp, arg, &keycode) < 0)
return 0;
tprintf(", [%u, ", keycode[0]);
printxval(evdev_keycode, keycode[1], "KEY_???");
tprints("]");
return 1;
}
static int
keycode_V2_ioctl(struct tcb *tcp, long arg)
{
struct input_keymap_entry ike;
unsigned i;
if (!arg) {
tprints(", NULL");
return 1;
}
if (!verbose(tcp) || umove(tcp, arg, &ike) < 0)
return 0;
tprintf(", {flags=%" PRIu8 ", len=%" PRIu8,
ike.flags, ike.len);
if (!abbrev(tcp)) {
tprintf(", index=%" PRIu16 ", keycode=%" PRIu32,
ike.index, ike.keycode);
tprints(", scancode={");
for (i = 0; i < ARRAY_SIZE(ike.scancode); i++)
tprintf(" %" PRIx8, ike.scancode[i]);
tprints("}}");
} else {
tprints(", ...}");
}
return 1;
}
static int
getid_ioctl(struct tcb *tcp, long arg)
{
struct input_id id;
if (!verbose(tcp) || umove(tcp, arg, &id) < 0)
return 0;
tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16,
id.bustype, id.vendor);
if (!abbrev(tcp)) {
tprintf(", ID_PRODUCT=%" PRIu16 ", ID_VERSION=%" PRIu16 "}",
id.product, id.version);
} else {
tprints(", ...}");
}
return 1;
}
static int
decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
const unsigned int max_nr, const char *dflt)
{
if (!verbose(tcp))
return 0;
unsigned int size;
if ((unsigned long) tcp->u_rval > max_nr)
size = max_nr;
else
size = tcp->u_rval;
char decoded_arg[size];
if (umoven(tcp, arg, size, decoded_arg) < 0)
return 0;
tprints(", [");
int bit_displayed = 0;
int i = next_set_bit(decoded_arg, 0, size);
if (i < 0) {
tprints(" 0 ");
} else {
printxval(decode_nr, i, dflt);
while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) {
if (abbrev(tcp) && bit_displayed >= 3) {
tprints(", ...");
break;
}
tprints(", ");
printxval(decode_nr, i, dflt);
bit_displayed++;
}
}
tprints("]");
return 1;
}
static int
mtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
const size_t size = _IOC_SIZE(code) / sizeof(int32_t);
if (!size)
return 0;
int32_t buffer[size];
if (!verbose(tcp) || umove(tcp, arg, &buffer) < 0)
return 0;
tprints(", {code=");
printxval(evdev_mtslots, buffer[0], "ABS_MT_???");
unsigned int i;
tprints(", values=[");
for (i = 1; i < ARRAY_SIZE(buffer); i++)
tprintf("%s%d", i > 1 ? ", " : "", buffer[i]);
tprints("]}");
return 1;
}
static int
repeat_ioctl(struct tcb *tcp, long arg)
{
unsigned int val[2];
if (!verbose(tcp) || umove(tcp, arg, &val) < 0)
return 0;
tprintf(", [%" PRIu32 " %" PRIu32 "]", val[0], val[1]);
return 1;
}
static int
evdev_read_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
if (entering(tcp))
return 1;
if (syserror(tcp))
return 0;
if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
switch (_IOC_NR(code) - 0x20) {
case EV_SYN:
return decode_bitset(tcp, arg, evdev_sync,
SYN_MAX, "SYN_???");
case EV_KEY:
return decode_bitset(tcp, arg, evdev_keycode,
KEY_MAX, "KEY_???");
case EV_REL:
return decode_bitset(tcp, arg, evdev_relative_axes,
REL_MAX, "REL_???");
case EV_ABS:
return decode_bitset(tcp, arg,
evdev_abs, ABS_MAX, "ABS_???");
case EV_MSC:
return decode_bitset(tcp, arg,
evdev_misc, MSC_MAX, "MSC_???");
case EV_SW:
return decode_bitset(tcp, arg,
evdev_switch, SW_MAX, "SW_???");
case EV_LED:
return decode_bitset(tcp, arg,
evdev_leds, LED_MAX, "LED_???");
case EV_SND:
return decode_bitset(tcp, arg,
evdev_snd, SND_MAX, "SND_???");
case EV_REP:
return decode_bitset(tcp, arg, evdev_autorepeat,
REP_MAX, "REP_???");
case EV_FF:
return decode_bitset(tcp, arg, evdev_ff_types,
FF_MAX, "FF_???");
case EV_PWR:
printnum_int(tcp, arg, "%d");
return 1;
case EV_FF_STATUS:
return decode_bitset(tcp, arg, evdev_ff_status,
FF_STATUS_MAX, "FF_STATUS_???");
default:
return 0;
}
}
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0)))
return abs_ioctl(tcp, arg);
switch (code) {
case EVIOCGVERSION:
tprints(", ");
printnum_int(tcp, arg, "%" PRIx32);
return 1;
case EVIOCGEFFECTS:
tprints(", ");
printnum_int(tcp, arg, "%" PRIu32);
return 1;
case EVIOCGID:
return getid_ioctl(tcp, arg);
case EVIOCGREP:
return repeat_ioctl(tcp, arg);;
case EVIOCGKEYCODE:
return keycode_ioctl(tcp, arg);
case EVIOCGKEYCODE_V2:
return keycode_V2_ioctl(tcp, arg);
}
switch (_IOC_NR(code)) {
case _IOC_NR(EVIOCGMTSLOTS(0)):
return mtslots_ioctl(tcp, code, arg);
case _IOC_NR(EVIOCGNAME(0)):
case _IOC_NR(EVIOCGPHYS(0)):
case _IOC_NR(EVIOCGUNIQ(0)):
tprints(", ");
printstr(tcp, arg, tcp->u_rval - 1);
return 1;
case _IOC_NR(EVIOCGPROP(0)):
return decode_bitset(tcp, arg,
evdev_prop, INPUT_PROP_MAX, "PROP_???");
case _IOC_NR(EVIOCGSND(0)):
return decode_bitset(tcp, arg,
evdev_snd, SND_MAX, "SND_???");
case _IOC_NR(EVIOCGSW(0)):
return decode_bitset(tcp, arg,
evdev_switch, SW_MAX, "SW_???");
case _IOC_NR(EVIOCGKEY(0)):
return decode_bitset(tcp, arg,
evdev_keycode, KEY_MAX, "KEY_???");
case _IOC_NR(EVIOCGLED(0)):
return decode_bitset(tcp, arg,
evdev_leds, LED_MAX, "LED_???");
default:
return 0;
}
}
static int
evdev_write_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
if (exiting(tcp))
return 1;
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0)))
return abs_ioctl(tcp, arg);
switch (code) {
case EVIOCSREP:
return repeat_ioctl(tcp, arg);
case EVIOCSKEYCODE:
return keycode_ioctl(tcp, arg);
case EVIOCSKEYCODE_V2:
return keycode_V2_ioctl(tcp, arg);
case EVIOCSFF:
return ff_effect_ioctl(tcp, arg);
case EVIOCRMFF:
case EVIOCSCLOCKID:
case EVIOCGRAB:
case EVIOCREVOKE:
tprints(", ");
printnum_int(tcp, arg, "%u");
return 1;
default:
return 0;
}
}
int
evdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
switch(_IOC_DIR(code)) {
case _IOC_READ:
return evdev_read_ioctl(tcp, code, arg);
case _IOC_WRITE:
if (!evdev_write_ioctl(tcp, code, arg))
tprintf(", %lx", arg);
return 1;
default:
return 0;
}
}
#endif /* HAVE_LINUX_INPUT_H */

View File

@ -254,6 +254,10 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
return v4l2_ioctl(tcp, code, arg);
case '=':
return ptp_ioctl(tcp, code, arg);
#ifdef HAVE_LINUX_INPUT_H
case 'E':
return evdev_ioctl(tcp, code, arg);
#endif
default:
break;
}

2
xlat/evdev_autorepeat.in Normal file
View File

@ -0,0 +1,2 @@
REP_DELAY
REP_PERIOD

2
xlat/evdev_ff_status.in Normal file
View File

@ -0,0 +1,2 @@
FF_STATUS_STOPPED
FF_STATUS_PLAYING

16
xlat/evdev_ff_types.in Normal file
View File

@ -0,0 +1,16 @@
FF_RUMBLE
FF_PERIODIC
FF_CONSTANT
FF_SPRING
FF_FRICTION
FF_DAMPER
FF_INERTIA
FF_RAMP
FF_SQUARE
FF_TRIANGLE
FF_SINE
FF_SAW_UP
FF_SAW_DOWN
FF_CUSTOM
FF_GAIN
FF_AUTOCENTER

260
xlat/evdev_keycode.in Normal file
View File

@ -0,0 +1,260 @@
KEY_RESERVED
KEY_ESC
KEY_1
KEY_2
KEY_3
KEY_4
KEY_5
KEY_6
KEY_7
KEY_8
KEY_9
KEY_0
KEY_MINUS
KEY_EQUAL
KEY_BACKSPACE
KEY_TAB
KEY_Q
KEY_W
KEY_E
KEY_R
KEY_T
KEY_Y
KEY_U
KEY_I
KEY_O
KEY_P
KEY_LEFTBRACE
KEY_RIGHTBRACE
KEY_ENTER
KEY_LEFTCTRL
KEY_A
KEY_S
KEY_D
KEY_F
KEY_G
KEY_H
KEY_J
KEY_K
KEY_L
KEY_SEMICOLON
KEY_APOSTROPHE
KEY_GRAVE
KEY_LEFTSHIFT
KEY_BACKSLASH
KEY_Z
KEY_X
KEY_C
KEY_V
KEY_B
KEY_N
KEY_M
KEY_COMMA
KEY_DOT
KEY_SLASH
KEY_RIGHTSHIFT
KEY_KPASTERISK
KEY_LEFTALT
KEY_SPACE
KEY_CAPSLOCK
KEY_F1
KEY_F2
KEY_F3
KEY_F4
KEY_F5
KEY_F6
KEY_F7
KEY_F8
KEY_F9
KEY_F10
KEY_NUMLOCK
KEY_SCROLLLOCK
KEY_KP7
KEY_KP8
KEY_KP9
KEY_KPMINUS
KEY_KP4
KEY_KP5
KEY_KP6
KEY_KPPLUS
KEY_KP1
KEY_KP2
KEY_KP3
KEY_KP0
KEY_KPDOT
KEY_ZENKAKUHANKAKU
KEY_102ND
KEY_F11
KEY_F12
KEY_RO
KEY_KATAKANA
KEY_HIRAGANA
KEY_HENKAN
KEY_KATAKANAHIRAGANA
KEY_MUHENKAN
KEY_KPJPCOMMA
KEY_KPENTER
KEY_RIGHTCTRL
KEY_KPSLASH
KEY_SYSRQ
KEY_RIGHTALT
KEY_LINEFEED
KEY_HOME
KEY_UP
KEY_PAGEUP
KEY_LEFT
KEY_RIGHT
KEY_END
KEY_DOWN
KEY_PAGEDOWN
KEY_INSERT
KEY_DELETE
KEY_MACRO
KEY_MUTE
KEY_VOLUMEDOWN
KEY_VOLUMEUP
KEY_POWER
KEY_KPEQUAL
KEY_KPPLUSMINUS
KEY_PAUSE
KEY_SCALE
KEY_KPCOMMA
KEY_HANGEUL
KEY_HANGUEL
KEY_HANJA
KEY_YEN
KEY_LEFTMETA
KEY_RIGHTMETA
KEY_COMPOSE
KEY_STOP
KEY_AGAIN
KEY_PROPS
KEY_UNDO
KEY_FRONT
KEY_COPY
KEY_OPEN
KEY_PASTE
KEY_FIND
KEY_CUT
KEY_HELP
KEY_MENU
KEY_CALC
KEY_SETUP
KEY_SLEEP
KEY_WAKEUP
KEY_FILE
KEY_SENDFILE
KEY_DELETEFILE
KEY_XFER
KEY_PROG1
KEY_PROG2
KEY_WWW
KEY_MSDOS
KEY_COFFEE
KEY_SCREENLOCK
KEY_DIRECTION
KEY_CYCLEWINDOWS
KEY_MAIL
KEY_BOOKMARKS
KEY_COMPUTER
KEY_BACK
KEY_FORWARD
KEY_CLOSECD
KEY_EJECTCD
KEY_EJECTCLOSECD
KEY_NEXTSONG
KEY_PLAYPAUSE
KEY_PREVIOUSSONG
KEY_STOPCD
KEY_RECORD
KEY_REWIND
KEY_PHONE
KEY_ISO
KEY_CONFIG
KEY_HOMEPAGE
KEY_REFRESH
KEY_EXIT
KEY_MOVE
KEY_EDIT
KEY_SCROLLUP
KEY_SCROLLDOWN
KEY_KPLEFTPAREN
KEY_KPRIGHTPAREN
KEY_NEW
KEY_REDO
KEY_F13
KEY_F14
KEY_F15
KEY_F16
KEY_F17
KEY_F18
KEY_F19
KEY_F20
KEY_F21
KEY_F22
KEY_F23
KEY_F24
KEY_PLAYCD
KEY_PAUSECD
KEY_PROG3
KEY_PROG4
KEY_DASHBOARD
KEY_SUSPEND
KEY_CLOSE
KEY_PLAY
KEY_FASTFORWARD
KEY_BASSBOOST
KEY_PRINT
KEY_HP
KEY_CAMERA
KEY_SOUND
KEY_QUESTION
KEY_EMAIL
KEY_CHAT
KEY_SEARCH
KEY_CONNECT
KEY_FINANCE
KEY_SPORT
KEY_SHOP
KEY_ALTERASE
KEY_CANCEL
KEY_BRIGHTNESSDOWN
KEY_BRIGHTNESSUP
KEY_MEDIA
KEY_SWITCHVIDEOMODE
KEY_KBDILLUMTOGGLE
KEY_KBDILLUMDOWN
KEY_KBDILLUMUP
KEY_SEND
KEY_REPLY
KEY_FORWARDMAIL
KEY_SAVE
KEY_DOCUMENTS
KEY_BATTERY
KEY_BLUETOOTH
KEY_WLAN
KEY_UWB
KEY_UNKNOWN
KEY_VIDEO_NEXT
KEY_VIDEO_PREV
KEY_BRIGHTNESS_CYCLE
KEY_BRIGHTNESS_ZERO
KEY_DISPLAY_OFF
KEY_WWAN
KEY_WIMAX
KEY_RFKILL
KEY_MICMUTE

11
xlat/evdev_leds.in Normal file
View File

@ -0,0 +1,11 @@
LED_NUML
LED_CAPSL
LED_SCROLLL
LED_COMPOSE
LED_KANA
LED_SLEEP
LED_SUSPEND
LED_MUTE
LED_MISC
LED_MAIL
LED_CHARGING

6
xlat/evdev_misc.in Normal file
View File

@ -0,0 +1,6 @@
MSC_SERIAL
MSC_PULSELED
MSC_GESTURE
MSC_RAW
MSC_SCAN
MSC_TIMESTAMP

15
xlat/evdev_mtslots.in Normal file
View File

@ -0,0 +1,15 @@
ABS_MT_SLOT
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
ABS_MT_WIDTH_MAJOR
ABS_MT_WIDTH_MINOR
ABS_MT_ORIENTATION
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOOL_TYPE
ABS_MT_BLOB_ID
ABS_MT_TRACKING_ID
ABS_MT_PRESSURE
ABS_MT_DISTANCE
ABS_MT_TOOL_X
ABS_MT_TOOL_Y

4
xlat/evdev_prop.in Normal file
View File

@ -0,0 +1,4 @@
INPUT_PROP_POINTER
INPUT_PROP_DIRECT
INPUT_PROP_BUTTONPAD
INPUT_PROP_SEMI_MT

View File

@ -0,0 +1,10 @@
REL_X
REL_Y
REL_Z
REL_RX
REL_RY
REL_RZ
REL_HWHEEL
REL_DIAL
REL_WHEEL
REL_MISC

3
xlat/evdev_snd.in Normal file
View File

@ -0,0 +1,3 @@
SND_CLICK
SND_BELL
SND_TONE

16
xlat/evdev_switch.in Normal file
View File

@ -0,0 +1,16 @@
SW_LID
SW_TABLET_MODE
SW_HEADPHONE_INSERT
SW_RFKILL_ALL
SW_RADIO
SW_MICROPHONE_INSERT
SW_DOCK
SW_LINEOUT_INSERT
SW_JACK_PHYSICAL_INSERT
SW_VIDEOOUT_INSERT
SW_CAMERA_LENS_COVER
SW_KEYPAD_SLIDE
SW_FRONT_PROXIMITY
SW_ROTATE_LOCK
SW_LINEIN_INSERT
SW_MUTE_DEVICE

4
xlat/evdev_sync.in Normal file
View File

@ -0,0 +1,4 @@
SYN_REPORT
SYN_CONFIG
SYN_MT_REPORT
SYN_DROPPED