大城县有做网站的吗,如何做网页游戏,企业网站 flash,顺企网下载安装1.Input输入子系统架构 Input Driver(Input设备驱动层)-Input core(输入子系统核心层)-Event handler(事件处理层)-User space(用户空间)
2.getevent获取Input事件的用法
getevent 指令用于获取android系统中 input 输入事件#xff0c;比如获取按键上报信息、获…
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)
#include errno.h
#include fcntl.h
#include linux/input.h
#include stdint.h
#include stdio.h
#include stdlib.h
#include string.h
#include sys/ioctl.h
#include unistd.hint sendevent_main(int argc, char *argv[])
{int fd;ssize_t ret;int version;struct input_event event;if(argc ! 5) {fprintf(stderr, use: %s device type code value\n, argv[0]);return 1;}fd open(argv[1], O_RDWR);if(fd 0) {fprintf(stderr, could not open %s, %s\n, argv[optind], strerror(errno));return 1;}if (ioctl(fd, EVIOCGVERSION, version)) {fprintf(stderr, could not get driver version for %s, %s\n, argv[optind], strerror(errno));return 1;}memset(event, 0, sizeof(event));event.type atoi(argv[2]);event.code atoi(argv[3]);event.value atoi(argv[4]);ret write(fd, event, sizeof(event));if(ret (ssize_t) sizeof(event)) {fprintf(stderr, write event failed, %s\n, strerror(errno));return -1;}return 0;
}
通过阅读sendevent.c源码可以得出sendevent的命令格式为 sendevent event事件 eventType eventKeyCode eventValue
event事件/dev/input/event*(数字)
eventType:
EV_SYN 0x00 同步事件
EV_KEY 0x01 按键事件
EV_REL 0x02 相对坐标
EV_ABS 0x03 绝对坐标
EV_MSC 0x04 其它
EV_LED 0x11 LED
EV_SND 0x12 声音
EV_REP 0x14 Repeat
EV_FF 0x15 力反馈
EV_PWR 电源
EV_FF_STATUS 状态
eventKeyCode: 通过getevent -i/p查询到的信息 eventValue 0001 表示down 0000表示up
p212:/ $ sendevent /dev/input/event4 1 28 1
p212:/ $ sendevent /dev/input/event4 0 0 0
p212:/ $ sendevent /dev/input/event4 1 28 0
p212:/ $ sendevent /dev/input/event4 0 0 0
这样就模拟了一个确认键。
4.input 模拟input 事件(安卓键值) 基于Android N,input.java 源代码位于
/frameworks/base/cmds/input/src/com/android/commands/input
键值相关宏定义在frameworks/base/core/java/android/view/KeyEvent.java
private void showUsage() {System.err.println(Usage: input [source] command [arg...]);System.err.println();System.err.println(The sources are: );for (String src : SOURCES.keySet()) {System.err.println( src);}System.err.println();System.err.println(The commands and default sources are:);System.err.println( text string (Default: touchscreen));System.err.println( keyevent [--longpress] key code number or name ... (Default: keyboard));System.err.println( tap x y (Default: touchscreen));System.err.println( swipe x1 y1 x2 y2 [duration(ms)] (Default: touchscreen));System.err.println( press (Default: trackball));System.err.println( roll dx dy (Default: trackball));}
根据源码可知模拟按键事件
input keyevent keycode number/name
基于Android N,keycode number/name对应
/frameworks/base/core/java/android/view/KeyEvent.java
input keyevent KEYCODE_DPAD_CENTER
等同于
input keyevent 23
模拟确认键
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口修改 6.触摸屏按键键值修改