本次介绍Linux的输入子系统的驱动开发.
Linux 内核的输入子系统为鼠标、键盘、触摸屏、游戏杆等输入设备提供了驱动框架。 当程序员要为自己的输入设备编写驱动程序时,只需要实现从设备获取输入事件即可。至于 输入事件如何处理,用户接口如何实现,都由输入子系统完成。这大大减轻了输入驱动程序 的编码工作,也提高了驱动程序的稳健性。
同时输入子系统为所有输入设备都为应用层提供了标准的接口,这大大提高了驱动程序 的易用性。输入子系统的驱动代码在内核的<drivers/input/> 目录下。
输入子系统构成
输入子系统的实现需要满足以下需求:
(1) 输入子系统要为每个输入设备都在/dev/ 目录下生成一个设备文件,以方便应用程序 读取指定输入设备产生的事件;
(2) 对于每一个输入设备,在输入子系统只需要实现其事件获取即可,至于事件如何处理、如何到达设备文件则不需要考虑;
(3) 在Linux 输入设备的可以分为事件类(如USB 鼠标、USB 键盘、触摸屏等)、MOUSE 类(特指 PS/2 接口的输入设备)、游戏杆等类型,为这些输入设备而实现的设备文件的接口必须有所差别。因此输入子系统需要为不同类型的输入设备实现正确的设备文件接口。
本次将通过开发一个简单的输入子系统代码来了解输入子系统,本次结合平台总线 + 输入子系统的方式开发,以下是相关代码:
先定义一个头文件:
#ifndef __PLAT_INPUT_H__
#define __PLAT_INPUT_H__
struct key_info {
char *name;
int gpio;
int code;
int flags;
};
struct key_platdata {
struct key_info *key_desc;
int num;
};
#endif
输入子系统平台设备信息代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include "key_info.h"
struct key_info key_pdesc[4] = {
[0] = {
.name = "KEY_UP",
.gpio = EXYNOS4_GPX3(2),
.code = KEY_UP,
.flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,