当我们按下触摸屏时:
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;
}