【Linux】驱动程序同步和异步通知方式

一、应用程序APP,访问驱动程序/dev/input/enent1流程:

在这里插入图片描述

假设用户程序直接访问 /dev/input/event0 设备节点,或者使用 tslib 访问设备节点,数据的流程如下:

  1. APP 发起读操作,若无数据则休眠;
  2. 用户操作设备,硬件上产生中断。如用户点击触摸屏,产生SIGIO信号;
  3. 输入系统驱动层对应的驱动程序处理中断: 读取到数据,转换为标准的输入事件,向核心层汇报。 所谓输入事件就是一个“struct input_event”结构体
  4. 核心层可以决定把输入事件转发给上面哪个 handler 来处理。最常用的是 evdev_handler:它只是把 input_event 结构体保存在内核 buffer 等。
  5. 当 APP正在等待数据时,evdev_handler 会把它唤醒,这样 APP 就可以读取数据。 APP 对输入事件的处理: APP 获 得 数据 的 方 法 有 2 种 : 直 接 访 问 设 备 节 点 ( 比 如 /dev/input/event0,1,2,…),或者通过 tslib、libinput 这类库来间接访问设备节点。这些库简化了对数据的处理。



二、标准输入事件–struct input_event

/* The event structure itself */
struct input_event {
	struct timeval time;
	__u16 type;
	__u16 code;
	__s32 value;
};

在这里插入图片描述



三、驱动程序同步通知方式

所谓同步,就是“你慢我等你”。

fd = open("/dev/input/event1", O_RDWR | O_NONBLOCK);

设置驱动程序为“O_NONBLOCK”表示“非阻塞”。APP 调用 read 函数读取数据时,如果驱动程序中有数据,那么 APP 的 read函数会返回数据。如果驱动程序中没有数据,APP会阻塞。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
 
int main()
{
    const char *inputDevicePath = "/dev/input/event0";
 
    int inputDeviceFd = open(inputDevicePath, O_RDONLY);
 
    if (inputDeviceFd == -1)
    {
        perror("Failed to open input device");
        return 1;
    }
 
    struct input_event event;
 
    while (1)
    {
        ssize_t bytesRead = read(inputDeviceFd, &event, sizeof(event));
 
        if (bytesRead == -1)
        {
            perror("Failed to read input event");
            break;
        }
 
        if (bytesRead == sizeof(event))
        {
            // 处理输入设备事件
            printf("Event type: %d, code: %d, value: %d\n", event.type, event.code, event.value);
        }
    }
 
    close(inputDeviceFd);
 
    return 0;
}



四、驱动程序异步通知方式

所谓异步通知,就是 APP 可以忙自己的事,当驱动程序用数据时它会主动给APP 发信号,这会导致 APP 执行信号处理函数。

驱动程序发信号流程:

  1. 用户点击触摸屏,触摸屏上的驱动从硬件上获得数据,转化为标准输入事件–struct input_event event;
  2. 驱动程序发信号(SIGIO,驱动程序常用信号,表示有IO事件)给应用程序(APP)。怎么发?内核里提供有函数,内核自动处理。

应用程序要做的事情有这几件:

  1. 编写信号处理函数:
void my_sig_handler(int sig)
{
	struct input_event event;
	while (read(fd, &event, sizeof(event)) == sizeof(event))
	{
		printf("get event: type = 0x%x, code = 0x%x, value = 0x%x\n", event.type, event.code, event.value);		
	}
}
  1. 注册信号处理函数:
signal(SIGIO, my_sig_handler);
  1. 打开驱动程序:
fd = open("/dev/input/event0", O_RDWR);
  1. 把APP的进程 ID 告诉驱动,getpid()可以获得应用程序的进程id。这一步是核心,告诉驱动程序应该把信号发给哪个APP
fcntl(fd, F_SETOWN, getpid());
  1. 使能驱动的 FASYNC 功能:
flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | FASYNC);

驱动程序的信号发给APP的关键是:APP 要把自己的pid告诉驱动。 APP 收到后,执行信号处理函数。




参考链接:
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【10】Python函数专题(上)

目录 1.什么是函数2.函数的参数2.1形参 和 实参2.2函数的传递方式2.3 不定长参数2.3.1 可变位置参数`*args`2.3.2可变关键字参数`**kwargs`2.3.3 小结2.4 参数的解包(也称拆包)1.什么是函数 在Python中,函数是一段可重复使用的代码块,用于执行特定任务。通过将代码封装在函…

AI技术如何助力实现智慧交通

人工智能的常见优势在于能够实时、高效地分析处理大量的数据&#xff0c;并结合算法模型提供个性化、专业化的服务。在智慧交通方面&#xff0c;人工智能同样可以发挥专长&#xff0c;助力打造智能高效的交通运输网络&#xff0c;本篇就为大家简单介绍一下AI技术如何促进智慧交…

小航助学题库蓝桥杯题库python选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

WordPress插件大全-免费的WordPress插件汇总

随着互联网的不断发展&#xff0c;网站建设变得日益普及。对于大多数人而言&#xff0c;WordPress是一个熟悉且易于使用的网站建设平台。然而&#xff0c;有时候我们可能会觉得WordPress的功能还不够满足我们的需求&#xff0c;这时候&#xff0c;插件就成了解决问题的得力工具…

springboot+mysql实现就业信息管理系统

