在input子系统中,把驱动分为主要的两层,平台驱动层(handler)与设备驱动层(input_dev),连接这两层的是一个handle结构
如下图
如图所示,input_dev与一个具体的设备结构连接.
handle还有一个私有数据结构,用于连接不同平台驱动的进程描述符,如下面提及的tsdev结构
下面介绍具体的连接,以tsdev(触摸平台驱动)为例
(一).handler和input_dev在input子系统中的连接
在input子系统中的平台驱动句柄(handler)用一个input_handler_list链表进行连接
和handler差不多,input_dev在input子系统中是用input_dev_list进行连接
之后用input_device_id结构搜索互相匹配的设备
寻找到匹配的设备之后调用handler提供的connect进行连接
连接完成后input_dev添加进handler的队列,handler添加进input_devde队列,形成如下图
为什么要这样连接呢,因为不同的设备根据其使用者的需要可以表达为不同的抽象
例如一个触摸屏可以作为一个event设备,作为一个鼠标设备,也可以作为一个触摸设备,所以一个设备需要与多个平台驱动进行连接
而一个平台驱动也不只为一个设备服务,一个触摸平台驱动可能要为A,B,C3个触摸设备提供上层驱动,所以需要这样一对多的连接
(二) 进程打开,读取设备
打开:进程打开设备首先通过input的fops进行转换,将设备文件的fops转换成平台驱动的fops
然后进入handler的open里继续操作,主要为设置tsdev,tsdev的作用是连接tsdev_list
tsdev_list的作用是连接进程,触摸屏设备一般为只读设备,允许多个进程进行读取
连接结构如下图
读取:
读取主要是由wait_event_interruptible和wake_up_interruptible组成
进程在调用read之后,获取open时取得的tsdev_list,调用wait_event_interruptible等待触摸屏的点击,进入阻塞状态
触摸屏点击之后下层驱动调用input_report_xxx填充事件结构(tsdev为ts_event),填充完毕后调用input_sync报告,
然后event函数调用wake_up_interruptible唤醒read,将填充完毕的事件结构通过tsdev_list写入read的buffer中,一次read就完成了
转帖请注明来自:http://blog.chinaunix.net/u1/57901/showart_1073410.html 谢谢~
下面是对input.c tsdev.c 的源码分析 还没写完~ 大家先参考一下吧~
|
文件: |
内外input子系统.pdf |
大小: |
261KB |
下载: |
下载 | |
阅读(2882) | 评论(0) | 转发(4) |