static int tpd_touchinfo(tinno_ts_data *ts, tinno_ts_point *touch_point) { int i = 0; int iInvalidTrackIDs = 0; int iTouchID, iSearchDeep; fts_report_data_t *pReportData = (fts_report_data_t *)ts->buffer; int ret; uint8_t start_reg = 0x00; #if 1 if ( tpd_read_touchinfo(ts) ){ CTP_DBG("Read touch information error. \n"); return -EAGAIN; } #else memset((void *)ts->buffer, FTS_INVALID_DATA, FTS_PROTOCOL_LEN); mutex_lock(&g_pts->mutex); start_reg = 0x02; ret = i2c_master_send(ts->client, &start_reg,1); ret = i2c_master_recv(ts->client, &ts->buffer[2], 5); if (ts->buffer[2] > 1) { start_reg = 9; ret = i2c_master_send(ts->client,&start_reg,1); ret = i2c_master_recv(ts->client, &ts->buffer[9], 4); } //edit by Magnum 2012-8-6 if (ts->buffer[9] > 1) { start_reg = 0x0f; ret = i2c_master_send(ts->client,&start_reg,1); ret = i2c_master_recv(ts->client, &ts->buffer[15], 4); } if (ts->buffer[15] > 1) { start_reg = 0x15; ret = i2c_master_send(ts->client,&start_reg,1); ret = i2c_master_recv(ts->client, &ts->buffer[21], 4); } if (ts->buffer[21] > 1) { start_reg = 0x1b; ret = i2c_master_send(ts->client,&start_reg,1); ret = i2c_master_recv(ts->client, &ts->buffer[27], 4); } // ret = i2c_master_recv(i2c_client, &buffer[0],8 ); //ret = i2c_master_recv(i2c_client, &buffer[8],8 ); //ret = i2c_master_recv(i2c_client, &buffer[16],8 ); //ret = i2c_master_recv(i2c_client, &buffer[24],8 ); //ret = i2c_master_recv(i2c_client, &buffer[32],1 ); mutex_unlock(&g_pts->mutex); if (ret < 0) { TPD_DEBUG("i2c_transfer failed"); return 1; //Error } #endif // tpd_dump_touchinfo( ts ); if ( 0 != pReportData->device_mode ){ CTP_DBG("device mode is %d\n", pReportData->device_mode); return -EPERM; } //We need only valid points... if ( pReportData->fingers > TINNO_TOUCH_TRACK_IDS ){ CTP_DBG("fingers is %d\n", pReportData->fingers); return -EAGAIN; } // For processing gestures. if (pReportData->gesture >= 0xF0 && pReportData->gesture <= 0xF3) { //fts_5x06_parase_keys(ts, pReportData); } iSearchDeep = 0; #ifdef FTS_SUPPORT_TRACK_ID for ( i = 0; i < TINNO_TOUCH_TRACK_IDS; i++ ){ iSearchDeep += ((pReportData->xy_data[i].event_flag != FTS_EF_RESERVED)?1:0); } #else if (pReportData->fingers >= ts->last_fingers ){ iSearchDeep = pReportData->fingers; }else{ iSearchDeep = ts->last_fingers; } ts->last_fingers = pReportData->fingers; #endif if ( iSearchDeep ) { #ifdef FTS_SUPPORT_TRACK_ID for ( i=0; i < TINNO_TOUCH_TRACK_IDS; i++ ){ #else for ( i=0; i < iSearchDeep; i++ ){ #endif if (pReportData->xy_data[i].event_flag != FTS_EF_RESERVED) { #ifdef FTS_SUPPORT_TRACK_ID iTouchID = pReportData->xy_data[i].touch_id; if ( iTouchID >= TINNO_TOUCH_TRACK_IDS ) { CTP_DBG("i: Invalied Track ID(%d)\n!", i, iTouchID); iInvalidTrackIDs++; continue; } #else iTouchID = i; #endif touch_point[iTouchID].flag = pReportData->xy_data[i].event_flag; touch_point[iTouchID].x = pReportData->xy_data[i].x_h << 8 | pReportData->xy_data[i].x_l; touch_point[iTouchID].y = pReportData->xy_data[i].y_h << 8 | pReportData->xy_data[i].y_l; touch_point[iTouchID].pressure = pReportData->xy_data[i].pressure; #ifdef TPD_FIRST_FIRWARE ft_map_coordinate(&(touch_point[iTouchID].x), &(touch_point[iTouchID].y)); #endif }else{ //CTP_DBG("We got a invalied point, we take it the same as a up event!"); //CTP_DBG("As it has no valid track ID, we assume it's order is the same as it's layout in the memory!"); //touch_point[i].flag = FTS_EF_RESERVED; } } if ( TINNO_TOUCH_TRACK_IDS == iInvalidTrackIDs ){ CTP_DBG("All points are Invalied, Ignore the interrupt!\n"); return -EAGAIN; } } CTP_DBG("p0_flag=0x%x x0=0x%03x y0=0x%03x pressure0=0x%03x " "p1_flag=0x%x x1=0x%03x y1=0x%03x pressure1=0x%03x " "gesture = 0x%x fingers=0x%x", touch_point[0].flag, touch_point[0].x, touch_point[0].y, touch_point[0].pressure, touch_point[1].flag, touch_point[1].x, touch_point[1].y, touch_point[1].pressure, pReportData->gesture, pReportData->fingers); return 0; }; static int touch_event_handler(void *para) { int i; tinno_ts_point touch_point[TINNO_TOUCH_TRACK_IDS]; struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; tinno_ts_data *ts = (tinno_ts_data *)para; sched_setscheduler(current, SCHED_RR, ¶m); do { set_current_state(TASK_INTERRUPTIBLE); wait_event_interruptible(waiter, tpd_flag!=0); tpd_flag = 0; memset(touch_point, FTS_INVALID_DATA, sizeof(touch_point)); set_current_state(TASK_RUNNING); if (!tpd_touchinfo(ts, &touch_point)) { //report muti point then for ( i=0; i < TINNO_TOUCH_TRACK_IDS; i++ ){ if ( FTS_INVALID_DATA != touch_point[i].x ){ if ( FTS_EF_UP == touch_point[i].flag ){ if( test_bit(i, &ts->fingers_flag) ){ tpd_up(ts, ts->touch_point_pre[i].x, ts->touch_point_pre[i].y, touch_point[i].pressure, i); }else{ CTP_DBG("This is a invalid up event.(%d)", i); } }else{//FTS_EF_CONTACT or FTS_EF_DOWN if ( test_bit(i, &ts->fingers_flag) && (FTS_EF_DOWN == touch_point[i].flag) ){ CTP_DBG("Ignore a invalid down event.(%d)", i); continue; } tpd_down(ts, touch_point[i].x, touch_point[i].y, touch_point[i].pressure, i); } }else if ( test_bit(i, &ts->fingers_flag) ){ CTP_DBG("Complete a invalid down or move event.(%d)", i); tpd_up(ts, ts->touch_point_pre[i].x, ts->touch_point_pre[i].y, touch_point[i].pressure, i); } } input_sync(tpd->dev); } mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); }while(!kthread_should_stop()); mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); return 0; }
static int tpd_touchinfo(tinno_ts_data *ts, tinno_ts_point *touch_point) { int i = 0; int iInvalidTrackIDs = 0; int iTouchID, iSearchDeep; fts_report_data_t *pReportData = (fts_report_data_t *)ts->buffer; if ( tpd_read_touchinfo(ts) ){ CTP_DBG("Read touch information error. \n"); return -EAGAIN; } // tpd_dump_touchinfo( ts ); if ( 0 != pReportData->device_mode ){ CTP_DBG("device mode is %d\n", pReportData->device_mode); return -EPERM; } //We need only valid points... if ( pReportData->fingers > TINNO_TOUCH_TRACK_IDS ){ CTP_DBG("fingers is %d\n", pReportData->fingers); return -EAGAIN; } // For processing gestures. if (pReportData->gesture >= 0xF0 && pReportData->gesture <= 0xF3) { //fts_6x06_parase_keys(ts, pReportData); } iSearchDeep = 0; #ifdef FTS_SUPPORT_TRACK_ID for ( i = 0; i < TINNO_TOUCH_TRACK_IDS; i++ ){ iSearchDeep += ((pReportData->xy_data[i].event_flag != FTS_EF_RESERVED)?1:0); } #else if (pReportData->fingers >= ts->last_fingers ){ iSearchDeep = pReportData->fingers; }else{ iSearchDeep = ts->last_fingers; } ts->last_fingers = pReportData->fingers; #endif if ( iSearchDeep ) { #ifdef FTS_SUPPORT_TRACK_ID for ( i=0; i < TINNO_TOUCH_TRACK_IDS; i++ ){ #else for ( i=0; i < iSearchDeep; i++ ){ #endif if (pReportData->xy_data[i].event_flag != FTS_EF_RESERVED) { #ifdef FTS_SUPPORT_TRACK_ID iTouchID = pReportData->xy_data[i].touch_id; if ( iTouchID >= TINNO_TOUCH_TRACK_IDS ) { CTP_DBG("i: Invalied Track ID(%d)\n!", i, iTouchID); iInvalidTrackIDs++; continue; } #else iTouchID = i; #endif touch_point[iTouchID].flag = pReportData->xy_data[i].event_flag; touch_point[iTouchID].x = pReportData->xy_data[i].x_h << 8 | pReportData->xy_data[i].x_l; touch_point[iTouchID].y = pReportData->xy_data[i].y_h << 8 | pReportData->xy_data[i].y_l; touch_point[iTouchID].pressure = pReportData->xy_data[i].pressure; #ifdef TPD_FIRST_FIRWARE ft_map_coordinate(&(touch_point[iTouchID].x), &(touch_point[iTouchID].y)); #endif }else{ //CTP_DBG("We got a invalied point, we take it the same as a up event!"); //CTP_DBG("As it has no valid track ID, we assume it's order is the same as it's layout in the memory!"); //touch_point[i].flag = FTS_EF_RESERVED; } } if ( TINNO_TOUCH_TRACK_IDS == iInvalidTrackIDs ){ CTP_DBG("All points are Invalied, Ignore the interrupt!\n"); return -EAGAIN; } } CTP_DBG("p0_flag=0x%x x0=0x%03x y0=0x%03x pressure0=0x%03x " "p1_flag=0x%x x1=0x%03x y1=0x%03x pressure1=0x%03x " "gesture = 0x%x fingers=0x%x", touch_point[0].flag, touch_point[0].x, touch_point[0].y, touch_point[0].pressure, touch_point[1].flag, touch_point[1].x, touch_point[1].y, touch_point[1].pressure, pReportData->gesture, pReportData->fingers); return 0; }; //BEGIN <touch panel> <DATE20130831> <tp proximity> zhangxiaofei #if defined TPD_PROXIMITY int tpd_read_ps(void) { tpd_proximity_detect; return 0; }
static int tpd_touchinfo(tinno_ts_data *ts, tinno_ts_point *touch_point) { int i = 0; int iInvalidTrackIDs = 0; int iTouchID, iSearchDeep; uint8_t *p_data_buf = (uint8_t *)ts->buffer; int status, touch_num; int offset; int points; if ( tpd_read_touchinfo(ts) ){ CTP_DBG("Read touch information error. \n"); return -EAGAIN; } if (TINNO_TOUCH_TRACK_IDS == 5) { touch_num = p_data_buf[2] & 0x07; } else { touch_num = p_data_buf[2] & 0x0f;//0x03; } CTP_DBG("touch_num is %d\n", touch_num); tpd_dump_touchinfo(ts); if (touch_num == 0) { ts->pcount = 0; ts->last_point_num = 0; return 0; } CTP_DBG("ts->last_point_num is %d\n", ts->last_point_num); points = touch_num; if (ts->last_point_num > touch_num) { touch_num = ts->last_point_num; } ts->last_point_num = points; if ( touch_num > TINNO_TOUCH_TRACK_IDS ){ CTP_DBG("fingers is %d\n", touch_num); touch_num = TINNO_TOUCH_TRACK_IDS; } iSearchDeep = 0; if (get_boot_mode() == RECOVERY_BOOT || get_boot_mode() == FACTORY_BOOT) { if ( 1 == touch_num ) { iSearchDeep = 1; } else { iSearchDeep = 0; } } else { iSearchDeep = touch_num; } ts->pcount = 0; offset = 0; if ( iSearchDeep ) { for ( i=0; i < touch_num; i++ ) { iTouchID = p_data_buf[5 + offset] >> 4; status = p_data_buf[3 + offset] >> 6; if ( iTouchID >= TINNO_TOUCH_TRACK_IDS ) { CTP_DBG("i = %d: Invalied Track ID(%d)\n!", i, iTouchID); iInvalidTrackIDs++; } else if(1 == status) { CTP_DBG("i = %d: TP Up event status ==%d\n!", i, status); } else { touch_point[i].x = (s16)(p_data_buf[3 + offset] & 0x0F) << 8 | (s16)p_data_buf[4 + offset]; touch_point[i].y = (s16)(p_data_buf[5 + offset] & 0x0F) << 8 | (s16)p_data_buf[6 + offset]; touch_point[i].touch_id = iTouchID; touch_point[i].status = status; ts->pcount++; CTP_DBG("i = %d, iTouchID ==%d, x == %d , y == %d , status ==%d\n!", i, touch_point[i].touch_id, touch_point[i].x, touch_point[i].y, touch_point[i].status); } offset += 6; } } CTP_DBG("touch_num = %d, ts->pcount = %d \n", touch_num, ts->pcount); if (0==touch_num) { ts->pcount = 0 ; //0xFF; //Release } if (ts->pcount > touch_num) { ts->pcount = touch_num; } return 0; };