@@ -51,21 +51,28 @@ static int lsm6dso_odr_to_freq_val(uint16_t odr)
5151}
5252
5353static const uint16_t lsm6dso_accel_fs_map [] = {2 , 16 , 4 , 8 };
54- static const uint16_t lsm6dso_accel_fs_sens [] = {1 , 8 , 2 , 4 };
5554
56- static int lsm6dso_accel_range_to_fs_val (int32_t range )
55+ static int lsm6dso_accel_range_to_fs_val (int32_t range , bool double_range )
5756{
5857 size_t i ;
5958
6059 for (i = 0 ; i < ARRAY_SIZE (lsm6dso_accel_fs_map ); i ++ ) {
61- if (range == lsm6dso_accel_fs_map [i ]) {
60+ if (range == ( lsm6dso_accel_fs_map [i ] << double_range ) ) {
6261 return i ;
6362 }
6463 }
6564
6665 return - EINVAL ;
6766}
6867
68+ static int lsm6dso_accel_fs_val_to_gain (int fs , bool double_range )
69+ {
70+ /* Range of ±2G has a LSB of GAIN_UNIT_XL, thus divide by 2 */
71+ return double_range ?
72+ lsm6dso_accel_fs_map [fs ] * GAIN_UNIT_XL :
73+ lsm6dso_accel_fs_map [fs ] * GAIN_UNIT_XL / 2 ;
74+ }
75+
6976static const uint16_t lsm6dso_gyro_fs_map [] = {250 , 125 , 500 , 0 , 1000 , 0 , 2000 };
7077static const uint16_t lsm6dso_gyro_fs_sens [] = {2 , 1 , 4 , 0 , 8 , 0 , 16 };
7178
@@ -172,8 +179,10 @@ static int lsm6dso_accel_range_set(const struct device *dev, int32_t range)
172179{
173180 int fs ;
174181 struct lsm6dso_data * data = dev -> data ;
182+ const struct lsm6dso_config * cfg = dev -> config ;
183+ bool range_double = !!(cfg -> accel_range & ACCEL_RANGE_DOUBLE );
175184
176- fs = lsm6dso_accel_range_to_fs_val (range );
185+ fs = lsm6dso_accel_range_to_fs_val (range , range_double );
177186 if (fs < 0 ) {
178187 return fs ;
179188 }
@@ -183,7 +192,7 @@ static int lsm6dso_accel_range_set(const struct device *dev, int32_t range)
183192 return - EIO ;
184193 }
185194
186- data -> acc_gain = ( lsm6dso_accel_fs_sens [ fs ] * GAIN_UNIT_XL );
195+ data -> acc_gain = lsm6dso_accel_fs_val_to_gain ( fs , range_double );
187196 return 0 ;
188197}
189198
@@ -746,13 +755,13 @@ static int lsm6dso_init_chip(const struct device *dev)
746755 break ;
747756 }
748757
749- fs = cfg -> accel_range ;
758+ fs = cfg -> accel_range & ACCEL_RANGE_MASK ;
750759 LOG_DBG ("accel range is %d" , fs );
751760 if (lsm6dso_accel_set_fs_raw (dev , fs ) < 0 ) {
752761 LOG_ERR ("failed to set accelerometer range %d" , fs );
753762 return - EIO ;
754763 }
755- lsm6dso -> acc_gain = lsm6dso_accel_fs_sens [ fs ] * GAIN_UNIT_XL ;
764+ lsm6dso -> acc_gain = lsm6dso_accel_fs_val_to_gain ( fs , cfg -> accel_range & ACCEL_RANGE_DOUBLE ) ;
756765
757766 odr = cfg -> accel_odr ;
758767 LOG_DBG ("accel odr is %d" , odr );
@@ -879,7 +888,9 @@ static int lsm6dso_init(const struct device *dev)
879888#define LSM6DSO_CONFIG_COMMON (inst ) \
880889 .accel_pm = DT_INST_PROP(inst, accel_pm), \
881890 .accel_odr = DT_INST_PROP(inst, accel_odr), \
882- .accel_range = DT_INST_PROP(inst, accel_range), \
891+ .accel_range = DT_INST_PROP(inst, accel_range) | \
892+ (DT_NODE_HAS_COMPAT(DT_DRV_INST(inst), st_lsm6dso32) ? \
893+ ACCEL_RANGE_DOUBLE : 0), \
883894 .gyro_pm = DT_INST_PROP(inst, gyro_pm), \
884895 .gyro_odr = DT_INST_PROP(inst, gyro_odr), \
885896 .gyro_range = DT_INST_PROP(inst, gyro_range), \
0 commit comments