输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见。同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分析很有意义。
一、input子系统知识点
完整的input子系统分析包括以下几方面:
1) 软件层次
2) 输入子系统分层(input_handler,input_core, input_device)
3) 输入设备(TS)驱动开发
4) evdev handler分析
5) input设备模型视图(sysfs)和运行映象(procfs)
6) tslib分析
7) 应用框架的事件处理分析
二、软件层次分析
Linux输入所涉及的软件层次如下图:
1.APP即通讯录应用,输入姓名拼音首字母,然后点击查询,输出结果(姓名和电话 码)。APP在QT creator可视化开发环境上使用所见即所得的方式拖入Button控件作为“查询”按钮。APP不需要关注按钮的显示,也不需要关心用户通过何种方式按下按钮,只需要做的是对按钮的单击事件进行响应,即通过姓名首字母来对姓名数据库进行查询并输出到结构框中。
2.QT应用框架需要完成APP开发所不需要关注的事情,即对输入事件进行封装处理、分发事件到目标控件、完成目标控件的状态变化和图像显示,当然还包括窗口的管理。上述应用图示是一个LCD屏显示页面,LCD的坐标点在左上角,如下图:
另外,触摸屏的分辨率和LCD显示屏的分辨率也有可能不一样,因此坐标的转换还要考虑分辨率的因素。
4.C library,Tslib必须通过open,read这些标准c接口访问内核层驱动,而这些接口最终都会使用syscall指令跳转到内核态。
5.VFS,open、read等接口通过syscall系统调用层最终会调用到vfs_open、vfs_read等接口。Open所带参数为输入设备文件名,如/dev/input/event1,vfs_open通过lookup在dentry链表中找到该设备文件对应的inode,进而分析出该文件是一个字符设备文件,交由字符设备驱动框架的chardev_open进行处理,最终获得输入子系统(主设备 都是13)对应的input-core层定义的file_operations,并封装到所在进程的file结构中,最后向应用层返回file对应的句柄fd,而read则是通过该file_operations进行读转发和访问操作。
6.字符设备驱动框架层。chardev_open通过设备文件对应的inode读出对应的主设备 是13,并在字符设备驱动全局链表cdev_map中找到主设备 13对应的file_operations, 即输入子系统初始化时向系统注册的input_fops。如下图:
1)所有的输入设备的主设备 都是13,其通过次设备来将输入设备进行分类,如下图:
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24722 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!