1.Input输入子系统架构
Input Driver(Input设备驱动层)->Input core(输入子系统核心层)->Event handler(事件处理层)->User space(用户空间)
2.getevent获取Input事件的用法
getevent 指令用于获取android系统中 input 输入事件,比如获取按键上报信息、获取触摸屏上报信息等。具体的代码目录:/system/core/toolbox/getevent.c
分析一段按键消息
以上数据的格式为:/dev/input/event0: "事件类型" "参数位定义" "值"
相关宏定义在:/usr/include/linux/input-event-codes.h
解析为:输入类型为按键
参数为摄像头
值为按下和释放
3.sendevent 模拟input事件(LINUX 内核键值)
/system/core/toolbox/sendevent.c
键值相关宏定义在:/usr/include/linux/input-event-codes.h
(高通安卓11,这里没有了。在/external/toybox/toys/android/sendevent.c)
通过阅读sendevent.c源码可以得出sendevent的命令格式为:
sendevent event事件 eventType eventKeyCode eventValue
event事件:/dev/input/event*(数字)
eventType:
eventKeyCode: 通过getevent -i/p查询到的信息
eventValue: 0001 表示down 0000表示up
这样就模拟了一个确认键。
4.input 模拟input 事件(安卓键值)
基于Android N,input.java 源代码位于:
/frameworks/base/cmds/input/src/com/android/commands/input
键值相关宏定义在:frameworks/base/core/java/android/view/KeyEvent.java
根据源码可知模拟按键事件:
基于Android N,keycode number/name对应
/frameworks/base/core/java/android/view/KeyEvent.java
5.按键功能修改
按键相关的设备树在
vendor/qcom/proprietary/devicetree-4.19/qcom/lagoon-mtp.dtsi
vendor/qcom/proprietary/devicetree-4.19/qcom/pm6350.dtsi
镜像对应dtbo.img
内核键值修改
搜索关键字:compatible = "gpio-keys"
可以通过修改键值改变按键功能
先在设备树中添加设备节点,然后添加pinctrl。
label 是按键的名称。gpios 表明使用的是那个gpio。 linux,input-type的0x1是EV_KEY。linux,code 是按键上报的键值。wakeup 按键按下可以唤醒系统。debounce-interval 是按键的消抖时间。
这里的改动只是改变了内核对应的键值,并不能实现安卓的功能,比如截屏、摄像头拍照之类的。
内核键值与安卓的映射关系
源码对应
device/qcom/qssi/gpio-keys.kl
frameworks/base/data/keyboards/qwerty.kl
frameworks/base/data/keyboards/Generic.kl
镜像对应systemimage
左侧对应内核键值,右侧对应安卓键值(这里是安卓键值去掉前缀)
IO口修改