首页 > 其他分享 >字符设备驱动之输入子系统分析(三)

字符设备驱动之输入子系统分析(三)

时间:2023-07-12 17:48:07浏览次数:46  
标签:字符 事件处理 evdev 系统分析 handler input 驱动 结构 设备

 

作者:Bright-Ho

联系方式:[email protected]


input输入子系统之“事件处理层”分析:


注意:我们现在只是涉及输入子系统的框架;具体细节会涉及到硬件的工作原理,在后面我们写驱动的时候会说到细节方面;


这一节,我们接触到了“事件处理层”;事件处理层包含了evdev.c(事件设备),tsdev.c(触摸屏设备),keyborad.c(键盘设备),以及mousedev.c(鼠标设备)等;

我们选取evdev.c(事件设备)内核源代码进行分析;该代码位于:drivers/input中;


上一节,我们说到,input_handler这个结构体就是在evdev.c这个事件处理文件中构造出来的;接下来,我们就继续分析“事件处理层”的代码;分析事件设备evdev.c的代码;


(1)入口函数evdev_init();

static int __init evdev_init(void)

{

return input_register_handler(&evdev_handler);

}


static struct input_handler evdev_handler = {

.event = evdev_event,

.connect = evdev_connect,

.disconnect = evdev_disconnect,

.fops = &evdev_fops,

.minor = EVDEV_MINOR_BASE,

.name = "evdev",

.id_table = evdev_ids,

};


里面直接调用input_register_handler(&evdev_handler);该函数是“核心层”提供的;

前面一节我们大概分析了该函数;这里最重要的是evdev_handler结构体;之前分析核心层的代码时候,一直都有evdev_handler这个结构体的出现,我们一直在寻找该结构的源头,现在我们清楚了,该结构体在“事件处理层”实现的;那么现在我们来分析input_handler结构体的成员;

evdev_connect函数:当dev和handler匹配成功后,就会调用该函数建立“连接”,怎么建立连接呢?对于每个不同的handler都有不同的连接方式,也就是不同的设备,有不同的连接方式。后面具体讲到设备驱动的时候,会讲到如何连接;

evdev_fops结构:该结构很重要,这个结构就是最终提供给应用层的调用接口,open,read,write,等;

evdev_ids:就是id号,用来匹配硬件设备和事件处理的;一旦匹配成功,就会调用connect函数建立“连接”;

EVDEV_MINOR_BASE:次设备号;

"evdev":名字;


那么这里重点看一下evdev_fops结构,也就是file_operations结构;我们自己写字符设备驱动的时候,就是自己构造这个结构,然后,通过register_chadev()函数来注册;那么引入“输入子系统”后,这个file_operations结构,就是由具体的“事件处理层”来实现;

不用我们自己手动实现!

609 static const struct file_operations evdev_fops = {

610 .owner = THIS_MODULE,

611 .read = evdev_read,

612 .write = evdev_write,

613 .poll = evdev_poll,

614 .open = evdev_open,

615 .release = evdev_release,

616 .unlocked_ioctl = evdev_ioctl,

617 #ifdef CONFIG_COMPAT

618 .compat_ioctl = evdev_ioctl_compat,

619 #endif

620 .fasync = evdev_fasync,

621 .flush = evdev_flush

622 };


应用程序open,read,write一个设备文件,就会调用到“事件处理层”里面提供的接口,这里就暂时不讲各个接口里面具体怎么实现的,等到讲到具体的硬件设备的时候,再来讲解;这里重点是讲解输入子系统的框架!!!


总结:“事件处理层”做了哪些事情?

(1)构造一个input_handler结构体,该结构体包含了,事件上报函数 evdev_event;设备和事件处理的连接函数evdev_connect; id号:evdev_ids用于匹配设备和事件处理;evdev_fops结构:驱动接口;

(2)调用核心层提供的注册函数input_register_handler(&evdev_handler);

该函数把input_handler结构体:

先放入一个input_table[]数组;

