2015年8月28日:至此工作一年有余,分享一些linux模块的学习经验和学习内容给初学者,还望对初学者们有点帮助。
初学安卓底层驱动开发,首先我们肯定要找一个切入点,input子系统是再好不过的一个切入点。熟悉input子系统以后可以再学习sensor模块,这里会涉及到HAL层的知识,这样对于理解其他的模块有很大的帮助。
下面开始input子系统的架构分析:
input子系统主要和触摸屏、鼠标、MSR(磁卡)、hid设备、游戏手柄等有关,这些设备都分别有各自的驱动程序,这里不去一一说明,以下以触摸屏为例来介绍input子系统:
1.硬件基础(作为开发人员应该熟知硬件的工作原理):
电容屏工作原理:
电容屏主要分为表面式电容屏(SCT,SurfaceCapacitive Touch)和投射式电容屏(PCT, Projected Capacitive Touch),其工作原理主要借助耦合电容和寄生电容的容值来断定手指的位置。电容的电极采用ITO铟锡氧化物,ITO薄膜是一种n型半导体材料,具有高的导电率、高的可见光透过率、高的机械硬度和良好的化学稳定性。具体不再赘述,读者若有疑问,可以提出共同探讨。
2.软件主要设计的文件:
2.1 内核层次:
输入子系统由设备驱动层、输入子系统核心层和事件处理层组成。
即input.c(核心层)、evdev.c/mousedev.v/joydev.c(事件处理层) 、各类输入设备驱动程序(驱动层)。
•设备驱动层(inputdevice)提供对硬件寄存器的读写访问,将底层硬件对用户输入访问的响应转换为标准的输入事件;
•核心层(inputcore)对下提供了设备驱动层的编程接口(事件上报、设备注册等),对上提供了事件处理层的编程接口;
•事件处理层(inputhandler)为用户空间的应用程序提供统一访问设备的接口,如open,read,write等等;
以下分析:
1.注册过程:
注册设备
以上过程完成设备的注册和设备的匹配,读者可以跟随流程图静心摸索。
2.事件上报:
凡是底层驱动,无不是调用input_event等类似的接口来上报事件的,鼠标上报按键事件,触屏上报abs事件。
事件处理
以上流程主要是把事件放到buffer中,buffer中数据会在inputreader.cpp中被eventhub.cpp中的getevent使用evdev.c中的函数操作集操作,诸如读取,写入等等。
本文从宏观上描述了input子系统kernel层次的的工作流程,一些细节上的问题就需要读者自己去钻研。