精通l的inux设备驱动程序开发-第7章-输入设备驱动.pdf
文本预览下载声明
第 7 章 输入设备驱动
内核的输入子系统是为了对分散的、多种不同类别的输入设备(如键盘、鼠标、跟
踪球、操纵杆、辊轮、触摸屏、加速计和手写板)进行统一处理的驱动。输入子系统带
来了如下好处:
• 统一了物理形态各异的相似的输入设备的处理功能。例如,各种鼠标,不论
PS/2、USB,还是蓝牙,都被同样处理。
• 提供了用于分发输入报告给用户应用程序的简单的事件(event)接口。你的驱
动不必创建、管理/dev 节点以及相关的访问方法。因此它能很方便的调用输入
API 以发送鼠标移动、键盘按键,或触摸事件给用户空间。X Windows 这样的
应用程序能够无缝地运行于输入子系统提供的 event 接口之上。
• 抽取出了输入驱动的通用部分,简化了驱动,并提供了一致性。例如,输入子
系统提供了一个底层驱动(成为 serio)的集合,支持对串口和键盘控制器等硬
件输入设备的访问。
图 7.1 展示了输入子系统的操作。此子系统包括一前一后运行的两类驱动:事件驱
动和设备驱动。事件驱动负责和应用程序的接口,而设备驱动负责和底层输入设备的通
信。鼠标事件产生者 mousedev,是前者的实例;而 PS/2 鼠标驱动是后者的实例。事件
驱动和设备驱动都可以利用输入子系统的高效、可重用的核心提供的服务。
图 7.1. 输入子系统
事件驱动是标准的,对所有的输入类都是可用的,所以你更可能的是实现设备驱动而
不是事件驱动。你的设备驱动可以利用一个已经存在的、合适的事件驱动通过输入核心和
用户应用程序接口。需要注意的是本章使用的名辞“设备驱动”指的是输入设备驱动,而
不是输入事件驱动。
输入事件驱动
输入子系统提供的事件接口已经发展成为很多图形窗口系统理解的标准。事件驱动提
供一个硬件无关的抽象,以和输入设备交互;如同帧缓冲接口(在第 12 章《视频设备驱
动》中讨论)提供一个通用的机制以和显示设备通信一样。事件驱动和帧缓冲驱动一起,
将图形用户接口(GUI)和各种各样的底层硬件隔离开来。
Evdev 接口
Evdev 是一个通用的输入事件驱动。Evdev 产生的每个事件包都有如下格式,定义于 i
nclude/linux/input.h:
struct input_event {
struct timeval time; /* Timestamp */
__u16 type; /* Event Type */
__u16 code; /* Event Code */
__s32 value; /* Event Value */
};
为了学习如何使用 evdev,让我们来实现一个虚拟鼠标的输入设备驱动。
设备例子:虚拟鼠标
我们的虚拟鼠标工作过程如下:一个应用程序(coord.c)模拟鼠标移动,并通过一个
sysfs 节点/sys/devices/platform/vms/coordinates 分发坐标信息给虚拟鼠标驱动(vms.
c)。虚拟鼠标驱动(vms驱动)通过 evdev 向上层传送这些移动信息。图 7.2 展示了详细
过程:
图 7.2. 虚拟鼠标的输入驱动
!--[if !vml]--
!--[e
ndif]--
通用目的鼠标(gpm)是服务器,让你在文本模式下使用鼠标,而无需 X 服务器。Gpm
能够理解 evdev 消息,因此 vms 驱动能够直接和其通信。一切就绪后,你将会看到随着由
coord.c 产生虚拟鼠标移动,光标在屏幕上跳动。
清单 7.1 包含coord.c,
显示全部