基本上所以的2440的触摸屏的驱动都有一个定时器,这是因为触摸屏有一个特性,在转换的模式下没有办法判断,笔尖的按下或抬起,所以一般都会在ADC中断处理函数里面先设置为等待模式,然后修改定时器的值,然后在定时器里判断笔尖的状态,再决定转进转换模式,还是等待模式。其实这里就是很简单的思想,就是当读完一个ADC的值后,然后等待笔尖提起,要是过一段时间笔尖还是没有提起,就开始转换,也就是交加进行。其实也可以去了定时器,就是在ADC中断处理函数用延时函数,那样子更加便于理解,但是浪费资源
static irqreturn_t adc_irq(int irq, void *dev_id)
{
unsigned long i=0;
unsigned long k,l;
static int cnt = 0;
static int x[4], y[4];
int adcdat0, adcdat1;
printk("test\n");
/* 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 */
adcdat0 = s3c_ts_regs->adcdat0;
adcdat1 = s3c_ts_regs->adcdat1;
x[0] = adcdat0 & 0x3ff;
y[0] = adcdat1 & 0x3ff;
/* 优化措施4: 软件过滤 */
printk("x = %d, y = %d\n", (x[0])/*+x[1]+x[2]+x[3])/4*/, (y[0])/*+y[1]+y[2]+y[3])/4*/);
enter_wait_pen_up_mode();
mdelay(30);//延时等待笔尖抬起
if(status_flag)//如果笔记没有抬起就转换
{
enter_measure_xy_mode();
start_adc();
}
*/
}
return IRQ_HANDLED;
}
{
if (s3c_ts_regs->adcdat0 & (1<<15))
{
status_flag = 0;
printk("pen up\n");
enter_wait_pen_down_mode();
}
else
{
status_flag = 1;
printk("pen down\n");
enter_wait_pen_up_mode();
enter_measure_xy_mode();
start_adc();
}
return IRQ_HANDLED;
}