Input子系统驱动分析

1、Input子系统架构

Linux系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动。

下面是Input系统的组成:

输入子系统由驱动层(Drivers),输入子系统核心层( Input Core )和事件处理层(Event Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下等都是通过 Driver -> InputCore -> Eventhandler -> userspace 的顺序到达用户空间传给应用程序。下面介绍各部分的功能:

(1)驱动层功能:负责和底层的硬件设备打交道,将底层硬件设备对用户输入的响应转换为标准的输入事件以后再向上发送给输入子系统核心层(Input Core)。

(2)Input系统核心层:Input Core即Input Layer,由driver/input/input.c及相关头文件实现,它对下提供了设备驱动层的接口,对上提供了事件处理层(Event Handler)的编程接口。内核实现,不用管

(3)事件处理层将硬件设备上报的事件分发到用户空间和内核。内核实现,不用管

主要分析input.c文件

2、输入核心层源码分析

1、核心模块注册:input_init函数

(1)class_register:用来注册input类

(2)input_proc_init:用来创建proc文件系统

(3)register_chrdev

  • 主设备号都是13,依靠次设备号来区分

2、设备驱动层的接口函数

(1)input_allocate_device分配设备号
(2)input_set_capability
(3)input_register_device向上注册

(1)input_allocate_device:申请动态内存,并进行局部泛性的初始化

img

(2)input_set_capability:进一步进行初始化,设置(设备可以产生哪些事件)

img

(3)input_register_device

img

3、handler和device的匹配(input_register_device函数中)

img

(1)input_attach_handler负责匹配和连接

img

  • input_match_device:匹配device和handler;
  • handler->connect(handler, dev, id) :连接device和handler

4、提供给事件驱动层的接口函数

evdev.c文件中有如下代码,其中的函数由input.c提供。

img

(1)input_register_handler

img

(2)input_register_handle

img

3、输入事件驱动层源码分析

三个函数input_handler,evdev_connect,evdev_event

待分析

4、输入设备驱动层源码分析

先找到bsp中按键驱动源码

(1)锁定目标:板载按键驱动

(2)确认厂家提供的BSP是否已经有驱动

(3)找到bsp中的驱动源码

按键驱动源码初步分析

(1)模块装载分析

(2)平台总线相关分析

(3)确定重点:probe函数

源码细节实现分析

(1)gpio_request

(2)input_allocate_device

(3)input_register_device

(4)timer

Last modification:November 19th, 2019 at 07:53 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment