diff options
-rw-r--r-- | driver/accelgyro_lsm6dsm.c | 13 | ||||
-rw-r--r-- | driver/accelgyro_lsm6dsm.h | 19 |
2 files changed, 9 insertions, 23 deletions
diff --git a/driver/accelgyro_lsm6dsm.c b/driver/accelgyro_lsm6dsm.c index 11aceb5347..5e2ab05a54 100644 --- a/driver/accelgyro_lsm6dsm.c +++ b/driver/accelgyro_lsm6dsm.c @@ -45,7 +45,8 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd) if (s->type == MOTIONSENSE_TYPE_ACCEL) { /* Adjust and check rounded value for acc. */ if (rnd && (newrange < LSM6DSM_ACCEL_NORMALIZE_FS(newrange))) - newrange <<= 1; + newrange *= 2; + if (newrange > LSM6DSM_ACCEL_FS_MAX_VAL) newrange = LSM6DSM_ACCEL_FS_MAX_VAL; @@ -53,7 +54,8 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd) } else { /* Adjust and check rounded value for gyro. */ if (rnd && (newrange < LSM6DSM_GYRO_NORMALIZE_FS(newrange))) - newrange <<= 1; + newrange *= 2; + if (newrange > LSM6DSM_GYRO_FS_MAX_VAL) newrange = LSM6DSM_GYRO_FS_MAX_VAL; @@ -65,7 +67,7 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd) if (err == EC_SUCCESS) /* Save internally gain for speed optimization. */ data->base.range = (s->type == MOTIONSENSE_TYPE_ACCEL ? - LSM6DSM_ACCEL_FS_GAIN(newrange) : + newrange : LSM6DSM_GYRO_FS_GAIN(newrange)); mutex_unlock(s->mutex); @@ -82,9 +84,8 @@ static int get_range(const struct motion_sensor_t *s) { struct stprivate_data *data = s->drv_data; - if (MOTIONSENSE_TYPE_ACCEL == s->type) - return LSM6DSM_ACCEL_GAIN_FS(data->base.range); - + if (s->type == MOTIONSENSE_TYPE_ACCEL) + return data->base.range; return LSM6DSM_GYRO_GAIN_FS(data->base.range); } diff --git a/driver/accelgyro_lsm6dsm.h b/driver/accelgyro_lsm6dsm.h index 1c1dea606d..606e19153f 100644 --- a/driver/accelgyro_lsm6dsm.h +++ b/driver/accelgyro_lsm6dsm.h @@ -85,31 +85,16 @@ enum lsm6dsm_odr { #define LSM6DSM_ACCEL_FS_8G_VAL 0x03 #define LSM6DSM_ACCEL_FS_16G_VAL 0x01 -#define LSM6DSM_ACCEL_FS_2G_GAIN 61 -#define LSM6DSM_ACCEL_FS_4G_GAIN 122 -#define LSM6DSM_ACCEL_FS_8G_GAIN 244 -#define LSM6DSM_ACCEL_FS_16G_GAIN 488 - #define LSM6DSM_ACCEL_FS_MAX_VAL 16 -/* Accel Gain value from selected Full Scale */ -#define LSM6DSM_ACCEL_FS_GAIN(_fs) \ - (_fs == 16 ? LSM6DSM_ACCEL_FS_16G_GAIN : \ - LSM6DSM_ACCEL_FS_2G_GAIN << __fls(_fs / 2)) - -/* Accel FS Full Scale value from Gain */ -#define LSM6DSM_ACCEL_GAIN_FS(_gain) \ - (1 << (32 - __builtin_clz(_gain / LSM6DSM_ACCEL_FS_2G_GAIN))) - /* Accel Reg value from Full Scale */ #define LSM6DSM_ACCEL_FS_REG(_fs) \ (_fs == 2 ? LSM6DSM_ACCEL_FS_2G_VAL : \ _fs == 16 ? LSM6DSM_ACCEL_FS_16G_VAL : \ - (32 - __builtin_clz(_fs / 2))) + __fls(_fs)) /* Accel normalized FS value from Full Scale */ -#define LSM6DSM_ACCEL_NORMALIZE_FS(_fs) \ - (1 << (32 - __builtin_clz(_fs / 2))) +#define LSM6DSM_ACCEL_NORMALIZE_FS(_fs) (1 << __fls(_fs)) /* Full Scale range value and gain for Gyro */ #define LSM6DSM_GYRO_FS_ADDR 0x11 |