nput子系统简介
struct input_event:对所有的输入类设备向应用层上报自己发生的输入事件做统一管理。
(1)linux的input子系统解决了:不同的硬件在驱动层和应用层之间的信息的传输,最终能让应用层感知到所有的输入类设备所发生的每一个输入类事件,并且能够响应这些事件做出相应的反应。
(2)input子系统分4个部分:应用层 + input event(负责向应用层上报事件) + input core(框架部分) + 硬件驱动
(3)事件驱动型GUI框架,如QT、VC等。
input设备应用层编程实践
(1)应用层操作驱动有2条路:/dev目录下的设备文件,/sys目录下的属性文件
(2)input子系统用的/dev目录下的设备文件,具体一般都是在 /dev/input/eventn (n = 0、1、2......)
(3)用cat命令来确认某个设备文件名对应哪个具体设备。在自己的ubuntu中实测的键盘是event1(cat event1后当键入任何按键时会输出东西),而鼠标是event3(cat event3后移动鼠标会输出东西).
实例:
解析struct input_event:标准接口打开并读取文件,解析键盘事件数据
input子系统(vdrivers/input)分为三层
(1)最上层:输入事件驱动层,如:evdev.c(这种是未来的趋势)和mousedev.c和joydev.c属于这一层
(2)中间层:输入核心层,input.c属于这一层
(3)最下层:输入设备驱动层,drivers/input/xxx 文件夹下
其架构体系模型如下:
input类设备驱动开发方法
(1)输入事件驱动层和输入核心层不需要动,只需要编写设备驱动层(从上图可以看出事件驱动层和输入核心层是多对一的,例如一个USB鼠标事件既可以走Mouse Handler这条线,也可以走Event Handler这条线。不过现在用Event Handler这个接口的多,逐渐成主流了)
(2)设备驱动层编写的接口和调用模式已定义好,驱动工程师的核心工作量是对具体输入设备硬件的操作和性能调优。
输入核心层源码分析(drivers/input/input.c)
核心模块注册input_init
(1)class_register
(2)input_proc_init
(3)register_chrdev
设备驱动层的接口函数
(1)input_allocate_device
(2)input_set_capability
(3)input_register_device
handler和device的匹配
(1)input_attach_handler
input_match_device 匹配device和handler
handler->connect(handler, dev, id) 连接device和handler
事件驱动层的接口函数
(1)input_register_handler
(2)input_register_handle
输入事件驱动层源码分析(drivers/input/evdev.c)
input_handler
evdev_connect
evdev_event
输入设备驱动层源码分析
先找到bsp中按键驱动源码(里面有很多源文件,怎么确定哪个是对应自己的开发板的呢?只要要在编译好的内核相应目录里找到对应的.o文件,便可确定)
(1)锁定目标:板载按键驱动
(2)确认厂家提供的BSP是否已经有驱动
(3)找到bsp中的驱动源码
按键驱动源码初步分析
(1)模块装载分析
(2)平台总线相关分析
(3)确定重点:probe函数
源码细节实现分析
(1)gpio_request
(2)input_allocate_device
(3)input_register_device
(4)timer
具体驱动程序书写方法可以参考Documentation/input/input-programming.rst文档