예제 #1
0
static int mma7660_start_dev(struct i2c_client *client, char rate)
{
	char buffer[MMA7660_REG_LEN];
	int ret = 0;

	buffer[0] = MMA7660_REG_INTSU;
	buffer[1] = 0x10;	//0x10; modify by zhao
	ret = mma7660_tx_data(client, &buffer[0], 2);
	ret = mma7660_rx_data(client, &buffer[0], 1);

	ret = mma7660_set_rate(client, rate);

	buffer[0] = MMA7660_REG_MODE;
	buffer[1] = 0x01;
	ret = mma7660_tx_data(client, &buffer[0], 2);
	ret = mma7660_rx_data(client, &buffer[0], 1);

	//enable_irq(client->irq);

#ifdef MMA7660_DATA_FILTER
	mma7660_adjust.count = 0;
#endif

	return ret;
}
예제 #2
0
static int mma7660_set_rate(struct i2c_client *client, char rate)
{
	char buffer[2];
	int ret = 0;
	
	if (rate > 128)
        return -EINVAL;
	rk28printk("[ZWP]%s,rate = %d\n",__FUNCTION__,rate);
	//因为增加了滤波功能,即每RawDataLength次才上报一次,所以提升gsensor两个档级
	if(rate > 2)
		rate -= 2;
	rk28printk("[ZWP]%s,new rate = %d\n",__FUNCTION__,rate);

/*	
    for (i = 0; i < 7; i++) {
        if (rate & (0x1 << i))
            break;
    }   
    

	buffer[0] = MMA7660_REG_SR;
	buffer[1] = 0xf8 | (0x07 & (~i));
*/
	buffer[0] = MMA7660_REG_SR;
	buffer[1] = 0xf8 | (0x07 & rate);

	ret = mma7660_tx_data(client, &(buffer[0]), 2);
	ret = mma7660_rx_data(client, &(buffer[0]), 1);

	return ret;
}
예제 #3
0
static int mma7660_get_data(struct i2c_client *client)
{
	char buffer[3];
	int ret;
	int x, y, z;
    struct mma7660_axis axis;
    struct mma8452_platform_data *pdata = client->dev.platform_data;
    do {
        memset(buffer, 0, 3);
        buffer[0] = MMA7660_REG_X_OUT;
        ret = mma7660_rx_data(client, &buffer[0], 3);
        if (ret < 0)
            return ret;
    } while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));

	x =  mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT])*YSENSIT;
	y =  mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT])*XSENSIT;
	z =  mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT])*ZSENSIT;

#if defined(CONFIG_MACH_RK29_ODYS_NEOX8)
	axis.x = x;
	axis.y = -z;
	axis.z = y;
#elif defined(CONFIG_MACH_RK29_ODYS_NEOX7)
	axis.x = -x;
	axis.y = -z;
	axis.z = -y;
#elif  defined(CONFIG_MACH_ODYS_LOOX_PLUS) || defined(CONFIG_MACH_ODYS_NEXT)
	axis.x = x;
	axis.y = z;
	axis.z = -y;
#else
	axis.x = y;
	axis.y = -x;
	axis.z = z;
