@@ -19,6 +19,45 @@ LOG_MODULE_DECLARE(LSM6DSV16X_RTIO);
19
19
#define FIFO_TH 1
20
20
#define FIFO_FULL 2
21
21
22
+ int lsm6dsv16x_gbias_config (const struct device * dev , enum sensor_channel chan ,
23
+ enum sensor_attribute attr ,
24
+ const struct sensor_value * val )
25
+ {
26
+ struct lsm6dsv16x_data * lsm6dsv16x = dev -> data ;
27
+
28
+ switch (attr ) {
29
+ case SENSOR_ATTR_OFFSET :
30
+ lsm6dsv16x -> gbias_x_udps = 10 * sensor_rad_to_10udegrees (& val [0 ]);
31
+ lsm6dsv16x -> gbias_y_udps = 10 * sensor_rad_to_10udegrees (& val [1 ]);
32
+ lsm6dsv16x -> gbias_z_udps = 10 * sensor_rad_to_10udegrees (& val [2 ]);
33
+ break ;
34
+ default :
35
+ LOG_DBG ("Accel attribute not supported." );
36
+ return - ENOTSUP ;
37
+ }
38
+
39
+ return 0 ;
40
+ }
41
+
42
+ int lsm6dsv16x_gbias_get_config (const struct device * dev , enum sensor_channel chan ,
43
+ enum sensor_attribute attr , struct sensor_value * val )
44
+ {
45
+ struct lsm6dsv16x_data * lsm6dsv16x = dev -> data ;
46
+
47
+ switch (attr ) {
48
+ case SENSOR_ATTR_OFFSET :
49
+ sensor_10udegrees_to_rad (lsm6dsv16x -> gbias_x_udps / 10 , & val [0 ]);
50
+ sensor_10udegrees_to_rad (lsm6dsv16x -> gbias_y_udps / 10 , & val [1 ]);
51
+ sensor_10udegrees_to_rad (lsm6dsv16x -> gbias_z_udps / 10 , & val [2 ]);
52
+ break ;
53
+ default :
54
+ LOG_DBG ("Accel attribute not supported." );
55
+ return - ENOTSUP ;
56
+ }
57
+
58
+ return 0 ;
59
+ }
60
+
22
61
static void lsm6dsv16x_config_fifo (const struct device * dev , uint8_t fifo_irq )
23
62
{
24
63
struct lsm6dsv16x_data * lsm6dsv16x = dev -> data ;
@@ -32,6 +71,7 @@ static void lsm6dsv16x_config_fifo(const struct device *dev, uint8_t fifo_irq)
32
71
lsm6dsv16x_fifo_mode_t fifo_mode = LSM6DSV16X_BYPASS_MODE ;
33
72
lsm6dsv16x_sflp_data_rate_t sflp_odr = LSM6DSV16X_SFLP_120Hz ;
34
73
lsm6dsv16x_fifo_sflp_raw_t sflp_fifo = { 0 };
74
+ lsm6dsv16x_sflp_gbias_t gbias ;
35
75
36
76
/* disable FIFO as first thing */
37
77
lsm6dsv16x_fifo_mode_set (ctx , LSM6DSV16X_BYPASS_MODE );
@@ -89,6 +129,52 @@ static void lsm6dsv16x_config_fifo(const struct device *dev, uint8_t fifo_irq)
89
129
lsm6dsv16x_fifo_sflp_batch_set (ctx , sflp_fifo );
90
130
lsm6dsv16x_sflp_game_rotation_set (ctx , PROPERTY_ENABLE );
91
131
132
+ /*
133
+ * Temporarly set Accel and gyro odr same as sensor fusion LP in order to
134
+ * make the SFLP gbias setting effective. Then restore it to saved values.
135
+ */
136
+ switch (sflp_odr ) {
137
+ case LSM6DSV16X_DT_SFLP_ODR_AT_480Hz :
138
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_480Hz );
139
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_480Hz );
140
+ break ;
141
+
142
+ case LSM6DSV16X_DT_SFLP_ODR_AT_240Hz :
143
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_240Hz );
144
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_240Hz );
145
+ break ;
146
+
147
+ case LSM6DSV16X_DT_SFLP_ODR_AT_120Hz :
148
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_120Hz );
149
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_120Hz );
150
+ break ;
151
+
152
+ case LSM6DSV16X_DT_SFLP_ODR_AT_60Hz :
153
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_60Hz );
154
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_60Hz );
155
+ break ;
156
+
157
+ case LSM6DSV16X_DT_SFLP_ODR_AT_30Hz :
158
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_30Hz );
159
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_30Hz );
160
+ break ;
161
+
162
+ case LSM6DSV16X_DT_SFLP_ODR_AT_15Hz :
163
+ lsm6dsv16x_accel_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_15Hz );
164
+ lsm6dsv16x_gyro_set_odr_raw (dev , LSM6DSV16X_DT_ODR_AT_15Hz );
165
+ break ;
166
+ }
167
+
168
+ /* set sflp gbias */
169
+ gbias .gbias_x = (float )lsm6dsv16x -> gbias_x_udps / 1000000 ;
170
+ gbias .gbias_y = (float )lsm6dsv16x -> gbias_y_udps / 1000000 ;
171
+ gbias .gbias_z = (float )lsm6dsv16x -> gbias_z_udps / 1000000 ;
172
+ lsm6dsv16x_sflp_game_gbias_set (ctx , & gbias );
173
+
174
+ /* restore accel/gyro odr to saved values */
175
+ lsm6dsv16x_accel_set_odr_raw (dev , lsm6dsv16x -> accel_freq );
176
+ lsm6dsv16x_gyro_set_odr_raw (dev , lsm6dsv16x -> gyro_freq );
177
+
92
178
/* Set pin interrupt (fifo_th could be on or off) */
93
179
if ((config -> drdy_pin == 1 ) || (ON_I3C_BUS (config ) && (!I3C_INT_PIN (config )))) {
94
180
lsm6dsv16x_pin_int1_route_set (ctx , & pin_int );
0 commit comments