static int xpt2046_read_values(struct XPT2046_TS_EVENT *ts_dev) { uint16 *ptmpdata; int ret = 0,cnt = 0; bool accept = false; int tmp_p = 0; ptmpdata = kzalloc(sizeof(uint16)*2, GFP_KERNEL); do { ptmpdata[0] = gLastZvalue[0]; ptmpdata[1] = gLastZvalue[1]; accept = xpt2046_pressure_filter(ts_dev); //accept = true; if(accept) { ptmpdata[0]= PT2046_read_op(ts_dev,READ_X); udelay(ADC_DELAYS); ptmpdata[1]= PT2046_read_op(ts_dev,READ_Y); udelay(ADC_DELAYS); gLastZvalue[0] = ptmpdata[0]; gLastZvalue[1] = ptmpdata[1]; ret++; } //printk("pressure = %d, x = %d y = %d accept = %d \n",gDebugData[0], ptmpdata[0], ptmpdata[1], accept); cnt++; } while(cnt<2||0!=TouchFilter(&ptmpdata[0],&ptmpdata[1],ts_dev->pendown)); tmp_p = tmp_save_ad_point_num % SAVEPOINTMAXNUM; if(ret) { ts_dev->x = gLastZvalue[0]; ts_dev->y = gLastZvalue[1]; if(cal_status_android < 5 && cal_status_android >= 0) { tmp_save_ad_point_x[tmp_p] = ts_dev->x; tmp_save_ad_point_y[tmp_p] = ts_dev->y; tmp_save_ad_point_num ++; } } else { ts_dev->x = 0; ts_dev->y = 4095; } //printk("xpt2046_read_values() ts_dev->x = %d, ts_dev->y = %d cal_status_android = %d tmp_save_ad_point_num = %d tmp_p = %d \n", // ts_dev->x, ts_dev->y, cal_status_android, tmp_save_ad_point_num, tmp_p); gDebugData[1] = ts_dev->x; gDebugData[2] = ts_dev->y; rk28printk("pressure = %d adx = %d ady = %d\n",gDebugData[0],gDebugData[1],gDebugData[2]); rk28printk("pressure = %d\n",gDebugData[0]); kfree(ptmpdata); return ret; }
/************************************************************** ** 函数名:ManageTouch ** 功能:触摸管理 ** 注意事项:研究中...笔中断有效时开始消抖(非阻塞延迟),->进入有效读TOUCH,每个循环读一次并检测笔中断,够10个循环则滤波出值. ***************************************************************/ void ManageTouch(void) { Touch_Cnt_Time++; /************************************************************** PEN为无效效 ***************************************************************/ if(GET_PEN_INT) { /************************************************************** 考虑这里也要使用消抖-释放消抖 ***************************************************************/ if(!(Touch_Flag&TOUCH_F_RELEASE)) { //如果之前有HOLD标志,则代表释放 if(Touch_Flag&TOUCH_F_HOLD) { Touch_Flag=TOUCH_F_NULL; Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_HOLD; T_Release_X=T_Hold_X; T_Release_Y=T_Hold_Y; } //否则之前只有PUSH标志,也代表释放 else if(Touch_Flag&TOUCH_F_PUSH) { Touch_Flag=TOUCH_F_NULL; Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_PUSH; T_Release_X=T_Push_X; T_Release_Y=T_Push_Y; } } return; } /************************************************************** PEN为有效 ***************************************************************/ //如果之前有释放状态,则从新开始判断触摸 if(Touch_Flag&TOUCH_F_RELEASE) { goto new_touch; } //-1.TOUCH_F_WAIT_HOLD标志,代表要开始计算等待保持时间 if(Touch_Flag&TOUCH_F_WAIT_HOLD) { if(Touch_Cnt_Time>=TOUCH_CNT_WAIT_HOLD_TIME) { Touch_Flag|=TOUCH_F_HOLD; Touch_Flag&=~TOUCH_F_WAIT_HOLD; T_Hold_X=T_Release_X; T_Hold_Y=T_Release_Y; } } //-1.HOLD并且非滤波标志 else if((Touch_Flag&TOUCH_F_HOLD)&&(!(Touch_Flag&TOUCH_F_FILTERING))) { Touch_Flag|=TOUCH_F_FILTERING; //则开始滤波 Filter_No=0; } //-3.PUSH标志并且非滤波标志*_* else if((Touch_Flag&TOUCH_F_PUSH)&&(!(Touch_Flag&TOUCH_F_FILTERING))) { if(Touch_Cnt_Time>=TOUCH_CNT_HOLD_TIME) //则开始计算BPK,时间到则又进入滤波 { Touch_Flag|=TOUCH_F_FILTERING; Filter_No=0; } } //-3.FLITERING-当没PUSH到PUSH的时候会进入这里一次,HOLD则连续进入 else if(Touch_Flag&TOUCH_F_FILTERING) { GetOneCoordinate(Filter_No); if((++Filter_No)==MAX_TOUCH_FILTER_NO) { if(!(Touch_Flag&TOUCH_F_PUSH)) //之前没有PUSH,则这个是属于PUSH的滤波 { TouchFilter(&T_Push_X,&T_Push_Y); Touch_Flag=TOUCH_F_PUSH; Touch_Cnt_Time=0; } else //属于HOLD的滤波 { TouchFilter(&T_Release_X,&T_Release_Y);//放到Release纯粹为了节省临时变量 Touch_Flag&=~TOUCH_F_FILTERING; Touch_Flag|=TOUCH_F_WAIT_HOLD; Touch_Cnt_Time=0; } } } //-4.BCK-消抖时间到,则转入滤波 else if(Touch_Flag&TOUCH_F_BCK_TIME) { if(Touch_Cnt_Time>=TOUCH_CNT_FLITER_TIME) { Touch_Flag=TOUCH_F_FILTERING; Filter_No=0; } } //-5.PUCH_NULL,置消抖标志 else { new_touch: Touch_Flag=TOUCH_F_BCK_TIME; Touch_Cnt_Time=0; } }