一、前言
在前面的开发过程中,我们都是直接创建一个设备类,然后注册这一个类的设备。那么这样的方法无疑会带来一些问题,我们自己尚且可以调用这些类和设备,对于其他的开发者那可能就需要特殊的文档说明来帮助使用。为了避免这种情况,在linux中,存在一个linux输入子系统来管理输入设备。
二、input输入子系统:
2.1、定义:
Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析。
这篇文章比较详细的介绍了关于输入子系统的概念
- 当然作为一个入门的开发者,对这个概念的理解也只能说是浅浅的知道,但是不妨在实际的开发中来体会用处的特点。
2.2、框架:
这是韦老师画的理解图:
- 在这个框架中,主要分为两个部分,也就是handler部分,和device部分。中间,可以通过建立一个handle来实现连接。
三、代码编写:
我们研究input的具体实现当然需要费一番功夫,但是对于我们开发驱动的来说,其实过程相对于之前的开发,过程反而比较简单和快捷。
3.1、申请设备空间和注册input设备:
input已经定义了一些设备类,这里我们只需要为设备申请空间然后注册这个我们自己的input设备就可以啦。
static int buttons_init(void)
{
int i = 0;
/*1. 分配一个input_dev结构体*/
buttons_dev = input_allocate_device();
/*3. 注册*/
input_register_device(buttons_dev);
/*4. 硬件相关操作*/
return 0;
}
3.1、在定时器函数中上报事件:
关于事件的上报,这篇文章写的很详细,直接点击观看
我们通过上报事件这一种方式,来实现数据的传送,
if(pinval)
{
/* 松开:最后一个参数,0表示松开,1表示按下 */
//这里上报的设备为buttons_dev,类型为EV_KEY按键,上报的数据为pinsdesc->keyval,上报的数值为0
input_event(buttons_dev,EV_KEY,pindesc->key_val,0);
}
else
{
/* 按下 */
input_event(buttons_dev,EV_KEY,pindesc->key_val,1);
input_sync(buttons_dev);
}
四、总结:
其实,在了解了input系统的实现过程之后,我们编写代码反而变得比较容易了,因为很多工作框架已经帮助我们完成了。