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