linux驱动开发之路(五)输入子系统

文章目录

  • 一、前言
  • 二、input输入子系统:
    • 2.1、定义:
    • 2.2、框架:
  • 三、代码编写:
    • 3.1、申请设备空间和注册input设备:
    • 3.1、在定时器函数中上报事件:
  • 四、总结:

一、前言

在前面的开发过程中,我们都是直接创建一个设备类,然后注册这一个类的设备。那么这样的方法无疑会带来一些问题,我们自己尚且可以调用这些类和设备,对于其他的开发者那可能就需要特殊的文档说明来帮助使用。为了避免这种情况,在linux中,存在一个linux输入子系统来管理输入设备。

二、input输入子系统:

2.1、定义:

Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析。
这篇文章比较详细的介绍了关于输入子系统的概念

  • 当然作为一个入门的开发者,对这个概念的理解也只能说是浅浅的知道,但是不妨在实际的开发中来体会用处的特点。

2.2、框架:

这是韦老师画的理解图:

linux驱动开发之路(五)输入子系统_第1张图片

  • 在这个框架中,主要分为两个部分,也就是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系统的实现过程之后,我们编写代码反而变得比较容易了,因为很多工作框架已经帮助我们完成了。

你可能感兴趣的:(linux驱动)