static irqreturn_t adc_irq(int irq, void *dev_id)
{
	static int cnt = 0;
	int adcdat0,adcdat1;
	static int x[4],y[4];
	
	adcdat0 = s3c_ts_regs ->adcdat0;
	adcdat1 = s3c_ts_regs ->adcdat1;
	/*优化措施 2 :如果ADC完成时,发现触摸笔已经松开,则丢弃此次结果*/
	if(s3c_ts_regs->adcdat0 & (1<<15))
	{
		/*已经松开*/
		enter_wait_pen_up_mode();
	}
	else
	{
//		printk("adc_irq cnt = %d, x=%d, y=%d \n ",++cnt,adcdat0 & 0x3ff,adcdat1 & 0x3ff);
		/*优化措施3: 多次测量求平均值*/
		x[cnt] = adcdat0 & 0x3ff;
		y[cnt] = adcdat1 & 0x3ff;
		++cnt;
		if (cnt==4)
		{
			printk("adc_irq cnt = %d, x=%d, y=%d \n ",cnt,(x[0]+x[1]+x[2]+x[3])/4,(y[0]+y[1]+y[2]+y[3])/4);
			cnt = 0;
			enter_wait_pen_up_mode();
		}
		else
		{
			enter_measure_xy_mode();
			start_adc();
		}
	}
	return IRQ_HANDLED;
}
Exemple #2
0
static void s3c_ts_timer_function(unsigned long data)
{
	int adcdat0, adcdat1;
	int updown;
	
	/* 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 */
	adcdat0 = s3c_ts_regs->adcdat0;
	adcdat1 = s3c_ts_regs->adcdat1;

	/* dat0和dat1中bit15都是0, updown才是0, 0是down state */
	updown =! (!(adcdat0 & (1<<15))) && (!(adcdat1 & (1<<15)));
	
	if (s3c_ts_regs->adcdat1 & (1<<15))
//	if(updown)
	{
		/* 已经松开 */
		enter_wait_pen_down_mode();
	}
	else
	{
		/* 测量X/Y坐标 */
		enter_measure_xy_mode();
		start_adc();
	}
}
static irqreturn_t adc_irq(int irq, void *dev_id)
{
	static int cnt = 0;
	static int x[4], y[4];
	int adcdat0, adcdat1;
	
	
	/* 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 */
	adcdat0 = s3c_ts_regs->adcdat0;
	adcdat1 = s3c_ts_regs->adcdat1;

	if (s3c_ts_regs->adcdat0 & (1<<15))
	{
		/* 已经松开 */
		cnt = 0;
		input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
		input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
		input_sync();
		enter_wait_pen_down_mode();

	}
	else
	{
		// printk("adc_irq cnt = %d, x = %d, y = %d\n", ++cnt, adcdat0 & 0x3ff, adcdat1 & 0x3ff);
		/* 优化措施3: 多次测量求平均值 */
		x[cnt] = adcdat0 & 0x3ff;
		y[cnt] = adcdat1 & 0x3ff;
		++cnt;
		if (cnt == 4)
		{
			/* 优化措施4: 软件过滤 */
			if (s3c_filter_ts(x, y))
			{			
				//printk("x = %d, y = %d\n", (x[0]+x[1]+x[2]+x[3])/4, (y[0]+y[1]+y[2]+y[3])/4);
				input_report_abs(s3c_ts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);
				input_report_abs(s3c_ts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);
				input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);
				input_report_key(s3c_ts_dev, BTN_TOUCH, 1);
				input_sync();
			}
			cnt = 0;
			enter_wait_pen_up_mode();

			/* 启动定时器处理长按/滑动的情况 */
			mod_timer(&ts_timer, jiffies + HZ/100);
		}
		else
		{
			enter_measure_xy_mode();
			start_adc();
		}		
	}
	
	return IRQ_HANDLED;
}
Exemple #4
0
static irqreturn_t adc_irq(int irq, void *dev_id)
{
	static int cnt = 0;
	int adcdat0, adcdat1;
	static int x[4], y[4];
	int updown;
	
#if 1
	/* 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 */
	adcdat0 = s3c_ts_regs->adcdat0;
	adcdat1 = s3c_ts_regs->adcdat1;

	/* dat0和dat1中bit15都是0, updown才是0, 0是down state */
	updown =! (!(adcdat0 & (1<<15))) && (!(adcdat1 & (1<<15)));

	if (updown)	/* 已经松开 */
	{
		cnt = 0;
		enter_wait_pen_down_mode();	/* 进入等待按下模式 */
	}
	else			/* 已经按下 */
	{
//		printk("adc_irq cnt = %d, x = %d, y = %d\n", ++cnt, adcdat0 & 0xfff, adcdat1 & 0xfff);
//		enter_wait_pen_up_mode();

		/* 优化措施3: 多次测量求平均值 */
		x[cnt] = adcdat0 & 0xfff;
		y[cnt] = adcdat1 & 0xfff;
		++cnt;

		if (cnt == 4)
		{
			cnt = 0;
			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();	/* 进入等待弹起模式 */
		}
		else
		{
			enter_measure_xy_mode();
			start_adc();
		}
	}
#endif

#if 0		
	printk("adc_irq cnt = %d, x = %d, y = %d\n", ++cnt,(int) (s3c_ts_regs->adcdat0 & 0xfff), (int) (s3c_ts_regs->adcdat1 & 0xfff));
	enter_wait_pen_up_mode();
#endif	

	return IRQ_HANDLED;
}
// 3th里面的自动分离模式启动后需要的中断函数注册,具体函数内容在4.2里面
static irqreturn_t adc_irq(int irq, void *dev_id)
{

	static int cnt = 0;
	static int x[4],   y[4]; // 优化措施3  测量保存4次,然后求平均值
	int adcdat0, adcdat1;  // 寄存器的bit[15]是判断松开还是按下的  手册447

	// X,Y的值存在ADCDAT0 AND ADCDAT1寄存器里面  手册442  part3
	// 最低10位为x坐标值,不过这个值是电压值而已,和坐标值没有关系
		
	//  &&&&&&&&&&&&***********  如果ADC启动完成时,发现触摸笔已经松开,则测量值已经不准确,丢弃此次结果。
		
	adcdat0 = s3c_ts_regs->adcdat0 ;
	adcdat1 = s3c_ts_regs->adcdat1 ;

	if (s3c_ts_regs->adcdat0 & (1<<15))
	{
		// 如果触摸笔已经松开
		cnt = 0;  // 优化3 中要每4次求一次平均值
		enter_wait_pen_down_mode();
	}
	else
	{
		//printk ("adc_irq cnt = %d, x = %d,	y = %d\n", ++cnt, s3c_ts_regs->adcdat0 & 0x3ff, adcdat1 & 0x3ff);
		// *******运行到这里,如果没有等待松开操作,则开发板只进行一次测量后就没有反映了,所以在这里要加上如下语句。

		// 优化措施3 多次测量求平均值
		x[cnt] = s3c_ts_regs->adcdat0 & 0x3ff;
		y[cnt] = s3c_ts_regs->adcdat1 & 0x3ff;
		++cnt;
		if (cnt == 4)
		{
			//printk ("adc_irq cnt = %d, x = %d,	y = %d\n", ++cnt, (x[0]+x[1]+x[2]+x[3])/4,  (y[0]+y[1]+y[2]+y[3])/4);
			// 上面这行错误代码,错误在 ++cnt.
			printk (" x = %d,	y = %d\n", (x[0]+x[1]+x[2]+x[3])/4,  (y[0]+y[1]+y[2]+y[3])/4);
			cnt = 0;
			enter_wait_pen_up_mode();			
		}
		else
		{
			enter_measure_xy_mode();
			start_adc();	
		}

		enter_wait_pen_up_mode();  // 测量完毕要等待触摸笔松开

	}

	
	return IRQ_HANDLED;
}
static void s3c_ts_timer_function(unsigned long data)
{
	if (s3c_ts_regs->adcdat0 & (1<<15))
	{
		/* 已经松开 */
		enter_wait_pen_down_mode();
	}
	else
	{
		/* 测量X/Y坐标 */
		enter_measure_xy_mode();
		start_adc();
	}
}
static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
	if(s3c_ts_regs->adcdat0 & (1<<15))
	{
		printk("pen up\n");
		enter_wait_pen_down_mode();
	}
	else
	{
//		printk("pen down\n");
//		enter_wait_pen_up_mode();
		enter_measure_xy_mode();
		start_adc();
	}
	return IRQ_HANDLED;
}
Exemple #8
0
static irqreturn_t stylus_action_irq_handler(int irq, void *dev_id){
	printk(KERN_ERR "Stylus Action\n");

	if(!(pRegs->rADCDATA0 & (1<<15))){//Sytlus down detected
		printk(KERN_DEBUG "Stylus Down\n");
		enter_measure_xy_mode();
		Enable_start_ADC();
		wait_stylus_UPorDOWN(UP);
	}
	else{
		printk(KERN_DEBUG "Stylus Up\n");
		TS_PostEvent(UP,0,0);
	}
	
	return IRQ_HANDLED;
}
static void tiny_ts_timer_function(unsigned long data)
{
	if (tiny_ts_regs->tsdatx1 & (1<<15))
	{
		/* 已经松开 */
		input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
		input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
		input_sync(s3c_ts_dev);
		enter_wait_pen_down_mode();
	}
	else
	{
		/* 测量X/Y坐标 */
		enter_measure_xy_mode();
		start_adc();
	}
}
static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
	if (tiny_ts_regs->tsdatx1 & (1<<15))
	{
		//printk("pen up\n");
		input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
		input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
		input_sync(s3c_ts_dev);
		enter_wait_pen_down_mode();
	}
	else
	{
		//printk("pen down\n");
		//enter_wait_pen_up_mode();
		enter_measure_xy_mode();
		start_adc();
	}
	return IRQ_HANDLED;
}
static irqreturn_t pen_down_up_irq(int irq, void *dev_id)

{
	if (s3c_ts_regs->adcdat0 & (1<<15))
	{
		printk("pen up\n");  //松开才能等待下一次等待模式
		enter_wait_pen_down_mode();
	}
	else
	{
	// 3th 开始,进行启动ADC,转换x,y坐标
	//printk("pen down\n"); //按下进入等待松开模式
	//enter_wait_pen_up_mode();
	// 触摸屏有xy分别分离模式和自动分离模式,我们取后一种自动分离模式,这种简单。
	enter_measure_xy_mode();
	start_adc();
	}
	return IRQ_HANDLED;
}
Exemple #12
0
static irqreturn_t pen_down_up_irq(int irq, void *dev_id)
{
	enter_no_operation_mode();
	
	if (s3c_ts_regs->adcdat0 & (1<<15))
	{
		printk("pen up\n");
		enter_wait_pen_down_mode();
	}
	else
	{
		printk("pen down\n");
//		enter_wait_pen_up_mode();
		enter_measure_xy_mode();
		start_adc();
	}

	/* 2416数据手册P554,XY_PST=0 */
	enter_no_operation_mode();
	
	return IRQ_HANDLED;
}