RK3568平台(input篇)输入设备应用编程

news2024/11/24 19:40:13

一.输入设备介绍

输入设备其实就是能够产生输入事件的设备就称为输入设备,常见的输入设备包括鼠标、键盘、触摸屏、按钮等等,它们都能够产生输入事件,产生输入数据给计算机系统。
对于输入设备的应用编程其主要是获取输入设备上报的数据、输入设备当前状态等,譬如获取触摸屏当前触摸点的X、Y 轴位置信息以及触摸屏当前处于按下还是松开状态。

input 子系统:

输入设备种类非常多,每种设备上报的数据类型又不一样,那么Linux 系统如何管理呢?Linux 系统为了统一管理这些输入设备,实现了一套能够兼容所有输入设备的框架,那么这个框架就是input 子系统。驱动开发人员基于input 子系统开发输入设备的驱动程序,input 子系统可以屏蔽硬件的差异,向应用层提供一套统一的接口。
基于input 子系统注册成功的输入设备,都会在/dev/input 目录下生成对应的设备节点(设备文件),设备节点名称通常为eventX(X 表示一个数字编号0、1、2、3 等),譬如/dev/input/event0、/dev/input/event1、
/dev/input/event2 等,通过读取这些设备节点可以获取输入设备上报的数据。

二.应用读取数据

如果我们要读取触摸屏的数据,假设触摸屏设备对应的设备节点为/dev/input/event0,那么数据读取流程如下:
①、应用程序打开/dev/input/event0 设备文件;
②、应用程序发起读操作(譬如调用read),如果没有数据可读则会进入休眠(阻塞I/O 情况下);
③、当有数据可读时,应用程序会被唤醒,读操作获取到数据返回;
④、应用程序对读取到的数据进行解析。
当无数据可读时,程序会进入休眠状态(也就是阻塞),譬如应用程序读触摸屏数据,如果当前并没有去触碰触摸屏,自然是无数据可读;当我们用手指触摸触摸屏或者在屏上滑动时,此时就会产生触摸数据、应用程序就有数据可读了,应用程序会被唤醒,成功读取到数据。那么对于其它输入设备亦是如此,无数据可读时应用程序会进入休眠状态(阻塞式I/O 方式下),当有数据可读时才会被唤醒。

在②中,通过 read 函数进行读取输入设备数据的读取,每一次 read 操作获取的都是 一个 struct input_event 结构体类型数据,struct input_event 是 Linux 内核中用于描述输入事 件的结构体类型。它定义在 头文件中,用于在内核和用户空间之间传递输入 事件的信息。

结构体 struct input_event 定义如下:

struct input_event {
struct timeval time;
__u16 type;// 类型
__u16 code;// 具体事件
__s32 value;// 对应的取值
};

type:type 用于描述发生了哪一种类型的事件(对事件的分类),Linux 系统所支持的输 入事件类型如下所示:

#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)

以上这些宏定义同样在头文件中,所以在应用程序中需要包含该头文件;一 种输入设备 通常可以产生多种不同类型的事件,譬如点击鼠标按键(左键、右键,或鼠标上 的其它按键)时会上报按键类事件,移动鼠标时则会上报相对位移类事件。

 code:code 表示该类事件中的哪一个具体事件,以上列举的每一种事件类型中都包含了 一系列具体事件,譬如一个键盘上通常有很多按键,而 code 变量则告知应用程序是哪一个按 键发生了输入事件。每一种事件类型都包含多种不同的事件,以按键类事件为例,对应的具体 事件如下所示:

#define KEY_RESERVED 0
#define KEY_ESC 1//ESC 键
#define KEY_1 2//数字 1 键
#define KEY_2 3//数字 2 键
#define KEY_3 4//数字 3 键
#define KEY_4 5//数字 4 键
#define KEY_5 6//数字 5 键
#define KEY_6 7//数字 6 键
#define KEY_7 8//数字 7 键
#define KEY_8 9//数字 8 键
#define KEY_9 10 //数字 9 键
#define KEY_0 11 //数字 0 键
#define KEY_MINUS 12 //减号键
#define KEY_EQUAL 13 //加号键
#define KEY_BACKSPACE 14 //回退键

对于其他输入事件的 code 值,可以查看 input-event-codes.h 头文件(该头文件被 所包含)。

