コード例 #1
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_range(struct i2c_client *client, unsigned char Range)
{
	int comres = 0;
	unsigned char data1;
	int i;

	if (client == NULL) {
		comres = -1;
	} else{
		for (i = 0; i < ARRAY_SIZE(bma250_valid_range); i++) {
			if (bma250_valid_range[i] == Range)
				break;
		}

		if (ARRAY_SIZE(bma250_valid_range) > i) {
			comres = bma250_smbus_read_byte(client,
					BMA250_RANGE_SEL_REG, &data1);

			data1  = BMA250_SET_BITSLICE(data1,
					BMA250_RANGE_SEL, Range);

			comres += bma250_smbus_write_byte(client,
					BMA250_RANGE_SEL_REG, &data1);
		} else {
			comres = -EINVAL;
		}
	}

	return comres;
}
コード例 #2
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_bandwidth(struct i2c_client *client, unsigned char BW)
{
	int comres = 0;
	unsigned char data;
	int i = 0;

	if (client == NULL) {
		comres = -1;
	} else {

		for (i = 0; i < ARRAY_SIZE(bma250_valid_bw); i++) {
			if (bma250_valid_bw[i] == BW)
				break;
		}

		if (ARRAY_SIZE(bma250_valid_bw) > i) {
			comres = bma250_smbus_read_byte(client,
					BMA250_BANDWIDTH__REG, &data);
			data = BMA250_SET_BITSLICE(data, BMA250_BANDWIDTH, BW);
			comres += bma250_smbus_write_byte(client,
					BMA250_BANDWIDTH__REG, &data);
		} else {
			comres = -EINVAL;
		}
	}

	return comres;
}
コード例 #3
0
static int bma250_soft_reset(struct i2c_client *client)
{
	int comres = 0;
	unsigned char data = BMA250_EN_SOFT_RESET_VALUE ;

	comres = bma250_smbus_write_byte(client, BMA250_EN_SOFT_RESET__REG, &data);

	return comres;
}
コード例 #4
0
static int bma250_set_bandwidth(struct i2c_client *client, unsigned char BW)
{
	int comres = 0;
	unsigned char data = '\0';
	int Bandwidth = 0;

	if (client == NULL) {
		comres = -1;
	} else {
		if (BW < 8) {
			switch (BW) {
			case 0:
				Bandwidth = BMA250_BW_7_81HZ;
				break;
			case 1:
				Bandwidth = BMA250_BW_15_63HZ;
				break;
			case 2:
				Bandwidth = BMA250_BW_31_25HZ;
				break;
			case 3:
				Bandwidth = BMA250_BW_62_50HZ;
				break;
			case 4:
				Bandwidth = BMA250_BW_125HZ;
				break;
			case 5:
				Bandwidth = BMA250_BW_250HZ;
				break;
			case 6:
				Bandwidth = BMA250_BW_500HZ;
				break;
			case 7:
				Bandwidth = BMA250_BW_1000HZ;
				break;
			default:
				break;
			}
			comres = bma250_smbus_read_byte(client,
							BMA250_BANDWIDTH__REG,
							&data);
			data =
			    BMA250_SET_BITSLICE(data, BMA250_BANDWIDTH,
						Bandwidth);
			comres +=
			    bma250_smbus_write_byte(client,
						    BMA250_BANDWIDTH__REG,
						    &data);
		} else {
			comres = -1;
		}
	}

	return comres;
}
コード例 #5
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_offset_filt_z(struct i2c_client *client, unsigned char
						offsetfilt)
{
	int comres = 0;
	unsigned char data;

	data =  offsetfilt;
	comres = bma250_smbus_write_byte(client, BMA250_OFFSET_FILT_Z_REG,
						&data);

	return comres;
}
コード例 #6
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_ee_w(struct i2c_client *client, unsigned char eew)
{
	int comres = 0;
	unsigned char data;

	comres = bma250_smbus_read_byte(client,
			BMA250_UNLOCK_EE_WRITE_SETTING__REG, &data);
	data = BMA250_SET_BITSLICE(data, BMA250_UNLOCK_EE_WRITE_SETTING, eew);
	comres = bma250_smbus_write_byte(client,
			BMA250_UNLOCK_EE_WRITE_SETTING__REG, &data);
	return comres;
}
コード例 #7
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_selftest_stn(struct i2c_client *client, unsigned char stn)
{
	int comres = 0;
	unsigned char data;

	comres = bma250_smbus_read_byte(client,
			BMA250_NEG_SELF_TEST__REG, &data);
	data = BMA250_SET_BITSLICE(data, BMA250_NEG_SELF_TEST, stn);
	comres = bma250_smbus_write_byte(client,
			BMA250_NEG_SELF_TEST__REG, &data);

	return comres;
}
コード例 #8
0
static int bma250_set_mode(struct i2c_client *client, unsigned char Mode)
{
	int comres = 0;
	unsigned char data1 = 0;

	if (client == NULL) {
		comres = -1;
	} else {
		if (Mode < 3) {
			comres = bma250_smbus_read_byte(client,
							BMA250_EN_LOW_POWER__REG,
							&data1);
			switch (Mode) {
			case BMA250_MODE_NORMAL:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_EN_LOW_POWER,
							    0);
				data1 =
				    BMA250_SET_BITSLICE(data1,
							BMA250_EN_SUSPEND, 0);
				break;
			case BMA250_MODE_LOWPOWER:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_EN_LOW_POWER,
							    1);
				data1 =
				    BMA250_SET_BITSLICE(data1,
							BMA250_EN_SUSPEND, 0);
				break;
			case BMA250_MODE_SUSPEND:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_EN_LOW_POWER,
							    0);
				data1 =
				    BMA250_SET_BITSLICE(data1,
							BMA250_EN_SUSPEND, 1);
				break;
			default:
				break;
			}

			comres += bma250_smbus_write_byte(client,
							  BMA250_EN_LOW_POWER__REG,
							  &data1);
		} else {
			comres = -1;
		}
	}

	return comres;
}
コード例 #9
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_offset_target_x(struct i2c_client *client,
		unsigned char offsettarget)
{
	int comres = 0;
	unsigned char data;

	comres = bma250_smbus_read_byte(client,
			BMA250_COMP_TARGET_OFFSET_X__REG, &data);
	data = BMA250_SET_BITSLICE(data,
			BMA250_COMP_TARGET_OFFSET_X, offsettarget);
	comres = bma250_smbus_write_byte(client,
			BMA250_COMP_TARGET_OFFSET_X__REG, &data);

	return comres;
}
コード例 #10
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_ee_prog_trig(struct i2c_client *client)
{
	int comres = 0;
	unsigned char data;
	unsigned char eeprog;
	eeprog = 0x01;

	comres = bma250_smbus_read_byte(client,
			BMA250_START_EE_WRITE_SETTING__REG, &data);
	data = BMA250_SET_BITSLICE(data,
				BMA250_START_EE_WRITE_SETTING, eeprog);
	comres = bma250_smbus_write_byte(client,
			BMA250_START_EE_WRITE_SETTING__REG, &data);
	return comres;
}
コード例 #11
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static int bma250_set_cal_trigger(struct i2c_client *client,
		unsigned char caltrigger)
{
	int comres = 0;
	unsigned char data;

	comres = bma250_smbus_read_byte(client,
			BMA250_EN_FAST_COMP__REG, &data);
	data = BMA250_SET_BITSLICE(data,
			BMA250_EN_FAST_COMP, caltrigger);
	comres = bma250_smbus_write_byte(client,
			BMA250_EN_FAST_COMP__REG, &data);

	return comres;
}
コード例 #12
0
static int bma250_set_slope_threshold(struct i2c_client *client,
	unsigned char threshold)
{
    int comres = 0;
    unsigned char data = 0;


    comres = bma250_smbus_read_byte(client,
	    BMA250_SLOPE_THRES__REG, &data);
    data = BMA250_SET_BITSLICE(data, BMA250_SLOPE_THRES, threshold);
    comres = bma250_smbus_write_byte(client,
	    BMA250_SLOPE_THRES__REG, &data);


    return comres;
}
コード例 #13
0
static int bma250_set_slope_duration(struct i2c_client *client, unsigned char
	duration)
{
    int comres = 0;
    unsigned char data = 0;


    comres = bma250_smbus_read_byte(client,
	    BMA250_SLOPE_DUR__REG, &data);
    data = BMA250_SET_BITSLICE(data, BMA250_SLOPE_DUR, duration);
    comres = bma250_smbus_write_byte(client,
	    BMA250_SLOPE_DUR__REG, &data);


    return comres;
}
コード例 #14
0
static int bma250_set_Int_Mode(struct i2c_client *client, unsigned char Mode)
{
    int comres = 0;
    unsigned char data = 0;
    


    comres = bma250_smbus_read_byte(client,
	    BMA250_INT_MODE_SEL__REG, &data);
    data = BMA250_SET_BITSLICE(data, BMA250_INT_MODE_SEL, Mode);
    comres = bma250_smbus_write_byte(client,
	    BMA250_INT_MODE_SEL__REG, &data);


    return comres;
}
コード例 #15
0
static int bma250_set_range(struct i2c_client *client, unsigned char Range)
{
	int comres = 0;
	unsigned char data1 = '\0';

	if (client == NULL) {
		comres = -1;
	} else {
		if (Range < 4) {
			comres = bma250_smbus_read_byte(client,
							BMA250_RANGE_SEL_REG,
							&data1);
			switch (Range) {
			case 0:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_RANGE_SEL,
							    0);
				break;
			case 1:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_RANGE_SEL,
							    5);
				break;
			case 2:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_RANGE_SEL,
							    8);
				break;
			case 3:
				data1 = BMA250_SET_BITSLICE(data1,
							    BMA250_RANGE_SEL,
							    12);
				break;
			default:
				break;
			}
			comres += bma250_smbus_write_byte(client,
							  BMA250_RANGE_SEL_REG,
							  &data1);
		} else {
			comres = -1;
		}
	}

	return comres;
}
コード例 #16
0
static int bma250_set_int1_pad_sel(struct i2c_client *client, unsigned char
	int1sel)
{
    int comres = 0;
    unsigned char data = 0;
    unsigned char state = 0;
    state = 0x01;


    switch (int1sel) {
	case 0:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_LOWG__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_LOWG,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_LOWG__REG, &data);
	    break;
	case 1:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_HIGHG__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_HIGHG,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_HIGHG__REG, &data);
	    break;
	case 2:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_SLOPE__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_SLOPE,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_SLOPE__REG, &data);
	    break;
	case 3:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_DB_TAP__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_DB_TAP,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_DB_TAP__REG, &data);
	    break;
	case 4:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_SNG_TAP__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_SNG_TAP,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_SNG_TAP__REG, &data);
	    break;
	case 5:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_ORIENT__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_ORIENT,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_ORIENT__REG, &data);
	    break;
	case 6:
	    comres = bma250_smbus_read_byte(client,
		    BMA250_EN_INT1_PAD_FLAT__REG, &data);
	    data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_FLAT,
		    state);
	    comres = bma250_smbus_write_byte(client,
		    BMA250_EN_INT1_PAD_FLAT__REG, &data);
	    break;
	default:
	    break;
    }

    return comres;
}
コード例 #17
0
static int bma250_set_Int_Enable(struct i2c_client *client, unsigned char
	InterruptType , unsigned char value)
{
    int comres = 0;
    unsigned char data1 = 0, data2 = 0;



    comres = bma250_smbus_read_byte(client, BMA250_INT_ENABLE1_REG, &data1);
    comres = bma250_smbus_read_byte(client, BMA250_INT_ENABLE2_REG, &data2);


    value = value & 1;
    switch (InterruptType) {
	case 0:
	    
	    data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_LOWG_INT, value);
	    break;
	case 1:
	    

	    data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_X_INT,
		    value);
	    break;
	case 2:
	    

	    data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_Y_INT,
		    value);
	    break;
	case 3:
	    

	    data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_Z_INT,
		    value);
	    break;
	case 4:
	    

	    data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_NEW_DATA_INT,
		    value);
	    break;
	case 5:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_X_INT,
		    value);
	    break;
	case 6:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_Y_INT,
		    value);
	    break;
	case 7:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_Z_INT,
		    value);
	    break;

	case 8:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SINGLE_TAP_INT,
		    value);
	    break;
	case 9:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_DOUBLE_TAP_INT,
		    value);
	    break;
	case 10:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_ORIENT_INT, value);
	    break;
	case 11:
	    

	    data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_FLAT_INT, value);
	    break;
	default:
	    break;
    }
    comres = bma250_smbus_write_byte(client, BMA250_INT_ENABLE1_REG,
	    &data1);
    comres = bma250_smbus_write_byte(client, BMA250_INT_ENABLE2_REG,
	    &data2);


    return comres;
}
コード例 #18
0
ファイル: bma250_driver.c プロジェクト: Philippe12/kernel_msm
static ssize_t bma250_selftest_store(struct device *dev,
		struct device_attribute *attr,
		const char *buf, size_t count)
{
	unsigned long data;
	unsigned char clear_value = 0;
	int error;
	short value1 = 0;
	short value2 = 0;
	short diff = 0;
	unsigned long result = 0;
	struct i2c_client *client = to_i2c_client(dev);
	struct bma250_data *bma250 = i2c_get_clientdata(client);

	error = strict_strtoul(buf, 10, &data);
	if (error)
		return error;

	if (data != 1)
		return -EINVAL;
	/* set to 2 G range */
	if (bma250_set_range(bma250->bma250_client, 0) < 0)
		return -EINVAL;

	bma250_smbus_write_byte(bma250->bma250_client, 0x32, &clear_value);
	/* 1 for x-axis*/
	bma250_set_selftest_st(bma250->bma250_client, 1);
	/* positive direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 0);
	mdelay(10);
	bma250_read_accel_x(bma250->bma250_client, &value1);
	/* negative direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 1);
	mdelay(10);
	bma250_read_accel_x(bma250->bma250_client, &value2);
	diff = value1-value2;

	printk(KERN_INFO "diff x is %d, value1 is %d, value2 is %d\n",
			diff, value1, value2);

	if (abs(diff) < 204)
		result |= 1;

	/* 2 for y-axis*/
	bma250_set_selftest_st(bma250->bma250_client, 2);
	/* positive direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 0);
	mdelay(10);
	bma250_read_accel_y(bma250->bma250_client, &value1);
	/* negative direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 1);
	mdelay(10);
	bma250_read_accel_y(bma250->bma250_client, &value2);
	diff = value1-value2;
	printk(KERN_INFO "diff y is %d, value1 is %d, value2 is %d\n",
			diff, value1, value2);
	if (abs(diff) < 204)
		result |= 2;

	/* 3 for z-axis*/
	bma250_set_selftest_st(bma250->bma250_client, 3);
	/* positive direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 0);
	mdelay(10);
	bma250_read_accel_z(bma250->bma250_client, &value1);
	/* negative direction*/
	bma250_set_selftest_stn(bma250->bma250_client, 1);
	mdelay(10);
	bma250_read_accel_z(bma250->bma250_client, &value2);
	diff = value1 - value2;

	printk(KERN_INFO "diff z is %d, value1 is %d, value2 is %d\n",
			diff, value1, value2);
	if (abs(diff) < 102)
		result |= 4;

	atomic_set(&bma250->selftest_result, (unsigned int) result);

	printk(KERN_INFO "self test finished\n");


	return count;
}