Android Input系统原理一

news2024/11/18 9:27:52

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/event2
  name:     "cec_input"
add device 2: /dev/input/event1
  name:     "aml_vkeypad"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event0
  name:     "aml_keypad"
add device 4: /dev/input/event3
  name:     "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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aloam框架laserMapping.cpp源码解读

一、详细源码解读 #include <math.h> #include <vector> #include <aloam_velodyne/common.h> #include <nav_msgs/Odometry.h> #include <nav_msgs/Path.h> #include <geometry_msgs/PoseStamped.h> #include <pcl_conversions/pcl_c…

动手学深度学习8.7. 通过时间反向传播-笔记练习(PyTorch)

本节课程地址&#xff1a;本节无视频 本节教材地址&#xff1a;8.7. 通过时间反向传播 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>bptt.ipynb 通过时间反向传播 到目前为止&…

[通义灵码] IDE 插件实现企业知识库问答

在2024杭州云栖大会上&#xff0c;随着通义大模型能力的全面提升&#xff0c;阿里云通义灵码迎来重磅升级&#xff0c;从一年前只能完成基础的辅助编程任务&#xff0c;进化到几句话就能完成需求理解、任务拆解、代码编写、修改BUG、测试等开发任务&#xff0c;最快几分钟可从0…

XSS | DOM 型 XSS 攻击

关注这个漏洞的其他相关笔记&#xff1a;XSS 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;DOM 型 XSS —— 理论篇 DOM 全称 Document Object Model&#xff0c;使用 DOM 可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。 DOM 型 XSS 是一种特殊类型的反射型 XSS&…

系统实现悬浮窗-菜单-悬浮按钮功能

文章目录 需求&#xff1a;系统实现悬浮窗菜单功能或悬浮小球定制功能实际手机产品效果悬浮窗作用 一、实际应用场景二、应用上面实现功能思路Demo演示效果部分源码分析Service层View层View初始化view 添加到窗体悬浮球拖动重点代码&#xff1a; 三、系统上面实现功能思路系统服…

秒懂Linux之信号

目录 信号的基本概念 信号的处理方式 默认动作 自定义处理信号 忽略该信号 信号的产生方式 kill命令 键盘组合键 系统调用 软件条件 异常 信号产生的深层理解 core的功能 信号的阻塞 内核中的表示 sigset_t 信号集操作函数 sigprocmask sigpending …

do while循环

/while(条件) {满足条件执行的代码&#xff0c;循环体 } /* do 做 */ while (false) { Console.WriteLine(" while循环执行了"); } do { //循环体逻辑 Console.WriteLine("dowhile循环执行了"); } while (true); Console.ReadLine(); /* w…

数据库索引:最左匹配原则——提升数据库的查询性能

数据库索引&#xff1a;最左匹配原则——提升数据库的查询性能 1、核心要点2、实例3、建议 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库优化中&#xff0c;组合索引的使用深受最左匹配原则的影响。这一原则是提升查询效率的关键…

详细分析Nginx中的proxy_pass 末尾斜杠

目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解&#xff0c;更多推荐阅读&#xff1a; Nginx配置静态网页访问&#xff08;图文界面&#xff09;Nginx将https重定向为http进行访问的配置&#xff08;附Demo&#xff09;Nginx从入门到精通&#xff08;全&#xff09;详细分…

[Java EE] TCP 协议

Author&#xff1a;MTingle major:人工智能 Build your hopes like a tower! 文章目录 文章目录​​​​​​​ 一. TCP 协议 二. TCP 特性 1. 确认应答(ack) 2. 超时重传 3. 连接管理 三次握手 四次挥手 TCP状态 4 滑动窗口 5. 流量控制 6.拥塞控制 7. 延时应答 8.捎带应答 9…

前端性能初探

前端监控 提升稳定性&#xff0c;更快的发现异常&#xff0c;定位异常&#xff0c;解决异常&#xff0c;js错误&#xff0c;接口异常&#xff0c;资源异常&#xff0c;白屏等。 关注用户体验&#xff0c;建立性能规范&#xff0c;长期关注优化&#xff0c;页面性能&#xff0c…

TopOn对话游戏魔客:2024移动游戏广告应如何突破?

TopOn对话游戏魔客&#xff1a;2024移动游戏广告应如何突破&#xff1f; 近年来&#xff0c;游戏广告投放的成本日益走高&#xff0c;ROI如何回正&#xff0c;素材如何创新等问题困扰着每一个广告主。在隐私政策的实施下&#xff0c;广告投放难度也在不断升级。 据data.ai发布…

MK米客方德SD NAND参考设计

一、电路设计 参考电路&#xff1a; R1~R5 (10K-100 kΩ)是上拉电阻&#xff0c;当SD NAND处于高阻抗模式时&#xff0c;保护CMD和DAT线免受总线浮动。 即使主机使用SD NAND SD模式下的1位模式&#xff0c;主机也应通过上拉电阻上拉所有的DATO-3线。 R6&#xff08;RCLK&…

解决图片放大模糊

首先需要了解设备像素和CSS像素&#xff0c;CSS像素 是 Web 开发中的逻辑像素&#xff0c;设计者根据这些像素来布局页面。设备像素 是设备屏幕上的实际像素点数。 DPR 是 设备像素 和 CSS像素 的比率&#xff0c;所以进行缩放后&#xff0c;也需要对图片尺寸进行处理&#xf…

【HarmonyOS】鸿蒙自定义TabLayout示例

【HarmonyOS】自定义TabLayout代码示例&#xff0c;通过 Scroll 锚点 Tab 布局&#xff0c;滚动条会自动滚动使选中的标签居中显示。 class MyTabItem {label: string "";positionX: number -1; // 当前位置width: number -1; // 当前宽度constructor(label: stri…

OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 HDMI&#xff08;High Definition Multimedia Int…

VS Code设置合集

目录 VS Code设置合集1、汉化2、VS Code自动报错3、VS Code右键没有Open In Default Browser4、VS Code设置颜色主题5、修改默认缩进字符 VS Code设置合集 1、汉化 点击插件 → 搜索chinese → 点击install&#xff0c; 同时按住ctrl shift P → 搜索>configure displ…

架构师:消息队列的技术指南

1、简述 消息队列(Message Queue, MQ)是一种异步通信机制,允许系统的各个组件通过消息在彼此之间进行通信。消息队列通过解耦系统组件、缓冲高峰期请求和提高系统的可扩展性,成为分布式系统中不可或缺的一部分。 2、工作原理 消息队列的基本工作原理是生产者将消息发布到…

Lesson08---string(4)类

Lesson08—string类&#xff08;4&#xff09; c第八章string类的实现 文章目录 Lesson08---string类&#xff08;4&#xff09;前言一、计算机是怎么储存文字的1. 在此之前先思考一个问题2.编码表2.1 ascll码2.2unicode码2.3UTF码2.4gbk码 二、实现一个简单的string1.构造函数…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…