value:内核每次上报事件都会向应用层发送一个数据 value,对 value 值的解释随着 code 的变化而变化。譬如对于按键事件来说,如果 value 等于 1,则表示按键按下;value 等于 0 表示按键松开,如果 value 等于 2 则表示按键长按。而在绝对位移事件中(type=3),如果 code=0(触摸点 X 坐标 ABS_X),那么 value 值就等于触摸点的 X 轴坐标值;如果 code=1 (触摸点 Y 坐标 ABS_Y),此时 value 值便等于触摸点的 Y 轴坐标值。

按键应用编程:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <linux/input.h>

int main(int argc, char *argv[]) 
{
    int fd, ret;
    struct input_event in_ev = {0}; //初始化 input_event 结构体

    fd = open(argv[1], O_RDONLY); //打开输入设备文件
    if (fd < 0) 
	{ //文件打开失败
        printf("文件打开失败\n");
        return -1;
    }

    while (1) 
	{
        ret = read(fd, &in_ev, sizeof(struct input_event)); //读取数据
        if (ret < 0) 
		{ //读取失败
            printf("读取数据失败\n");
        }

        // 打印读取到的事件信息
        printf("type:%d code:%d value:%d\n", in_ev.type, in_ev.code, in_ev.value);

        if (EV_KEY == in_ev.type) 
		{ //检测到按键事件
            switch (in_ev.value) 
			{
                case 0: //松开按键
                    printf("code<%d>: 松开", in_ev.code);
                    break;
                case 1: //按下按键
                    printf("code<%d>: 按下", in_ev.code);
                    break;
                case 2: //长按按键
                    printf("code<%d>: 长按", in_ev.code);
                    break;
            }

            // 根据按键码打印按键功能
            switch (in_ev.code) 
			{
                case KEY_MENU:
                    printf(": HOME键\n");
                    break;
				case KEY_BACK:
                    printf(": BACK键\n");
                    break;
                case KEY_VOLUMEUP:
                    printf(": 音量增加键\n");
                    break;
                case KEY_VOLUMEDOWN:
                    printf(": 音量减小键\n");
                    break;
                // 其他按键码对应的功能在这里添加
                default:
                    printf(": 未知键\n");
                    break;
            }
        }
    }

    close(fd); //关闭输入设备文件
    return 0;
}

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

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

相关文章

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公…

SAP实施方法论的变化

SAP 的实施方法论 ASAP&#xff0c;在SAP进入 S/4 HANA时&#xff0c;不知不觉改了意思。 原来叫Accelerate SAP&#xff0c;现在叫Activate SAP &#xff0c;毕竟存量SAP太多&#xff0c;大部分用户并非象十多年前一样新实施SAP&#xff0c;而是在老的Sap R/3 &#xff0c;MyS…

简单的基于小波变换的图像压缩(Python)

2023 沃尔夫数学奖得主&#xff0c;给了杜克大学的Ingrid Daubechies&#xff08;多贝西&#xff09;教授 以色列沃尔夫基金会理事会成员 Michael Lin 教授在周二宣布: “Ingrid Daubechies is awarded the Wolf Prize for her work in the creation and development of wavel…

QT 5.14.2 应用程序打包

我们可以直接通过开发工具预览我们的程序。但是当要把开发好的程序给别人使用的时候&#xff0c;我们就需要把程序打包成可执行的exe&#xff0c;然后把这个exe文件和其他相关的文件一起发给别人&#xff0c;这样别人就可以使用了。 一、生成可独立运行的exe (一)、编译程序的…

01 基础入门 编写你的第一个 Go 语言程序

从这节课开始&#xff0c;我会带你走进 Go 语言的世界。我会用通俗易懂的语言&#xff0c;介绍 Go 语言的各个知识点&#xff0c;让你可以从零开始逐步学习&#xff0c;再深入它的世界。不管你以前是否接触过 Go 语言&#xff0c;都可以从这个专栏中受益。 现在&#xff0c;让…

TVBOX 最新版下载+视频源教程

下载链接 wx 搜索 Geek 前端 发送电视资源进行获取 操作教程

