static void acc_work_func(struct work_struct *work) { struct acc_context *cxt = NULL; //int out_size; //hwm_sensor_data sensor_data; int x,y,z,status; int64_t nt; struct timespec time; int err; cxt = acc_context_obj; if(NULL == cxt->acc_data.get_data) { ACC_LOG("acc 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; err = cxt->acc_data.get_data(&x,&y,&z,&status); if(err) { ACC_ERR("get acc data fails!!\n" ); goto acc_loop; } else { { if( 0 == x && 0==y && 0 == z) { goto acc_loop; } cxt->drv_data.acc_data.values[0] = x+cxt->cali_sw[0]; cxt->drv_data.acc_data.values[1] = y+cxt->cali_sw[1]; cxt->drv_data.acc_data.values[2] = z+cxt->cali_sw[2]; cxt->drv_data.acc_data.status = status; cxt->drv_data.acc_data.time = nt; } } if(true == cxt->is_first_data_after_enable) { cxt->is_first_data_after_enable = false; //filter -1 value if(ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[0] || ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[1] || ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[2]) { ACC_LOG(" read invalid data \n"); goto acc_loop; } } //report data to input device //printk("new acc work run....\n"); //ACC_LOG("acc data[%d,%d,%d] \n" ,cxt->drv_data.acc_data.values[0], //cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]); acc_data_report(cxt->drv_data.acc_data.values[0], cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2], cxt->drv_data.acc_data.status); acc_loop: if(true == cxt->is_polling_run) { mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); } }
static void acc_work_func(struct work_struct *work) { struct acc_context *cxt = NULL; int x, y, z, status; int64_t pre_ns, cur_ns; int64_t delay_ms; int err; cxt = acc_context_obj; delay_ms = atomic_read(&cxt->delay); if (NULL == cxt->acc_data.get_data) { ACC_ERR("acc driver not register data path\n"); return; } cur_ns = getCurNS(); err = cxt->acc_data.get_data(&x, &y, &z, &status); if (err) { ACC_ERR("get acc data fails!!\n"); goto acc_loop; } else { if (0 == x && 0 == y && 0 == z) goto acc_loop; cxt->drv_data.acc_data.values[0] = x; cxt->drv_data.acc_data.values[1] = y; cxt->drv_data.acc_data.values[2] = z; cxt->drv_data.acc_data.status = status; pre_ns = cxt->drv_data.acc_data.time; cxt->drv_data.acc_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 (ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[0] || ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[1] || ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[2]) { ACC_LOG(" read invalid data\n"); goto acc_loop; } } /* report data to input device */ /* printk("new acc work run....\n"); */ /* ACC_LOG("acc data[%d,%d,%d]\n" ,cxt->drv_data.acc_data.values[0], */ /* cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]); */ while ((cur_ns - pre_ns) >= delay_ms*1800000LL) { pre_ns += delay_ms*1000000LL; acc_data_report(cxt->drv_data.acc_data.values[0], cxt->drv_data.acc_data.values[1], cxt->drv_data.acc_data.values[2], cxt->drv_data.acc_data.status, pre_ns); } acc_data_report(cxt->drv_data.acc_data.values[0], cxt->drv_data.acc_data.values[1], cxt->drv_data.acc_data.values[2], cxt->drv_data.acc_data.status, cxt->drv_data.acc_data.time); acc_loop: if (true == cxt->is_polling_run) startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false); }