static int touch_event_handler(void *unused) { struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; static int x1, y1, x2, y2, raw_x1, raw_y1, raw_x2, raw_y2; int temp_x1 = x1, temp_y1 = y1, temp_raw_x1 = raw_x1, temp_raw_y1 = raw_y1; int lastUp_x = 0, lastUp_y = 0; char buffer[10]; int ret = -1, touching, oldtouching;//int pending = 0 unsigned char Wrbuf[1] = {0}; sched_setscheduler(current, SCHED_RR, ¶m); do{ set_current_state(TASK_INTERRUPTIBLE); while (tpd_halt) {tpd_flag = 0; msleep(20);} wait_event_interruptible(waiter, tpd_flag != 0); tpd_flag = 0; TPD_DEBUG_SET_TIME; set_current_state(TASK_RUNNING); i2c_client->addr = ( i2c_client->addr & I2C_MASK_FLAG ) | I2C_ENEXT_FLAG; ret = i2c_master_send(i2c_client, Wrbuf, 1); if(ret != sizeof(Wrbuf)) { TPD_DEBUG("[mtk-tpd] i2c write communcate error: 0x%x\n", ret); continue; } i2c_client->addr = ( ( i2c_client->addr & I2C_MASK_FLAG ) | I2C_DMA_FLAG ) | I2C_ENEXT_FLAG; ret = tpd_i2c_read(i2c_client, buffer, 7); buffer[7] = buffer[8] = buffer[9] = 0; if (ret != 7)//sizeof(buffer) { TPD_DEBUG("[mtk-tpd] i2c read communcate error: 0x%x\n", ret); continue; } i2c_client->addr = i2c_client->addr & I2C_MASK_FLAG; touching = buffer[0]; if(touching > 0) { raw_x1 = x1 = ((buffer[3] << 8) | buffer[2]); raw_y1 = y1 = ((buffer[5] << 8) | buffer[4]); } if(touching > 1) { raw_x2 = x2 = ((buffer[7] << 8) | buffer[6]); raw_y2 = y2 = ((buffer[9] << 8) | buffer[8]); } oldtouching = buffer[1]; TPD_DEBUG("[mtk-tpd]:raw_x1:%d, raw_y1:%d, raw_x2:%d, raw_y2:%d\n", raw_x1, raw_y1, raw_x2, raw_y2); TPD_DEBUG("[mtk-tpd]:touch:%d, old_touch:%d\n", touching, oldtouching); switch(touching) { case 0: /* touching=0, oldtouching 0 is invalid */ if(oldtouching > 0) { //tpd_up(raw_y1, raw_x1, y1, x1, 0); //tpd_up(raw_x1, raw_y1, x1, y1, 0); lastUp_x = x1; lastUp_y = y1; } if(oldtouching > 1) { //tpd_up(raw_y2, raw_x2, y2, x2, 0); //tpd_up(raw_x2, raw_y2, x2, y2, 0); //lastUp_x = x1; //lastUp_y = y1; } tpd_up(lastUp_x, lastUp_y, lastUp_x, lastUp_y, 0); break; case 1: tpd_calibrate(&x1, &y1); //tpd_down(raw_y1, raw_x1, y1, x1, 1); tpd_down(raw_x1, raw_y1, x1, y1, 1); if(oldtouching == 2) { if(abs(x1 - x2) < 2 && abs(y1 - y2) < 2) // need to adjust. { //tpd_up(temp_raw_y1, temp_raw_x1, temp_y1, temp_x1, 0); //For ICS //tpd_up(temp_raw_x1, temp_raw_y1, temp_x1, temp_y1, 0); } else { //tpd_up(raw_y2, raw_x2, y2, x2, 0); //For ICS //tpd_up(raw_x2, raw_y2, x2, y2, 0); } } break; case 2: tpd_calibrate(&x1, &y1); //tpd_down(raw_y1, raw_x1, y1, x1, 1); tpd_down(raw_x1, raw_y1, x1, y1, 1); //tpd_calibrate(&x2, &y2); //tpd_down(raw_y2, raw_x2, y2, x2, 1); //tpd_down(raw_x2, raw_y2, x2, y2, 1); break; default: TPD_DEBUG("[mtk-tpd] invalid touch num: 0x%x\n", touching); continue; } temp_x1 = x1; temp_y1 = y1; temp_raw_x1 = raw_x1; temp_raw_y1 = raw_y1; input_sync(tpd->dev); } while (!kthread_should_stop()); return 0; }
static int touch_event_handler(void *unused) { struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; static int x1, y1, raw_x1, raw_y1; int temp_x1, temp_y1, temp_raw_x1, temp_raw_y1, temp_touch_dir, temp_contact_id; int report_id, touch_valid, contact_id, touch_dir, touch_need_sync; char buffer[10]; int ret = -1; sched_setscheduler(current, SCHED_RR, ¶m); do { set_current_state(TASK_INTERRUPTIBLE); while (tpd_halt) {tpd_flag = 0; msleep(20);} wait_event_interruptible(waiter, tpd_flag != 0); tpd_flag = 0; TPD_DEBUG_SET_TIME; set_current_state(TASK_RUNNING); TPD_DEBUG("[mtk-tpd] touch interrupt\n"); touch_need_sync = 0; temp_x1 = 0xFFFFFFFF; temp_y1 = 0xFFFFFFFF; temp_raw_x1 = 0xFFFFFFFF; temp_raw_y1 = 0xFFFFFFFF; temp_touch_dir = 0xFFFFFFFF; temp_contact_id = 0xFFFFFFFF; do { i2c_client->addr = i2c_client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG | I2C_ENEXT_FLAG; ret = tpd_i2c_read(i2c_client, buffer, 10); if (ret != sizeof(buffer)) { TPD_DEBUG("[mtk-tpd] i2c read communcate error: 0x%x\n", ret); continue; } i2c_client->addr = i2c_client->addr & I2C_MASK_FLAG; report_id = buffer[0]; if (0x4 == report_id) { touch_valid = buffer[1]>>7; if (touch_valid) { contact_id = (buffer[1]&0x7C)>>2; touch_dir = buffer[1]&0x1; raw_x1 = x1 = ((buffer[3] << 8) | buffer[2]); raw_y1 = y1 = ((buffer[5] << 8) | buffer[4]); TPD_DEBUG("[mtk-tpd]:id:%d, raw_x1:%d, raw_y1:%d\n", contact_id, raw_x1, raw_y1); tpd_calibrate(&x1, &y1); if (((temp_x1 != x1) || (temp_y1 != y1) || (temp_contact_id != contact_id)) && (0xFFFFFFFF != temp_x1) && (0xFFFFFFFF != temp_y1)) { touch_need_sync = 1; if (temp_touch_dir) { tpd_down(temp_raw_y1, temp_raw_x1, temp_y1, temp_x1, 1); } else { tpd_up(temp_raw_y1, temp_raw_x1, temp_y1, temp_x1, 0); } } temp_x1 = x1; temp_y1 = y1; temp_raw_x1 = raw_x1; temp_raw_y1 = raw_y1; temp_touch_dir = touch_dir; temp_contact_id = contact_id; } else { TPD_DEBUG("[mtk-tpd]:Touch Invalid\n"); } } else { TPD_DEBUG("[mtk-tpd]:Invalid report ID:%d\n", buffer); } }while(!mt_get_gpio_in(GPIO_CTP_EINT_PIN));