【论文复现|智能算法改进】基于多策略融合灰狼算法的移动机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.改进点 混沌反向学习策略 融合Logistic混沌映射和Tent混沌映射生成Logistic-Tent复合混沌映射: Z i 1 { ( r Z i ( 1 − Z i ) ( 4 −…

程序员的核心职业素养:专业、沟通与持续学习

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…

报错 Cannot read properties of undefined(reading‘addEventListener‘)如何解决

我在制作项目中遇到了一个问题&#xff0c;给大家分享一下&#xff0c;如下图&#xff1a; 问题&#xff1a;这是我给一个input输入框绑定的监听事件出现的报错 翻译&#xff1a;无法读取未定义的属性(读取 addEventListener ) 错误原因&#xff1a;js中操作的dom元素的函数方…

几个小创新模型,KAN组合网络(LSTM、GRU、Transformer)时间序列预测,python预测全家桶...

截止到本期&#xff0c;一共发了8篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.终于来了&#xff01;python机器学习预测全家桶 2.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&a…

GStreamer 源码编译,在 Clion 下搭建调试环境

前言 最近在学习 GStreamer&#xff0c;官方提供了一些教程&#xff0c;本人希望能够断点调试&#xff0c;以便学习代码逻辑。本文记录如何在 Clion 搭建 GStreamer 源码编译、调试环境 步骤 下载源码 git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.gitCl…

Android中的Audio系统框架分析(一)

概述 Audio系统是Android 平台重要的组成部分&#xff0c;我们将从以下几个方面来讲解&#xff1a; 一Audio基础知识讲解 二、Android系统中Audio框架 Audio基础知识讲解 我们大家知道声音是由物体振动产生的声波。是通过介质&#xff08;空气或固体、液体&#xff09;传播并…

【JKI SMO】框架讲解(一)

JKI State Machine是一款易于使用且功能强大的状态机模板&#xff0c;可以作为界面或者仪器工作流程的基础框架&#xff0c;但是他不能处理复杂系统的多任务并发机制&#xff0c;因为他是只能处理单个进程。 随之&#xff0c;JKI推出了基于面向对象封装的SMO框架&#xff0c;是…

hugo 博客写作流程 (二)

写作工具 推荐两款软件,本人都使用过: typora和obsidian typora: https://github.com/woniu336/typora-007 新建文章 在博客目录找到shell/quickstart.sh双击打开即可 发布到Github 前提: 魔法上网在Github新建一个仓库 找到shell/quickstart.sh双击打开,选择7.SSH 管理…

Linux系统安装Ruby语言

Ruby是一种面向对象的脚本语言&#xff0c;由日本的计算机科学家松本行弘设计并开发&#xff0c;Ruby的设计哲学强调程序员的幸福感&#xff0c;致力于简化编程的复杂性&#xff0c;并提供一种既强大又易于使用的工具。其语法简洁优雅&#xff0c;易于阅读和书写&#xff0c;使…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月16日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年6月16日 星期日 农历五月十一 1、 国家网信办&#xff1a;将涉网络暴力违法情形记入用户信用记录。 2、 卫健委&#xff1a;超三成3岁以下婴幼儿家庭有入托需求&#xff0c;托育服务关注度持续上升。 3、 大陆对台134项关…

单片机与DHT11温湿度检测设计

本次设计是采用STC89C54单片机加上低成本的温湿度模块DHT11构成的温湿度检测系统。设计主要由硬件与软件两部分设计构成。硬件方面包括单片机STC89C54、温湿度模块DHT11、显示模块LCD1602、电池电源、I2C存储器以及控制按键等5个部分。此系统完全基于单片机最小系统并进行一定的…

英伟达与斯坦福携手,打造未来全息XR眼镜:头带时代的终结

在XR(扩展现实)技术的演进过程中,一个显著的挑战在于如何平衡设备的便携性与视觉体验。传统的XR设备由于需要厚重的头带固定光学器件和显示器,不仅增加了体积,还为用户带来了社交上的不便。然而,随着英伟达与斯坦福大学戈登韦茨斯坦教授领导的研究团队的合作,这一难题似…

极致深耕,打造核心竞争壁垒——探寻蓝思科技穿越周期的密码

作者 | 曾响铃 文 | 响铃说 一家企业&#xff0c;如何才能在时代变幻的风云中不计较一时得失&#xff0c;长期稳健发展&#xff0c;穿越周期&#xff1f;本期主题就来探寻一家在湖南的国际化企业的发展密码。 穿越周期的企业&#xff0c;都在坚持一个驱动发展的“原点” 细…

【新课程】PICO VR 交互开发指南

从PICO开始&#xff0c;迈向XR跨平台开发 Unity XR Interaction Toolkit &#xff08;简称XRI&#xff09;是一套跨平台的 XR 交互开发工具包&#xff0c;随着版本的更新与完善&#xff0c;逐渐获得了开发者的青睐。各 XR 平台逐步推荐开发者采用 XRI 作为首选的交互开发工具为…