努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/05/20/6434725.aspx
S3C2440支持的是4线电阻式触摸屏,这里简单说一下触摸屏基本原理,目前的触摸屏种类有:阻型触摸屏,容性触摸屏,多点触摸。阻性触摸屏通常由三部分组成:上下两层透明的(ITO氧化铟)导体层,两层导体之间的间隔层和电极。触摸屏工作时,上下导体层各自构成了一个电阻网络,分别称为X层,Y层,X层在左右两电极,Y层在上下两电极分别引出信号,一共引出4个信号,构成所谓的4线电阻。当某一层加上电压时,会在该网络上形成电压梯度。如有外力使得上下两层在某一点接触,则在电极未加电压的另一层可以测得接触点的电压。得到的电压值通过A/D转换,就可相应的判断接触点的坐标。说白了,阻性触摸屏可以想象成两个方向的滑动变阻,当手点上时两个接触面被接触上,接触位置不一样相当于滑动位置不一样。
再来说一下S3C2440使用的ADC控制器,是一个10位的8通道的模数转换器。在2.5MHz的A/D转换时钟下,最大的转换速率可达500KSPS(SPS:sample per second,每秒采样的次数)。S3C2440的4个控制信号的引脚与AD的4个模拟信号输入引脚复用。从下图中可以看出ADC和触摸屏只有一个A/D转换器(A/D Converter),可以通过设置寄存器来选择对哪路模拟信号(多达8路)进行采样。图中有两个中断信号:INT_ADC,INT_TC,前者表示A/D转换器已经转换完毕,后者表示触摸屏被按下了。
在Linux内核的触摸屏驱动中采用了延时进行消抖和算术平均值法进行滤波,这里分析一下s3c2410_ts程序,首先来看模块的初始化函数:
下面来看一下IRQ_TC的中断处理函数:
下面看一下这个实际进行中断处理的函数:
如果AD转换完成,会调用AD完成的中断处理程序: