static void gyro_work_func(struct work_struct *work) { struct gyro_context *cxt = NULL; //int out_size; //hwm_sensor_data sensor_data; int x,y,z,status; int64_t nt; struct timespec time; int err = 0; cxt = gyro_context_obj; if(NULL == cxt->gyro_data.get_data) { GYRO_ERR("gyro driver not register data path\n"); } time.tv_sec = time.tv_nsec = 0; time = get_monotonic_coarse(); nt = time.tv_sec*1000000000LL+time.tv_nsec; //add wake lock to make sure data can be read before system suspend cxt->gyro_data.get_data(&x,&y,&z,&status); if(err) { GYRO_ERR("get gyro data fails!!\n" ); goto gyro_loop; } else { if((x != cxt->drv_data.gyro_data.values[0]) || (y != cxt->drv_data.gyro_data.values[1]) || (z != cxt->drv_data.gyro_data.values[2])) { if( 0 == x && 0==y && 0 == z) { goto gyro_loop; } cxt->drv_data.gyro_data.values[0] = x; cxt->drv_data.gyro_data.values[1] = y; cxt->drv_data.gyro_data.values[2] = z; cxt->drv_data.gyro_data.status = status; cxt->drv_data.gyro_data.time = nt; } } if(true == cxt->is_first_data_after_enable) { cxt->is_first_data_after_enable = false; //filter -1 value if(GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[0] || GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[1] || GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[2]) { GYRO_LOG(" read invalid data \n"); goto gyro_loop; } } //report data to input device //printk("new gyro work run....\n"); //GYRO_LOG("gyro data[%d,%d,%d] \n" ,cxt->drv_data.gyro_data.values[0], //cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2]); gyro_data_report(cxt->drv_data.gyro_data.values[0], cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2], cxt->drv_data.gyro_data.status); gyro_loop: if(true == cxt->is_polling_run) { { mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); } } }
static void gyro_work_func(struct work_struct *work) { struct gyro_context *cxt = NULL; int x, y, z, status; int64_t pre_ns, cur_ns; int64_t delay_ms; int err = 0; cxt = gyro_context_obj; delay_ms = atomic_read(&cxt->delay); if (NULL == cxt->gyro_data.get_data) GYRO_ERR("gyro driver not register data path\n"); cur_ns = getCurNS(); /* add wake lock to make sure data can be read before system suspend */ cxt->gyro_data.get_data(&x, &y, &z, &status); if (err) { GYRO_ERR("get gyro data fails!!\n"); goto gyro_loop; } else { cxt->drv_data.gyro_data.values[0] = x+cxt->cali_sw[0]; cxt->drv_data.gyro_data.values[1] = y+cxt->cali_sw[1]; cxt->drv_data.gyro_data.values[2] = z+cxt->cali_sw[2]; cxt->drv_data.gyro_data.status = status; pre_ns = cxt->drv_data.gyro_data.time; cxt->drv_data.gyro_data.time = cur_ns; } if (true == cxt->is_first_data_after_enable) { pre_ns = cur_ns; cxt->is_first_data_after_enable = false; /* filter -1 value */ if (GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[0] || GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[1] || GYRO_INVALID_VALUE == cxt->drv_data.gyro_data.values[2]) { GYRO_LOG(" read invalid data\n"); goto gyro_loop; } } /* GYRO_LOG("gyro data[%d,%d,%d]\n" ,cxt->drv_data.gyro_data.values[0], */ /* cxt->drv_data.gyro_data.values[1],cxt->drv_data.gyro_data.values[2]); */ while ((cur_ns - pre_ns) >= delay_ms*1800000LL) { pre_ns += delay_ms*1000000LL; gyro_data_report(cxt->drv_data.gyro_data.values[0], cxt->drv_data.gyro_data.values[1], cxt->drv_data.gyro_data.values[2], cxt->drv_data.gyro_data.status, pre_ns); } gyro_data_report(cxt->drv_data.gyro_data.values[0], cxt->drv_data.gyro_data.values[1], cxt->drv_data.gyro_data.values[2], cxt->drv_data.gyro_data.status, cxt->drv_data.gyro_data.time); gyro_loop: if (true == cxt->is_polling_run) startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false); }