Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1342635
  • 博文数量: 244
  • 博客积分: 1039
  • 博客等级: 少尉
  • 技术积分: 1562
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 09:40
文章分类

全部博文(244)

文章存档

2021年(2)

2019年(6)

2018年(2)

2014年(1)

2013年(187)

2012年(47)

分类: LINUX

2013-01-17 17:06:43

原文地址:内外Input子系统 作者:superfight

在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
下载: 下载
阅读(480) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~