写s3c2440触摸屏驱动的时候,发现进入adc_irq函数的else块时,尽管adctsc寄存器的配置没改变,但如果不重写一次enter_measure_xy_mode()的话,adc转换出来的坐标(尤其是Y轴)将会很不稳定
未重写enter_measure_xy_mode():
static irqreturn_t adc_irq(int irq,void *dev_id)
{
static int cnt = 0;
static int adcdat0 = 0,adcdat1 = 0;
if(cnt == 3)
{
adcdat0 += (s3c_ts_regs->adcdat0 & 0x3ff);
adcdat1 += (s3c_ts_regs->adcdat1 & 0x3ff);
//printk("average:x = %d, y = %d\n",adcdat1/4,adcdat0/4);
input_report_abs(s3c_ts_dev, ABS_X, adcdat1/4);
input_report_abs(s3c_ts_dev, ABS_Y, adcdat0/4);
input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);
input_report_key(s3c_ts_dev, BTN_TOUCH, 1);
input_sync(s3c_ts_dev);
cnt = 0;
adcdat0 = 0;
adcdat1 = 0;
enter_wait_pen_up_mode();
mod_timer(&ts_timer,jiffies + HZ/100);
}
else
{
adcdat0 += (s3c_ts_regs->adcdat0 & 0x3ff);
adcdat1 += (s3c_ts_regs->adcdat1 & 0x3ff);
cnt++;
start_adc();
}
return IRQ_HANDLED;
}
重写enter_measure_xy_mode():
static irqreturn_t adc_irq(int irq,void *dev_id)
{
static int cnt = 0;
static int adcdat0 = 0,adcdat1 = 0;
if(cnt == 3)
{
adcdat0 += (s3c_ts_regs->adcdat0 & 0x3ff);
adcdat1 += (s3c_ts_regs->adcdat1 & 0x3ff);
//printk("average:x = %d, y = %d\n",adcdat1/4,adcdat0/4);
input_report_abs(s3c_ts_dev, ABS_X, adcdat1/4);
input_report_abs(s3c_ts_dev, ABS_Y, adcdat0/4);
input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);
input_report_key(s3c_ts_dev, BTN_TOUCH, 1);
input_sync(s3c_ts_dev);
cnt = 0;
adcdat0 = 0;
adcdat1 = 0;
enter_wait_pen_up_mode();
mod_timer(&ts_timer,jiffies + HZ/100);
}
else
{
adcdat0 += (s3c_ts_regs->adcdat0 & 0x3ff);
adcdat1 += (s3c_ts_regs->adcdat1 & 0x3ff);
cnt++;
enter_measure_xy_mode();
start_adc();
}
return IRQ_HANDLED;
}