static void mag_work_func(struct work_struct *work) { struct mag_context *cxt = NULL; int out_size; hwm_sensor_data sensor_data; int64_t nt; struct timespec time; int err, idx; int i; cxt = mag_context_obj; memset(&sensor_data, 0, sizeof(sensor_data)); time.tv_sec = time.tv_nsec = 0; time = get_monotonic_coarse(); nt = time.tv_sec*1000000000LL+time.tv_nsec; for(i = 0; i < MAX_M_V_SENSOR; i++) { if (NULL == cxt->drv_obj[i]) { //MAG_LOG("%d driver not atteched\n",i); continue; } if((0 == cxt->drv_obj[i]->polling) || !(cxt->active_data_sensor&(0x01<<i))) { MAG_LOG("mag_type(%d) polling(%d) enabled(%d)\n",i, cxt->drv_obj[i]->polling,cxt->active_data_sensor); continue; } err = cxt->drv_obj[i]->mag_operate(cxt->drv_obj[i]->self,OP_MAG_GET_DATA, NULL, 0, &sensor_data, sizeof(hwm_sensor_data), &out_size); if(err) { MAG_ERR("get %d data fails!!\n" ,i); return; } else { { if( 0 == sensor_data.values[0] && 0==sensor_data.values[1] && 0 == sensor_data.values[2]) { MAG_ERR("data is zero.\n" ); continue; } cxt->drv_data[i].mag_data.values[0] = sensor_data.values[0]; cxt->drv_data[i].mag_data.values[1] = sensor_data.values[1]; cxt->drv_data[i].mag_data.values[2] = sensor_data.values[2]; cxt->drv_data[i].mag_data.status = sensor_data.status; cxt->drv_data[i].mag_data.time = nt; } } if(true == cxt->is_first_data_after_enable) { cxt->is_first_data_after_enable = false; //filter -1 value if(MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[0] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[1] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[2]) { MAG_LOG(" read invalid data \n"); continue; } } if(ID_M_V_MAGNETIC ==i) { mag_data_report(MAGNETIC,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1], cxt->drv_data[i].mag_data.values[2], cxt->drv_data[i].mag_data.status); MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); } if(ID_M_V_ORIENTATION ==i) { mag_data_report(ORIENTATION,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1], cxt->drv_data[i].mag_data.values[2], cxt->drv_data[i].mag_data.status); MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); } } //report data to input device //printk("new mag work run....\n"); if(true == cxt->is_polling_run) { mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); } }
static void mag_work_func(struct work_struct *work) { struct mag_context *cxt = NULL; hwm_sensor_data sensor_data; int64_t nt; struct timespec time; int err; int i; int x,y,z,status; cxt = mag_context_obj; memset(&sensor_data, 0, sizeof(sensor_data)); time.tv_sec = time.tv_nsec = 0; time = get_monotonic_coarse(); nt = time.tv_sec*1000000000LL+time.tv_nsec; for(i = 0; i < MAX_M_V_SENSOR; i++) { if(!(cxt->active_data_sensor&(0x01<<i))) { MAG_LOG("mag_type(%d) enabled(%d)\n",i,cxt->active_data_sensor); continue; } if(ID_M_V_MAGNETIC ==i) { err = cxt->mag_dev_data.get_data_m(&x,&y,&z,&status); if(err) { MAG_ERR("get %d data fails!!\n" ,i); return; } cxt->drv_data[i].mag_data.values[0]=x; cxt->drv_data[i].mag_data.values[1]=y; cxt->drv_data[i].mag_data.values[2]=z; cxt->drv_data[i].mag_data.status = status; if(true == cxt->is_first_data_after_enable) { cxt->is_first_data_after_enable = false; //filter -1 value if(MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[0] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[1] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[2]) { MAG_LOG(" read invalid data \n"); continue; } } mag_data_report(MAGNETIC,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1], cxt->drv_data[i].mag_data.values[2], cxt->drv_data[i].mag_data.status); //MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], //cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); } if(ID_M_V_ORIENTATION ==i) { err = cxt->mag_dev_data.get_data_o(&x,&y,&z,&status); if(err) { MAG_ERR("get %d data fails!!\n" ,i); return; } cxt->drv_data[i].mag_data.values[0]=x; cxt->drv_data[i].mag_data.values[1]=y; cxt->drv_data[i].mag_data.values[2]=z; cxt->drv_data[i].mag_data.status = status; if(true == cxt->is_first_data_after_enable) { cxt->is_first_data_after_enable = false; //filter -1 value if(MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[0] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[1] || MAG_INVALID_VALUE == cxt->drv_data[i].mag_data.values[2]) { MAG_LOG(" read invalid data \n"); continue; } } mag_data_report(ORIENTATION,cxt->drv_data[i].mag_data.values[0], cxt->drv_data[i].mag_data.values[1], cxt->drv_data[i].mag_data.values[2], cxt->drv_data[i].mag_data.status); //MAG_LOG("mag_type(%d) data[%d,%d,%d] \n" ,i,cxt->drv_data[i].mag_data.values[0], //cxt->drv_data[i].mag_data.values[1],cxt->drv_data[i].mag_data.values[2]); } } //report data to input device //printk("new mag work run....\n"); if(true == cxt->is_polling_run) { mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); } }