static int yas_bma250_set_enable(int enable) { int err; /* Check initialize */ if (acc_data.initialize == 0) return YAS_ERROR_NOT_INITIALIZED; if (yas_bma250_ischg_enable(enable)) { if (enable) { /* Open i2c */ err = yas_bma250_i2c_open(); if (err != YAS_NO_ERROR) return err; /* Reset chip */ yas_bma250_write_reg_byte(YAS_BMA250_SOFT_RESET_REG, YAS_BMA250_SOFT_RESET_VAL); yas_bma250_msleep(5); /* Set axes range*/ yas_bma250_update_bits(YAS_BMA250_RANGE, YAS_BMA250_RANGE_2G); yas_bma250_set_delay(acc_data.delay); yas_bma250_power_up(); } else { yas_bma250_power_down(); err = yas_bma250_i2c_close(); if (err != YAS_NO_ERROR) return err; } } acc_data.enable = enable; return YAS_NO_ERROR; }
static int yas_bma250_set_delay(int delay) { unsigned char odr; int i; /* Check initialize */ if (acc_data.initialize == 0) { return YAS_ERROR_NOT_INITIALIZED; } /* Determine optimum odr */ for (i = 1; i < (int)(sizeof(yas_bma250_odr_tbl) / sizeof(struct yas_bma250_odr)) && delay >= (int)yas_bma250_odr_tbl[i].delay; i++) ; odr = yas_bma250_odr_tbl[i-1].odr; acc_data.delay = delay; if (yas_bma250_get_enable()) { yas_bma250_update_bits(YAS_BMA250_BANDWIDTH, odr); yas_bma250_update_bits(YAS_BMA250_SLEEP_DUR, bma250_set_sleep_dur(odr)); } else { yas_bma250_power_up(); yas_bma250_update_bits(YAS_BMA250_BANDWIDTH, odr); yas_bma250_update_bits(YAS_BMA250_SLEEP_DUR, bma250_set_sleep_dur(odr)); yas_bma250_power_down(); } return YAS_NO_ERROR; }
static int yas_bma250_set_delay(int delay) { unsigned char odr; int i; /* Output data rate */ static const struct yas_bma250_odr yas_bma250_odr_tbl[] = { {1, YAS_BMA250_BANDWIDTH_1000HZ}, {2, YAS_BMA250_BANDWIDTH_500HZ}, {4, YAS_BMA250_BANDWIDTH_250HZ}, {8, YAS_BMA250_BANDWIDTH_125HZ}, {16, YAS_BMA250_BANDWIDTH_63HZ}, {32, YAS_BMA250_BANDWIDTH_32HZ}, {64, YAS_BMA250_BANDWIDTH_16HZ}, {128, YAS_BMA250_BANDWIDTH_8HZ}, }; /* Check initialize */ if (acc_data.initialize == 0) return YAS_ERROR_NOT_INITIALIZED; for (i = 1; i < 8; i++) { if (delay <= (int)yas_bma250_odr_tbl[i].delay) break; }; odr = yas_bma250_odr_tbl[i-1].odr; acc_data.delay = delay; if (yas_bma250_get_enable()) { yas_bma250_update_bits(YAS_BMA250_BANDWIDTH, odr); yas_bma250_update_bits(YAS_BMA250_SLEEP_DUR, bma250_set_sleep_dur(odr)); } else { yas_bma250_power_up(); yas_bma250_update_bits(YAS_BMA250_BANDWIDTH, odr); yas_bma250_update_bits(YAS_BMA250_SLEEP_DUR, bma250_set_sleep_dur(odr)); yas_bma250_power_down(); } return YAS_NO_ERROR; }