关于enter_measure_xy_mode()函数对触摸屏adc转换稳定性的影响

写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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42666958/article/details/86755118