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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }