input子系统详解2——应用层代码实践

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、编程步骤总结

步骤1:确定设备文件名字

步骤2:使用标准接口打开与读取设备文件

步骤3:解析struct input_event

二、编程步骤分析

1、确定设备文件名

应用层操作驱动有2条路:/dev目录下的设备文件,/sys目录下的属性文件。input子系统用的是/dev目录下的设备文件,具体一般都是在 /dev/input/event* 。

我们可以用cat命令来确认某个设备文件名对应哪个具体设备。比如我们在开发板“ cat /dev/input/event* ”(这里的*用具体的数字填充进去),然后晃动鼠标或者在键盘上敲打字,如果有反应,就表示该设备文件对应着鼠标或者键盘。

这里实测得知键盘是event1,而鼠标是event3。

2、使用标准接口操作设备文件

即使用open、read/write函数操作设备文件。

3、解析input_event结构体变量

解析input_event结构体变量(即读取该结构体变量成员的信息),可得知输入事件信息。

事件类型定义在x210_kernel\include\linux\input.h文件中,内容如下:

/** Event types*/#define EV_SYN			0x00
#define EV_KEY			0x01
#define EV_REL			0x02
#define EV_ABS			0x03
#define EV_MSC			0x04
#define EV_SW			0x05
#define EV_LED			0x11
#define EV_SND			0x12
#define EV_REP			0x14
#define EV_FF			0x15
#define EV_PWR			0x16
#define EV_FF_STATUS		0x17
#define EV_MAX			0x1f
#define EV_CNT			(EV_MAX+1)

三、代码与测试

1、代码示例

(1)键盘事件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <string.h>#define DEVICE_KEY			"/dev/input/event1"
#define DEVICE_MOUSE		"/dev/input/event3"int main(void)
{int fd = -1, ret = -1;struct input_event ev;// 第1步:打开设备文件fd = open(DEVICE_KEY, O_RDONLY);if (fd < 0){perror("open");return -1;}while (1){// 第2步:读取一个event事件包memset(&ev, 0, sizeof(struct input_event));ret = read(fd, &ev, sizeof(struct input_event));if (ret != sizeof(struct input_event)){perror("read");close(fd);return -1;}// 第3步:解析event包,才知道发生了什么样的输入事件printf("%s.\n", (unsigned char *)&ev);	}// 第4步:关闭设备close(fd);return 0;
}

(2)鼠标事件:在上面代码中将设备文件换成鼠标对应的设备文件,第3步换成下面代码。

// 第3步:解析event包,才知道发生了什么样的输入事件printf("-------------------------\n");printf("type: %hd\n", ev.type);printf("code: %hd\n", ev.code);printf("value: %d\n", ev.value);printf("\n");

2、测试

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

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

相关文章