然后再把该结构体放入input_handler_list的链表;

把设备链表里面的每一项设备取出来和input_handler进行匹配,一旦匹配成功就调用input_handler结构里面的connect连接函数,把设备和事件连接在一起;当应用程序open,read,write,设备接口的时候就会调用“事件处理层”里面提供的file_operations里的面的驱动接口来处理具体的硬件设备;


下一节我们继续讲解设备驱动层的东西;







标签:字符,事件处理,evdev,系统分析,handler,input,驱动,结构,设备
From: https://www.cnblogs.com/Bright-Ho/p/17548340.html

相关文章

  • HJ102 字符统计
    1.题目读题HJ102 字符统计  考查点 这道题的考查点可能是以下几个方面:字符串的处理和操作,如遍历、分割、拼接等。数据结构的选择和使用,如数组、字典、列表等。排序算法的理解和实现,如冒泡排序、选择排序、快速排序等。编程语言的基本语法和规范,如变量、函数、循......
  • C# 获取字符串自动换行
    ```//判断是否是汉字publicstaticboolIsChinese(charchr){return(int)chr>0x4E00&&(int)chr<0x9FA5;}///<summary>///截取字符串,不限制字符串长度///</summary>///<paramname="str&qu......
  • Windows 驱动程序签名教程(一) --- 开发测试篇
    一、内核驱动签名初篇1.大概聊一聊现有驱动情况1.开启安全启动(SecureBoot)1.使用微软WHQL签名2.使用2013-2015年签发的驱动签名,已过期未吊销未拉黑(不知道什么时候打个补丁会修复).2.关闭安全启动(SecureBoot)1.使用微软WHQL签名2.使用过期签名的sha1sha256都可以正常......
  • Java IO:字节流、字符流、缓冲流
    原文:https://blog.csdn.net/mu_wind/article/details/108674284流的特性有下面几点:先进先出:最先写入输出流的数据最先被输入流读取到。顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)只读或只写:......
  • 高通个别驱动创建Buffer耗时高问题的解决
    前言最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(855,855+等),创建VB的耗时跟VB的数量成正比,这个应该是驱动的bug。跟官方人员确认过,确实是有这个问题,他们给的解决方案是减少Buffer的数量,经过一轮优化后,Buffer数量减少了将近30%,但是这个耗时的问题还是没能解决,在正常机......
  • 如何实现mysql驱动的具体操作步骤
    MySQL驱动简介及使用示例1.什么是MySQL驱动?MySQL驱动是用于连接和操作MySQL数据库的软件模块。MySQL是一种常用的关系型数据库管理系统,而驱动则是用于连接不同编程语言和MySQL数据库之间的桥梁。驱动有助于程序员使用编程语言操作MySQL数据库,例如执行查询、插入、更新和删除数据......
  • 构造字符串有感
    题目要求用小写字母构造一个字符串,这个字符串最大到1e6,这种题一般有两种思路。思路我们要做的就是,找到规律。打表找规律用dp思想,线性推,考虑当前位置字符只受前面已经出现的字符影响,且无后效性。因为字母只有26个,所以找到状态方程,就可以很好的解决了题目参考cf:https://codef......
  • 【剑指Offer】54、字符流中第一个不重复的字符
    【剑指Offer】54、字符流中第一个不重复的字符题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当......
  • 1-14 编写一个程序,打印输入中各个字符出现频度的直方图
    ArchlinuxGCC13.1.1 202304292023-07-1123:25:36星期二 做了调整,只输出大小写字母共计56个字符的横向直方图,如有其他需要,自行添加。点击查看代码#include<stdio.h>#defineTRUE1#defineFALSE0intmain(){intc_in;intc_num[52];intc......
  • HJ81 字符串字符匹配
    1.题目读题HJ81 字符串字符匹配  考查点 2.解法思路 代码逻辑 具体实现publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringtarget=sc.nextLine();Stringsource=sc.nextLine();S......