第六章:输入系统(4)-模拟输入系统驱动

上小节讲解了输入子系统的基本框架,该小节我们编写一个万能模拟输入驱动程序。linux 的输入子系统不进行讲解了,欢迎大家观看我的文章,在这里就当做大家对linux内核驱动已经比较了解了。最简单字符驱动的框架如下:
APP: open read write ioctl
启动: drv_open drv_ read drv_write drv_ioctl
硬件: 进行相应操作
但是在输入子系统中,前人已经定出了很多框架,比如我们一个应用层一个open函数,对应驱动层的多个open函数,具体是使用哪个,还需要进行参数指定,框图如下:
在这里插入图片描述
那么应用层怎么知道哪个才是他需要的呢?在dev/input下存在多个设备节点,每个设备节点都有对应的驱动,应用层只需要确定他想要的节点即可。一般来说dev/input/event0,2,3…是原始数据,没有加工的,如果想先获得处理过的数据,例如鼠标,我们可以open(ev/input/monsedev)找安卓中只使用了event.c。

我们硬件驱动需要做的相关工作:根据硬件状态上报数据(原始数据),如果是一个鼠标,我们可以先上报给monsedev,然后进行处理之后,monsedev再继续上报。一般编写流程如下:
1.分配/构造input_device结构体
2.注册:input_register_device(成功时通过connect找ev/input下会创建event节点)
3.有输入事件产生时,中断上报,input_event(dev,type,code,value)

下面我们怎么写出模拟驱动呢?步骤基本和上面一样,只是我们不在操作硬件,上报的时间是我们自己定义的事件。通过另外一个应用程序写进去的,那么为什么可以这样呢?

上面的图示中,驱动层分为了两层,当应用程序open之后调用read函数,在evd_read处,会进行堵塞,或者说休眠等待。他等待缓存区有数据可读,该缓存区域是evdev层分配的一段空间。在硬件驱动层察觉到中断之后,就会往这个缓存区写入数据(即上报数据),那么evd_read就会苏醒,从缓存区而获取到数据然后提交给应用层。是不是感觉层次很分明,如同第一个人(APP)叫第二个人(evdev层)去取数据,但是他不直接去拿,而是一个地方等待,等待第三个人(硬件相关驱动层)去数据给他,等待以后,第二个人在返回给第一个人。那么我们现在第三个人,不用硬件驱动就可以了,我们使用另外一个APP,往缓存区写入数据。

找andriod中,有一个可以直接当做第三个人的应用程序,我们看看如何使用,打开我么你的开发板,进入andriod系统之后,执行:
sendevent
我们可以到打印信息
use: sendevent device type code value
这个就是该程序的使用方法。

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/87811595