RK3568驱动指南|第十三篇 输入子系统第(137章 初识input子系统)

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十三篇 输入子系统_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第十三篇 输入子系统

第137章 初识input子系统

137.1什么是输入子系统?

在Linux中,input子系统是专门为处理输入类设备而设计的一个子系统或框架。它提供了一套通用的接口和机制,用于驱动开发人员编写和管理输入设备的驱动程序。输入设备包括键盘、鼠标、触摸屏、游戏手柄等,具体示意图如下所示:

使用input子系统的主要目的是规范和简化输入设备驱动的开发过程,以提高驱动的通用性和兼容性。它通过将输入设备的共同功能和处理逻辑提取出来,编写成通用的代码,将差异化的代码留给具体的设备驱动开发人员,这种分工合作的方式使得驱动开发人员可以更专注地处理设备特定的细节,从而大大降低工程师的开发难度。

在不使用输入子系统的情况下,可能会使用不同的代码来表示相同的动作。例如,一个同学可能使用数字1来表示按键按下,数字0来表示按键松开;而另一个同学可能使用数字2来表示按键按下,数字3来表示按键松开。这样的情况下,应用程序很难适配所有不同的驱动程序,从而导致程序的兼容性和移植性较差。

而在使用输入子系统后就可以解决这个问题。例如,当不同厂家的键盘连接到计算机上时,它们的驱动程序都是按照输入子系统框架来编写的。这意味着所有厂家的驱动程序都使用相同的代码规范来表示按键动作,例如使用1表示按下,使用0表示松开。这样一来,无论是哪个厂家的键盘,都可以在任意计算机上正常使用。

使用输入子系统的另一个好处是驱动开发人员不需要自己实现文件操作集函数。输入子系统已经提供了一套标准的接口和函数,开发人员只需要按照这些接口进行开发,而无需关心底层的文件操作细节。这样可以大大降低开发的难度和复杂度。

综上使用input子系统的作用如下所示:

(1)兼容性: 输入子系统提供了一个统一的框架和接口,使得不同厂家的输入设备都可以按照相同的规范进行驱动开发。无论是键盘、鼠标还是其他输入设备,只要符合输入子系统定义的接口和事件格式,都可以在Linux系统中正常工作。这样一来,工程师不需要针对每个厂家的设备编写和维护不同的驱动代码,大大提高了设备的兼容性。

(2)统一的驱动编程方式: 输入子系统定义了一套通用的驱动编程方式,工程师只需要按照输入子系统的规范进行开发即可。输入设备的驱动模块需要实现相应的接口函数,如初始化函数、事件处理函数等。这些接口函数的实现方式是相同的,不论是键盘驱动还是鼠标驱动,都可以按照统一的方式进行开发。这样一来,工程师可以更加专注于设备特定的细节,而无需关心通用的驱动框架,简化了开发过程。

(3)统一的应用操作接口: 输入子系统通过提供一组统一的应用操作接口,如/dev/input/eventX,使得应用程序可以方便地与输入设备进行交互。应用程序可以通过读取这些设备节点,获取输入事件的信息,并进行相应的处理。无论是哪种类型的输入设备,应用程序都可以使用相同的方式进行访问和操作。这样一来,应用程序的开发人员不需要关心底层输入设备的细节,可以更加专注于应用程序的逻辑开发。

137.2 如何确定输入设备和节点的关系

在输入子系统中,输入设备与设备节点之间有一定的对应关系。以下是判断设备节点与输入设备的方法:

1.设备名: 输入子系统的设备节点可以分为通用设备名和专用设备名。专用设备名通常可以从设备名中直接识别出设备类型,例如"keyboard"(键盘)或"mouse"(鼠标)。而通用设备名则不能直接确定设备类型。如下图所示,event0-event4属于通用设备名,而mouse0和mouse2属于专用设备名。

2.试探性方法: 可以使用"cat"命令打开设备节点文件,然后对物理设备进行操作,观察终端是否有输出。例如,对于键盘设备,你可以运行"cat /dev/input/eventX",其中"/dev/input/eventX"是设备节点的路径,然后按下键盘按键,观察终端是否输出相应的字符。通过这种试探性的方法,你可以判断设备节点与具体设备之间的对应关系。例如使用以下命令来测试鼠标,如下所示:

sudo cat /dev/input/mouse0

 

注:鼠标节点也可能是mouse1或者mouse2。

3.查看输入设备信息:可以使用以下命令查看"/proc/bus/input/devices"文件:

cat /proc/bus/input/devices

部分打印截图如下所示:

该文件记录了当前系统的所有输入设备的信息在该文件中,你可以找到与设备节点相关的信息,例如设备名称、供应商ID、产品ID等。通过对比设备节点的路径和设备信息中的对应字段,你可以确定设备节点与特定输入设备之间的关系,例如可以通过上述打印信息查看到,键盘对应的设备节点为/dev/input/event1,如下图所示:

其他相关内容的解释如下所示:

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41: 这一行显示了设备的总线类型、供应商ID、产品ID和固件版本。在这个例子中,该设备的总线类型为0011,供应商ID为0001,产品ID为0001,固件版本为ab41。

