diff --git a/Makefile.am b/Makefile.am index 47696e0a..2e471e97 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,6 +41,7 @@ strace_SOURCES = \ count.c \ desc.c \ dirent.c \ + evdev.c \ execve.c \ exit.c \ fadvise.c \ diff --git a/defs.h b/defs.h index b5b0d558..18cce3f6 100644 --- a/defs.h +++ b/defs.h @@ -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); diff --git a/evdev.c b/evdev.c new file mode 100644 index 00000000..0faa487b --- /dev/null +++ b/evdev.c @@ -0,0 +1,445 @@ +/* + * Copyright (c) 2015 Etienne Gemsa + * Copyright (c) 2015 Dmitry V. Levin + * 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 +#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 */ diff --git a/ioctl.c b/ioctl.c index a2b42ba6..46f83342 100644 --- a/ioctl.c +++ b/ioctl.c @@ -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; } diff --git a/xlat/evdev_autorepeat.in b/xlat/evdev_autorepeat.in new file mode 100644 index 00000000..ac8b8fb5 --- /dev/null +++ b/xlat/evdev_autorepeat.in @@ -0,0 +1,2 @@ +REP_DELAY +REP_PERIOD diff --git a/xlat/evdev_ff_status.in b/xlat/evdev_ff_status.in new file mode 100644 index 00000000..3f887101 --- /dev/null +++ b/xlat/evdev_ff_status.in @@ -0,0 +1,2 @@ +FF_STATUS_STOPPED +FF_STATUS_PLAYING diff --git a/xlat/evdev_ff_types.in b/xlat/evdev_ff_types.in new file mode 100644 index 00000000..c6714f8f --- /dev/null +++ b/xlat/evdev_ff_types.in @@ -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 diff --git a/xlat/evdev_keycode.in b/xlat/evdev_keycode.in new file mode 100644 index 00000000..2a647131 --- /dev/null +++ b/xlat/evdev_keycode.in @@ -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 diff --git a/xlat/evdev_leds.in b/xlat/evdev_leds.in new file mode 100644 index 00000000..c085ed34 --- /dev/null +++ b/xlat/evdev_leds.in @@ -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 diff --git a/xlat/evdev_misc.in b/xlat/evdev_misc.in new file mode 100644 index 00000000..385ee4d1 --- /dev/null +++ b/xlat/evdev_misc.in @@ -0,0 +1,6 @@ +MSC_SERIAL +MSC_PULSELED +MSC_GESTURE +MSC_RAW +MSC_SCAN +MSC_TIMESTAMP diff --git a/xlat/evdev_mtslots.in b/xlat/evdev_mtslots.in new file mode 100644 index 00000000..eedf6885 --- /dev/null +++ b/xlat/evdev_mtslots.in @@ -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 diff --git a/xlat/evdev_prop.in b/xlat/evdev_prop.in new file mode 100644 index 00000000..03a8b8e3 --- /dev/null +++ b/xlat/evdev_prop.in @@ -0,0 +1,4 @@ +INPUT_PROP_POINTER +INPUT_PROP_DIRECT +INPUT_PROP_BUTTONPAD +INPUT_PROP_SEMI_MT diff --git a/xlat/evdev_relative_axes.in b/xlat/evdev_relative_axes.in new file mode 100644 index 00000000..7158d47a --- /dev/null +++ b/xlat/evdev_relative_axes.in @@ -0,0 +1,10 @@ +REL_X +REL_Y +REL_Z +REL_RX +REL_RY +REL_RZ +REL_HWHEEL +REL_DIAL +REL_WHEEL +REL_MISC diff --git a/xlat/evdev_snd.in b/xlat/evdev_snd.in new file mode 100644 index 00000000..eaebe3c9 --- /dev/null +++ b/xlat/evdev_snd.in @@ -0,0 +1,3 @@ +SND_CLICK +SND_BELL +SND_TONE diff --git a/xlat/evdev_switch.in b/xlat/evdev_switch.in new file mode 100644 index 00000000..381d8387 --- /dev/null +++ b/xlat/evdev_switch.in @@ -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 diff --git a/xlat/evdev_sync.in b/xlat/evdev_sync.in new file mode 100644 index 00000000..39c2e4a9 --- /dev/null +++ b/xlat/evdev_sync.in @@ -0,0 +1,4 @@ +SYN_REPORT +SYN_CONFIG +SYN_MT_REPORT +SYN_DROPPED