RK3568平台(input篇)input数据上报分析

news2024/9/8 23:23:51

一.input设置事件类型

__set_bit 是一个位操作函数,用于设置一个位图中的特定位,例如可以通过下面的代码将 输入设备设置为支持按键事件:

__set_bit(EV_KEY,myinput_dev->evbit)

第一位为设置设置事件类型。

第二位为输入设备的能力 和支持的功能。

设置事件类型

在头文件 include/uapi/linux/input-event-codes.h 中,Linux 内核已经为我们定义了一些输入 事件类型,它们的含义如下:

(1)EV_SYN (0x00): 用于同步事件,表示一组输入事件的结束。

(2)EV_KEY (0x01): 用于按键事件,表示按下、释放或重复一个键。

(3)EV_REL (0x02): 用于相对位移事件,表示设备的相对位置变化,例如鼠标的移动。

(4)EV_ABS (0x03): 用于绝对位移事件,表示设备的绝对位置变化,例如触摸屏的坐标。

(5)EV_MSC (0x04): 用于杂项事件,包含一些特殊目的的事件类型,例如设备状态变化等。

(6)EV_SW (0x05): 用于开关事件,表示开关的状态变化,例如电源按钮、开合盖等。

(7)EV_LED (0x11): 用于 LED 事件,表示 LED 灯的状态变化。

(8)EV_SND (0x12): 用于声音事件,表示声音的播放相关事件。

(9)EV_REP (0x14): 用于重复事件,表示键盘重复发送事件。

(10)EV_FF (0x15): 用于力反馈事件,表示力反馈设备的输出事件。

(11)EV_PWR (0x16): 用于电源事件,表示电源状态变化。

(12)EV_FF_STATUS (0x17): 用于力反馈状态事件,表示力反馈设备的状态变化。

(13)EV_MAX (0x1f): 输入事件类型的最大值。

(14)EV_CNT: 输入事件类型的数量。

在 input_dev 结构体中定义了一系列的位图,在输入子系统中用于表示输入设备的能力 和支持的功能,具体定义如下所示:

unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; // 设备的属性位图

unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; // 设备支持的事件类型位图

unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; // 设备支持的按键位图

unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; // 设备支持的相对坐标位图

unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; // 设备支持的绝对坐标位图

unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; // 设备支持的杂项事件位图

unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; // 设备支持的 LED 位图

unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; // 设备支持的声音位图

unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; // 设备支持的力反馈位图

(1)evbit(事件类型位图)是一个长度为 EV_CNT 的数组,每个元素对应一个事件类型。 通过设置相应的位,可以指示设备支持的事件类型,如按键事件、相对位移事件、绝对位移事 件、杂项事件等。 (2)keybit(按键类型位图)表示输入设备支持的按键类型,通常与 EV_KEY 事件类型 相关。通过设置相应的位,可以指示设备支持的按键。

(3)relbit(相对位移类型位图)表示输入设备支持的相对位移类型,通常与 EV_REL 事 件类型相关。通过设置相应的位,可以指示设备支持的相对位移,例如鼠标的移动。

(4)absbit(绝对位移类型位图)表示输入设备支持的绝对位移类型,通常与 EV_ABS 事 件类型相关。通过设置相应的位,可以指示设备支持的绝对位移,例如触摸屏的坐标。

(5)mscbit(杂项类型位图)表示输入设备支持的杂项类型,通常与 EV_MSC 事件类 型相关。通过设置相应的位,可以指示设备支持的杂项事件,例如设备状态变化等。

(6)ledbit(LED 类型位图)表示输入设备支持的 LED 类型,通常与 EV_LED 事件类 型相关。通过设置相应的位,可以指示设备支持的 LED 灯控制。

(7)sndbit(声音类型位图)表示输入设备支持的声音类型,通常与 EV_SND 事件类型 相关。通过设置相应的位,可以指示设备支持的声音事件。

(8)ffbit(力反馈类型位图)表示输入设备支持的力反馈类型,通常与 EV_FF 事件类 型相关。通过设置相应的位,可以指示设备支持的力反馈事件。

(9)swbit(开关类型位图)表示输入设备支持的开关类型,通常与 EV_SW 事件类型相 关。通过设置相应的位,可以指示设备支持的开关状态变化。

二.上报事件

上报事件是指在设备驱动层中,当输入设备产生事件时,将该事件通知给输入子系统。在 上报事件之前,首先要确定要上报的事件类型。事件类型可以是按键事件、相对位置事件、绝 对位置事件等,取决于输入设备的特性和能力。在 Linux 内核中,事件类型由预定义的常量表 示,如 EV_KEY 表示按键事件,EV_REL 表示相对位置事件,EV_ABS 表示绝对位置事件等。

而在确定事件类型之后,就需要使用相应的上报函数将事件数据传递给输入子系统。 常用的上报函数包括:

input_report_key():上报按键事件,用于通知按键的按下和释放状态。

input_report_rel():上报相对位置事件,用于通知设备的相对移动量,如鼠标的移动。