N: Name="AT Translated Set 2 keyboard": 这一行显示了设备的名称。在这个例子中,该设备的名称为"AT Translated Set 2 keyboard"。

P: Phys=isa0060/serio0/input0: 这一行显示了设备的物理位置。在这个例子中,该设备的物理位置是isa0060/serio0/input0。

S: Sysfs=/devices/platform/i8042/serio0/input/input1: 这一行显示了设备在sysfs文件系统中的路径。在这个例子中,该设备的路径是/devices/platform/i8042/serio0/input/input1。

U: Uniq=: 这一行显示了设备的唯一标识符。在这个例子中,唯一标识符为空。

H: Handlers=sysrq kbd event1 leds: 这一行显示了设备的处理程序。它指示了处理设备输入事件的程序或模块。在这个例子中,设备有sysrq、kbd、event1和leds这些处理程序,其中event1就表示设备节点为/dev/input/event1。

B: PROP=0: 这一行显示了设备的属性。在这个例子中,设备的属性值为0。

B: EV=120013: 这一行显示了设备支持的事件类型。在这个例子中,设备支持EV_SYN、EV_KEY、EV_MSC和EV_LED这些事件类型。

B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe: 这一行显示了设备支持的按键。每个按键对应一个位,1表示按键被按下,0表示按键未被按下。该行显示了按键的状态,以16进制表示。

B: MSC=10: 这一行显示了设备支持的杂项事件。在这个例子中,设备支持MSC_SCAN事件。

B: LED=7: 这一行显示了设备支持的LED灯。在这个例子中,设备支持3个LED灯,使用一个7位的二进制数表示灯的状态。

上面讲解的cat命令是一种试探性的方法,除此之外还可以使用hexdump命令对输出信息进行二进制内容查看,它可以将二进制文件以十六进制和ASCII码的形式进行显示。它的基本语法为:

hexdump [选项] [文件]...

下面是一些常用的选项:

-C: 以规范的格式输出十六进制和ASCII码。它会按照十六进制的形式显示文件的内容,并在每行的右侧显示相应的ASCII码。这种格式可以很方便地查看二进制文件的内容。

-b: 以单字节八进制的形式显示文件内容。每个字节的值将以八进制数字的形式显示。

-c: 以单字节字符的形式显示文件内容。每个字节将以字符的形式显示,非可打印字符将显示为"."。

-d: 以双字节十进制的形式显示文件内容。每个字节对应的十进制值将以十进制数字的形式显示。

-o: 以双字节八进制的形式显示文件内容。每个字节的值将以八进制数字的形式显示。

-x: 以双字节十六进制的形式显示文件内容。每个字节的值将以十六进制数字的形式显示。

-s offset: 从指定的偏移量开始输出文件内容。可以使用十进制或十六进制表示偏移量。

然后使用以下命令对键盘的输出信息进行二进制内容查看,如下图所示:

sudo hexdump /dev/input/event1

137.3.确定开发板输出设备节点

在上个小节基于虚拟机ubuntu来学习了如何确定输入设备和节点的关系,本小节将使用RK3568开发板进行实践,开发板上的的输入设备如下所示:

总共有4个输入设备,分别是触摸屏、红外接收器、adc按键以及耳机接口,然后启动开发板,进入系统之后如下图所示: 

首先通过以下命令查看总共有多少个输入设备,如下图所示:

ls /dev/input/

可以看到总共有event0-event4 五个通用设备名,上面我们总共找出来了4个输入设备,那这里为什么会有五个节点呢,所以我们就需要使用下面的命令查看详细的输入设备信息了,如下图所示:

 cat /proc/bus/input/devices

 从上到下依次是红外接收器、电源power按键、触摸屏、adc按键和耳机,为了更简单的进行演示,这里选取触摸屏和adc按键来进行测试,从上面的信息可以得到触摸屏和adc按键分别对应event2和event3,所以可以使用以下命令对两个输入设备的输出信息进行二进制内容查看,如下图所示:

hexdump /dev/input/event2

hexdump /dev/input/event3

至此,开发板输出设备节点的测试就完成了。 

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

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

相关文章

【MQ】消息队列概述

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 定义 消息队列:一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件,很多初学者认为,MQ通过消息的发送…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类: 单钥加密(private key cryptography):加密和解密过程都用同一套密码双钥加密(public key cryptography):加密和解密过程用的是两套密码 历史上&#xff0c…

马斯克回应OpenAI:Change your name

