s32 tpd_ps_operate(void *self, u32 command, void *buff_in, s32 size_in, void *buff_out, s32 size_out, s32 *actualout) { s32 err = 0; s32 value; hwm_sensor_data *sensor_data; switch (command) { case SENSOR_DELAY: if ((buff_in == NULL) || (size_in < sizeof(int))) { GTP_ERROR("Set delay parameter error!"); err = -EINVAL; } // Do nothing break; case SENSOR_ENABLE: if ((buff_in == NULL) || (size_in < sizeof(int))) { GTP_ERROR("Enable sensor parameter error!"); err = -EINVAL; } else { value = *(int *)buff_in; err = tpd_enable_ps(value); } break; case SENSOR_GET_DATA: if ((buff_out == NULL) || (size_out < sizeof(hwm_sensor_data))) { GTP_ERROR("Get sensor data parameter error!"); err = -EINVAL; } else { sensor_data = (hwm_sensor_data *)buff_out; sensor_data->values[0] = tpd_get_ps_value(); sensor_data->value_divide = 1; sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; } break; default: GTP_ERROR("proxmy sensor operate function no this parameter %d!\n", command); err = -1; break; } return err; }
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); //BEGIN <touch panel> <DATE20130831> <tp proximity> zhangxiaofei #if defined TPD_PROXIMITY int err; hwm_sensor_data sensor_data; u8 proximity_status; u8 state; #endif //END <touch panel> <DATE20130831> <tp proximity> zhangxiaofei 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); //BEGIN <touch panel> <DATE20130831> <tp proximity> zhangxiaofei #if defined TPD_PROXIMITY if (tpd_proximity_flag == 1) { i2c_smbus_read_i2c_block_data(g_pts->client, TPD_PROXIMITY_ENABLE_REG, 1, &state); TPD_PROXIMITY_DBG("proxi_5206 0xB0 state value is 1131 0x%02X\n", state); if(!(state&0x01)) { tpd_enable_ps(1); } i2c_smbus_read_i2c_block_data(g_pts->client, 0x01, 1, &proximity_status); TPD_PROXIMITY_DBG("proxi_5206 0x01 value is 1139 0x%02X\n", proximity_status); if (proximity_status == TPD_PROXIMITY_CLOSE_VALUE) { tpd_proximity_detect = 0; } else if(proximity_status == TPD_PROXIMITY_FARAWAY_VALUE) { tpd_proximity_detect = 1; } TPD_PROXIMITY_DBG("tpd_proximity_detect 1149 = %d\n", tpd_proximity_detect); if ((err = tpd_read_ps())) { TPD_PROXIMITY_DBG("proxi_5206 read ps data 1156: %d\n", err); } sensor_data.values[0] = tpd_get_ps_value(); sensor_data.value_divide = 1; sensor_data.status = SENSOR_STATUS_ACCURACY_MEDIUM; if ((err = hwmsen_get_interrupt_data(ID_PROXIMITY, &sensor_data))) { TPD_PROXIMITY_DBG(" proxi_5206 call hwmsen_get_interrupt_data failed= %d\n", err); } } #endif //END <touch panel> <DATE20130831> <tp proximity> zhangxiaofei //BEGIN <add changing flag> <DATE20130330> <add changing flag> zhangxiaofei if(g_tp_charger_flag != g_pre_tp_charger_flag){ g_pre_tp_charger_flag = g_tp_charger_flag; fts_ft6x06_switch_charger_status(g_tp_charger_flag); } //END <add changing flag> <DATE20130330> <add changing flag> zhangxiaofei 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; }
int tpd_ps_operate(void* self, uint32_t command, void* buff_in, int size_in, void* buff_out, int size_out, int* actualout) { int err = 0; int value; hwm_sensor_data *sensor_data; TPD_DEBUG("[proxi_5206]command = 0x%02X\n", command); switch (command) { case SENSOR_DELAY: if((buff_in == NULL) || (size_in < sizeof(int))) { APS_ERR("Set delay parameter error!\n"); err = -EINVAL; } // Do nothing break; case SENSOR_ENABLE: if((buff_in == NULL) || (size_in < sizeof(int))) { APS_ERR("Enable sensor parameter error!\n"); err = -EINVAL; } else { value = *(int *)buff_in; if(value) { if((tpd_enable_ps(1) != 0)) { APS_ERR("enable ps fail: %d\n", err); return -1; } } else { if((tpd_enable_ps(0) != 0)) { APS_ERR("disable ps fail: %d\n", err); return -1; } } } break; case SENSOR_GET_DATA: if((buff_out == NULL) || (size_out< sizeof(hwm_sensor_data))) { APS_ERR("get sensor data parameter error!\n"); err = -EINVAL; } else { sensor_data = (hwm_sensor_data *)buff_out; if((err = tpd_read_ps())) { err = -1;; } else { sensor_data->values[0] = tpd_get_ps_value(); TPD_PROXIMITY_DBG("huang sensor_data->values[0] 1082 = %d\n", sensor_data->values[0]); sensor_data->value_divide = 1; sensor_data->status = SENSOR_STATUS_ACCURACY_MEDIUM; } } break; default: APS_ERR("proxmy sensor operate function no this parameter %d!\n", command); err = -1; break; } return err; }