Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1371716
  • 博文数量: 478
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4833
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 11:12
文章分类

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2016-07-29 14:25:05

 

getevent/sendevent 使用说明

标签: 
2012-09-21 14:22 11082人阅读 评论(4)  举报
 分类:
 
调试工具

这两天准备写一下input子系统的分析,过程中发现了两个好工具,呵呵,就是本文介绍的主角:getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这样在调试的时候遇到有的样机按键坏了或者触摸屏坏了就方便了,工具的源码位于 SDK的system/core/toolbox下面。

一、getevent

首先看一下命令的用法说明:


[plain] view plain copy
  1. # getevent -h  
  2. Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]  
  3.     -t: show time stamps  
  4.     -n: don't print newlines  
  5.     -s: print switch states for given bits  
  6.     -S: print all switch states  
  7.     -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)  
  8.     -p: show possible events (errs, dev, name, pos. events)  
  9.     -q: quiet (clear verbosity mask)  
  10.     -c: print given number of events then exit  
  11.     -r: print rate events are received  


其中 [-t] 参数显示事件的时间戳,[-n] 取消事件显示时的换行符,[-s switchmask] 得到指定位的开关状态,[-S] 得到所有开关的状态,[-v [mask]] 根据mask的值显示相关信息,后面详细介绍mask的使用方法,[-p] 显示每个设备支持的事件类型和编码,[-q] 只显示事件数据,[-c count] 只显示count次事件的数据,[-r] 显示事件接收频率。下面看一下命令以及相关参数的使用结果:

1、getevent -p


[plain] view plain copy
  1. # getevent -p  
  2. add device 1: /dev/input/event4  
  3.   name:     "tempsensor"  
  4.   events:  
  5.     SYN (0000): 0000  0003   
  6.     ABS (0003): 0010  value 0, min 0, max 100, fuzz 0 flat 0  
  7. add device 2: /dev/input/event3  
  8.   name:     "accsensor"  
  9.   events:  
  10.     SYN (0000): 0000  0003   
  11.     ABS (0003): 0000  value -23, min 0, max 0, fuzz 0 flat 0  
  12.                 0001  value -8, min 0, max 0, fuzz 0 flat 0  
  13.                 0002  value -966, min 0, max 0, fuzz 0 flat 0  
  14. add device 3: /dev/input/event2  
  15.   name:     "xx_keypad"  
  16.   events:  
  17.     SYN (0000): 0000  0001   
  18.     KEY (0001): 0000  0001  0002  0003  0004  0005  0006  0007   
  19.                 0008  0009  000a  000b  000c  000d  000e  000f   
  20.                 0010  0011  0012  0013  0014  0015  0016  0017   
  21.                 0018  0019  001a  001b  001c  001d  001e  001f   
  22.                 0020  0021  0022  0023  0024  0025  0026  0027   
  23.                 0028  0029  002a  002b  002c  002d  002e  002f   
  24.                 0030  0031  0032  0033  0034  0035  0036  0037   
  25.                 0038  0039  003a  003b  003c  003d  003e  003f   
  26.                 0074   
  27. add device 4: /dev/input/event1  
  28.   name:     "xx_ts"  
  29.   events:  
  30.     SYN (0000): 0000  0001  0003   
  31.     KEY (0001): 0066  008b  009e  00d9   
  32.     ABS (0003): 0030  value 0, min 0, max 255, fuzz 0 flat 0  
  33.                 0035  value 0, min 0, max 320, fuzz 0 flat 0  
  34.                 0036  value 0, min 0, max 480, fuzz 0 flat 0  
可以看到 [-p] 参数显示出来当前系统存在的所有input设备,并且把每个设备支持的事件类型以及编码都列举了出来,比如xx_ts:



[plain] view plain copy
  1. SYN (0000): 0000  0001  0003  
表示xx_ts支持的事件类型有:EV_SYN [0000] (同步事件),EV_KEY [0001] (按键事件),EV_ABS [0003] (绝对值事件);



[plain] view plain copy
  1. KEY (0001): 0066  008b  009e  00d9  

表示xx_ts支持的按键编码有:KEY_HOME [0066] (HOME键),KEY_MENU [008b] (MENU键)

                                              KEY_BACK [009e] (BACK键),KEY_SEARCH [00d9] (SEARCH键)

[plain] view plain copy
  1. ABS (0003): 0030  value 0, min 0, max 255, fuzz 0 flat 0  
  2.             0035  value 0, min 0, max 320, fuzz 0 flat 0  
  3.             0036  value 0, min 0, max 480, fuzz 0 flat 0  

表示xx_ts支持的绝对值编码有:ABS_MT_TOUCH_MAJOR [0030] (接触面长轴值) {有效值范围[0, 255]}

                                                 ABS_MT_POSITION_X [0035] (x轴坐标) {有效值范围[0, 320]}

                                                 ABS_MT_POSITION_Y [0036] (y轴坐标) {有效值范围[0, 480]}

2、getevent -v [mask]

[-v] 参数会根据mask的值决定显示内容,在源码中可以找到相应位的定义:


[cpp] view plain copy
  1. enum {  
  2.     PRINT_DEVICE_ERRORS     = 1U << 0,  
  3.     PRINT_DEVICE            = 1U << 1,  
  4.     PRINT_DEVICE_NAME       = 1U << 2,  
  5.     PRINT_DEVICE_INFO       = 1U << 3,  
  6.     PRINT_VERSION           = 1U << 4,  
  7.     PRINT_POSSIBLE_EVENTS   = 1U << 5,  
  8. };  
其中 PRINT_DEVICE_ERRORS 显示错误信息,PRINT_DEVICE 显示设备个数,PRINT_DEVICE_NAME 显示设备名称,PRINT_DEVICE_INFO 显示设备信息,PRINT_VERSION 显示设备版本号,PRINT_POSSIBLE_EVENTS 显示设备支持的事件类型及编码。唯一觉得有缺憾的是 [-v] 参数执行后会一直显示事件的数据,而没有mask决定是否显示这些数据,不过可以通过grep过滤掉。在输入命令时根据相应的位决定mask值:



[plain] view plain copy
  1. # getevent -v 63  
  2. add device 1: /dev/input/event4  
  3.   bus:      0000  
  4.   vendor    0000  
  5.   product   0000  
  6.   version   0000  
  7.   name:     "tempsensor"  
  8.   location: ""  
  9.   id:       ""  
  10.   version:  1.0.0  
  11.   events:  
  12.     SYN (0000): 0000  0003   
  13.     ABS (0003): 0010  value 0, min 0, max 100, fuzz 0 flat 0  
  14. ...  
这样就显示出了所有的信息。
二、sendevent
sendevent就比较有用了,首先看一下它的用法说明:


[plain] view plain copy
  1. # sendevent   
  2. use: sendevent device type code value  
可以看到sendevent需要4个参数即:device,type,code,value。这些值可以由input子系统定义,也可以从getevent里面获取,比如我们要模拟一次 BACK 事件,根据前面的信息可知BACK的编码为0x9e即158,那我们输入如下命令即可模拟一次BACK键的按下和弹起:



[plain] view plain copy
  1. # sendevent /dev/input/event1 1 158 1  
  2. # sendevent /dev/input/event1 1 158 0  
device需要是支持该按键的设备这里是xx_ts;type为1表示是按键事件;value为1表示按下,为0表示弹起,一次按键事件由按下和弹起两个操作组成。另外Android还在framework层提供了输入键值的工具input,这些我们后面再详细分析。


顶 6
阅读(2864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~