springbootmysql实现的就业信息管理系统,有普通用户和管理员两种角色,演示地址:yanshi.ym4j.com:8091 普通用户账号&#xff1a;test 密码&#xff1a;123456管理员账号&#xff1a;admin 密码&#xff1a;123456 共包含就业信息管理、就业统计、用户管理等功能。 登录 就业信…

银河麒麟高级服务器操作系统V10安装达梦数据库管理系统DM8——单实例

一、介绍 之前介绍过供个人学习在VMware虚拟机上安装银河麒麟高级服务器操作系统V10&#xff0c;有兴趣的可以去看看&#xff08;银河麒麟V10安装&#xff09;&#xff0c;本次主要学习在银河麒麟V10上安装达梦数据库-DM8。DM8是达梦公司在总结DM系列产品研发与应用经验的基础…

广州华锐视点:3D毒品预防专题教育平台帮助青少年提升拒毒意识

随着科技的不断发展&#xff0c;人们的生活方式也在不断地改变。在这个信息爆炸的时代&#xff0c;传统的普法教育方式已经无法满足人们的需求。为了适应这一变化&#xff0c;越来越多的教育机构开始尝试利用现代科技手段进行普法教育。其中&#xff0c;3D毒品预防专题教育平台…

JS 绘制半径不一致的环形图进度条

HTML部分: <canvas id"mycanvas" width"100" height"100"></canvas>JS部分&#xff1a; const option {element: "mycanvas", // 元素count: 26, // 高亮数据totalCount: 129, // 总数据progressColor: #3266FB, // 进…

a-table:表格组件常用功能记录——基础积累

antdvue是我目前项目的主流&#xff0c;在工作过程中&#xff0c;经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 table组件 <a-table :dataSource"tableData":rowKey"(row) > row.id":scroll"{ y: 550 }"bordered:pag…

Linux处理系统常见命令

目录 1 sudo 1.1 介绍 1.2 配合 2 ifconfig与ping 2.1 ifconfig 2.2 ping 3 kill 4 apt-get 4.1 介绍 4.2 配合 5 history 6 clear 7 env 1 sudo 1.1 介绍 给这条命令最高权限&#xff0c;比如 sudo cp something.txt /usr/bin/something.txt 1…

Neural Architecture Search for Deep Image Prior

深度图像先验的神经结构搜索 论文链接&#xff1a;https://arxiv.org/abs/2001.04776 项目链接&#xff1a;https://github.com/Pol22/NAS_DIP Abstract 在最近提出的深度图像先验算法(DIP)下&#xff0c;我们提出了一种神经结构搜索(NAS)技术来提高无监督图像去噪、修复和超…

一文了解什么是GIS

地理信息系统&#xff08;GIS&#xff09;是捕捉、存储、分析和呈现空间数据的强大工具。通过将地理信息与其他数据源相结合&#xff0c;GIS为有效决策至关重要的模式、关系和趋势提供了有价值的见解。 一、GIS的关键概念 1.空间数据&#xff1a;GIS依赖于空间数据&#xff0c…

ODBC一般操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

注解Annotation - Java

注解Annotation 一、介绍二、使用三、三个基本的Annotation四、JDK内置的基本注解类型1、Override2、Deprecated3、SuppressWarnings 五、JDK的元注解1、Retention2、Target3、Documented4、Inherited 一、介绍 注解&#xff08;Annotation&#xff09;也被称为元数据&#xf…

老师怎么选班干部

对于老师来说&#xff0c;选择合适的班干部是一项重要任务。班干部不仅是学生的榜样&#xff0c;也是班级秩序维护者。 了解学生的情况是必要的。老师需要了解每个学生的性格、能力和潜力&#xff0c;为他们分配适合的职务。对于新班级&#xff0c;可以观察学生在课堂上的表现、…

C++11新特性(上)

一、C11简介 相比C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更…

Breadcrumb面包屑(antd-design组件库)简单用法和自定义分隔符

1.Breadcrumb面包屑 显示当前页面在系统层级结构中的位置&#xff0c;并能向上返回。 2.何时使用 当系统拥有超过两级以上的层级结构时&#xff1b; 当需要告知用户『你在哪里』时&#xff1b; 当需要向上导航的功能时。 组件代码来自&#xff1a; 面包屑 Breadcrumb - Ant Des…

linux 磁盘扩容初始化挂载 笔记

目录 说明环境信息前提条件 操作步骤 说明 linux 系统磁盘扩容步骤 环境信息 系统信息&#xff1a;Linux version 4.19.90-23.8.v2101.ky10.aarch64cpu信息&#xff1a;Kunpeng-920 、aarch64、64-bit、HiSilicon 前提条件 有未初始化的用户磁盘操作系统可以支持当前磁盘的…

不确定度校准和可靠性图简介

图片来源 项杰 一、说明 不确定性校准是机器学习中最容易被误解的概念之一。它可以概括为这个简单的问题&#xff1a;“鉴于上述下雨的可能性&#xff0c;您是否带伞&#xff1f;” 我们在日常生活中使用主观概率和不确定性校准的概念&#xff0c;但没有意识到它们。对于不确定…

Linux命令中的符号

目录 1 管道符 | 1.1 | grep [要检索的东西] 1.2 echo | tee 2 重定向 2.1 输出重定向覆盖 > 2.2 输出重定向添加 >> 2.3 文件输入重定向 < 2.4 多行文本输入重定向 << 2.5 常用搭配 2.5.1 终端不显示 > /dev/null 1 管道符 | 我们…