#endif

	//	printk("l=%-4d,x=%-5d, y=%-5d, z=%-5d. %s:\n",__LINE__,axis.x, axis.y, axis.z, __func__);
	//	printk("%s: x=%-5d, y=%-5d, z=%-d\n",__func__, axis.x, axis.y, axis.z);
		mma7660_report_value(client, &axis);
	//	Xaverage = Yaverage = Zaverage = 0;

	//����RawDataLength��ֵ��ƽ��ֵ
	Xaverage += axis.x;
	Yaverage += axis.y;
	Zaverage += axis.z;
    rk28printk( "%s: ------------------mma7660_GetData axis = %d  %d  %d,average=%d %d %d--------------\n",
           __func__, axis.x, axis.y, axis.z,Xaverage,Yaverage,Zaverage); 
	
	if((++RawDataNum)>=RawDataLength){
		RawDataNum = 0;
		axis.x = Xaverage/RawDataLength;
		axis.y = Yaverage/RawDataLength;
		axis.z = Zaverage/RawDataLength;
	    mma7660_report_value(client, &axis);
		Xaverage = Yaverage = Zaverage = 0;
	}

	return 0;
}
예제 #4
0
static int mma7660_start_dev(struct i2c_client *client, char rate)
{
	char buffer[MMA7660_REG_LEN];
	int ret = 0;

	buffer[0] = MMA7660_REG_INTSU;
	buffer[1] = 0x10;	//0x10; modify by zhao
	ret = mma7660_tx_data(client, &buffer[0], 2);
	ret = mma7660_rx_data(client, &buffer[0], 1);

	ret = mma7660_set_rate(client, rate);

	buffer[0] = MMA7660_REG_MODE;
	buffer[1] = 0x01;
	ret = mma7660_tx_data(client, &buffer[0], 2);
	ret = mma7660_rx_data(client, &buffer[0], 1);

	enable_irq(client->irq);
	rk28printk("\n----------------------------mma7660_start------------------------\n");
	
	return ret;
}
예제 #5
0
static int mma7660_get_data(struct i2c_client *client)
{
	char buffer[3];
	int ret;
    struct mma7660_axis axis;
    //struct rk2818_gs_platform_data *pdata = client->dev.platform_data;
    do {
        memset(buffer, 0, 3);
        buffer[0] = MMA7660_REG_X_OUT;
        ret = mma7660_rx_data(client, &buffer[0], 3);
        if (ret < 0)
            return ret;
    } while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));

	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
/*
	if(pdata->swap_xy)
	{
		axis.y = -axis.y;
		swap(axis.x,axis.y);		
	}
*/
	//计算RawDataLength次值的平均值
	Xaverage += axis.x;
	Yaverage += axis.y;
	Zaverage += axis.z;
    rk28printk( "%s: ------------------mma7660_GetData axis = %d  %d  %d,average=%d %d %d--------------\n",
           __func__, axis.x, axis.y, axis.z,Xaverage,Yaverage,Zaverage); 
	
	if((++RawDataNum)>=RawDataLength){
		RawDataNum = 0;
		axis.x = Xaverage/RawDataLength;
		axis.y = Yaverage/RawDataLength;
		axis.z = Zaverage/RawDataLength;
	    mma7660_report_value(client, &axis);
		Xaverage = Yaverage = Zaverage = 0;
	}
#if 0	
  //  rk28printk( "%s: ------------------mma7660_GetData axis = %d  %d  %d--------------\n",
  //         __func__, axis.x, axis.y, axis.z); 
     
    //memcpy(sense_data, &axis, sizeof(axis));
    mma7660_report_value(client, &axis);
	//atomic_set(&data_ready, 0);
	//wake_up(&data_ready_wq);
#endif
	return 0;
}
예제 #6
0
static int mma7660_set_rate(struct i2c_client *client, char rate)
{
	struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
	char buffer[2];
	int ret = 0;
	int i;
	
	//if (rate > 128)
	//	return -EINVAL;

	rate = MMA7660_MAX_RATE;
	
	//williamdeng wisky 20120424 GSENSOR��Ƶ�ʶ������������������޸��µĶ������㷽ʽ
	
	/*for (i = 0; i < 7; i++) {
		if (rate & (0x1 << i))
			break;
	}*/
	switch(rate)
	{
	case 1:  i=7;break;
	case 2:  i=6;break;
	case 4:  i=5;break;
	case 8:  i=4;break;
	case 16: i=3;break;
	case 32: i=2;break;
	case 64: i=1;break;
	case 120:i=0;break;
	default: i=1;break;//set default to 64 samples/second
	}
	//end williamdeng wisky 20120424
	
	buffer[0] = MMA7660_REG_SR;
	buffer[1] = 0xf8 | (0x07 & (i));

	ret = mma7660_tx_data(client, &(buffer[0]), 2);
	ret = mma7660_rx_data(client, &(buffer[0]), 1);

	mma7660->curr_tate = rate;
		
	return ret;
}
예제 #7
0
static int mma7660_get_data(struct i2c_client *client)
{
	char buffer[3];
	int ret;
	int x, y, z;
    struct mma7660_axis axis;
    struct mma8452_platform_data *pdata = client->dev.platform_data;
    do {
        memset(buffer, 0, 3);
        buffer[0] = MMA7660_REG_X_OUT;
        ret = mma7660_rx_data(client, &buffer[0], 3);
        if (ret < 0)
            return ret;
    } while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));
	x =  mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT])*YSENSIT;
	y =  mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT])*XSENSIT;
	z =  mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT])*ZSENSIT;
	
