mtk 驱动开发(71)---Android getevent,sendevent,input keyevent

Android getevent,sendevent,input keyevent

前言

getevent和sendevent是Android系统自带的获取设备的收发事件和模拟设备事件进行自动话测试。而input keyevent也在自动话测试中有很大的作用,用于模拟常用按键等。接下来就一一是实践角度分析此三个工具的使用方法。

getevent

进入android手机,然后输入getevent --help就可以查看该工具使用方法。
[cpp]  view plain  copy
  1. test@123:/data # getevent --help                                      
  2. getevent: invalid option --  
  3. Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]  
  4.     -t: show time stamps  
  5.     -n: don't print newlines  
  6.     -s: print switch states for given bits  
  7.     -S: print all switch states  
  8.     -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)  
  9.     -d: show HID descriptor, if available  
  10.     -p: show possible events (errs, dev, name, pos. events)  
  11.     -i: show all device info and possible events  
  12.     -l: label event types and names in plain text  
  13.     -q: quiet (clear verbosity mask)  
  14.     -c: print given number of events then exit  
  15.     -r: print rate events are received  
简单说几个常见的参数。【-t】显示事件发生的时间,【-p】显示设备上支持的事件类型和编码,【-l】显示事件类型的信息以标签的形式,【-r】事件出现的频率。

下面执行例子说明,执行如下的命令,然后按下手机的音量上键和下键
[cpp]  view plain  copy
  1. getevent -t  
执行结果如下:
[cpp]  view plain  copy
  1. test@123:/data # getevent -t                                        
  2. could not get driver version for /dev/input/mice, Not a typewriter  
  3. add device 1: /dev/input/event0  
  4.   name:     "xxx-gpio-keys"  
  5. add device 2: /dev/input/event3  
  6.   name:     "..............."  
  7. add device 3: /dev/input/event2  
  8.   name:     "................."  
  9. could not get driver version for /dev/input/mouse0, Not a typewriter  
  10. add device 4: /dev/input/event1  
  11.   name:     "adaptive_ts"  
  12. [    1488.476515] /dev/input/event0: 0001 0073 00000001  
  13. [    1488.476515] /dev/input/event0: 0000 0000 00000000  
  14. [    1488.631825] /dev/input/event0: 0001 0073 00000000  
  15. [    1488.631825] /dev/input/event0: 0000 0000 00000000  
  16. [    1489.424382] /dev/input/event0: 0001 0072 00000001  
  17. [    1489.424382] /dev/input/event0: 0000 0000 00000000  
  18. [    1489.548998] /dev/input/event0: 0001 0072 00000000  
  19. [    1489.548998] /dev/input/event0: 0000 0000 00000000  
我们需要对上述的一串数字进行说明,如下图:
看上图就可以看的一目了然了,而这些事件的定义在kernel/include/linux/input.h中。
[cpp]  view plain  copy
  1. /** 
  2.  * struct input_value - input value representation 
  3.  * @type: type of value (EV_KEY, EV_ABS, etc) 
  4.  * @code: the value code 
  5.  * @value: the value 
  6.  */  
  7. struct input_value {  
  8.     __u16 type;  
  9.     __u16 code;  
  10.     __s32 value;  
  11. };  
此结构体不就是上述设备名字后面的三列数据的定义。 而所谓的事件类型定义如下:
[cpp]  view plain  copy
  1. /* 
  2.  * Event types 
  3.  */  
  4.   
  5. #define EV_SYN          0x00  
  6. #define EV_KEY          0x01  
  7. #define EV_REL          0x02  
  8. #define EV_ABS          0x03  
  9. #define EV_MSC          0x04  
  10. #define EV_SW           0x05  
  11. #define EV_LED          0x11  
  12. #define EV_SND          0x12  
  13. #define EV_REP          0x14  
  14. #define EV_FF           0x15  
  15. #define EV_PWR          0x16  
  16. #define EV_FF_STATUS        0x17  
  17. #define EV_MAX          0x1f  
  18. #define EV_CNT          (EV_MAX+1)  
常见的事件类型有EV_SYN(同步事件),EV_KEY(按键事件),EV_ABS(绝对事件)。而每个事件下面有不同的code定义,就按键事件下就有很多code,不在此一一列举了。列去三个我们下面要用到的。
[cpp]  view plain  copy
  1. #define KEY_VOLUMEDOWN<span style="white-space:pre;">       </span>114  
  2. #define KEY_VOLUMEUP<span style="white-space:pre;">     </span>115  
  3. #define KEY_POWER<span style="white-space:pre;">        </span>116<span style="white-space:pre;">   </span>/* SC System Power Down */  
  4. #define BTN_TOUCH<span style="white-space:pre;">        </span>0x14a  

ok,这下我们就很快能解析上述数据的含义了。注意(每个事件完成后都会存在一个KEY_SYN同步事件,用于同步上报事件。所有的数据是十六机制显示)

当然了,如果你觉得上面识别还是很不方法,可以使用-l参数。
[cpp]  view plain  copy
  1. test@123:/data # getevent -tl                                       
  2. could not get driver version for /dev/input/mice, Not a typewriter  
  3. add device 1: /dev/input/event0  
  4.   name:     "xxxx-gpio-keys"  
  5. add device 2: /dev/input/event3  
  6.   name:     "xxxxx"  
  7. add device 3: /dev/input/event2  
  8.   name:     "xxx"  
  9. could not get driver version for /dev/input/mouse0, Not a typewriter  
  10. add device 4: /dev/input/event1  
  11.   name:     "adaptive_ts"  
  12. [    3246.862919] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         DOWN                  
  13. [    3246.862919] /dev/input/event0: EV_SYN       SYN_REPORT           00000000              
  14. [    3247.058640] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         UP                    
  15. [    3247.058640] /dev/input/event0: EV_SYN       SYN_REPORT           00000000              
  16. [    3266.495595] /dev/input/event0: EV_KEY       KEY_VOLUMEDOWN       DOWN                  
  17. [    3266.495595] /dev/input/event0: EV_SYN       SYN_REPORT           00000000              
  18. [    3266.635165] /dev/input/event0: EV_KEY       KEY_VOLUMEDOWN       UP                    
  19. [    3266.635165] /dev/input/event0: EV_SYN       SYN_REPORT           00000000    
从上就可以很方便的辨别是按键事件,分别为按下/抬起音量上键,按下/抬起音量下键。

接下来分析下绝对事件,一般为触摸屏事件。同样的办法执行getevent -t,然后按下触摸屏。
[cpp]  view plain  copy
  1. test@123:/data # getevent -t                                            
  2. could not get driver version for /dev/input/mice, Not a typewriter  
  3. add device 1: /dev/input/event0  
  4.   name:     "xxx-gpio-keys"  
  5. add device 2: /dev/input/event3  
  6.   name:     "xxxx"  
  7. add device 3: /dev/input/event2  
  8.   name:     "xxxx"  
  9. could not get driver version for /dev/input/mouse0, Not a typewriter  
  10. add device 4: /dev/input/event1  
  11.   name:     "adaptive_ts"  
  12. [    3449.957951] /dev/input/event1: 0003 0039 00000040  
  13. [    3449.957951] /dev/input/event1: 0003 0035 00000166  
  14. [    3449.957951] /dev/input/event1: 0003 0036 000001c5  
  15. [    3449.957951] /dev/input/event1: 0001 014a 00000001  
  16. [    3449.957951] /dev/input/event1: 0000 0000 00000000  
  17. [    3449.995643] /dev/input/event1: 0003 0039 ffffffff  
  18. [    3449.995643] /dev/input/event1: 0001 014a 00000000  
  19. [    3449.995643] /dev/input/event1: 0000 0000 00000000  
和上述一样,就不贴图分析数据了,直接说明数据的内容。

设备类型为/dev/input/event1,该input事件用作触摸屏事件。
0003: 代表事件类型为EV_ABS事件,0001为EV_KEY事件,0000为EV_SYN事件。
关于EV_ABS事件的code,需要贴出几个常见的code。
[cpp]  view plain  copy
  1. #define ABS_MT_ORIENTATION  0x34    /* Ellipse orientation */  
  2. #define ABS_MT_POSITION_X   0x35    /* Center X touch position */  
  3. #define ABS_MT_POSITION_Y   0x36    /* Center Y touch position */  
  4. #define ABS_MT_TOOL_TYPE    0x37    /* Type of touching device */  
  5. #define ABS_MT_BLOB_ID      0x38    /* Group a set of packets as a blob */  
  6. #define ABS_MT_TRACKING_ID  0x39    /* Unique ID of initiated contact */  
  7. #define ABS_MT_PRESSURE     0x3a    /* Pressure on contact area */  
code=0x39代表一个唯一的ID。
code=0x35代表触摸器按下的x坐标。
code=0x36代表触摸屏按下的y坐标。
可以按到上述按下的触摸屏坐标是: (0x166,0x1c5)=十进制(358,453)。

执行getevent -p命令可以看到设备尺寸等信息。
[cpp]  view plain  copy
  1. add device 4: /dev/input/event1  
  2.   name:     "adaptive_ts"  
  3.   events:  
  4.     KEY (0001): 009e  00ac  014a  0244   
  5.     ABS (0003): 0000  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0  
  6.                 0001  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0  
  7.                 002f  : value 0, min 0, max 9, fuzz 0, flat 0, resolution 0  
  8.                 0035  : value 0, min 0, max 720, fuzz 0, flat 0, resolution 0  
  9.                 0036  : value 0, min 0, max 1280, fuzz 0, flat 0, resolution 0  
  10.                 0039  : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0  
  11.   input props:  
  12.     INPUT_PROP_DIRECT  
比如0x35和0x36就对应的是该手机的尺寸的大小,大小是720*1280的。如果通过获得x,y坐标存在问题,可以通过如下公式转化:
[cpp]  view plain  copy
  1. x=(x-xmin)*480/(xmax-xmin) ;  
  2. y=(y-ymin)*800/(ymax-ymin);  

sendevent

和getevent方法一样,通过sendevent --help就可以获得使用方法。
[cpp]  view plain  copy
  1. test@123:/data # sendevent --help                                     
  2. use: sendevent device type code value  
发送按下power按键
[cpp]  view plain  copy
  1. sendevent /dev/input/event0 0001 0074 00000001         
  2. sendevent /dev/input/event0 0000 0000 00000000         
  3. sendevent /dev/input/event0 0001 0074 00000000         
  4. sendevent /dev/input/event0 0000 0000 00000000   

input keyevent

用法如下:
input keyevent <keycode>
关于keycode可以通过查看Monkey常用的键值表。
[cpp]  view plain  copy
  1. 0 -->  "KEYCODE_UNKNOWN"  
  2. 1 -->  "KEYCODE_MENU"  
  3. 2 -->  "KEYCODE_SOFT_RIGHT"  
  4. 3 -->  "KEYCODE_HOME"  
  5. 4 -->  "KEYCODE_BACK"  
  6. 5 -->  "KEYCODE_CALL"   

如果想使用命令拨打电话,直接使用:  input keyevent 5即可。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值