Android 下收发input事件的工具 getevent 和 sendevent

来源:互联网 发布:2016总决赛 知乎 编辑:程序博客网 时间:2024/05/16 17:49
Android 自带了 getevent 和 sendevent,分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。

关于event设备的获取,在 /proc/bus/input/devices 下面:

$ adb shell cat /proc/bus/input/devices

0 getevent和sendevent用法:

$ adb shell getevent -h                                              
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received

$ adb shell sendevent -h
use: sendevent device type code value

1、模拟发送一个Power键:

$ export KEYCODE_POWER=26
$ input keyevent ${KEYCODE_HOME}
或者:
先获取gpio-keys event的设备接口:
$ adb shell cat /proc/bus/input/devices | grep -A 5 gpio-keys | grep event
H: Handlers=event5

# Press power button(Don't release)
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 1
$ adb shell sendevent /dev/input/event5 0 0 0

# Release power button
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 0
$ adb shell sendevent /dev/input/event5 0 0 0

2、模拟获取Power键的事件

先执行
$ adb shell getevent /dev/input/event5

然后按下power键并观察输出:
按下时:
0001 0074 00000001
0000 0000 00000000

弹起来时:
0001 0074 00000000
0000 0000 00000000

可以看到更好跟我们上面模拟的一样,注,上面那些值是十六进制的,如果想要 更加直观地分析获取的上报事件可以参考 在 Android 通过 get_event 获得 input 设备 上报event 

以上转载自http://blog.csdn.net/hellowxwworld/article/details/10733567

以下为原创部分:

================================================================================================

下面以海思Hi3751V310芯片为例子,讲解下在实际中的使用

130|root@Hi3751V310:/ # getevent -h                                            
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received

问题:最近遇到一个问题:就是电视机的前面板按键中信号源键没有作用,而红外遥控器上是可以的。在串口中敲getevent,按键前面板按键中的信源键

130|root@Hi3751V310:/ # getevent                                               
add device 1: /dev/input/event3
  name:     "Hi Keypad"
could not get driver version for /dev/input/mouse1, Not a typewriter
add device 2: /dev/input/event2
  name:     "qwerty"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event1
  name:     "Hi mouse"
add device 4: /dev/input/event0
  name:     "Hi keyboard"
could not get driver version for /dev/input/mice, Not a typewriter
/dev/input/event3: 0001 00fa 00000001
/dev/input/event3: 0001 00fa 00000000
/dev/input/event3: 0000 0000 00000000

对比下红外遥控器,按下信源键

/dev/input/event0: 0001 00fa 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 00fa 00000000
/dev/input/event0: 0000 0000 00000000

分析可得:红外和前面板getevent事件报上来都是fa,在红外上的可以正常使用,说明android框架层的按键适配没有问题。

                两者的区别是一个是/dev/input/event3    /dev/input/event0

我们在串口中敲getevent -v

130|root@Hi3751V310:/ # getevent -v                                            
add device 1: /dev/input/event3
  bus:      0006
  vendor    046d
  product   0002
  version   0000
  name:     "Hi Keypad"
  location: ""
  id:       ""
  version:  1.0.1
add device 2: /dev/input/event2
  bus:      0000
  vendor    0000
  product   0000
  version   0100
  name:     "qwerty"
  location: ""
  id:       ""
  version:  1.0.1
add device 3: /dev/input/event1
  bus:      0000
  vendor    0001
  product   0002
  version   0100
  name:     "Hi mouse"
  location: ""
  id:       ""
  version:  1.0.1
add device 4: /dev/input/event0
  bus:      0000
  vendor    0001
  product   0001
  version   0100
  name:     "Hi keyboard"
  location: ""
  id:       ""
  version:  1.0.1

   由之前的项目经验知道,在红外按键中,用的keylayout文件是Vendor_0001_Product_0001.kl

   从上面的打印可以推敲处理,前面板按键用的keylayout文件是Vendor_046d_Product_0002.kl

而在板子上的system/usr/keylayout/ 中是没有Vendor_046d_Product_0002.kl这个文件的。

   试着在system/usr/keylayout/ 中增加Vendor_046d_Product_0002.kl,里面的内容和Vendor_0001_Product_0001.kl是一样的,结果发现前面板按键都可以用了。

   说明前面板按键用的是Vendor_046d_Product_0002.kl这个keylayout文件

   那么为什么只会前面板中信号源键不行,其他都可以呢?

   会不会找不到所知道的kl文件时,它就使用了一套默认的keylayout文件,里面除了信号源键外,其他都适配正确的?

   我们可以删除掉Vendor_0001_Product_0001.kl文件,让红外按键查找使用一套默认的keylayout文件。

  果然,红外上除了信号源键,前面板用到的按键都可以的,证明猜想成立。


0 0
原创粉丝点击