构造函数初始化器

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {class Program{static void Main(string[] args){cat c new cat("萌萌");//先执行cat(string s,int i)构造…

oracle中的视图详解

1.视图的概述 视图其实就是一条查询sql语句&#xff0c;用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用&#xff0c;因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表&#xff0c;所有对视图数据的修改最终都会被反映到视图的基…

input子系统详解3——input子系统框架核心层分析

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 一、前言 由input子系统简介可知&#xff0c;input子系统分为三层&#xff1a; 1、上层输入事件驱动层 涉及的文件有x210_kernel\drivers\input\evdev.c、mousedev.c 和 joydev.c文件&#xff0c;分别对应…

java servlet 部署到tomcat_如何把spring boot项目部署到tomcat容器中

把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 war二、移除嵌入式tomcat插件在pom.xml里找到spring-boot-starter-web依赖节点&#xff0c;在其中添加如下代码&#xff0c;org.springframework.bootspring-boot-starter-weborg.sp…

Gitlab Merge Request Builder Plugin 配置小记

2019独角兽企业重金招聘Python工程师标准>>> 以前在给一些开源项目贡献代码的时候&#xff0c;在github上一提交pull request或者提交的分支代码更新了的时候&#xff0c;jenkins就会自动把代码进行merge并且运行单元测试&#xff0c;当时看了心里就2个字&#xff1…

IOS:屏幕旋转与Transform

IOS&#xff1a;屏幕旋转与Transform iTouch&#xff0c;iPhone&#xff0c;iPad设置都是支持旋转的&#xff0c;如果我们的程序能够根据不同的方向做出不同的布局&#xff0c;体验会更好。 如何设置程序支持旋转呢&#xff0c;通常我们会在程序的info.plist中进行设置Supporte…

input子系统详解4——输入事件驱动层源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由input子系统简介可知&#xff0c;input子系统分为三层&#xff1a; ​ 1、上层输入事件驱动层 涉及的文件有x210_kernel\drivers\input\evdev.c、mousedev.c 和 joydev.c文件&#xff0…

前端翻译:Activating Browser Modes with Doctype

一、前言                         原本备份&#xff1a; http://www.cnblogs.com/fsjohnhuang/p/3830623.html 由于本人英语能力有限&#xff0c;译本内容难免有误&#xff0c;望各位指正&#xff01; 本译文不含附录部分&#xff0c;请知悉。 二、译…

java公钥加密私钥解密过程_GPG加密解密过程

GPG加密解密过程一、Linux系统下1.安装yum安装[rootPOC-ORACLE ~]# yum install gnupg下载安装包安装https://www.gnupg.org/download/index.en.html查看gpg帮助[rootPOC-ORACLE ~]# gpg --helpgpg (GnuPG) 2.0.14libgcrypt 1.4.5Copyright (C) 2009 Free Software Foundation,…

魔兽世界客户端数据研究(三)

终于决定&#xff0c;还是通过wow model viewer起手&#xff0c;研究一下WOW的数据类型&#xff0c;从另一个角度&#xff0c;体验一把这个唯一让我充过值的游戏。 这将是一系列随笔&#xff0c;即在读代码的时候&#xff0c;顺便记录&#xff0c;以理清思路和加深映象。 其中…

input子系统详解5——参考驱动模板编写按键驱动

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、input类设备驱动的开发 &#xff08;1&#xff09;输入事件驱动层和框架核心层不需要动&#xff0c;只需要编写具体硬件驱动层代码。 &#xff08;2&#xff09;具体硬件驱动层的编程接口与调用…

java很多魔法数判断_可别在代码中写那么多魔法值了,脑壳疼!

1. 前言重构老代码中遇到了不少类似下面这种写法&#xff1a;public void attend(String value) {if ("0".equals(value)) {//todo} else if ("1".equals(value)) {//todo} else {//todo}}脑壳疼&#xff01;从 Java 语法上无懈可击&#xff0c;但是从业务…

十分钟让你明白Objective-C的语法(和Java、C++的对比)

2019独角兽企业重金招聘Python工程师标准>>> 很多想开发iOS&#xff0c;或者正在开发iOS的程序员以前都做过Java或者C&#xff0c;当第一次看到Objective-C的代码时都会头疼&#xff0c;Objective-C的代码在语法上和Java, C有着很大的区别&#xff0c;有的同学会感觉…

稀疏多项式的运算

问题描述&#xff1a; 已知稀疏多项式Pn(X)c1x^e1c2x^e2....cmx^em,其中nem>em-1>....>e1>0; ci!0,m>1.试采用存储量同多项式项数m成正比的顺序存储结构&#xff0c;编写求Pn(x0)的算法&#xff08;x0为给定值&#xff09;&#xff0c;并分析你的算法的时间复杂…

I2C子系统详解1——I2C总线设备的驱动框架

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 I2C总线驱动框架详解 linux内核I2C子系统详解 一、I2C总线的物理特征 这部分内容的简介可见博客&#xff1a;SPI、I2C、UART&#xff08;即串口&#xff09;三种串行总线详解。 &#x…

sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64

我对这个问题有类似的问题&#xff1a;我正在运行一个使用sqlite的脚本,虽然我能够通过命令行成功运行sqlite3,但是当我尝试运行脚本时,我总是遇到这个错误&#xff1a;SEVERE: [sqlite] sqliteQueue[master.catalog]: error running job queuecom.almworks.sqlite4java.sqlite…

神经网络编程入门

本文主要内容包括&#xff1a; (1) 介绍神经网络基本原理&#xff0c; (2) AForge.NET实现前向神经网络的方法&#xff0c; (3) Matlab实现前向神经网络的方法 。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。Iris数据集可以在http://en.wikipedia.or…

I2C子系统详解2——I2C核心层源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、前言 由I2C总线设备的驱动框架可知&#xff0c;I2C总线设备驱动框架涉及的文件如下&#xff1a; &#xff08;1&#xff09;I2C设备驱动层相关的文件 x210开发板的电容触摸屏gslX680采用I2C接口…

软考复习之路—组成原理

计算机系统的基础知识应该是作为一个编程人员必备的一门课程&#xff0c;仅仅有了解了计算机的组成&#xff0c;程序在计算 机中的存储状态&#xff0c;运算等基本内容&#xff0c;我们才干继续对计算机有更深层次的认识&#xff0c;更easy学习与上手。比方说要 想学习操作系统…

python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解

一、内存管理机制1.由c开发出来的cpython2.include / objests3.需要下载python源码包4.Pyobject&#xff1a;floatPyVarObject&#xff1a;5.在python中所有东西创建对象的时候&#xff0c;内部都会存储一个数据// 维护双向链表struct _object *_ob_next;struct _object *_ob_p…