input_report_abs():上报绝对位置事件,用于通知设备的绝对位置,如触摸屏的坐标。

input_report_key 函数:

函数原型:input_report_key(struct input_dev *dev, unsigned int code, int value): 
功能:上报按键事件。
参数:dev:输入设备结构体指针,表示要发送事件的输入设备。 code:按键码,表示按下或释放的具体按键。 value:按键状态,0 表示按键释放,非零值表示按键按下。

input_report_rel 函数:

函数原型:input_report_rel(struct input_dev *dev, unsigned int code, int value): 
功能:上报相对位置事件。
参数:dev:输入设备结构体指针,表示要发送事件的输入设备。 code:位置码,表示相对位置的具体类型。 value:位置偏移量,表示设备相对于先前位置的移动量。

input_report_abs 函数:

函数原型:input_report_abs(struct input_dev *dev, unsigned int code, int value): 
功能:上报绝对位置事件。 
参数:dev:输入设备结构体指针,表示要发送事件的输入设备。 code:位置码,表示绝对位置的具体类型。 value:位置值,表示设备的绝对位置。

input_report_ff_status 函数:

input_report_ff_status(struct input_dev *dev, unsigned int code, int value): 
功能:上报力反馈状态事件。 
参数:dev:输入设备结构体指针,表示要发送事件的输入设备。 code:力反馈码,表示力反馈的具体类型。 value:力反馈状态,0 表示停止,非零值表示运行中。

input_report_switch 函数:

函数原型:input_report_switch(struct input_dev *dev, unsigned int code, int value): 
功能:上报开关事件。 
参数:dev:输入设备结构体指针,表示要发送事件的输入设备。 code:开关码,表示开关的具体类型。 value:开关状态,0 表示关闭,非零值表示打开。

input_sync 函数:

函数原型:input_sync(struct input_dev *dev): 
功能:同步事件。 参数:dev:输入设备结构体指针,表示要发送事件的输入设备。

每个上报函数都是内联函数,通过调用 input_event()函数将事件数据添加到输入事件队列 中。这些函数的参数中包含了事件类型(如 EV_KEY、EV_REL 等)、事件码(如按键码、位 置码等)以及事件的具体值(如按键状态、位置偏移量等)。这些参数用于构造输入事件,并 将其添加到输入事件队列中,以便后续的处理。 在使用上报函数之后,通常会调用 input_sync()函数进行同步。同步事件的目的是告知输入 子系统事件的结束,以便子系统可以将事件传递给相应的应用程序或系统组件进行处理。同步 事件的调用可以防止事件数据的丢失或混乱。

三.上报数据格式分析

可以使用 命令“hexdump /dev/input/event4”来查看上报的信息。实际上,使用 hexdump 命令查看到的 数据也是 input_event 数据包。

接下来我们再来看一下 input_event 数据包中的成员

 在 input_event 数据包中,有四个成员变量:time,type,code,value。这些成员变量的 值在使用 hexdump 命令获取到的数据中是以字节的形式存储的每个字节都以十六进制的形式 表示。为了将 hexdump 输出的数据与 input_event 数据包中的成员值对应起来,你需要了解数 据包的字节顺序(即字节序)和每个成员的字节大小。

time.tv_sec 和 time.tv_usec 的类型是 long int,占 8 个字节

__u16 type 的类型是 unsigned short int,占 2 个字节

__u16 code 的类型是 unsigned short int,占 2 个字节

__s32 value 的类型是 unsigned int,占 4 个字节。

一个 input_event 数据包所占字节的大小为 8+8+2+2+4 =24 个字节。

如下图所示为一个 input_event 数据包。

对应的成员值如下:

tv_sec: 0f09 65d3 0000 0000

tv_usec: 36fb 0001 0000 0000

type: 0003

code:0039

value: 0000 0000

 

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

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

相关文章

6 网络

6 网络 1、概念2 IP地址3、套接字4、TCP协议4.1 TCP协议的基本特征4.2 建立连接4.4 终止连接4.5 编程模型 5、UDP协议5.1 UDP协议的基本特性5.2 常用函数5.3 UDP通信模型 6、域名解析 1、概念 计算机网络是实现资源共享和信息传递的计算机系统 ISO/OSI网络协议模型 TCP/IP协…

应急响应靶场

靶场搭建 靶场环境搭建:首先确定目标靶机的IP地址: 端口探测:发现只开放了22号端口 尝试利用hydra进行爆破: 成功找到了密码。ssh远程登录之后,添加后门账号: msfvenom生成msf的木马: 利用python快速搭建h…

代码随想录 day 25 回溯

第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/vi…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12,开发者工具,网络 1、web基本概念 web服务器(web server):也称HTTP服务器(HTTP server)&am…

解决Windows密码丢失问题:详细指南

解决Windows密码丢失问题:详细指南 引言 最近因为某些工作缘故,接触到windows比较频繁,特此记录一下 当下,计算机安全是每个人都不能忽视的重要问题。然而,有时可能因为忘记密码而无法访问自己的Windows系统&#xf…

