当前位置: 首页 > news >正文

Android Input系统原理一

1. getevent 命令使用

getevent -h
getevent -lrt-t  表示事件发生时间
-l  label event types and names in plain text  表示把event事件类型名字打出来
-r  显示一下接受事件速率
130|console:/ # getevent -lrt                                                  
could not get driver version for /dev/input/mice, Not a typewriter
add device 1: /dev/input/event2name:     "cec_input"
add device 2: /dev/input/event1name:     "aml_vkeypad"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event0name:     "aml_keypad"
add device 4: /dev/input/event3name:     "input_btrcu"[    3298.022144] /dev/input/event0: EV_SYN       SYN_REPORT           00000000            
[    3298.176073] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         UP                  
[    3298.176073] /dev/input/event0: EV_SYN       SYN_REPORT           00000000             rate 6拆分一下这条命令  
[    3298.022144] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         DOWN  
分别对应
时间   节点   事件类型  事件code   事件value

getevent事件是驱动上报的,可以用这条命令定位input问题是驱动问题还是驱动之上的问题

2.getevent源码 

 system/core/toolbox/getevent.c

nfds = 1;  //pollfd数组大小
ufds = calloc(1, sizeof(ufds[0]));//pollfd数组ufds[0].fd = inotify_init();//使用inotify fd监听节点变化  也可以监听文件夹内容的变化
ufds[0].events = POLLIN;  //想要监听的事件
//如果使用  getevent /dev/input/event0  指定一个具体的节点  将会进入这个流程
if(device) {if(!print_flags_set)print_flags |= PRINT_DEVICE_ERRORS;res = open_device(device, print_flags);if(res < 0) {return 1;}
}
//监听指定路径  有新的删除节点或新增节点,都会触发 pollin事件
res = inotify_add_watch(ufds[0].fd, device_path, IN_DELETE | IN_CREATE);
//扫描路径,将/dev/input/路径下的文件都添加到poll中监听
res = scan_dir(device_path, print_flags);  static int scan_dir(const char *dirname, int print_flags) {
......
......while((de = readdir(dir))) {if(de->d_name[0] == '.' &&(de->d_name[1] == '\0' ||(de->d_name[1] == '.' && de->d_name[2] == '\0')))continue;strcpy(filename, de->d_name);open_device(devname, print_flags);}
......
......
}static int open_device(const char *device, int print_flags)
{
......
......ufds[nfds].fd = fd; //将/dev/input/下每个节点对应fd放入ufds中ufds[nfds].events = POLLIN;device_names[nfds] = strdup(device);nfds++;return 0;
}
while(1) {//int pollres =//监听文件描述符变化poll(ufds, nfds, -1);//printf("poll %d, returned %d\n", nfds, pollres);//如果是文件描述符0变化,意味着/dev/input/路径下有新文件被创建或删除,将变化同步到poll数组中if(ufds[0].revents & POLLIN) {read_notify(device_path, ufds[0].fd, print_flags);}//从1开始遍历监听的具体的节点信息,将对应的信息打印出来for(i = 1; i < nfds; i++) {if(ufds[i].revents) {if(ufds[i].revents & POLLIN) {res = read(ufds[i].fd, &event, sizeof(event));if(res < (int)sizeof(event)) {fprintf(stderr, "could not get event\n");return 1;}if(get_time) {printf("[%8ld.%06ld] ", event.time.tv_sec, event.time.tv_usec);}if(print_device)printf("%s: ", device_names[i]);print_event(event.type, event.code, event.value, print_flags);if(sync_rate && event.type == 0 && event.code == 0) {int64_t now = event.time.tv_sec * 1000000LL + event.time.tv_usec;if(last_sync_time)printf(" rate %lld", 1000000LL / (now - last_sync_time));last_sync_time = now;}printf("%s", newline);if(event_count && --event_count == 0)return 0;}}}
}

3. 多指触控协议分析 (无环境查看,这部分只做笔记)

1.EV_SYN

同步事件,在事件开始或完成会有

对应code:

0004:代表一个事件开始(不必要)

0005:代表一个事件开始(不必要)

SYN_REPORT:代表一个事件的结束(必要)

可以看到遥控器触发也会有SYN_REPORT 的code

2.EV_ABS

事件的一种绝对坐标类型

对应code:

1  ABS_MT_SLOT

本质代表着不同手指,它的value代表手指id

2  ABS_MT_TRACKING_ID

类型B特有的,实际上,每个slot会和一个ID相对应,一个非负数的表示一次接触,-1表示这是一个无用的slot(或者理解为一次接触的结束)无论在接触的类型相对应的slot发生了改变,驱动都应该通过改变这个值来使这个slot失效。并且下一次触摸的ID值会是这次的值加1。

3  ABS_MT_POSITION_X   ABS_MT_POSITION_Y

相对于屏幕中心的 x, y坐标

4  ABS_MT_TOUCH_MAJOR

接触部分的长轴长度。相当于椭圆的长轴。

5  ABS_MT_TOUCH_MINOR

接触部分的短轴长度。相当于椭圆的短轴。

6  ABS_MT_PRESSURE

代表按下压力,有的设备不一定有

3.EV_KEY

事件的一种类型。表示是按键(不仅仅指的物理按键也包括TOUCH)事件

对应code:

1  BIN_TOUCH

触摸按键。其值是DOWN或者UP。

2  BIN_TOOL_FINGER

按键的是finger,并且其值也是DOWN或者UP

具体案例可看

android多指控制协议详细解答_touchmajor-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MAC如何获取文件数字签名和进程名称
  • QT开发: Qt 框架中字符串核心类QString详解
  • Linux上Java项目环境安装
  • 深度学习:常见损失函数简介--名称、作用和用法
  • Git基本用法总结
  • Spring AOP - 配置文件方式实现
  • 字节跳动的微服务独家面经
  • 52 文本预处理_by《李沐:动手学深度学习v2》pytorch版
  • docker面经
  • 【ASE】第三课_山丘颜色梯度效果
  • C++——输入三个整数,按照由小到大的顺序输出。用指针方法处理。
  • HTTP(超文本传输协议)基础
  • 【洛谷】P4588 [TJOI2018] 数学计算 的题解 + 线段树板子代码
  • 示例:WPF中Grid显示网格线的几种方式
  • 常见服务端口号和中文大全
  • (三)从jvm层面了解线程的启动和停止
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • C++类的相互关联
  • ES6--对象的扩展
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python3 使用 asyncio 代替线程
  • React 快速上手 - 07 前端路由 react-router
  • scala基础语法(二)
  • Vue全家桶实现一个Web App
  • 从0到1:PostCSS 插件开发最佳实践
  • 对超线程几个不同角度的解释
  • 解析带emoji和链接的聊天系统消息
  • 如何优雅地使用 Sublime Text
  • 使用parted解决大于2T的磁盘分区
  • 数组的操作
  • 通过npm或yarn自动生成vue组件
  • 物联网链路协议
  • elasticsearch-head插件安装
  • #if等命令的学习
  • #职场发展#其他
  • (2)STL算法之元素计数
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (9)STL算法之逆转旋转
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm高校实验室 毕业设计 800008
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (面试必看!)锁策略
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET C# 操作Neo4j图数据库
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET gRPC 和RESTful简单对比
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件