基于input子系统的驱动分析

基于input子系统的驱动分析

input子系统本质多个模块构成的一个体系,用来实现:对鼠标、键盘、按键这类输入设备驱动的管理。这里所谓的输入设备,是狭义上的,仅仅指人机交互用的输入设备。传感器这种输入设备不属于该范围。
下图是input子系统的结构
这里写图片描述
值得注意的是,虽然事件处理层主要有event类型的、mouse类型的、key类型的,但是event类型兼容所有的输入设备,并有取代其他类型的趋势。可以认为,所有的设备在/dev/input下,都是以event*命名的
下图是系统工作的具体流程
这里写图片描述

1.事件处理层分析

事件处理层负责接受驱动层的汇报上来的数据,然后打包成标准格式再给应用层。此外设备文件也是事件处理层负责创建的。

  • 应用层可以打开/dev/input/eventx,即可读取到标准格式的输入事件包struct input_event
  • struct input_event是一个标准的格式包,由事件处理层创建并传递给应用层。当一个输入事件发生时,会发送多个input_event,形成一帧数据。下面是<linux/input.h>中定义的input_event原型。
struct input_event {
    struct timeval time;//表示输入事件发生时间点
    __u16 type;//输入事件类型
    __u16 code;//输入事件编码值
    __s32 value;//操作值
};
  • input_event内元素值对应的含义,在<linux/input.h>中定义

2.核心层(input.c)分析

  • input.c中是input设备框架,它是一个模块,该模块加载函数做的事情非常典型,主要还是注册类和注册设备
/*该模块加载函数做的事情非常典型,主要还是注册类和注册设备*/
static int __init input_init(void)
{
    /*无关代码就不贴了*/
    ...

    /*注册了一个叫input的类*/
    err = class_register(&input_class);

    /*无关代码就不贴了*/
    ...

    /*注册input设备,所有的input设备的主设备号都为13*/
    err = register_chrdev(INPUT_MAJOR, "input", &input_fops);

    /*无关代码就不贴了*/
    ...
}
  • 所有的input设备公用一个主设备号(都是13),它们之间以次设备号互相区分。所以在框架中使用register_chrdev注册了一个主设备号为13的设备,而在事件处理层中创建设备文件主设备号都为13,次设备号不同

3.驱动分析

下图是驱动的具体流程
其本质是:驱动只需通过上报读到的硬件状态给事件处理层,其他的都由事件处理层负责。应用层只需读取/dev/input/event*即可
这里写图片描述
下面是具体的源码,以最常见的按键驱动为例

源码:

#include <linux/input.h>
#include <linux/module.h>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值