NAS、SAN 与 DAS 的比较与应用场景

文章目录 1. NAS(网络附加存储)定义特点实现成本:适用场景 2. SAN(存储区域网络)定义特点实现成本:适用场景 3. DAS(直接附加存储)定义特点实现成本:适用场景 区别总结结…

基于tkinter的学生信息管理系统之登录界面和主界面菜单设计

目录 一、tkinter的介绍 二、登陆界面的设计 1、登陆界面完整代码 2、部分代码讲解 3、登录的数据模型设计 4、效果展示 三、学生主界面菜单设计 1、学生主界面菜单设计完整代码 2、 部分代码讲解 3、效果展示 四、数据库的模型设计 欢迎大家进来学习和支持&#xff01…

文件操作相关的精讲

目录: 思维导图 一. 文件定义 二. 文件的打开和关闭 三. 文件的顺序读写操作 四. 文件的随机读写操作 五. 文本文件和二进制文件 六. 文件读取结束的判断 七.文件缓冲区 思维导图: 一. 文件定义 1.文件定义 C语言中,文件是指一组相…

Chapter 18 Python异常

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、什么是异常二、捕获异常三、异常的传递 前言 在Python中,异常是一种特定的对象,能够在程序运行过程中被抛出和处理。有效地管理异常不仅可以…

Spark+实例解读

第一部分 Spark入门 学习教程:Spark 教程 | Spark 教程 Spark 集成了许多大数据工具,例如 Spark 可以处理任何 Hadoop 数据源,也能在 Hadoop 集群上执行。大数据业内有个共识认为,Spark 只是Hadoop MapReduce 的扩展&#xff08…

精准客户从何而来?一招让你的客户源源不断!

你们是否还在为找不到精准客户而烦恼? 今天,我要分享一招非常实用的技巧,让你也能拥有源源不断的客源! 首先,我们需要深入了解自己的目标客户。他们是谁?他们的需求是什么?并利用大数据洞察客…

Cocos Creator文档学习记录

Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接:Hello World | Cocos Creator 百度百科:Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程,可多次的迭…

【前端 19】使用Vue-CLI脚手架构建Vue2项目

使用Vue CLI构建Vue 2项目 引言 Vue.js 是一个构建用户界面的渐进式JavaScript框架,以其轻量级和易用性受到前端开发者的广泛喜爱。Vue CLI(Vue Command Line Interface)是一个基于Vue.js进行快速开发的完整系统,提供了零配置的项…

Amazon Bedrock + Amazon DynamoDB 数据设计与建模

一、Amazon DynamoDB简介 在当今数字化转型的浪潮中,企业对数据处理能力的需求日益增长,为了应对大规模数据和高并发访问的挑战,选择一款合适的数据库解决方案变得尤为重要。 Amazon DynamoDB,作为亚马逊云科技提供的一种完全托…

【人工智能】Transformers之Pipeline(六):图像分类(image-classification)

目录 一、引言 二、图像分类(image-classification) 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#x…

文远知行IPO,L4的梦还是L2给的

文|刘俊宏 编|王一粟 随着萝卜快跑在武汉初步验证了Robotaxi商业闭环,L4自动驾驶的公司们终于迎来了“黎明的曙光”。 7月27日,文远知行向美国SEC(证券交易委员会)提交了招股书,以超越Moment…

Flask Bootstrap #2 - MVC架构

Reference https://medium.com/%E5%B7%A5%E7%A8%8B%E9%9A%A8%E5%AF%AB%E7%AD%86%E8%A8%98/%E4%BD%BF%E7%94%A8-python-flask-%E5%BB%BA%E7%AB%8B%E7%B6%B2%E7%AB%99-353e449a9bc8 1 MVC架构 在 Flask Boostrap #1 - 安装Flask 透过 app.route() 建立路由是 flask API 常见的…

实验2-4-1 求1到N的和*--sum记得累加啊!

//实验2-4-1 求1到N的和//计算序列 1 2 3 ... 的前N项之和。#include<stdio.h> #include<math.h> int main(){int N,sum0;scanf("%d",&N);for(int a1;a<N;a){ suma;//sum进行累加&#xff01;&#xff01;&#xff01;&#xff01;&#xff01…

VS2019编译和使用gtest测试(C++)

目录 一、首先下载gtest开源 二、使用gtest 一、首先下载gtest开源 https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下载下来解压到文件夹&#xff0c;再在文件夹里面新建一个build文件夹&#xff0c;如下&#xff1a; 再安装cmake&#xff0c;…

Cocos Creator2D游戏开发(6)-飞机大战(4)-敌机产生

敌机产生&玩家发射子弹 敌机产生: 创建一个空节点 创建一个敌机预制体 把敌机图片拖入预制体内 使用代码生成敌机 让敌机动起来 创建一个预制体enemy_prefab双击预制体enemy_prefab,然后拖入一个敌机图片,设置好方向和尺寸,一定要记得保存然后关闭(场景编辑器里面的保存)…