输入设备驱动之按键设备驱动输入设备驱动之按键设备驱动
2.6版本的内核中,驱动的开发逐渐发展成基于总线模型等一定结构的开发模式,采用了分层的设计思想,这样
的变化使得驱动开发的工作量相对而言越来越少,但是也增加了我们阅读、分析源码的思想的难度。
我的环境:
Fedora14 内核版本,2.6.38.1
开发板:TQ2440
移植内核版本:2.6.30.4
Linux输入子系统就是一个基于分层模式的系统,其基本的层次分解如下图所示。
在图中我们可以发现输入子系统主要包括三个部分设备驱动层(input driver)、核心层(input core)和输入事件驱动层。输
入子系统的划分使得输入设备的驱动程序设计越来越简单,但是其中的思想采用我们学习的重点和难点。
Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的
功能来与用户空间交互。输入设备一般包括键盘,鼠标,触摸屏等,在内核中都是以输入设备出现的。下面分析input输入子
系统的结构,以及功能实现。
1. Input子系统是分层结构的,总共分为三层:硬件驱动层,子系统核心层,事件处理层。
(1)、其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。
(2)、子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。
(3)、事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。
2. 各层之间通信的基本单位就是事件,任何一个输入设备的动作都可以抽象成一种事件,如键盘的按下,触摸屏的按下,鼠
标的移动等。事件有三种属性:类型(type),编码(code),值(value),Input子系统支持的所有事件都定义在input.h中,包括
所有支持的类型,所属类型支持的编码等。事件传送的方向是硬件驱动层-->子系统核心-->事件处理层-->用户空间。
在驱动程序设计中,我们对于设备的驱动设计主要集中在设备驱动层的实现,但是这与之前的设备驱动开发存在较大的差别,
主要是因为设备驱动不再是编写基本操作的实现过程,也就是不在是对struct file_operations 这个结构体对象的填充和实现。
在输入设备驱动中的主要实现包括下面几个过程:
1、分配一个输入设备对象。并完成响应结构体元素的填充,主要包括支持的事件类型和事件代号等。
分配对象的函数:
struct input_dev *input_allocate_device(void);
释放对象函数:
void input_free_device(struct input_dev *dev);
设置支持的事件类型和事件代码:
通常采用set_bit函数实现:
设置支持的事件类型(支持按键事件)