一文!!!迅速理解Linux下input子系统框架

input子系统框架

前言

最近在看韦老师的驱动视频,不得不说Linux的驱动框架性真的很强,也很有难度,INPUT子系统算是较为简单的了,此文为方便理解的学习记录,如果大家有需要还会继续更新。

框架

  1. 从底层开始分析,有各种各样的输入设备:如键盘、鼠标、屏幕。我们需要为这些硬件注册相应的底层驱动,能从各种不同的输入设备中获得数据并且上报,这就是Input Device层
  2. 我们知道Linux对驱动进行了非常完善的封装以==方便用户分层开发。==我们从Input Device 层获得了数据之后,Linux通过Input Core层对这些从硬件读取的初始数据封装成一个标准的格式继续转发给上层handler。
  3. 最后一层用于提供向用户层对接的open/write等函数,命名为Input Handler层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rt50CSQA-1664003306193)(C:\Users\WEN\AppData\Roaming\Typora\typora-user-images\image-20220923125813740.png)]
不理解不要紧,最后可以通过代码来反映

内部实现

内部实现栈图

在这里插入图片描述

可能不太清晰,我们一步一步分析。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAkOtMFg-1664003306197)(INPUT子系统.assets/image-20220924133828569.png)]

  1. 如上图所示,我们首先在设备树提供设备信息,然后进行platform_driver的编写,在platform_bus_type总线下,当设备和驱动匹配的时候自动调用Probe函数

    Probe函数栈:

在这里插入图片描述

可见在Probe函数中分配、设置、注册了一个input_dev,并且遍历寻找匹配的handler,通过handler->connect将input_dev和input_handler进行连接。

  1. 要注意与应用层对接的是Handler层(对应evdev),那么他里面就必定有一个file_operations结构体:
    在这里插入图片描述

当我们的应用程序想要读数据的时候:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UrshBcm-1664003306198)(INPUT子系统.assets/image-20220924134807816.png)]
可见最后会休眠等待中断将数据上报!

  1. ==那么什么时候会被唤醒接受数据呢?==可以看到在设备驱动中进行了中断函数的注册,来看一下此中断函数:

在这里插入图片描述

一旦中断产生:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqpMbp0Z-1664003306199)(INPUT子系统.assets/image-20220924140305598.png)]

重要结构体

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:理解整个架构

我们前面放了一张框架图:

在这里插入图片描述

  1. Input Device层和Input Handler层很好理解:Input Handler(Linux已经写好了)为用户提供了统一的接口来获取数据,而Input Device里面注册了Input_dev结构体,里面有硬件具体的信息。

  2. 而中间层Input Core层,他是将各种不同的数据封装了一个输入事件结构体input_event:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X06XIRyA-1664004026884)(INPUT子系统.assets/image-20220924141114411.png)]
    大大提高了程序的可复用性。

猜你喜欢

转载自blog.csdn.net/weixin_58453536/article/details/127025613