#if defined(CONFIG_MACH_RK29_ODYS_NEOX8) || defined(CONFIG_MACH_RK29_BQ_KEPLER2HD)
#if defined(CM10_KERNEL)
/* CM10 */
	axis.x = -x;
	axis.y = -y;
	axis.z = z;
#elif defined(JB422_KERNEL)
	axis.x = -y;
	axis.y = x;
	axis.z = -z;
#else
/* JB */
	axis.x = x;
	axis.y = -z;
	axis.z = y;
#endif
#elif defined(CONFIG_MACH_RK29_ODYS_NEOX7)
#if defined(CM10_KERNEL)
/* CM10 */
	axis.x = x;
	axis.y = y;
	axis.z = z;
#elif defined(JB422_KERNEL)
	axis.x = y;
	axis.y = -x;
	axis.z = z;
#else
/* JB */
	axis.x = -x;
	axis.y = -z;
	axis.z = -y;
#endif
#else
	axis.x = y;
	axis.y = -x;
	axis.z = z;
#endif
	//	printk("l=%-4d,x=%-5d, y=%-5d, z=%-5d. %s:\n",__LINE__,axis.x, axis.y, axis.z, __func__);
	//	printk("%s: x=%-5d, y=%-5d, z=%-d\n",__func__, axis.x, axis.y, axis.z);
		mma7660_report_value(client, &axis);
	//	Xaverage = Yaverage = Zaverage = 0;
	return 0;
}
예제 #8
0
static int mma7660_get_data(struct i2c_client *client)
{
	char buffer[3];
	int ret;
	struct mma7660_axis axis;
//    struct mma7660_platform_data *pdata = client->dev.platform_data;
	
	do {
		memset(buffer, 0, 3);
		buffer[0] = MMA7660_REG_X_OUT;
		ret = mma7660_rx_data(client, &buffer[0], 3);
		if (ret < 0)
			return ret;
	} while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));
	WPRINTK("raw x=%d,y=%d,z=%d\n",buffer[0],buffer[1],buffer[2]);
#if defined(WISKY_GSENSOR_NX_PY_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_PZ_PY)
    axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
    axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
    axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
#elif defined(WISKY_GSENSOR_NX_PY_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PX_PY_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_NY_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NX_NY_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_NY_NX_NZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_PX_NZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_PX_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);	
#elif defined(WISKY_GSENSOR_NY_NX_PZ)
	axis.x = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]); 
#elif defined(WISKY_GSENSOR_PX_NY_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PY_NX_PZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);	
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#elif defined(WISKY_GSENSOR_PX_NY_NZ)
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#else
	axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
	axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
	axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);
#endif

	#ifdef MMA7660_DATA_FILTER
	axis.x += GSENSOR_ADJUST_X;
	axis.y += GSENSOR_ADJUST_Y;
	axis.z += GSENSOR_ADJUST_Z;
	#endif
	WPRINTK("x=%d,y=%d,z=%d\n",axis.x,axis.y,axis.z);
	mma7660_report_value(client, &axis);

	return 0;
}