Exemple #1
0
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);
}