最近,整个AI圈都在关注OpenaAI和SpaceX首席执行官埃隆马斯克的官司。继OpenAI驳回“埃隆的所有主张”(dismiss "all of Elons claims")之后,今日马斯克在OpenaAI的X推文下锐评“请更换你的名字”("Chan…

position定位学习

加了绝对定位的盒子不能通过margin:0 auto水平居中 脱标元素不会产生外边距合并问题

重读 Java 设计模式: 探索经典之道与 Spring 框架的设计

写在开头 记得大学刚毕业那会儿,想学点东西,于是拿出了《Head First 设计模式》这本书,就开始了阅读,我曾对这些模式感到晦涩难懂。然而,随着工作岁月的增长,我逐渐领悟到设计模式的价值,尤其是…

使用 Docker 部署 File Browser 文件管理系统

1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目:File Browser,简单实用、轻量级、跨平台,安装部署简单快…

Mysql按照月份分组统计数据,当月无数据则填充0

目录 起因实现结论 起因 最近有个需求需要在sql中实现获取近半年的统计数据,本来以为挺简单的,不过这个项目数据基本没有,在此情况下还要实现获取近半年的数据就没办法简单group by了 实现 #如果每个月都有数据的话是比较简单的 SELECT DA…

Request和Response对象

Request和Response都是Servlet的service方法的参数,Request负责获取请求数据,而Response负责设置相应数据~ 一.Request 1.继承体系 Tomcat负责解析数据,因此由Tomcat来提供实现类~ 2.获取请求数据 请求行 请求头 请求体 需要注意的是只有…

【方法】如何打开7Z分卷压缩文件?

什么是7Z分卷压缩文件?就是在压缩文件时,将文件压缩成若干个大小一样、以“文件名.7z.序号”格式命名的7Z压缩包,可以方便存储和传输,如下图所示。 一、7Z分卷压缩文件如何打开? 我们只需要按照普通压缩包的打开方式&…

C语言分析基础排序算法——插入排序

目录 插入排序 直接插入排序 希尔排序 希尔排序基本思路解析 希尔排序优化思路解析 完整希尔排序文件 插入排序 直接插入排序 所谓直接插入排序,即每插入一个数据和之前的数据进行大小比较,如果较大放置在后面,较小放置在前面&#x…

带胶囊按钮的标题是如何实现的

使用uni-app开发小程序经常会遇到胶囊按钮和标题之间融合的问题,因为这样可以大大提高页面的美观和整体性,那么接下来简单拆分步骤看下是如何实现的吧 😁 可以看到我们设置的标题是在默认标题栏之下的(这不是我们想要的效果 &…

Python学习笔记-Flask实现简单的抽奖程序

1.导入flask包和randint包 from flask import Flask,render_template from random import randint 2.初始化 Flask 应用: app Flask(__name__) 3. 定义英雄列表 hero [黑暗之女,狂战士,正义巨像,卡牌大师,德邦总管,无畏战车,诡术妖姬,猩红收割者,远古恐惧,正义天使,无极剑…

【广度优先搜索】【图论】【并集查找】2493. 将节点分成尽可能多的组

作者推荐 视频算法专题 本文涉及知识点 广度优先搜索 图论 并集查找 LeetCod2493. 将节点分成尽可能多的组 给你一个正整数 n ,表示一个 无向 图中的节点数目,节点编号从 1 到 n 。 同时给你一个二维整数数组 edges ,其中 edges[i] [ai…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台,FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片,另外板上带有一个SODIM…

考虑到通信链路中断的(Delay Tolerant Network, DTN)

文章目录 A Study of DTN for Reliable Data Delivery from Space Station to Ground Stationabstractintroduction An Analytical Framework for Disruption of Licklider Transmission Protocol in Mars Communicationsabstract本文贡献 OVERVIEW OF RELIABLE DATA TRANSMISS…

资源池化单集群安装经验总结

登录linux环境通过跳板机用ssh命令连接分配的ip,将准备好的openGauss安装包以及xml文件上传到跳板机用scp命令传到自己的节点。 问题1:预安装包版本问题 解决方法:查看自己机器的系统,至openGauss官网下载正确版本的安装包 open…

Java使用spire.doc操作word文档(合并、插入文字图片和表格、替换书签)

一、引入依赖 <dependency><groupId>e-iceblue</groupId><artifactId>spire.office</artifactId><version>7.5.4</version> </dependency> 二、word操作 1、合并word文档 import com.spire.doc.Document; import com.spir…

目标检测——摩托车头盔检测数据集

一、简介 首先&#xff0c;摩托车作为一种交通工具&#xff0c;具有高速、开放和稳定性差的特点&#xff0c;其事故发生率高&#xff0c;伤亡率排在机动车辆损伤的首位。因此&#xff0c;摩托车乘员头盔对于保护驾乘人员头部安全至关重要。在驾乘突发状况、人体受冲击时&#…

#14vue3生成表单并跳转到外部地址的方式

1、背景 后端返回的json数据中包含一个json数组&#xff0c;此数组中是目标跳转地址所需要的form表单的数据。 2、跳转前的页面 const goto () > {finish.value true;request.post(/xxx/yyy,{zzz: zzz.value}).then(res > {const url res.data.submitUrlconst params…

在线安装MySQL5.7

在线安装MySQL 安装MySQL5.7 yum -y install mysql57-community-release-el7-10.noarch.rpm 若无可用安装包&#xff0c;执行下面这句 wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm 本地安装 yum localinstall -y mysql57-community-releas…