输入子系统学习笔记之源码分析1_框架性分析

1. 引入输入子系统的目的

输入设备的驱动程序如果按照一般字符设备驱动的写法,那么这些驱动就没办法用在别人写的应用程序上。这是因为其它人不会去打开这个设备文件也有可能不知道这个设备文件的命名,其它人有可能打开线程或者是直接使用scanf获得输入。这样驱动程序可以自己使用或者是公司内部使用,别人是无法使用,除非你告诉它怎么使用你的驱动,但是这样,那个应用程序就不是通用的,这个应用程序就没法在别的单板上运行。既然这样,那么如何写出一个通用的驱动程序,别人的应用程序可以无缝的移植到单板上呢? 这就是linux2.6 引入输入子系统的目的,我们可以使用现成的驱动(input system),然后把自己的设备相关的代码融合进去,就可以构建一个通用的驱动程序。因此,可以知道输入子系统是针对分散的,多种不同类的输入设备进行统一处理的驱动程序。

2. 引入输入子系统的代码的好处

刚开始分析输入子系统时,觉的很复杂,不知道内核为什么要这么多东西。但是就是因为这些“复杂”的代码,如果我们弄懂后,在编写输入设备驱动程序将变得非常简单,因为输入子系统抽取了我们输入设备的通用部分,我们仅仅实现与设备相关的部分代码。当然不止这个好处,至少带来的好处如下:

# 统一了物理形态各异的相似的物理设备功能。比如是,各种借口类型的键盘或鼠标。

# 提供了用于分发输入报告给用户应用程序的的简单事件借口

# 抽取了输入驱动程序的通用部分,简化了驱动程序

3. 输入子系统的组成部分及作用

输入子系统有三部分组成,如下:

# 核心层: 高效,无bug,可重用

# 事件处理层: 负责与应用程序交互

# 设备驱动层: 负责与底层输入设备交互

事件处理程序是标准的,对于所有的输入类是通用的。所以一般而言我们要实现的设备驱动程序,而不是事件处理程序。内核已经为我们提供了常用的事件处理程序,基本上如果没有特需要求,我们没有必要去实现事件处理程序。设备驱动程序可以利用一个存在的,合适的事件处理程序通过核心和用户应用程序交互。

4. 输入子系统框架

image_thumb12

注:keyboard.c不会在/dev/input/下产生节点,而是作为ttyn终端(不包括串口终端)的输入,我们在使用cat /dev/ttyn调试时时实际上就是使用了keyboard.c。

     从输入子系统框架可知已经完成了字符驱动的文件操作接口,这就意味着按照输入子系统提供文件接口编写的应用程序可以无缝的移植到依据输入子系统框架编写的设备驱动程序,这样的结果带来的好处是一个公司写的应用程序可以使用另外一家公司提供的驱动程序。正是因为如此,android, X window,qt等多应用对于linux系统中键盘,鼠标,触目屏等输入设备的支持越来越倾向于标准的input子系统。框架图很容易看出事件处理层(event hander)负责与应用程序交互,核心层(input core)为事件处理层和设备处理层提供借口(这是linux中经常采用的思想,为了解决接口的差异或是其它问题达到统一的目的,一般引入一个中间层来协调!一位linux大师曾说过linux中的任何问题都可以通过引入中间层来解决!)。设备处理层负责与底层的硬件通信,当硬件产生中断时,设备处理层将通过上报事件给核心层,核心层找到相应的事件处理程序,最后传到应用层。可以看出,每层的功能划分非常明确,其中核心层和事件处理层是标准的,一般不需要修改。需要实现的是设备驱动程序,由于输入子系统实现了大部分工作,就像一栋大楼架子已全部搭好,下一步工作是添砖加瓦!这里也是一样我们要做的是依据输入子系统的框架,然后在里面添加自己的代码,其实就是把自己的代码融合到输入子系统上面。因此,要写一个输入子系统设备驱动程序非常简单,仅仅是去了解输入子系统留出的接口即可。但是如果要到到灵活应用的目地,那么还要好好分析下输入子系统的工作流程。

下面记录的是分析输入子系统的3个部分时的笔记

posted @ 2013-03-18 21:46  lsx_007  阅读(393)  评论(0编辑  收藏  举报