S3C2410的触摸屏控制
(1).基础知识
要正确使用触摸屏,首先就要正确获取触摸屏的坐标。上一节我们已经介绍了触摸屏的硬件原理,了解到,需要分时给触摸屏的X层或Y层外加电压,再通过测量触点电压得到触点坐标。那么触摸屏控制器的作用就是要实现为触摸屏的X层或Y层分时提供电压,同时还要获取触点电压,并通过模数转换器(ADC)将这个电压模拟量换成数字量。
1.1 S3C2410的ADC及触摸屏接口原理
图 14-2-1 s3c2410的ADC及触摸屏接口
图 1-1 s3c2410与触摸屏连接示意图
如图1-1所示,S3C2410内部集成的一个外部晶体管控制器,为四线电阻式触摸屏提供nYMON、YMON、nXPON和XMON控制信号,这些控制信号用来实现对四个外部晶体管(需要硬件电路设计人员自行添加)的通断控制,进而实现分时为触摸屏的X导电层、Y导电层提供电压。注意到,外部晶体管控制器还提供了一个引脚用来控制一个内部晶体管,该晶体管的导通与否决定了AIN7是否被上拉到VDDA_ADC。AIN7还连接到了S3C2410的中断发生器。另外,S3C2410内置了一个8通道(AIN[7..0])的10位ADC,该ADC能以500KS/S的采样速率将外部的模拟信号转换为10位分辨率的数字量。因此,ADC能与触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。触点的X与Y坐标对应的电压信号分别被接入ADC的AIN7和AIN5通道。在正常工作时,触摸屏通常有两种工作状态,一种是等待中断状态,此时触摸屏不处在触摸状态,另一种是触摸屏处于触摸状态,此时S3C2410需要实现坐标转换。与这两种工作状态相对应的,触摸屏的4个控制引脚就有三种连接情况,分别是等待中断的引脚连接情况,X轴坐标转换时的引脚连接情况,Y轴坐标转换时的引脚连接情况,简称这三种连接情况分别为引脚连接状态1、引脚连接状态2、引脚连接状态3。
引脚连接状态 | XP | XM | YP | YM |
1 | Pull-up | Hi-Z | AIN5 | GND |
2 | External Voltage | GND | AIN5 | Hi-Z |
3 | AIN7 | Hi-Z | External Voltage | GND |
表 1-2 触摸屏引脚连接状态
Pull-up代表将XP通过上拉电阻连接到VDDA_ADC,Hi-Z代表将相应的引脚设置为高阻态,也就是断开状态,External Voltage代表将相应的引脚连接到触摸屏的外接电源,GND代表将相应的引脚连接到地。
当没有接触触摸屏时,触摸屏就始终处于等待中断状态,这时相对应的就是引脚连接状态1。当接触触摸屏时,由于等待中断状态下引脚连接状态1的作用,此时首先会触发中断,进入中断服务程序,在程序中将引脚连接状态1改变成应交连接状态2,获得X轴的坐标转换结果,之后再将引脚连接状态2改变成引脚连接状态3,获得Y轴的坐标转换结果,最后在退出中断服务程序前还要将引脚连接状态设置成引脚连接状态1,对应等待中断状态。
(1)等待中断
从图1-1可以看出,由于XP接上拉电阻,而XM处于断开状态,所以沿X导电层是一个等势体,并且该等势体一头接着上拉电阻,所以此时X轴方向导电层电压被上拉电阻拉高,因此XP引脚的电压为高,由于XP始终连接通道A[7],而A[7]又与中断发生器相连,所以此时传到中断发生器的电压为高,故不发生中断,触摸屏一直维持着等待发生中断状态。另一方面,由于YP接通道A[5],YM接地,所以整个Y导电层电压等于地电压。当触摸屏接触时,上下导电层在触点处连通,此时X导电层的电压将被拉低,这个电压通过A[7]传到中断发生器,触发中断。
(2)坐标转换
收到中断后,S3C2410将进入坐标转换过程。先介绍X轴方向坐标转换过程,此时4个控制引脚处于引脚连接状态2,由于XP接外加参考电压,XM接地,所以在X轴方向形成均匀电压降,而YP接通道A[5],YM断开,故Y轴方向的导电层形成一个等势体,由于此时两导电层有接触,故触点处X轴方向的电压会通过Y轴方向的等势体传到A[5]通道,S3C2410将这个电压取出并转换,最后就可以得到X轴方向的电压。同理,将控制引脚置于引脚连接状态3便可实现Y轴坐标转换过程。
1.2 S3C2410的ADC和触摸屏接口模式
通过配置S3C2410的ADCTSC寄存器的AUTO_PST、XY_PST和ADCCON寄存器的STDBM,可以令触摸屏接口工作于5种模式,分别介绍如下。
(1)普通转换模式(Normal Converson Mode)
普通转换模式(AUTO_PST = 0,XY_PST = 0)用来进行一般的ADC转换,例如通过ADC测量电池电压等。
(2)独立X/Y位置转换模式(Separate X/Y Position Conversion Mode)
独立X/Y轴坐标转换模式其实包含了X轴模式和Y轴模式。为获得X、Y坐标,需首先进行X轴的坐标转换(AUTO_PST = 0,XY_PST = 1),X轴的转换数据会写到ADCDAT0寄存器的XPDAT中,等待转换完成后,触摸屏控制器会产生INT_ADC中断。然后,进行Y轴的坐标转换(AUTO_PST = 0,XY_PST = 2),Y轴的转换数据会写到ADCDAT1寄存器的YPDAT中,等待转换完成后,触摸屏控制器也会产生INT_ADC中断。
(3)自动(连续)X/Y位置转换模式(Auto X/Y Position Conversion Mode)
自动(连续)X/Y位置转换模式(AUTO_PST = 1,XY_PST = 0)运行方式是触摸屏控制自动转换X位置和Y位置。触摸屏控制器在ADCDAT0的XPDATA位写入X测定数据,在ADCDAT1的YPADATA位写入Y测定数据。自动(连续)位置转换后,触摸屏控制器产生INT_ADC中断。
(4)等待中断模式(Wait for Interrupt Mode)
当触摸屏控制器等待中断模式时,它等待触摸屏触点信号的到来。当触点信号到来时,控制器产生INT_TC中断信号。然后,X位置和Y位置能被适当地转换模式(独立X/Y位置转换模式或自动X/Y位置转换模式)读取到。
(5)待机模式(Standby Mode)
当ADCCON寄存器的STDBM位置1时,待机模式被激活。在这种模式下,A/D转换动作被禁止,ADCDAT0的XPDATA位和ADXDATA1的YPDAT保留以前被转换的数据。
1.3 S3C2410的ADC及触摸屏控制寄存器
(1)ADC控制寄存器:ADCCON
参数 | 位 | 描述 |
ECFLG | [15] | 这一位是转换结果的标志位,只读。 0:正处于模数转换过程中,1:模数转换已经结束。 |
PRSCEN | [14] | 预指数使能位 |
PRSCVL | [13:6] | 预指数,跟AD转换的时间有关 |
SEL_MUX | [5:3] | 选择通道位,选中的通道上的电压被连接到模数转换器 000:AIN0 001:AIN1 010:AIN2 011:AIN3 100:AIN4 101:AIN5 110:AIN6 111:AIN7 |
STDBM | [2] | 启动模式选择位 0:正常工作模式, 1:待机模式 |
READ_START | [1] | 读启动模式使能位 |
ENABLE_START | [0] | 启动使能位 |
表 14-2-2 ADC控制寄存器
这里有必要解释一下PRSCEN 和PRSCVL两个参数,当PRSCEN为1时,设置PRSCVL的值将会决定AD转换的时间。ADC使用的时钟是系统的PCLK,假设PCLK = 50MHz,设置PRSCVL的值为49,那么:
A/D 转换的频率 = 50MHz / (49+1) = 1 MHz
A/D 转换的时间 = 1 /(1MHz / 5cycles)=5 uS
(2)ADC触摸屏控制寄存器:ADCTSC
该寄存器主要是通过控制触摸屏的各个控制引脚来决定触摸屏转换状态,使其进行坐标轴转换,或者是进入中断状态,等待触摸屏中断。
参数 | 位 | 描述 |
保留 | [8] | 0表示触摸屏被按下,1表示触摸屏松开 |
YM_SEN | [7] | 选择YMON引脚的输出 0:YMON=0,YM=Hi-Z , 1:YMON=1,YM=GND |
YP_SEN | [6] | 选择NYPON引脚的输出 0:nYPON=0,YP=External Voltage , 1:nYPON=1,YP=AIN5 |
XM_SEN | [5] | 选择XMON引脚的输出 0:XMON=0,XM=Hi-Z , 1:XMON=1,XM=GND |
XP_SEN | [4] | 选择NXPON引脚的输出 0:nXPON=0,XM=External Voltage , 1:nXPON=1,XP=AIN7 |
PULL-UP | [3] | XP引脚的上拉电阻使能位,在等待中断状态要用到该项 0: XP上拉使能, 1:XP上拉禁止 |
AUTO_PST | [2] | 普通转换模式和自动转换选择位 0:普通转换模式, 1:自动转换模式 |
XY_PST | [1:0] | 操作选择 00:无操作, 01:X坐标转换 10:Y坐标转换, 11: 等待中断 |
表 1-3 ADC触摸屏控制寄存器
(3)ADC数据寄存器0:ADCDATA0
该寄存器是只读的,其中控制位都是标志位和结果位。
参数 | 位 | 描述 |
UPDOWN | [15] | 触摸状态。0:按下状态, 1:抬起状态 |
AUTO_PST | [14] | 普通转换模式和自动转换状态位 0:普通转换模式, 1:自动转换模式 |
XY_PST | [13:12] | 操作状态 00:无操作, 01:X坐标转换状态 10:Y坐标转换状态, 11: 中断等待状态 |
保留 | [11:10] | 保留位 |
XPDATA | [9:0] | X坐标转换结果 |
表 1-4 ADC数据寄存器0
(4)ADC数据寄存器1:ADCDATA1
该寄存器是只读的,其中控制位都是标志位和结果位。
参数 | 位 | 描述 |
UPDOWN | [15] | 触摸状态。0:按下状态, 1:抬起状态 |
AUTO_PST | [14] | 普通转换模式和自动转换状态位 0:普通转换模式, 1:自动转换模式 |
XY_PST | [13:12] | 操作状态 00:无操作, 01:X坐标转换状态 10:Y坐标转换状态, 11: 中断等待状态 |
保留 | [11:10] | 保留位 |
YPDATA | [9:0] | Y坐标转换结果 |
表 1-5 ADC数据寄存器1
(5)ADC延时寄存器:ADCDLY
该寄存器是只读的,其中控制位都是标志位和结果位。
参数 | 位 | 描述 |
DELAY | [15:0] | (1)在普通转换模式,独立X/Y坐标转换模式,自动坐标转换模式下,X/Y坐标转换的延时时间 (2)在等待中断模式下,当发生触摸中断时,该寄存器在数ms间隔内产生INT_TC中断 |
表 1-6 ADC延时寄存器
1.4 S3C2410的触摸屏中断控制
S3C2410为ADC分配了31号中断INT_ADC,该中断还有两个子中断,一个是INT_TC,一个是INT_ADC。
当触摸屏处于等待中断状态时,如果在触摸屏上有触摸动作,就产生INT_TC中断,该中断首先会在SUBSRCPND寄存器中登记,然后经过INTSUBMASK寄存器检验,如果此次级中断未被屏蔽,就会继续与主中断源汇合,此时,主中断INT_ADC将在SRCPND寄存器中登记,再经过INTMSK的检验,如果还是没有被屏蔽且此时没有其他优先级更高的中断响应,该中断就会顺利在INTPND中登记并执行。
当触摸屏处于坐标转换状态,如果X轴或者Y轴的坐标转换完成后,就会产生INT_ADC子中断,该中断的处理过程与INT_TC的处理过程一样。主要包括中断屏蔽寄存器(INTSUBMSK和INTMSK的对应位设置为允许中断)以及中断模式寄存器(INTMOD的对应位设为IRQ模式)。
(2)代码过程
(1)宏定义
Ø WAIT4INT(x)
(((x)<<8)|S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|S3C2410_ADCTSC_XY_PST(3))
定义WAIT4INT(x)宏,用来配置ADCTSC寄存器,使触摸屏工作于等待中断状态。宏定义的表达式中,各项的具体含义需要可以查看表14-2-3关于ADCTSC寄存器的说明,以及内核中S3C2410_ADCTSC_YM_SEN,S3C2410_ADCTSC_YP_SEN等宏的定义
Ø AUTOPST
(S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|\S3C2410_ADCTSC_AUTO_PST|S3C2410_ADCTSC_XY_PST(0))
定义AUTOPST宏,在驱动程序中,这个宏与S3C2410_ADCTSC_PULL_UP_DISABLE宏进行或运算以后用来配置ADCTSC寄存器,使触摸屏工作于自动X/Y坐标转换状态。
上面两个宏定义中用到的S3C2410_ADCTSC_YM_SEN,S3C2410_ADCTSC_YP_SEN等宏,在asm/plat-s3c/regs-adc.h中定义。
(3)函数
Ø s3c2410_ts_connect
static inline void s3c2410_ts_connect(void)
{
s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
}
该函数用来配置GPG[12..15]为触摸屏对应的功能。
Ø touch_timer_fire
touch_timer_fire函数在两个地方被调用,一个是在INT_TC的中断处理函数stylus_updown中,另一个是在定时器处理函数s3c2410_ts_timer中。实现的功能如下:
当发生触摸动作的时候,产生INT_TC中断,在该中断的处理函数stylus_updown中,先读取pendown的值,如果该值为1,表示确实有触摸动作,于是调用touch_timer_fire函数,此时ts.count的值为0,直接启动AD转换。AD转换的模式设置为自动X/Y坐标转换模式。
每次AD转换完成以后会产生INT_ADC中断,执行该中断处理函数stylus_action,在stylus_action函数中,会启动(1<<shift)次AD转换,每做完一次AD转会都会将得到的坐标值进行累加,同时ts.count加1。直到ts.count为(1<<shift),开启定时器timer,并配置ADCTSC寄存器使触摸屏重新进入等待中断状态。
当定时器timer溢出时,执行定时器处理函数s3c2410_ts_timer,该函数又会调用touch_timer_fire,此时ts.count的值为(1<<shift),不为0,于是通过将累加得到的坐标值右移shift位,得到坐标平均值,交给事件处理层(Event Handler)处理。
Ø INT_TC中断处理函数stylus_updown.当产生屏幕动作时,执行此函数!
Ø INT_ADC中断处理函数stylus_action。产生一次ADC转换时,执行此函数。
Ø static int __devinit s3c2410ts_init(void)(驱动注册函数)。
Ø static void __exit s3c2410ts_exit(void)(驱动卸载函数)。