Android getevent及sendevent分析

 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

[html] view plaincopy
  1. /dev/input/event0: 0001 0073 00000001  
  2. /dev/input/event0: 0000 0000 00000000  
  3. /dev/input/event0: 0001 0073 00000000  
  4. /dev/input/event0: 0000 0000 00000000  

其中type定義如下

[html] view plaincopy
  1. /*  
  2.  * Event types  
  3.  */  
  4. #define EV_SYN          0x00  
  5. #define EV_KEY          0x01  
  6. #define EV_REL          0x02  
  7. #define EV_ABS          0x03  
  8. #define EV_MSC          0x04  
  9. #define EV_SW           0x05  
  10. #define EV_LED          0x11  
  11. #define EV_SND          0x12  
  12. #define EV_REP          0x14  
  13. #define EV_FF           0x15  
  14. #define EV_PWR          0x16  
  15. #define EV_FF_STATUS    0x17  
  16. #define EV_MAX          0x1f  
  17. #define EV_CNT          (EV_MAX+1)  
一般來說,常用的是EV_KEY, EV_REL, EV_ABS, EV_SYN

分別對應keyboard, 相對座標, 絕對座標, 同步事件

EV_SYN則表示一組完整事件已經完成,需要處理,EV_SYN的code定義事件分發的類型,

EV_SYN對應的code如下

[html] view plaincopy
  1. /*  
  2.  * Synchronization events.  
  3.  */  
  4. #define SYN_REPORT      0  
  5. #define SYN_CONFIG      1  
  6. #define SYN_MT_REPORT       2  
  7. #define SYN_DROPPED     3  

EV_KEY對應的code如下,只列舉部分:

[html] view plaincopy
  1. #define KEY_RESERVED        0  
  2. #define KEY_ESC         1  
  3. #define KEY_1           2  
  4. #define KEY_2           3  
  5. #define KEY_A           30  
  6. #define KEY_S           31  
  7. #define KEY_D           32  
  8. #define KEY_VOLUMEDOWN      114  
  9. #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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章