当我们按下触摸屏时:
1,首先进入触摸屏中断,RQ_TC
2,如果触摸屏是被按下的状态,则调用touch_timer_fire启动ADC中断adc_irq
3,如果1个时间滴答到来则进入定时器服务程序touch_timer_fire
4,判断触摸屏是否仍然处于按下状态
5,如果是,则上报事件和转换的数据,并重启ADC转换,重复第(2)步
6,如果不是(松开),则上报事件和转换的数据,本次转换完成
函数追踪:
/*触摸屏中断服务程序*/
static irqreturn_t stylus_irq(int irq, void *dev_id)
{
//printk("stylus_irq\n");
/*用于记录这一次AD转换后的值*/
unsigned long data0;
unsigned long data1;
bool down;
/*本次读取时为了判断,还有获取坐标 */
data0 = readl(ts.io + S3C2410_ADCDAT0);
data1 = readl(ts.io + S3C2410_ADCDAT1);
/*在等待中断的时候,获取触摸屏按下的状态*/
down = get_down(data0, data1);
/* TODO we should never get an interrupt with down set while
* the timer is running, but maybe we ought to verify that the
* timer isn't running anyways. */
/*如果触摸屏被按下,则启动ADC*/
if (down)
s3c_adc_start(ts.client, 0, 1 << ts.shift);
else/*如果是抬起状态,就结束了这一次的操作,所以就释放ADC资源的占有*/
dev_dbg(ts.dev, "%s: count=%d\n", __func__, ts.count);
if (ts.features & FEAT_PEN_IRQ) {
/* Clear pen down/up interrupt 清中断*/
writel(0x0, ts.io + S3C64XX_ADCCLRINTPNDNUP);
}
return IRQ_HANDLED;
}
/*定时器中断服务程序*/
/*如果是按下状态,则调用touch_timer_fire函数来启动ADC转换*/

本文详细阐述了触摸屏中断RQ_TC发生时的处理过程,包括:1) 触摸屏中断服务程序启动ADC;2) 定时器中断服务程序判断触摸屏状态并上报事件;3) ADC中断服务程序进行数据转换。整个流程确保了触摸屏按下和松开状态的准确上报。

1万+

被折叠的 条评论
为什么被折叠?



