进入shell,以触摸屏为例,执行getevent -p /dev/input/event1,输出如下:
add device 1: /dev/input/event1
name: "MSG21XX Touchscreen"
events:
KEY (0001): 008b 009e 00ac 00d9
ABS (0003): 002f : value 0, min 0, max 1, fuzz 0, flat 0, resolution 0
0030 : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
0032 : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
0035 : value 0, min 0, max 720, fuzz 0, flat 0, resolution 0
0036 : value 0, min 0, max 1280, fuzz 0, flat 0, resolution 0
0039 : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
input props:
INPUT_PROP_DIRECT
表明/dev/event0能产生按键类事件和绝对位移类事件。8b,9e,ac,d9转换成10进制分别是139,158,172,217,分别代表菜单键,返回键,主页键,搜索键。在kernel/include/uapi/linux/input.h中定义如下:
#define KEY_MENU 139 /* Menu (show menu) */
#define KEY_BACK 158 /* AC Back */
#define KEY_HOMEPAGE 172 /* AC Home */
#define KEY_SEARCH 217
对触摸屏采用getevent读取触摸数据,输出如下:
root@msm8909:/ # getevent /dev/input/event1
0001 00ac 00000001
0000 0000 00000000
0001 00ac 00000000
0000 0000 00000000
驱动程序通过input_event函数上报触摸结果,最终会调用kernel/drivers/input/evdev.c中的evdev_event函数:
static void evdev_event(struct input_handle *handle,
unsigned int type, unsigned int code, int value)
{
struct input_value vals[] = { { type, code, value } };
evdev_events(handle, vals, 1);
}
所以,弄清楚了struct input_value中每个成员的含义,也就弄清楚了getevent输出结果的含义,该结构体在kernel/include/linux/input.h中定义:
struct input_value {
__u16 type;
__u16 code;
__s32 value;
};
所以getevent输出结果的含义如下:
按键事件 HOME键 按下
0001 00ac 00000001
-------------同步事件-------------
0000 0000 00000000
按键事件 HOME键 松开
0001 00ac 00000000
-------------同步事件-------------
0000 0000 00000000
在shell下输入如下命令,效果相当于触摸屏的Home键被按下再被松开松开的效果:
root@msm8909:/ # sendevent /dev/input/event1 1 172 1
root@msm8909:/ # sendevent /dev/input/event1 0 0 0
root@msm8909:/ # sendevent /dev/input/event1 1 172 0
root@msm8909:/ # sendevent /dev/input/event1 0 0 0