getevent、sendevent经常用于android input事件
A.getevent使用
1.在终端输入adb shell后,使用getevent命令可以打印如下信息
add device 1: /dev/input/event2
name: "bma250"
add device 2: /dev/input/event0
name: "rk29-keypad"
add device 3: /dev/input/event1
name: "ilitek_i2c"
2.对上述信息进行分析,bma250是一个g-sensor设备,可以对/dev/input/event2进行操作;而device 2设备也就是/dev/input/event0,是一个简单的按键设备;对于 device 3设备,可以看出是奕力的一款触摸设备。
3.操作这些设备,getevent能够获取的这些设备的动作。比如操作按键信息如下:
格式getevent /dev/input/eventX type code value
- /dev/input/event0: 0001 0073 00000001
- /dev/input/event0: 0000 0000 00000000
- /dev/input/event0: 0001 0073 00000000
- /dev/input/event0: 0000 0000 00000000
其中type定义如下
- /*
- * Event types
- */
- #define EV_SYN 0x00
- #define EV_KEY 0x01
- #define EV_REL 0x02
- #define EV_ABS 0x03
- #define EV_MSC 0x04
- #define EV_SW 0x05
- #define EV_LED 0x11
- #define EV_SND 0x12
- #define EV_REP 0x14
- #define EV_FF 0x15
- #define EV_PWR 0x16
- #define EV_FF_STATUS 0x17
- #define EV_MAX 0x1f
- #define EV_CNT (EV_MAX+1)
分别对应keyboard, 相对坐标, 绝对坐标, 同步事件
EV_SYN则表示一组完整事件已经完成,需要处理,EV_SYN的code定义事件分发的类型,
EV_SYN对应的code如下
- /*
- * Synchronization events.
- */
- #define SYN_REPORT 0
- #define SYN_CONFIG 1
- #define SYN_MT_REPORT 2
- #define SYN_DROPPED 3
EV_KEY对应的code如下,只列举部分:
- #define KEY_RESERVED 0
- #define KEY_ESC 1
- #define KEY_1 2
- #define KEY_2 3
- #define KEY_A 30
- #define KEY_S 31
- #define KEY_D 32
- #define KEY_VOLUMEDOWN 114
- #define KEY_VOLUMEUP 115
根据上面分析,可以用kernel函数来表达
/dev/input/event0: 0001 0073 00000001 -> input_report_key(input, KEY_VOLUMEUP, 1) -> input_event(dev, EV_KEY, KEY_VOLUMEUP, !!1)
/dev/input/event0: 0000 0000 00000000 ->input_event(dev, EV_SYN, SYN_REPORT, 0)
/dev/input/event0: 0001 0073 00000000 -> input_report_key(input, KEY_VOLUMEUP, 0) -> input_event(dev, EV_KEY, KEY_VOLUMEUP, !!0)
4.分析bam250设备信息,具体就不分析了。
/dev/input/event2: 0003 0000 ffffff64 -> input_report_abs(sensor_data->input, ABS_X, acc.x)
/dev/input/event2: 0003 0001 000000c8 -> input_report_abs(sensor_data->input, ABS_Y, acc.y)
/dev/input/event2: 0003 0002 00000060 -> input_report_abs(sensor_data->input, ABS_Z, acc.z);
/dev/input/event2: 0000 0000 00000000 -> input_sync(sensor_data->input) -> input_event(dev, EV_SYN, SYN_REPORT, 0)
5.剩下就是TP了,要用到的宏并不多。
其中用到EV_ABS,对应的code如下,只列举部分:
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
#define ABS_MT_DISTANCE 0x3b /* Contact hover distance */
根据上面的宏定义很容易分析下面的信息
/dev/input/event1: 0001 014a 00000001 -> input_report_key(ts->input_dev, BTN_TOUCH, 1)
/dev/input/event1: 0003 0039 00000000 -> input_report_abs(ts->input, ABS_MT_TRACKING_ID, id)
/dev/input/event1: 0003 0035 0000003b -> input_report_abs(ts->input, ABS_MT_POSITION_X, px)
/dev/input/event1: 0003 0036 0000003c -> input_report_abs(ts->input, ABS_MT_POSITION_Y, py)
/dev/input/event1: 0003 0030 0000000f
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0039 00000000
/dev/input/event1: 0003 0035 0000003b
/dev/input/event1: 0003 0036 0000003c
/dev/input/event1: 0003 0030 0000000f
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
5:input模拟触摸
源码frameworks/base/cmds/input/src/com/android/commands/input/Input.java
root@android:/ # input
usage: input ...
input text <string>
input keyevent <key code number or name>
input [touchscreen|touchpad] tap <x> <y>
input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2>
input trackball press
input trackball roll <dx> <dy>
向android发送触摸坐标(500,580),
# input tap 500 580
发送触摸屏滑动事件,从(200,200)滑动到(400,200)
# input swipe 200 200 400 200
暂停多媒体播放器,更多keycode查看http://android.toolib.net/reference/android/view/KeyEvent.html#KEYCODE_MUSIC
# input keyevent 127