[PATCH] Add decoding for evdev ioctls.
Etienne Gemsa
etienne.gemsa at lse.epita.fr
Fri Jan 30 10:57:24 UTC 2015
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.
* Makefile.am: add evdev.c to sources.
* defs.h (evdev_ioctl): New prototype.
* evdev.c (evdev_ioctl_decode_envelope, evdev_ff_effect_ioctl,
evdev_abs_ioctl, evdev_keycode_ioctl, evdev_decode_per_byte,
evdev_ioctl): New file.
* ioctl.c: New case for ioctl_decode switch.
* xlat/evdev_events.in: New file.
* xlat/evdev_keycode.in: New file.
* xlat/evdev_leds.in: New file.
* xlat/evdev_mtslots.in: New file.
* xlat/evdev_prop.in: New file.
* xlat/evdev_snd.in: New file.
* xlat/evdev_switch.in: New file.
Signed-off-by: Etienne Gemsa <etienne.gemsa at lse.epita.fr>
---
Makefile.am | 1 +
defs.h | 1 +
evdev.c | 347 ++++++++++++++++++++++++++++++++++++++++++++++++++
ioctl.c | 2 +
xlat/evdev_events.in | 12 ++
xlat/evdev_keycode.in | 260 +++++++++++++++++++++++++++++++++++++
xlat/evdev_leds.in | 13 ++
xlat/evdev_mtslots.in | 15 +++
xlat/evdev_prop.in | 4 +
xlat/evdev_snd.in | 3 +
xlat/evdev_switch.in | 16 +++
11 files changed, 674 insertions(+)
create mode 100644 evdev.c
create mode 100644 xlat/evdev_events.in
create mode 100644 xlat/evdev_keycode.in
create mode 100644 xlat/evdev_leds.in
create mode 100644 xlat/evdev_mtslots.in
create mode 100644 xlat/evdev_prop.in
create mode 100644 xlat/evdev_snd.in
create mode 100644 xlat/evdev_switch.in
diff --git a/Makefile.am b/Makefile.am
index a00aad2..74de87a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -39,6 +39,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 97865da..c6dbf30 100644
--- a/defs.h
+++ b/defs.h
@@ -741,6 +741,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 0000000..8597178
--- /dev/null
+++ b/evdev.c
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2015 Etienne Gemsa <etienne.gemsa at lse.epita.fr>
+ * 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 <linux/input.h>
+#include <stdlib.h>
+#include "defs.h"
+#include "xlat/evdev_keycode.h"
+#include "xlat/evdev_prop.h"
+#include "xlat/evdev_leds.h"
+#include "xlat/evdev_mtslots.h"
+#include "xlat/evdev_events.h"
+#include "xlat/evdev_switch.h"
+#include "xlat/evdev_snd.h"
+
+void evdev_ioctl_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);
+}
+
+int evdev_ff_effect_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+{
+ struct ff_effect ffe;
+
+ if (!verbose(tcp) || umove(tcp, arg, &ffe) < 0)
+ return 0;
+
+ tprintf(", {type=%" PRIu16 ", id=%" PRIu16 ", direction=%" PRIu16,
+ ffe.type, 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);
+ evdev_ioctl_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);
+ evdev_ioctl_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);
+ evdev_ioctl_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:
+ tprints(", ...}");
+ return 1;
+ default :
+ return 0;
+ }
+
+ } else
+ tprints(", ...}");
+ return 1;
+}
+
+struct input_mt_request_layout {
+ __u32 code;
+ __s32 values[];
+};
+
+int evdev_abs_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+{
+ struct input_absinfo absinfo;
+
+ if(tcp->u_rval == -1)
+ return 0;
+ 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;
+}
+
+int evdev_keycode_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+{
+ struct input_keymap_entry ike;
+ unsigned int keycode[2];
+ unsigned i;
+
+ if (tcp->u_rval == -1)
+ return 0;
+ if ((_IOC_SIZE(code)) == sizeof(unsigned int[2])) {
+ if (!verbose(tcp) || umove(tcp, arg, &keycode) < 0)
+ return 0;
+
+ tprintf(", [%u, %s]", keycode[0],
+ xlookup(evdev_keycode, keycode[1]));
+ } else {
+ 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 < 32; i++)
+ tprintf(" %" PRIu8, ike.scancode[i]);
+ tprints("}}");
+ } else {
+ tprints(", ...}");
+ }
+ }
+ return 1;
+}
+
+int evdev_decode_per_byte_ioctls(struct tcb *tcp, const unsigned code, long arg,
+ const struct xlat decode_flag[], const unsigned int max_flag)
+{
+ if (tcp->u_rval <= 0)
+ return 0;
+
+ char *decoded_arg = calloc(tcp->u_rval, sizeof(char));
+ if (decoded_arg == NULL) {
+ return 0;
+ }
+
+ int passed;
+ int all_to_zero;
+ unsigned i;
+ unsigned j;
+ unsigned bit_offset;
+
+ if (!verbose(tcp) || umovestr(tcp, arg, tcp->u_rval, decoded_arg) < 0) {
+ free(decoded_arg);
+ return 0;
+ }
+
+ passed = 0;
+ all_to_zero = 1;
+ tprints(", [");
+ for (i = 0; i < tcp->u_rval; i++) {
+ if (decoded_arg[i]) {
+ for (j = 0; j < 8; j++) {
+ if (decoded_arg[i] & (1 << j)) {
+ bit_offset = i*8 + j;
+ tprintf("%s%s", (passed ? ", " : ""),
+ xlookup(decode_flag, bit_offset));
+ passed = 1;
+ }
+ }
+ all_to_zero = 0;
+ }
+ }
+
+ if (all_to_zero)
+ tprints("0]");
+ else
+ tprints("]");
+
+ free(decoded_arg);
+ return 1;
+}
+
+int evdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+{
+ struct input_id id;
+ unsigned int rp_settings[2];
+ int i;
+ struct input_mt_request_layout mtslots;
+ int values_size;
+ int passed;
+
+ if (entering(tcp))
+ return 0;
+
+ if (_IOC_NR(code) >= _IOC_NR(EVIOCGBIT(0,0))
+ && _IOC_NR(code) <= _IOC_NR(EVIOCGBIT(EV_MAX,0))) {
+ if(tcp->u_rval == -1)
+ return 0;
+
+ tprintf(", %s = [", xlookup(evdev_events, _IOC_NR(code) - 0x20));
+ printstr(tcp, arg, _IOC_SIZE(code));
+ tprintf("]");
+ return 1;
+ }
+
+ if (_IOC_NR(code) >= _IOC_NR(EVIOCGABS(0))
+ && _IOC_NR(code) <= _IOC_NR(EVIOCGABS(ABS_MAX)))
+ return evdev_abs_ioctl(tcp, code, arg);
+
+ if (_IOC_NR(code) >= _IOC_NR(EVIOCSABS(0))
+ && _IOC_NR(code) <= _IOC_NR(EVIOCSABS(ABS_MAX)))
+ return evdev_abs_ioctl(tcp, code, arg);
+
+ switch (_IOC_NR(code)) {
+ case _IOC_NR(EVIOCGRAB):
+ case _IOC_NR(EVIOCREVOKE):
+ return 0;
+ case _IOC_NR(EVIOCGVERSION):
+ tprints(", ");
+ printnum(tcp, arg, "%" PRIx32);
+ return 1;
+ case _IOC_NR(EVIOCRMFF):
+ case _IOC_NR(EVIOCGEFFECTS):
+ case _IOC_NR(EVIOCSCLOCKID):
+ tprints(", ");
+ printnum(tcp, arg, "%" PRIu32);
+ return 1;
+ case _IOC_NR(EVIOCGID):
+ if (!verbose(tcp) || umove(tcp, arg, &id) < 0)
+ return 0;
+
+ if(!abbrev(tcp)) {
+ tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16
+ , id.bustype, id.vendor);
+ tprintf(", ID_PRODUCT=%" PRIu16 ", ID_VERSION=%" PRIu16
+ "}", id.product, id.version);
+ } else {
+ tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16
+ ", ...}", id.bustype, id.vendor);
+ }
+ return 1;
+ case _IOC_NR(EVIOCGREP):
+ if (tcp->u_rval == -1)
+ return 0;
+ if (!verbose(tcp) || umove(tcp, arg, &rp_settings) < 0)
+ return 0;
+
+ tprintf(", [delay=%" PRIu32 ", period=%" PRIu32 "]",
+ rp_settings[0], rp_settings[1]);
+ return 1;
+ case _IOC_NR(EVIOCGKEYCODE):
+ return evdev_keycode_ioctl(tcp, code, arg);
+ case _IOC_NR(EVIOCGMTSLOTS(0)):
+ if (tcp->u_rval == -1)
+ return 0;
+ if (!verbose(tcp) || umove(tcp, arg, &mtslots) < 0)
+ return 0;
+
+ if (!mtslots.values) {
+ tprints(", [ 0 ]");
+ return 1;
+ }
+
+ tprints(", {code=");
+ printxval(evdev_mtslots, mtslots.code, "error");
+ tprints(", values={");
+ values_size = _IOC_SIZE(code) - sizeof(__u32);
+ passed = 0;
+ for(i = 0; i < (int)(values_size / sizeof(__s32)); i++) {
+ tprintf("%s%d", passed ? ", " : "", mtslots.values[i]);
+ passed = 1;
+ }
+ tprints("}");
+ return 1;
+ case _IOC_NR(EVIOCGNAME(0)):
+ case _IOC_NR(EVIOCGPHYS(0)):
+ case _IOC_NR(EVIOCGUNIQ(0)):
+ if (tcp->u_rval == -1)
+ return 0;
+
+ tprints(", ");
+ printstr(tcp, arg, tcp->u_rval - 1);
+ return 1;
+ case _IOC_NR(EVIOCGPROP(0)):
+ return evdev_decode_per_byte_ioctls(tcp, code, arg,
+ evdev_prop, INPUT_PROP_MAX);
+ case _IOC_NR(EVIOCGSND(0)):
+ return evdev_decode_per_byte_ioctls(tcp, code, arg,
+ evdev_snd, SND_MAX);
+ case _IOC_NR(EVIOCGSW(0)):
+ return evdev_decode_per_byte_ioctls(tcp, code, arg,
+ evdev_switch, SW_MAX);
+ case _IOC_NR(EVIOCGKEY(0)):
+ return evdev_decode_per_byte_ioctls(tcp, code, arg,
+ evdev_keycode, KEY_MAX);
+ case _IOC_NR(EVIOCGLED(0)):
+ return evdev_decode_per_byte_ioctls(tcp, code, arg,
+ evdev_leds, LED_MAX);
+ case _IOC_NR(EVIOCSFF):
+ return evdev_ff_effect_ioctl(tcp, code, arg);
+ default:
+ return 0;
+ }
+}
diff --git a/ioctl.c b/ioctl.c
index a2b42ba..2ba7d4a 100644
--- a/ioctl.c
+++ b/ioctl.c
@@ -254,6 +254,8 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
return v4l2_ioctl(tcp, code, arg);
case '=':
return ptp_ioctl(tcp, code, arg);
+ case 'E':
+ return evdev_ioctl(tcp, code, arg);
default:
break;
}
diff --git a/xlat/evdev_events.in b/xlat/evdev_events.in
new file mode 100644
index 0000000..0974b59
--- /dev/null
+++ b/xlat/evdev_events.in
@@ -0,0 +1,12 @@
+EV_SYN
+EV_KEY
+EV_REL
+EV_ABS
+EV_MSC
+EV_SW
+EV_LED
+EV_SND
+EV_REP
+EV_FF
+EV_PWR
+EV_FF_STATUS
diff --git a/xlat/evdev_keycode.in b/xlat/evdev_keycode.in
new file mode 100644
index 0000000..2994d9e
--- /dev/null
+++ b/xlat/evdev_keycode.in
@@ -0,0 +1,260 @@
+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 0000000..7414414
--- /dev/null
+++ b/xlat/evdev_leds.in
@@ -0,0 +1,13 @@
+LED_NUML
+LED_CAPSL
+LED_SCROLLL
+LED_COMPOSE
+LED_KANA
+LED_SLEEP
+LED_SUSPEND
+LED_MUTE
+LED_MISC
+LED_MAIL
+LED_CHARGING
+LED_MAX
+LED_CNT
diff --git a/xlat/evdev_mtslots.in b/xlat/evdev_mtslots.in
new file mode 100644
index 0000000..eedf688
--- /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 0000000..03a8b8e
--- /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_snd.in b/xlat/evdev_snd.in
new file mode 100644
index 0000000..eaebe3c
--- /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 0000000..381d838
--- /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
--
1.9.1
More information about the Strace-devel
mailing list