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