static void print_sensordata(struct ssp_data *data, unsigned int uSensor) { switch (uSensor) { case ACCELEROMETER_SENSOR: case GYROSCOPE_SENSOR: case GEOMAGNETIC_SENSOR: ssp_dbg(" %u : %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; case PRESSURE_SENSOR: ssp_dbg(" %u : %d, %d (%ums)\n", uSensor, data->buf[uSensor].pressure[0], data->buf[uSensor].pressure[1], get_msdelay(data->adDelayBuf[uSensor])); break; case LIGHT_SENSOR: ssp_dbg(" %u : %u, %u, %u, %u (%ums)\n", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, get_msdelay(data->adDelayBuf[uSensor])); break; case PROXIMITY_SENSOR: ssp_dbg(" %u : %d %d(%ums)\n", uSensor, data->buf[uSensor].prox[0], data->buf[uSensor].prox[1], get_msdelay(data->adDelayBuf[uSensor])); break; default: ssp_dbg("Wrong sensorCnt: %u\n", uSensor); break; } }
static void print_sensordata(struct ssp_data *data, unsigned int uSensor) { switch (uSensor) { case ACCELEROMETER_SENSOR: case GYROSCOPE_SENSOR: case GEOMAGNETIC_SENSOR: ssp_dbg(" %u : %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; case PRESSURE_SENSOR: ssp_dbg(" %u : %d, %d (%ums)\n", uSensor, data->buf[uSensor].pressure[0], data->buf[uSensor].pressure[1], get_msdelay(data->adDelayBuf[uSensor])); break; case GESTURE_SENSOR: ssp_dbg(" %u : %d %d %d %d (%ums)\n", uSensor, data->buf[uSensor].data[0], data->buf[uSensor].data[1], data->buf[uSensor].data[2], data->buf[uSensor].data[3], get_msdelay(data->adDelayBuf[uSensor])); break; case TEMPERATURE_HUMIDITY_SENSOR: ssp_dbg(" %u : %d %d %d(%ums)\n", uSensor, data->buf[uSensor].data[0], data->buf[uSensor].data[1], data->buf[uSensor].data[2], get_msdelay(data->adDelayBuf[uSensor])); break; case LIGHT_SENSOR: ssp_dbg(" %u : %u, %u, %u, %u (%ums)\n", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, get_msdelay(data->adDelayBuf[uSensor])); break; case PROXIMITY_SENSOR: ssp_dbg(" %u : %d %d(%ums)\n", uSensor, data->buf[uSensor].prox[0], data->buf[uSensor].prox[1], get_msdelay(data->adDelayBuf[uSensor])); break; case SIG_MOTION_SENSOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].sig_motion, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_DETECTOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].step_det, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_COUNTER: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].step_diff, get_msdelay(data->adDelayBuf[uSensor])); break; default: ssp_dbg("Wrong sensorCnt: %u\n", uSensor); break; } }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_gyro_cal(data); if (iRet < 0) ssp_errf("set_gyro_cal failed"); iRet = set_accel_cal(data); if (iRet < 0) ssp_errf("set_accel_cal failed"); udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { if (atomic64_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh, data->uProxLoThresh); data->buf[PROXIMITY_SENSOR].prox = 0; report_sensordata(data, PROXIMITY_SENSOR, &data->buf[PROXIMITY_SENSOR]); #if 1 if(sec_debug_get_debug_level() > 0) { data->bMcuDumpMode = true; ssp_info("Mcu Dump Enabled"); } iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) ssp_errf("MSG2SSP_AP_MCU_SET_DUMPMODE failed"); #else #if CONFIG_SEC_DEBUG data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) ssp_errf("MSG2SSP_AP_MCU_SET_DUMPMODE failed"); #endif #endif }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[2] = {0,}; unsigned int uSensorCnt; /* umfa.ssp int iRet = 0; proximity_open_calibration(data); iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } */ udelay(10); for (uSensorCnt = 0; uSensorCnt < (SENSOR_MAX - 1); uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { uBuf[1] = (u8)get_msdelay(data->adDelayBuf[uSensorCnt]); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 2); udelay(10); } } if (data->bProximityRawEnabled == true) { uBuf[0] = 1; uBuf[1] = 20; send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 2); } }
static int enable_accel_for_cal(struct ssp_data *data) { u8 uBuf[9] = { 0, }; s32 dMsDelay = get_msdelay(data->adDelayBuf[ACCELEROMETER_SENSOR]); memcpy(&uBuf[0], &dMsDelay, 4); if (atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR)) { if (get_msdelay(data->adDelayBuf[ACCELEROMETER_SENSOR]) != 10) { send_instruction(data, CHANGE_DELAY, ACCELEROMETER_SENSOR, uBuf, 9); return SUCCESS; } } else { send_instruction(data, ADD_SENSOR, ACCELEROMETER_SENSOR, uBuf, 9); } return FAIL; }
static void change_sensor_delay(struct ssp_data *data, int iSensorType, int64_t dNewDelay) { u8 uBuf[2]; int64_t dTempDelay = data->adDelayBuf[iSensorType]; data->adDelayBuf[iSensorType] = dNewDelay; if (iSensorType == ORIENTATION_SENSOR) iSensorType = ACCELEROMETER_SENSOR; switch (data->aiCheckStatus[iSensorType]) { case ADD_SENSOR_STATE: ssp_dbg("[SSP]: %s - add %u, New = %lldns\n", __func__, 1 << iSensorType, dNewDelay); uBuf[1] = (u8)get_msdelay(dNewDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, iSensorType, uBuf, 2); data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE; if (iSensorType == PROXIMITY_SENSOR) { input_report_abs(data->prox_input_dev, ABS_DISTANCE, 1); input_sync(data->prox_input_dev); } break; case RUNNING_SENSOR_STATE: if (dTempDelay == data->adDelayBuf[iSensorType]) break; ssp_dbg("[SSP]: %s - Change %u, New = %lldns\n", __func__, 1 << iSensorType, dNewDelay); uBuf[1] = (u8)get_msdelay(dNewDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2); break; default: data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE; } }
static int ssp_remove_sensor(struct ssp_data *data, unsigned int uChangedSensor, unsigned int uNewEnable) { u8 uBuf[2]; int64_t dSensorDelay = data->adDelayBuf[uChangedSensor]; ssp_dbg("[SSP]: %s - remove sensor = %d, current state = %d\n", __func__, (1 << uChangedSensor), uNewEnable); data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY; if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) { data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; if (uChangedSensor == ACCELEROMETER_SENSOR) accel_open_calibration(data); else if (uChangedSensor == GYROSCOPE_SENSOR) gyro_open_calibration(data); else if (uChangedSensor == PRESSURE_SENSOR) pressure_open_calibration(data); else if (uChangedSensor == PROXIMITY_SENSOR) proximity_open_calibration(data); return 0; } else if (uChangedSensor == ORIENTATION_SENSOR) { if (!(atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR))) uChangedSensor = ACCELEROMETER_SENSOR; else { change_sensor_delay(data, ACCELEROMETER_SENSOR, data->adDelayBuf[ACCELEROMETER_SENSOR]); return 0; } } else if (uChangedSensor == ACCELEROMETER_SENSOR) { if (atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) { change_sensor_delay(data, ORIENTATION_SENSOR, data->adDelayBuf[ORIENTATION_SENSOR]); return 0; } } if (!uNewEnable) { if (data->bCheckSuspend == false) { disable_debug_timer(data); data->bDebugEnabled = false; } } uBuf[1] = (u8)get_msdelay(dSensorDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 2); data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; return 0; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_gyro_cal(data); if (iRet < 0) pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); iRet = set_accel_cal(data); if (iRet < 0) pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); #ifdef CONFIG_SENSORS_SSP_SX9306 if (atomic_read(&data->aSensorEnable) & (1 << GRIP_SENSOR)) { open_grip_caldata(data); set_grip_calibration(data, true); } #endif udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { mutex_lock(&data->enable_mutex); if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } mutex_unlock(&data->enable_mutex); } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); data->bMcuDumpMode = ssp_check_sec_dump_mode(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE, data->bMcuDumpMode); if (iRet < 0) pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); }
static void disable_accel_for_cal(struct ssp_data *data, int iDelayChanged) { u8 uBuf[2] = {0, 10}; if (atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR)) { uBuf[1] = get_msdelay(data->adDelayBuf[ACCELEROMETER_SENSOR]); uBuf[0] = get_delay_cmd(uBuf[1]); if (iDelayChanged) send_instruction(data, CHANGE_DELAY, ACCELEROMETER_SENSOR, uBuf, 2); } else { send_instruction(data, REMOVE_SENSOR, ACCELEROMETER_SENSOR, uBuf, 2); } }
static void disable_accel_for_cal(struct ssp_data *data, int iDelayChanged) { u8 uBuf[9] = { 0, }; s32 dMsDelay = get_msdelay(data->adDelayBuf[ACCELEROMETER_SENSOR]); memcpy(&uBuf[0], &dMsDelay, 4); if (atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR)) { if (iDelayChanged) send_instruction(data, CHANGE_DELAY, ACCELEROMETER_SENSOR, uBuf, 9); } else { send_instruction(data, REMOVE_SENSOR, ACCELEROMETER_SENSOR, uBuf, 4); } }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[9] = {0,}; unsigned int uSensorCnt; int iRet = 0; #ifdef CONFIG_SENSORS_SSP_YAS532 iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } #endif iRet = set_gyro_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); } iRet = set_accel_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); } udelay(10); for (uSensorCnt = 0; uSensorCnt < SENSOR_MAX; uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { s32 dMsDelay = get_msdelay(data->adDelayBuf[uSensorCnt]); memcpy(&uBuf[0], &dMsDelay, 4); memcpy(&uBuf[4], &data->batchLatencyBuf[uSensorCnt], 4); uBuf[8] = data->batchOptBuf[uSensorCnt]; send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 9); udelay(10); } } if (data->bProximityRawEnabled == true) { s32 dMsDelay = 20; memcpy(&uBuf[0], &dMsDelay, 4); send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 4); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); #if SSP_SEC_DEBUG data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE,data->bMcuDumpMode); if (iRet < 0) { pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); } #endif }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[2] = {0,}; unsigned int uSensorCnt; int iRet = 0; iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } iRet = set_gyro_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_gyro_cal failed\n", __func__); } iRet = set_accel_cal(data); if (iRet < 0) { pr_err("[SSP]: %s - set_accel_cal failed\n", __func__); } udelay(10); for (uSensorCnt = 0; uSensorCnt < (SENSOR_MAX - 1); uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { uBuf[1] = (u8)get_msdelay(data->adDelayBuf[uSensorCnt]); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 2); udelay(10); } } if (data->bProximityRawEnabled == true) { uBuf[0] = 1; uBuf[1] = 20; send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 2); } set_proximity_threshold(data, data->uProxHiThresh,data->uProxLoThresh); data->bMcuDumpMode = sec_debug_is_enabled(); iRet = ssp_send_cmd(data, MSG2SSP_AP_MCU_SET_DUMPMODE,data->bMcuDumpMode); if (iRet < 0) { pr_err("[SSP]: %s - MSG2SSP_AP_MCU_SET_DUMPMODE failed\n", __func__); } }
static int ssp_remove_sensor(struct ssp_data *data, unsigned int uChangedSensor, unsigned int uNewEnable) { u8 uBuf[2]; int64_t dSensorDelay = data->adDelayBuf[uChangedSensor]; ssp_dbg("[SSP]: %s - remove sensor = %d, current state = %d\n", __func__, (1 << uChangedSensor), uNewEnable); data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY; if (uChangedSensor == ORIENTATION_SENSOR) { if (!(atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR))) { uChangedSensor = ACCELEROMETER_SENSOR; } else { change_sensor_delay(data, ACCELEROMETER_SENSOR, data->adDelayBuf[ACCELEROMETER_SENSOR]); return 0; } } else if (uChangedSensor == ACCELEROMETER_SENSOR) { if (atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) { change_sensor_delay(data, ORIENTATION_SENSOR, data->adDelayBuf[ORIENTATION_SENSOR]); return 0; } } if (!uNewEnable) { if (data->bCheckSuspend == false) data->bDebugEnabled = false; } if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) { uBuf[1] = (u8)get_msdelay(dSensorDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 2); } data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; return 0; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[2] = {0,}; unsigned int uSensorCnt; set_proximity_threshold(data); udelay(10); for (uSensorCnt = 0; uSensorCnt < (SENSOR_MAX - 1); uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { uBuf[1] = (u8)get_msdelay(data->adDelayBuf[uSensorCnt]); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 2); udelay(10); } } data->uTimeOutCnt = 0; data->uBusyCnt = 0; }
void sync_sensor_state(struct ssp_data *data) { unsigned char uBuf[2] = {0,}; unsigned int uSensorCnt; proximity_open_calibration(data); udelay(10); for (uSensorCnt = 0; uSensorCnt < (SENSOR_MAX - 1); uSensorCnt++) { if (atomic_read(&data->aSensorEnable) & (1 << uSensorCnt)) { uBuf[1] = (u8)get_msdelay(data->adDelayBuf[uSensorCnt]); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, ADD_SENSOR, uSensorCnt, uBuf, 2); udelay(10); } } if (data->bProximityRawEnabled == true) { uBuf[0] = 1; uBuf[1] = 20; send_instruction(data, ADD_SENSOR, PROXIMITY_RAW, uBuf, 2); } }
static void print_sensordata(struct ssp_data *data, unsigned int uSensor) { switch (uSensor) { case ACCELEROMETER_SENSOR: case GYROSCOPE_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; case GEOMAGNETIC_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].cal_x, data->buf[uSensor].cal_y, data->buf[uSensor].cal_y, data->buf[uSensor].accuracy, get_msdelay(data->adDelayBuf[uSensor])); break; case GEOMAGNETIC_UNCALIB_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; #ifdef CONFIG_SENSORS_SSP_BMP182 case PRESSURE_SENSOR: ssp_dbg("[SSP] %u : %d, %d (%ums)\n", uSensor, data->buf[uSensor].pressure[0], data->buf[uSensor].pressure[1], get_msdelay(data->adDelayBuf[uSensor])); break; #endif #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_MAX88921) || \ defined(CONFIG_SENSORS_SSP_MAX88920) case GESTURE_SENSOR: ssp_dbg("[SSP] %u : %d %d %d %d (%ums)\n", uSensor, data->buf[uSensor].data[3], data->buf[uSensor].data[4], data->buf[uSensor].data[5], data->buf[uSensor].data[6], get_msdelay(data->adDelayBuf[uSensor])); break; #endif #ifdef CONFIG_SENSORS_SSP_SHTC1 case TEMPERATURE_HUMIDITY_SENSOR: ssp_dbg("[SSP] %u : %d %d %d(%ums)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; #endif #ifdef CONFIG_SENSORS_SSP_UVIS25 case UV_SENSOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].uv, get_msdelay(data->adDelayBuf[uSensor])); break; #endif case LIGHT_SENSOR: #if defined(CONFIG_SENSORS_SSP_TMG399X) || defined(CONFIG_SENSORS_SSP_TMD37823) ssp_dbg("[SSP] %u : %u, %u, %u, %u, %u, %u (%ums)\n", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, data->buf[uSensor].a_time, data->buf[uSensor].a_gain, get_msdelay(data->adDelayBuf[uSensor])); break; #else ssp_dbg("[SSP] %u : %u, %u, %u, %u, %u, %u (%ums)\n", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, data->buf[uSensor].ir_cmp, data->buf[uSensor].amb_pga, get_msdelay(data->adDelayBuf[uSensor])); break; #endif case PROXIMITY_SENSOR: ssp_dbg("[SSP] %u : %d %d(%ums)\n", uSensor, data->buf[uSensor].prox[0], data->buf[uSensor].prox[1], get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_DETECTOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].step_det, get_msdelay(data->adDelayBuf[uSensor])); break; case GAME_ROTATION_VECTOR: case ROTATION_VECTOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].quat_a, data->buf[uSensor].quat_b, data->buf[uSensor].quat_c, data->buf[uSensor].quat_d, data->buf[uSensor].acc_rot, get_msdelay(data->adDelayBuf[uSensor])); break; case SIG_MOTION_SENSOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].sig_motion, get_msdelay(data->adDelayBuf[uSensor])); break; case GYRO_UNCALIB_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_COUNTER: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].step_diff, get_msdelay(data->adDelayBuf[uSensor])); break; default: ssp_dbg("[SSP] Wrong sensorCnt: %u\n", uSensor); break; } }
static void print_sensordata(struct ssp_data *data, unsigned int uSensor) { switch (uSensor) { case ACCELEROMETER_SENSOR: case GYROSCOPE_SENSOR: ssp_info("%u : %d, %d, %d (%ums, %dms)", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GEOMAGNETIC_SENSOR: ssp_info("%u : %d, %d, %d, %d (%ums)", uSensor, data->buf[uSensor].cal_x, data->buf[uSensor].cal_y, data->buf[uSensor].cal_y, data->buf[uSensor].accuracy, get_msdelay(data->adDelayBuf[uSensor])); break; case GEOMAGNETIC_UNCALIB_SENSOR: ssp_info("%u : %d, %d, %d, %d, %d, %d (%ums)", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; case PRESSURE_SENSOR: ssp_info("%u : %d, %d (%ums, %dms)", uSensor, data->buf[uSensor].pressure, data->buf[uSensor].temperature, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GESTURE_SENSOR: ssp_info("%u : %d, %d, %d, %d (%ums)", uSensor, data->buf[uSensor].data[3], data->buf[uSensor].data[4], data->buf[uSensor].data[5], data->buf[uSensor].data[6], get_msdelay(data->adDelayBuf[uSensor])); break; case LIGHT_SENSOR: ssp_info("%u : %u, %u, %u, %u, %u, %u (%ums)", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, data->buf[uSensor].a_time, data->buf[uSensor].a_gain, get_msdelay(data->adDelayBuf[uSensor])); break; case PROXIMITY_SENSOR: ssp_info("%u : %d, %d (%ums)", uSensor, data->buf[uSensor].prox, data->buf[uSensor].prox_ex, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_DETECTOR: ssp_info("%u : %u (%ums, %dms)", uSensor, data->buf[uSensor].step_det, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GAME_ROTATION_VECTOR: case ROTATION_VECTOR: ssp_info("%u : %d, %d, %d, %d, %d (%ums, %dms)", uSensor, data->buf[uSensor].quat_a, data->buf[uSensor].quat_b, data->buf[uSensor].quat_c, data->buf[uSensor].quat_d, data->buf[uSensor].acc_rot, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case SIG_MOTION_SENSOR: ssp_info("%u : %u(%ums)", uSensor, data->buf[uSensor].sig_motion, get_msdelay(data->adDelayBuf[uSensor])); break; case GYRO_UNCALIB_SENSOR: ssp_info("%u : %d, %d, %d, %d, %d, %d (%ums)", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_COUNTER: ssp_info("%u : %u(%ums)", uSensor, data->buf[uSensor].step_diff, get_msdelay(data->adDelayBuf[uSensor])); break; case LIGHT_IR_SENSOR: ssp_info("%u : %u, %u, %u, %u, %u, %u, %u(%ums)", uSensor, data->buf[uSensor].irdata, data->buf[uSensor].ir_r, data->buf[uSensor].ir_g, data->buf[uSensor].ir_b, data->buf[uSensor].ir_w, data->buf[uSensor].ir_a_time, data->buf[uSensor].ir_a_gain, get_msdelay(data->adDelayBuf[uSensor])); break; case INTERRUPT_GYRO_SENSOR: ssp_info("%u : %d, %d, %d (%ums)", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; default: ssp_info("Wrong sensorCnt: %u", uSensor); break; } }
static int ssp_remove_sensor(struct ssp_data *data, unsigned int uChangedSensor, unsigned int uNewEnable) { u8 uBuf[2]; int iRet = 0; int64_t dSensorDelay = data->adDelayBuf[uChangedSensor]; ssp_dbg("[SSP]: %s - remove sensor = %d, current state = %d\n", __func__, (1 << uChangedSensor), uNewEnable); data->adDelayBuf[uChangedSensor] = DEFUALT_POLLING_DELAY; if (data->aiCheckStatus[uChangedSensor] == INITIALIZATION_STATE) { data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; if (uChangedSensor == ACCELEROMETER_SENSOR) accel_open_calibration(data); else if (uChangedSensor == GYROSCOPE_SENSOR) gyro_open_calibration(data); else if (uChangedSensor == PRESSURE_SENSOR) pressure_open_calibration(data); else if (uChangedSensor == PROXIMITY_SENSOR) { proximity_open_lcd_ldi(data); proximity_open_calibration(data); } else if (uChangedSensor == GEOMAGNETIC_SENSOR) { iRet = mag_open_hwoffset(data); if (iRet < 0) pr_err("[SSP]: %s - mag_open_hw_offset" " failed, %d\n", __func__, iRet); iRet = set_hw_offset(data); if (iRet < 0) { pr_err("[SSP]: %s - set_hw_offset failed\n", __func__); } } return 0; } else if (uChangedSensor == ORIENTATION_SENSOR) { if (!(atomic_read(&data->aSensorEnable) & (1 << ACCELEROMETER_SENSOR))) { uChangedSensor = ACCELEROMETER_SENSOR; } else { change_sensor_delay(data, ACCELEROMETER_SENSOR, data->adDelayBuf[ACCELEROMETER_SENSOR]); return 0; } } else if (uChangedSensor == ACCELEROMETER_SENSOR) { if (atomic_read(&data->aSensorEnable) & (1 << ORIENTATION_SENSOR)) { change_sensor_delay(data, ORIENTATION_SENSOR, data->adDelayBuf[ORIENTATION_SENSOR]); return 0; } } else if (uChangedSensor == GEOMAGNETIC_SENSOR) { if (mag_store_hwoffset(data)) pr_err("mag_store_hwoffset success\n"); } if (atomic_read(&data->aSensorEnable) & (1 << uChangedSensor)) { uBuf[1] = (u8)get_msdelay(dSensorDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, REMOVE_SENSOR, uChangedSensor, uBuf, 2); } data->aiCheckStatus[uChangedSensor] = NO_SENSOR_STATE; return 0; }
static void print_sensordata(struct ssp_data *data, unsigned int uSensor) { switch (uSensor) { case ACCELEROMETER_SENSOR: case GYROSCOPE_SENSOR: #ifdef CONFIG_SENSORS_SSP_INTERRUPT_GYRO_SENSOR case INTERRUPT_GYRO_SENSOR: #endif ssp_dbg("[SSP] %u : %d, %d, %d (%ums, %dms)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GEOMAGNETIC_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].cal_x, data->buf[uSensor].cal_y, data->buf[uSensor].cal_y, data->buf[uSensor].accuracy, get_msdelay(data->adDelayBuf[uSensor])); break; case GEOMAGNETIC_UNCALIB_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; case PRESSURE_SENSOR: ssp_dbg("[SSP] %u : %d, %d (%ums, %dms)\n", uSensor, data->buf[uSensor].pressure[0], data->buf[uSensor].pressure[1], get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GESTURE_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].data[3], data->buf[uSensor].data[4], data->buf[uSensor].data[5], data->buf[uSensor].data[6], get_msdelay(data->adDelayBuf[uSensor])); break; case TEMPERATURE_HUMIDITY_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].x, data->buf[uSensor].y, data->buf[uSensor].z, get_msdelay(data->adDelayBuf[uSensor])); break; case LIGHT_SENSOR: ssp_dbg("[SSP] %u : %u, %u, %u, %u, %u, %u (%ums)\n", uSensor, data->buf[uSensor].r, data->buf[uSensor].g, data->buf[uSensor].b, data->buf[uSensor].w, data->buf[uSensor].a_time, data->buf[uSensor].a_gain, get_msdelay(data->adDelayBuf[uSensor])); break; case PROXIMITY_SENSOR: ssp_dbg("[SSP] %u : %d, %d (%ums)\n", uSensor, data->buf[uSensor].prox[0], data->buf[uSensor].prox[1], get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_DETECTOR: ssp_dbg("[SSP] %u : %u (%ums, %dms)\n", uSensor, data->buf[uSensor].step_det, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case GAME_ROTATION_VECTOR: case ROTATION_VECTOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d (%ums, %dms)\n", uSensor, data->buf[uSensor].quat_a, data->buf[uSensor].quat_b, data->buf[uSensor].quat_c, data->buf[uSensor].quat_d, data->buf[uSensor].acc_rot, get_msdelay(data->adDelayBuf[uSensor]), data->batchLatencyBuf[uSensor]); break; case SIG_MOTION_SENSOR: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].sig_motion, get_msdelay(data->adDelayBuf[uSensor])); break; case GYRO_UNCALIB_SENSOR: ssp_dbg("[SSP] %u : %d, %d, %d, %d, %d, %d (%ums)\n", uSensor, data->buf[uSensor].uncal_x, data->buf[uSensor].uncal_y, data->buf[uSensor].uncal_z, data->buf[uSensor].offset_x, data->buf[uSensor].offset_y, data->buf[uSensor].offset_z, get_msdelay(data->adDelayBuf[uSensor])); break; case STEP_COUNTER: ssp_dbg("[SSP] %u : %u(%ums)\n", uSensor, data->buf[uSensor].step_diff, get_msdelay(data->adDelayBuf[uSensor])); break; default: ssp_dbg("[SSP] Wrong sensorCnt: %u\n", uSensor); break; } }
static void change_sensor_delay(struct ssp_data *data, int iSensorType, int64_t dNewDelay) { u8 uBuf[2]; unsigned int uNewEnable = 0; int64_t dTempDelay = data->adDelayBuf[iSensorType]; if (!(atomic_read(&data->aSensorEnable) & (1 << iSensorType))) { data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE; return; } data->adDelayBuf[iSensorType] = dNewDelay; if (iSensorType == ORIENTATION_SENSOR) iSensorType = ACCELEROMETER_SENSOR; switch (data->aiCheckStatus[iSensorType]) { case ADD_SENSOR_STATE: ssp_dbg("[SSP]: %s - add %u, New = %lldns\n", __func__, 1 << iSensorType, dNewDelay); uBuf[1] = (u8)get_msdelay(dNewDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); if (send_instruction(data, ADD_SENSOR, iSensorType, uBuf, 2) != SUCCESS) { uNewEnable = (unsigned int)atomic_read(&data->aSensorEnable) & (~(unsigned int)(1 << iSensorType)); atomic_set(&data->aSensorEnable, uNewEnable); data->aiCheckStatus[iSensorType] = NO_SENSOR_STATE; data->uMissSensorCnt++; break; } data->aiCheckStatus[iSensorType] = RUNNING_SENSOR_STATE; if (iSensorType == PROXIMITY_SENSOR) { proximity_open_lcd_ldi(data); proximity_open_calibration(data); input_report_abs(data->prox_input_dev, ABS_DISTANCE, 1); input_sync(data->prox_input_dev); } break; case RUNNING_SENSOR_STATE: if (get_msdelay(dTempDelay) == get_msdelay(data->adDelayBuf[iSensorType])) break; ssp_dbg("[SSP]: %s - Change %u, New = %lldns\n", __func__, 1 << iSensorType, dNewDelay); uBuf[1] = (u8)get_msdelay(dNewDelay); uBuf[0] = (u8)get_delay_cmd(uBuf[1]); send_instruction(data, CHANGE_DELAY, iSensorType, uBuf, 2); break; default: data->aiCheckStatus[iSensorType] = ADD_SENSOR_STATE; } }