]> granicus.if.org Git - strace/commitdiff
Add decoding for evdev ioctls
authorEtienne Gemsa <etienne.gemsa@lse.epita.fr>
Fri, 20 Feb 2015 16:14:10 +0000 (17:14 +0100)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 22 Feb 2015 02:29:54 +0000 (02:29 +0000)
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>
16 files changed:
Makefile.am
defs.h
evdev.c [new file with mode: 0644]
ioctl.c
xlat/evdev_autorepeat.in [new file with mode: 0644]
xlat/evdev_ff_status.in [new file with mode: 0644]
xlat/evdev_ff_types.in [new file with mode: 0644]
xlat/evdev_keycode.in [new file with mode: 0644]
xlat/evdev_leds.in [new file with mode: 0644]
xlat/evdev_misc.in [new file with mode: 0644]
xlat/evdev_mtslots.in [new file with mode: 0644]
xlat/evdev_prop.in [new file with mode: 0644]
xlat/evdev_relative_axes.in [new file with mode: 0644]
xlat/evdev_snd.in [new file with mode: 0644]
xlat/evdev_switch.in [new file with mode: 0644]
xlat/evdev_sync.in [new file with mode: 0644]

index 47696e0aeb773d64520977e91a355d1700c043cc..2e471e973c51e5b9d4b23d1a1d0f0bebfb0f87d7 100644 (file)
@@ -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 b5b0d558e398d407e3000a993dd1f2858a69f772..18cce3f6b01cdbe06728b9d630feb15ec5b98b6b 100644 (file)
--- 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 (file)
index 0000000..0faa487
--- /dev/null
+++ b/evdev.c
@@ -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 */
diff --git a/ioctl.c b/ioctl.c
index a2b42ba6a3860bbc37b56ec1b583028807558557..46f833422d1bc376486bd89a3f0f9b026db96bfa 100644 (file)
--- 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 (file)
index 0000000..ac8b8fb
--- /dev/null
@@ -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 (file)
index 0000000..3f88710
--- /dev/null
@@ -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 (file)
index 0000000..c6714f8
--- /dev/null
@@ -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 (file)
index 0000000..2a64713
--- /dev/null
@@ -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 (file)
index 0000000..c085ed3
--- /dev/null
@@ -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 (file)
index 0000000..385ee4d
--- /dev/null
@@ -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 (file)
index 0000000..eedf688
--- /dev/null
@@ -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 (file)
index 0000000..03a8b8e
--- /dev/null
@@ -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 (file)
index 0000000..7158d47
--- /dev/null
@@ -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 (file)
index 0000000..eaebe3c
--- /dev/null
@@ -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 (file)
index 0000000..381d838
--- /dev/null
@@ -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 (file)
index 0000000..39c2e4a
--- /dev/null
@@ -0,0 +1,4 @@
+SYN_REPORT
+SYN_CONFIG
+SYN_MT_REPORT
+SYN_DROPPED