1 /**
2 ******************************************************************************
3 * @file lsm6dsv16x_reg.c
4 * @author Sensors Software Solution Team
5 * @brief LSM6DSV16X driver file
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2024 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19
20 #include "lsm6dsv16x_reg.h"
21
22 /**
23 * @defgroup LSM6DSV16X
24 * @brief This file provides a set of functions needed to drive the
25 * lsm6dsv16x enhanced inertial module.
26 * @{
27 *
28 */
29
30 /**
31 * @defgroup Interfaces functions
32 * @brief This section provide a set of functions used to read and
33 * write a generic register of the device.
34 * MANDATORY: return 0 -> no Error.
35 * @{
36 *
37 */
38
39 /**
40 * @brief Read generic device register
41 *
42 * @param ctx communication interface handler.(ptr)
43 * @param reg first register address to read.
44 * @param data buffer for data read.(ptr)
45 * @param len number of consecutive register to read.
46 * @retval interface status (MANDATORY: return 0 -> no Error)
47 *
48 */
lsm6dsv16x_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lsm6dsv16x_read_reg(const stmdev_ctx_t *ctx, uint8_t reg,
50 uint8_t *data,
51 uint16_t len)
52 {
53 int32_t ret;
54
55 if (ctx == NULL)
56 {
57 return -1;
58 }
59
60 ret = ctx->read_reg(ctx->handle, reg, data, len);
61
62 return ret;
63 }
64
65 /**
66 * @brief Write generic device register
67 *
68 * @param ctx communication interface handler.(ptr)
69 * @param reg first register address to write.
70 * @param data the buffer contains data to be written.(ptr)
71 * @param len number of consecutive register to write.
72 * @retval interface status (MANDATORY: return 0 -> no Error)
73 *
74 */
lsm6dsv16x_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lsm6dsv16x_write_reg(const stmdev_ctx_t *ctx, uint8_t reg,
76 uint8_t *data,
77 uint16_t len)
78 {
79 int32_t ret;
80
81 if (ctx == NULL)
82 {
83 return -1;
84 }
85
86 ret = ctx->write_reg(ctx->handle, reg, data, len);
87
88 return ret;
89 }
90
91 /**
92 * @}
93 *
94 */
95
96 /**
97 * @defgroup Private functions
98 * @brief Section collect all the utility functions needed by APIs.
99 * @{
100 *
101 */
102
bytecpy(uint8_t * target,uint8_t * source)103 static void bytecpy(uint8_t *target, uint8_t *source)
104 {
105 if ((target != NULL) && (source != NULL))
106 {
107 *target = *source;
108 }
109 }
110
111 /**
112 * @}
113 *
114 */
115
116 /**
117 * @defgroup Sensitivity
118 * @brief These functions convert raw-data into engineering units.
119 * @{
120 *
121 */
lsm6dsv16x_from_sflp_to_mg(int16_t lsb)122 float_t lsm6dsv16x_from_sflp_to_mg(int16_t lsb)
123 {
124 return ((float_t)lsb) * 0.061f;
125 }
126
lsm6dsv16x_from_fs2_to_mg(int16_t lsb)127 float_t lsm6dsv16x_from_fs2_to_mg(int16_t lsb)
128 {
129 return ((float_t)lsb) * 0.061f;
130 }
131
lsm6dsv16x_from_fs4_to_mg(int16_t lsb)132 float_t lsm6dsv16x_from_fs4_to_mg(int16_t lsb)
133 {
134 return ((float_t)lsb) * 0.122f;
135 }
136
lsm6dsv16x_from_fs8_to_mg(int16_t lsb)137 float_t lsm6dsv16x_from_fs8_to_mg(int16_t lsb)
138 {
139 return ((float_t)lsb) * 0.244f;
140 }
141
lsm6dsv16x_from_fs16_to_mg(int16_t lsb)142 float_t lsm6dsv16x_from_fs16_to_mg(int16_t lsb)
143 {
144 return ((float_t)lsb) * 0.488f;
145 }
146
lsm6dsv16x_from_fs125_to_mdps(int16_t lsb)147 float_t lsm6dsv16x_from_fs125_to_mdps(int16_t lsb)
148 {
149 return ((float_t)lsb) * 4.375f;
150 }
151
lsm6dsv16x_from_fs250_to_mdps(int16_t lsb)152 float_t lsm6dsv16x_from_fs250_to_mdps(int16_t lsb)
153 {
154 return ((float_t)lsb) * 8.750f;
155 }
156
lsm6dsv16x_from_fs500_to_mdps(int16_t lsb)157 float_t lsm6dsv16x_from_fs500_to_mdps(int16_t lsb)
158 {
159 return ((float_t)lsb) * 17.50f;
160 }
161
lsm6dsv16x_from_fs1000_to_mdps(int16_t lsb)162 float_t lsm6dsv16x_from_fs1000_to_mdps(int16_t lsb)
163 {
164 return ((float_t)lsb) * 35.0f;
165 }
166
lsm6dsv16x_from_fs2000_to_mdps(int16_t lsb)167 float_t lsm6dsv16x_from_fs2000_to_mdps(int16_t lsb)
168 {
169 return ((float_t)lsb) * 70.0f;
170 }
171
lsm6dsv16x_from_fs4000_to_mdps(int16_t lsb)172 float_t lsm6dsv16x_from_fs4000_to_mdps(int16_t lsb)
173 {
174 return ((float_t)lsb) * 140.0f;
175 }
176
lsm6dsv16x_from_lsb_to_celsius(int16_t lsb)177 float_t lsm6dsv16x_from_lsb_to_celsius(int16_t lsb)
178 {
179 return (((float_t)lsb / 256.0f) + 25.0f);
180 }
181
lsm6dsv16x_from_lsb_to_nsec(uint32_t lsb)182 float_t lsm6dsv16x_from_lsb_to_nsec(uint32_t lsb)
183 {
184 return ((float_t)lsb * 21750.0f);
185 }
186
lsm6dsv16x_from_lsb_to_mv(int16_t lsb)187 float_t lsm6dsv16x_from_lsb_to_mv(int16_t lsb)
188 {
189 return ((float_t)lsb) / 78.0f;
190 }
191
192 /*
193 * Original conversion routines taken from: https://github.com/numpy/numpy
194 *
195 * Converts from half-precision (16-bit) float number to single precision (32-bit).
196 *
197 * uint32_t static uint32_t ToFloatBits(uint16_t h);
198 * Released under BSD-3-Clause License
199 */
ToFloatBits(uint16_t h)200 static uint32_t ToFloatBits(uint16_t h)
201 {
202 uint16_t h_exp = (h & 0x7c00u);
203 uint32_t f_sgn = ((uint32_t)h & 0x8000u) << 16;
204 switch (h_exp)
205 {
206 case 0x0000u: // 0 or subnormal
207 {
208 uint16_t h_sig = (h & 0x03ffu);
209 // Signed zero
210 if (h_sig == 0)
211 {
212 return f_sgn;
213 }
214 // Subnormal
215 h_sig <<= 1;
216 while ((h_sig & 0x0400u) == 0)
217 {
218 h_sig <<= 1;
219 h_exp++;
220 }
221 uint32_t f_exp = ((uint32_t)(127 - 15 - h_exp)) << 23;
222 uint32_t f_sig = ((uint32_t)(h_sig & 0x03ffu)) << 13;
223 return f_sgn + f_exp + f_sig;
224 }
225 case 0x7c00u: // inf or NaN
226 // All-ones exponent and a copy of the significand
227 return f_sgn + 0x7f800000u + (((uint32_t)(h & 0x03ffu)) << 13);
228 default: // normalized
229 // Just need to adjust the exponent and shift
230 return f_sgn + (((uint32_t)(h & 0x7fffu) + 0x1c000u) << 13);
231 }
232 }
233
234 /**
235 * @brief Convert from 16-bit to 32-bit float number
236 *
237 * @param val Batching in FIFO buffer of SFLP values.
238 * @retval interface status (MANDATORY: return 0 -> no Error)
239 *
240 */
lsm6dsv16x_from_f16_to_f32(uint16_t val)241 uint32_t lsm6dsv16x_from_f16_to_f32(uint16_t val)
242 {
243 return ToFloatBits(val);
244 }
245
246 /**
247 * @}
248 *
249 */
250
251 /**
252 * @defgroup Accelerometer user offset correction
253 * @brief This section groups all the functions concerning the
254 * usage of Accelerometer user offset correction
255 * @{
256 *
257 */
258
259 /**
260 * @brief Enables accelerometer user offset correction block; it is valid for the low-pass path.[set]
261 *
262 * @param ctx read / write interface definitions
263 * @param val Enables accelerometer user offset correction block; it is valid for the low-pass path.
264 * @retval interface status (MANDATORY: return 0 -> no Error)
265 *
266 */
lsm6dsv16x_xl_offset_on_out_set(const stmdev_ctx_t * ctx,uint8_t val)267 int32_t lsm6dsv16x_xl_offset_on_out_set(const stmdev_ctx_t *ctx, uint8_t val)
268 {
269 lsm6dsv16x_ctrl9_t ctrl9;
270 int32_t ret;
271
272 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
273 if (ret == 0)
274 {
275 ctrl9.usr_off_on_out = val;
276 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
277 }
278
279 return ret;
280 }
281
282 /**
283 * @brief Enables accelerometer user offset correction block; it is valid for the low-pass path.[get]
284 *
285 * @param ctx read / write interface definitions
286 * @param val Enables accelerometer user offset correction block; it is valid for the low-pass path.
287 * @retval interface status (MANDATORY: return 0 -> no Error)
288 *
289 */
lsm6dsv16x_xl_offset_on_out_get(const stmdev_ctx_t * ctx,uint8_t * val)290 int32_t lsm6dsv16x_xl_offset_on_out_get(const stmdev_ctx_t *ctx, uint8_t *val)
291 {
292 lsm6dsv16x_ctrl9_t ctrl9;
293 int32_t ret;
294
295 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
296 *val = ctrl9.usr_off_on_out;
297
298 return ret;
299 }
300
301 /**
302 * @brief Accelerometer user offset correction values in mg.[set]
303 *
304 * @param ctx read / write interface definitions
305 * @param val Accelerometer user offset correction values in mg.
306 * @retval interface status (MANDATORY: return 0 -> no Error)
307 *
308 */
lsm6dsv16x_xl_offset_mg_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_offset_mg_t val)309 int32_t lsm6dsv16x_xl_offset_mg_set(const stmdev_ctx_t *ctx,
310 lsm6dsv16x_xl_offset_mg_t val)
311 {
312 lsm6dsv16x_z_ofs_usr_t z_ofs_usr;
313 lsm6dsv16x_y_ofs_usr_t y_ofs_usr;
314 lsm6dsv16x_x_ofs_usr_t x_ofs_usr;
315 lsm6dsv16x_ctrl9_t ctrl9;
316 int32_t ret;
317 float_t tmp;
318
319 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
320 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
321 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
322 if (ret != 0)
323 {
324 return ret;
325 }
326
327
328 if ((val.x_mg < (0.0078125f * 127.0f)) && (val.x_mg > (0.0078125f * -127.0f)) &&
329 (val.y_mg < (0.0078125f * 127.0f)) && (val.y_mg > (0.0078125f * -127.0f)) &&
330 (val.z_mg < (0.0078125f * 127.0f)) && (val.z_mg > (0.0078125f * -127.0f)))
331 {
332 ctrl9.usr_off_w = 0;
333
334 tmp = val.z_mg / 0.0078125f;
335 z_ofs_usr.z_ofs_usr = (uint8_t)tmp;
336
337 tmp = val.y_mg / 0.0078125f;
338 y_ofs_usr.y_ofs_usr = (uint8_t)tmp;
339
340 tmp = val.x_mg / 0.0078125f;
341 x_ofs_usr.x_ofs_usr = (uint8_t)tmp;
342 }
343 else if ((val.x_mg < (0.125f * 127.0f)) && (val.x_mg > (0.125f * -127.0f)) &&
344 (val.y_mg < (0.125f * 127.0f)) && (val.y_mg > (0.125f * -127.0f)) &&
345 (val.z_mg < (0.125f * 127.0f)) && (val.z_mg > (0.125f * -127.0f)))
346 {
347 ctrl9.usr_off_w = 1;
348
349 tmp = val.z_mg / 0.125f;
350 z_ofs_usr.z_ofs_usr = (uint8_t)tmp;
351
352 tmp = val.y_mg / 0.125f;
353 y_ofs_usr.y_ofs_usr = (uint8_t)tmp;
354
355 tmp = val.x_mg / 0.125f;
356 x_ofs_usr.x_ofs_usr = (uint8_t)tmp;
357 }
358 else // out of limit
359 {
360 ctrl9.usr_off_w = 1;
361 z_ofs_usr.z_ofs_usr = 0xFFU;
362 y_ofs_usr.y_ofs_usr = 0xFFU;
363 x_ofs_usr.x_ofs_usr = 0xFFU;
364 }
365
366 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
367 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
368 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
369 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
370
371 return ret;
372 }
373
374 /**
375 * @brief Accelerometer user offset correction values in mg.[get]
376 *
377 * @param ctx read / write interface definitions
378 * @param val Accelerometer user offset correction values in mg.
379 * @retval interface status (MANDATORY: return 0 -> no Error)
380 *
381 */
lsm6dsv16x_xl_offset_mg_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_offset_mg_t * val)382 int32_t lsm6dsv16x_xl_offset_mg_get(const stmdev_ctx_t *ctx,
383 lsm6dsv16x_xl_offset_mg_t *val)
384 {
385 lsm6dsv16x_z_ofs_usr_t z_ofs_usr;
386 lsm6dsv16x_y_ofs_usr_t y_ofs_usr;
387 lsm6dsv16x_x_ofs_usr_t x_ofs_usr;
388 lsm6dsv16x_ctrl9_t ctrl9;
389 int32_t ret;
390
391 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
392 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
393 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
394 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
395 if (ret != 0)
396 {
397 return ret;
398 }
399
400 if (ctrl9.usr_off_w == PROPERTY_DISABLE)
401 {
402 val->z_mg = ((float_t)z_ofs_usr.z_ofs_usr * 0.0078125f);
403 val->y_mg = ((float_t)y_ofs_usr.y_ofs_usr * 0.0078125f);
404 val->x_mg = ((float_t)x_ofs_usr.x_ofs_usr * 0.0078125f);
405 }
406 else
407 {
408 val->z_mg = ((float_t)z_ofs_usr.z_ofs_usr * 0.125f);
409 val->y_mg = ((float_t)y_ofs_usr.y_ofs_usr * 0.125f);
410 val->x_mg = ((float_t)x_ofs_usr.x_ofs_usr * 0.125f);
411 }
412
413 return ret;
414 }
415
416 /**
417 * @}
418 *
419 */
420
421 /**
422 * @brief Reset of the device.[set]
423 *
424 * @param ctx read / write interface definitions
425 * @param val Reset of the device.
426 * @retval interface status (MANDATORY: return 0 -> no Error)
427 *
428 */
lsm6dsv16x_reset_set(const stmdev_ctx_t * ctx,lsm6dsv16x_reset_t val)429 int32_t lsm6dsv16x_reset_set(const stmdev_ctx_t *ctx, lsm6dsv16x_reset_t val)
430 {
431 lsm6dsv16x_func_cfg_access_t func_cfg_access;
432 lsm6dsv16x_ctrl3_t ctrl3;
433 int32_t ret;
434
435 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
436 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
437 if (ret != 0)
438 {
439 return ret;
440 }
441
442 ctrl3.boot = ((uint8_t)val & 0x04U) >> 2;
443 ctrl3.sw_reset = ((uint8_t)val & 0x02U) >> 1;
444 func_cfg_access.sw_por = (uint8_t)val & 0x01U;
445
446 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
447 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
448
449 return ret;
450 }
451
452 /**
453 * @brief Global reset of the device.[get]
454 *
455 * @param ctx read / write interface definitions
456 * @param val Global reset of the device.
457 * @retval interface status (MANDATORY: return 0 -> no Error)
458 *
459 */
lsm6dsv16x_reset_get(const stmdev_ctx_t * ctx,lsm6dsv16x_reset_t * val)460 int32_t lsm6dsv16x_reset_get(const stmdev_ctx_t *ctx, lsm6dsv16x_reset_t *val)
461 {
462 lsm6dsv16x_func_cfg_access_t func_cfg_access;
463 lsm6dsv16x_ctrl3_t ctrl3;
464 int32_t ret;
465
466 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
467 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
468 if (ret != 0)
469 {
470 return ret;
471 }
472
473 switch ((ctrl3.sw_reset << 2) + (ctrl3.boot << 1) + func_cfg_access.sw_por)
474 {
475 case LSM6DSV16X_READY:
476 *val = LSM6DSV16X_READY;
477 break;
478
479 case LSM6DSV16X_GLOBAL_RST:
480 *val = LSM6DSV16X_GLOBAL_RST;
481 break;
482
483 case LSM6DSV16X_RESTORE_CAL_PARAM:
484 *val = LSM6DSV16X_RESTORE_CAL_PARAM;
485 break;
486
487 case LSM6DSV16X_RESTORE_CTRL_REGS:
488 *val = LSM6DSV16X_RESTORE_CTRL_REGS;
489 break;
490
491 default:
492 *val = LSM6DSV16X_GLOBAL_RST;
493 break;
494 }
495
496 return ret;
497 }
498
499 /**
500 * @brief Change memory bank.[set]
501 *
502 * @param ctx read / write interface definitions
503 * @param val MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK,
504 * @retval interface status (MANDATORY: return 0 -> no Error)
505 *
506 */
lsm6dsv16x_mem_bank_set(const stmdev_ctx_t * ctx,lsm6dsv16x_mem_bank_t val)507 int32_t lsm6dsv16x_mem_bank_set(const stmdev_ctx_t *ctx, lsm6dsv16x_mem_bank_t val)
508 {
509 lsm6dsv16x_func_cfg_access_t func_cfg_access;
510 int32_t ret;
511
512 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
513 if (ret != 0)
514 {
515 return ret;
516 }
517
518 func_cfg_access.shub_reg_access = ((uint8_t)val & 0x02U) >> 1;
519 func_cfg_access.emb_func_reg_access = (uint8_t)val & 0x01U;
520 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
521
522 return ret;
523 }
524
525 /**
526 * @brief Change memory bank.[get]
527 *
528 * @param ctx read / write interface definitions
529 * @param val MAIN_MEM_BANK, SENSOR_HUB_MEM_BANK, EMBED_FUNC_MEM_BANK,
530 * @retval interface status (MANDATORY: return 0 -> no Error)
531 *
532 */
lsm6dsv16x_mem_bank_get(const stmdev_ctx_t * ctx,lsm6dsv16x_mem_bank_t * val)533 int32_t lsm6dsv16x_mem_bank_get(const stmdev_ctx_t *ctx, lsm6dsv16x_mem_bank_t *val)
534 {
535 lsm6dsv16x_func_cfg_access_t func_cfg_access;
536 int32_t ret;
537
538 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
539 if (ret != 0)
540 {
541 return ret;
542 }
543
544 switch ((func_cfg_access.shub_reg_access << 1) + func_cfg_access.emb_func_reg_access)
545 {
546 case LSM6DSV16X_MAIN_MEM_BANK:
547 *val = LSM6DSV16X_MAIN_MEM_BANK;
548 break;
549
550 case LSM6DSV16X_EMBED_FUNC_MEM_BANK:
551 *val = LSM6DSV16X_EMBED_FUNC_MEM_BANK;
552 break;
553
554 case LSM6DSV16X_SENSOR_HUB_MEM_BANK:
555 *val = LSM6DSV16X_SENSOR_HUB_MEM_BANK;
556 break;
557
558 default:
559 *val = LSM6DSV16X_MAIN_MEM_BANK;
560 break;
561 }
562
563 return ret;
564 }
565
566 /**
567 * @brief Device ID.[get] THis function works also for OIS
568 * (WHO_AM_I and SPI2_WHO_AM_I have same address)
569 *
570 * @param ctx read / write interface definitions
571 * @param val Device ID.
572 * @retval interface status (MANDATORY: return 0 -> no Error)
573 *
574 */
lsm6dsv16x_device_id_get(const stmdev_ctx_t * ctx,uint8_t * val)575 int32_t lsm6dsv16x_device_id_get(const stmdev_ctx_t *ctx, uint8_t *val)
576 {
577 int32_t ret;
578
579 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WHO_AM_I, val, 1);
580
581 return ret;
582 }
583
584 /**
585 * @brief Accelerometer output data rate (ODR) selection.[set]
586 *
587 * @param ctx read / write interface definitions
588 * @param val lsm6dsv16x_data_rate_t enum
589 * @retval interface status (MANDATORY: return 0 -> no Error)
590 *
591 */
lsm6dsv16x_xl_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_data_rate_t val)592 int32_t lsm6dsv16x_xl_data_rate_set(const stmdev_ctx_t *ctx,
593 lsm6dsv16x_data_rate_t val)
594 {
595 lsm6dsv16x_ctrl1_t ctrl1;
596 lsm6dsv16x_haodr_cfg_t haodr;
597 uint8_t sel;
598 int32_t ret;
599
600 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
601 if (ret != 0)
602 {
603 return ret;
604 }
605
606 ctrl1.odr_xl = (uint8_t)val & 0x0Fu;
607 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
608 if (ret != 0)
609 {
610 return ret;
611 }
612
613 sel = ((uint8_t)val >> 4) & 0xFU;
614 if (sel != 0U)
615 {
616 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
617 haodr.haodr_sel = sel;
618 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
619 }
620
621 return ret;
622 }
623
624 /**
625 * @brief Accelerometer output data rate (ODR) selection.[get]
626 *
627 * @param ctx read / write interface definitions
628 * @param val lsm6dsv16x_data_rate_t enum
629 * @retval interface status (MANDATORY: return 0 -> no Error)
630 *
631 */
lsm6dsv16x_xl_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_data_rate_t * val)632 int32_t lsm6dsv16x_xl_data_rate_get(const stmdev_ctx_t *ctx,
633 lsm6dsv16x_data_rate_t *val)
634 {
635 lsm6dsv16x_ctrl1_t ctrl1;
636 lsm6dsv16x_haodr_cfg_t haodr;
637 uint8_t sel;
638 int32_t ret;
639
640 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
641 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
642 if (ret != 0)
643 {
644 return ret;
645 }
646
647 sel = haodr.haodr_sel;
648
649 switch (ctrl1.odr_xl)
650 {
651 case LSM6DSV16X_ODR_OFF:
652 *val = LSM6DSV16X_ODR_OFF;
653 break;
654
655 case LSM6DSV16X_ODR_AT_1Hz875:
656 *val = LSM6DSV16X_ODR_AT_1Hz875;
657 break;
658
659 case LSM6DSV16X_ODR_AT_7Hz5:
660 *val = LSM6DSV16X_ODR_AT_7Hz5;
661 break;
662
663 case LSM6DSV16X_ODR_AT_15Hz:
664 switch (sel)
665 {
666 default:
667 case 0:
668 *val = LSM6DSV16X_ODR_AT_15Hz;
669 break;
670 case 1:
671 *val = LSM6DSV16X_ODR_HA01_AT_15Hz625;
672 break;
673 case 2:
674 *val = LSM6DSV16X_ODR_HA02_AT_12Hz5;
675 break;
676 }
677 break;
678
679 case LSM6DSV16X_ODR_AT_30Hz:
680 switch (sel)
681 {
682 default:
683 case 0:
684 *val = LSM6DSV16X_ODR_AT_30Hz;
685 break;
686 case 1:
687 *val = LSM6DSV16X_ODR_HA01_AT_31Hz25;
688 break;
689 case 2:
690 *val = LSM6DSV16X_ODR_HA02_AT_25Hz;
691 break;
692 }
693 break;
694
695 case LSM6DSV16X_ODR_AT_60Hz:
696 switch (sel)
697 {
698 default:
699 case 0:
700 *val = LSM6DSV16X_ODR_AT_60Hz;
701 break;
702 case 1:
703 *val = LSM6DSV16X_ODR_HA01_AT_62Hz5;
704 break;
705 case 2:
706 *val = LSM6DSV16X_ODR_HA02_AT_50Hz;
707 break;
708 }
709 break;
710
711 case LSM6DSV16X_ODR_AT_120Hz:
712 switch (sel)
713 {
714 default:
715 case 0:
716 *val = LSM6DSV16X_ODR_AT_120Hz;
717 break;
718 case 1:
719 *val = LSM6DSV16X_ODR_HA01_AT_125Hz;
720 break;
721 case 2:
722 *val = LSM6DSV16X_ODR_HA02_AT_100Hz;
723 break;
724 }
725 break;
726
727 case LSM6DSV16X_ODR_AT_240Hz:
728 switch (sel)
729 {
730 default:
731 case 0:
732 *val = LSM6DSV16X_ODR_AT_240Hz;
733 break;
734 case 1:
735 *val = LSM6DSV16X_ODR_HA01_AT_250Hz;
736 break;
737 case 2:
738 *val = LSM6DSV16X_ODR_HA02_AT_200Hz;
739 break;
740 }
741 break;
742
743 case LSM6DSV16X_ODR_AT_480Hz:
744 switch (sel)
745 {
746 default:
747 case 0:
748 *val = LSM6DSV16X_ODR_AT_480Hz;
749 break;
750 case 1:
751 *val = LSM6DSV16X_ODR_HA01_AT_500Hz;
752 break;
753 case 2:
754 *val = LSM6DSV16X_ODR_HA02_AT_400Hz;
755 break;
756 }
757 break;
758
759 case LSM6DSV16X_ODR_AT_960Hz:
760 switch (sel)
761 {
762 default:
763 case 0:
764 *val = LSM6DSV16X_ODR_AT_960Hz;
765 break;
766 case 1:
767 *val = LSM6DSV16X_ODR_HA01_AT_1000Hz;
768 break;
769 case 2:
770 *val = LSM6DSV16X_ODR_HA02_AT_800Hz;
771 break;
772 }
773 break;
774
775 case LSM6DSV16X_ODR_AT_1920Hz:
776 switch (sel)
777 {
778 default:
779 case 0:
780 *val = LSM6DSV16X_ODR_AT_1920Hz;
781 break;
782 case 1:
783 *val = LSM6DSV16X_ODR_HA01_AT_2000Hz;
784 break;
785 case 2:
786 *val = LSM6DSV16X_ODR_HA02_AT_1600Hz;
787 break;
788 }
789 break;
790
791 case LSM6DSV16X_ODR_AT_3840Hz:
792 switch (sel)
793 {
794 default:
795 case 0:
796 *val = LSM6DSV16X_ODR_AT_3840Hz;
797 break;
798 case 1:
799 *val = LSM6DSV16X_ODR_HA01_AT_4000Hz;
800 break;
801 case 2:
802 *val = LSM6DSV16X_ODR_HA02_AT_3200Hz;
803 break;
804 }
805 break;
806
807 case LSM6DSV16X_ODR_AT_7680Hz:
808 switch (sel)
809 {
810 default:
811 case 0:
812 *val = LSM6DSV16X_ODR_AT_7680Hz;
813 break;
814 case 1:
815 *val = LSM6DSV16X_ODR_HA01_AT_8000Hz;
816 break;
817 case 2:
818 *val = LSM6DSV16X_ODR_HA02_AT_6400Hz;
819 break;
820 }
821 break;
822
823 default:
824 *val = LSM6DSV16X_ODR_OFF;
825 break;
826 }
827
828 return ret;
829 }
830
831 /**
832 * @brief Accelerometer operating mode selection.[set]
833 *
834 * @param ctx read / write interface definitions
835 * @param val XL_HIGH_PERFORMANCE_MD, XL_HIGH_ACCURACY_ODR_MD, XL_LOW_POWER_2_AVG_MD, XL_LOW_POWER_4_AVG_MD, XL_LOW_POWER_8_AVG_MD, XL_NORMAL_MD,
836 * @retval interface status (MANDATORY: return 0 -> no Error)
837 *
838 */
lsm6dsv16x_xl_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_mode_t val)839 int32_t lsm6dsv16x_xl_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_xl_mode_t val)
840 {
841 lsm6dsv16x_ctrl1_t ctrl1;
842 int32_t ret;
843
844 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
845
846 if (ret == 0)
847 {
848 ctrl1.op_mode_xl = (uint8_t)val & 0x07U;
849 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
850 }
851
852 return ret;
853 }
854
855 /**
856 * @brief Accelerometer operating mode selection.[get]
857 *
858 * @param ctx read / write interface definitions
859 * @param val XL_HIGH_PERFORMANCE_MD, XL_HIGH_ACCURACY_ODR_MD, XL_LOW_POWER_2_AVG_MD, XL_LOW_POWER_4_AVG_MD, XL_LOW_POWER_8_AVG_MD, XL_NORMAL_MD,
860 * @retval interface status (MANDATORY: return 0 -> no Error)
861 *
862 */
lsm6dsv16x_xl_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_mode_t * val)863 int32_t lsm6dsv16x_xl_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_xl_mode_t *val)
864 {
865 lsm6dsv16x_ctrl1_t ctrl1;
866 int32_t ret;
867
868 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL1, (uint8_t *)&ctrl1, 1);
869 if (ret != 0)
870 {
871 return ret;
872 }
873
874 switch (ctrl1.op_mode_xl)
875 {
876 case LSM6DSV16X_XL_HIGH_PERFORMANCE_MD:
877 *val = LSM6DSV16X_XL_HIGH_PERFORMANCE_MD;
878 break;
879
880 case LSM6DSV16X_XL_HIGH_ACCURACY_ODR_MD:
881 *val = LSM6DSV16X_XL_HIGH_ACCURACY_ODR_MD;
882 break;
883
884 case LSM6DSV16X_XL_ODR_TRIGGERED_MD:
885 *val = LSM6DSV16X_XL_ODR_TRIGGERED_MD;
886 break;
887
888 case LSM6DSV16X_XL_LOW_POWER_2_AVG_MD:
889 *val = LSM6DSV16X_XL_LOW_POWER_2_AVG_MD;
890 break;
891
892 case LSM6DSV16X_XL_LOW_POWER_4_AVG_MD:
893 *val = LSM6DSV16X_XL_LOW_POWER_4_AVG_MD;
894 break;
895
896 case LSM6DSV16X_XL_LOW_POWER_8_AVG_MD:
897 *val = LSM6DSV16X_XL_LOW_POWER_8_AVG_MD;
898 break;
899
900 case LSM6DSV16X_XL_NORMAL_MD:
901 *val = LSM6DSV16X_XL_NORMAL_MD;
902 break;
903
904 default:
905 *val = LSM6DSV16X_XL_HIGH_PERFORMANCE_MD;
906 break;
907 }
908
909 return ret;
910 }
911
912 /**
913 * @brief Gyroscope output data rate (ODR) selection.[set]
914 *
915 * @param ctx read / write interface definitions
916 * @param val lsm6dsv16x_data_rate_t enum
917 * @retval interface status (MANDATORY: return 0 -> no Error)
918 *
919 */
lsm6dsv16x_gy_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_data_rate_t val)920 int32_t lsm6dsv16x_gy_data_rate_set(const stmdev_ctx_t *ctx,
921 lsm6dsv16x_data_rate_t val)
922 {
923 lsm6dsv16x_ctrl2_t ctrl2;
924 lsm6dsv16x_haodr_cfg_t haodr;
925 uint8_t sel;
926 int32_t ret;
927
928 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
929
930 ctrl2.odr_g = (uint8_t)val & 0x0Fu;
931 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
932 if (ret != 0)
933 {
934 return ret;
935 }
936
937 sel = ((uint8_t)val >> 4) & 0xFU;
938 if (sel != 0U)
939 {
940 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
941 haodr.haodr_sel = sel;
942 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
943 }
944
945 return ret;
946 }
947
948 /**
949 * @brief Gyroscope output data rate (ODR) selection.[get]
950 *
951 * @param ctx read / write interface definitions
952 * @param val lsm6dsv16x_data_rate_t enum
953 * @retval interface status (MANDATORY: return 0 -> no Error)
954 *
955 */
lsm6dsv16x_gy_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_data_rate_t * val)956 int32_t lsm6dsv16x_gy_data_rate_get(const stmdev_ctx_t *ctx,
957 lsm6dsv16x_data_rate_t *val)
958 {
959 lsm6dsv16x_ctrl2_t ctrl2;
960 lsm6dsv16x_haodr_cfg_t haodr;
961 uint8_t sel;
962 int32_t ret;
963
964 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
965 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_HAODR_CFG, (uint8_t *)&haodr, 1);
966 if (ret != 0)
967 {
968 return ret;
969 }
970
971 sel = haodr.haodr_sel;
972
973 switch (ctrl2.odr_g)
974 {
975 case LSM6DSV16X_ODR_OFF:
976 *val = LSM6DSV16X_ODR_OFF;
977 break;
978
979 case LSM6DSV16X_ODR_AT_1Hz875:
980 *val = LSM6DSV16X_ODR_AT_1Hz875;
981 break;
982
983 case LSM6DSV16X_ODR_AT_7Hz5:
984 *val = LSM6DSV16X_ODR_AT_7Hz5;
985 break;
986
987 case LSM6DSV16X_ODR_AT_15Hz:
988 switch (sel)
989 {
990 default:
991 case 0:
992 *val = LSM6DSV16X_ODR_AT_15Hz;
993 break;
994 case 1:
995 *val = LSM6DSV16X_ODR_HA01_AT_15Hz625;
996 break;
997 case 2:
998 *val = LSM6DSV16X_ODR_HA02_AT_12Hz5;
999 break;
1000 }
1001 break;
1002
1003 case LSM6DSV16X_ODR_AT_30Hz:
1004 switch (sel)
1005 {
1006 default:
1007 case 0:
1008 *val = LSM6DSV16X_ODR_AT_30Hz;
1009 break;
1010 case 1:
1011 *val = LSM6DSV16X_ODR_HA01_AT_31Hz25;
1012 break;
1013 case 2:
1014 *val = LSM6DSV16X_ODR_HA02_AT_25Hz;
1015 break;
1016 }
1017 break;
1018
1019 case LSM6DSV16X_ODR_AT_60Hz:
1020 switch (sel)
1021 {
1022 default:
1023 case 0:
1024 *val = LSM6DSV16X_ODR_AT_60Hz;
1025 break;
1026 case 1:
1027 *val = LSM6DSV16X_ODR_HA01_AT_62Hz5;
1028 break;
1029 case 2:
1030 *val = LSM6DSV16X_ODR_HA02_AT_50Hz;
1031 break;
1032 }
1033 break;
1034
1035 case LSM6DSV16X_ODR_AT_120Hz:
1036 switch (sel)
1037 {
1038 default:
1039 case 0:
1040 *val = LSM6DSV16X_ODR_AT_120Hz;
1041 break;
1042 case 1:
1043 *val = LSM6DSV16X_ODR_HA01_AT_125Hz;
1044 break;
1045 case 2:
1046 *val = LSM6DSV16X_ODR_HA02_AT_100Hz;
1047 break;
1048 }
1049 break;
1050
1051 case LSM6DSV16X_ODR_AT_240Hz:
1052 switch (sel)
1053 {
1054 default:
1055 case 0:
1056 *val = LSM6DSV16X_ODR_AT_240Hz;
1057 break;
1058 case 1:
1059 *val = LSM6DSV16X_ODR_HA01_AT_250Hz;
1060 break;
1061 case 2:
1062 *val = LSM6DSV16X_ODR_HA02_AT_200Hz;
1063 break;
1064 }
1065 break;
1066
1067 case LSM6DSV16X_ODR_AT_480Hz:
1068 switch (sel)
1069 {
1070 default:
1071 case 0:
1072 *val = LSM6DSV16X_ODR_AT_480Hz;
1073 break;
1074 case 1:
1075 *val = LSM6DSV16X_ODR_HA01_AT_500Hz;
1076 break;
1077 case 2:
1078 *val = LSM6DSV16X_ODR_HA02_AT_400Hz;
1079 break;
1080 }
1081 break;
1082
1083 case LSM6DSV16X_ODR_AT_960Hz:
1084 switch (sel)
1085 {
1086 default:
1087 case 0:
1088 *val = LSM6DSV16X_ODR_AT_960Hz;
1089 break;
1090 case 1:
1091 *val = LSM6DSV16X_ODR_HA01_AT_1000Hz;
1092 break;
1093 case 2:
1094 *val = LSM6DSV16X_ODR_HA02_AT_800Hz;
1095 break;
1096 }
1097 break;
1098
1099 case LSM6DSV16X_ODR_AT_1920Hz:
1100 switch (sel)
1101 {
1102 default:
1103 case 0:
1104 *val = LSM6DSV16X_ODR_AT_1920Hz;
1105 break;
1106 case 1:
1107 *val = LSM6DSV16X_ODR_HA01_AT_2000Hz;
1108 break;
1109 case 2:
1110 *val = LSM6DSV16X_ODR_HA02_AT_1600Hz;
1111 break;
1112 }
1113 break;
1114
1115 case LSM6DSV16X_ODR_AT_3840Hz:
1116 switch (sel)
1117 {
1118 default:
1119 case 0:
1120 *val = LSM6DSV16X_ODR_AT_3840Hz;
1121 break;
1122 case 1:
1123 *val = LSM6DSV16X_ODR_HA01_AT_4000Hz;
1124 break;
1125 case 2:
1126 *val = LSM6DSV16X_ODR_HA02_AT_3200Hz;
1127 break;
1128 }
1129 break;
1130
1131 case LSM6DSV16X_ODR_AT_7680Hz:
1132 switch (sel)
1133 {
1134 default:
1135 case 0:
1136 *val = LSM6DSV16X_ODR_AT_7680Hz;
1137 break;
1138 case 1:
1139 *val = LSM6DSV16X_ODR_HA01_AT_8000Hz;
1140 break;
1141 case 2:
1142 *val = LSM6DSV16X_ODR_HA02_AT_6400Hz;
1143 break;
1144 }
1145 break;
1146
1147 default:
1148 *val = LSM6DSV16X_ODR_OFF;
1149 break;
1150 }
1151
1152 return ret;
1153 }
1154
1155 /**
1156 * @brief Gyroscope operating mode selection.[set]
1157 *
1158 * @param ctx read / write interface definitions
1159 * @param val GY_HIGH_PERFORMANCE_MD, GY_HIGH_ACCURACY_ODR_MD, GY_SLEEP_MD, GY_LOW_POWER_MD,
1160 * @retval interface status (MANDATORY: return 0 -> no Error)
1161 *
1162 */
lsm6dsv16x_gy_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_mode_t val)1163 int32_t lsm6dsv16x_gy_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_gy_mode_t val)
1164 {
1165 lsm6dsv16x_ctrl2_t ctrl2;
1166 int32_t ret;
1167
1168 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
1169 if (ret == 0)
1170 {
1171 ctrl2.op_mode_g = (uint8_t)val & 0x07U;
1172 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
1173 }
1174
1175 return ret;
1176 }
1177
1178 /**
1179 * @brief Gyroscope operating mode selection.[get]
1180 *
1181 * @param ctx read / write interface definitions
1182 * @param val GY_HIGH_PERFORMANCE_MD, GY_HIGH_ACCURACY_ODR_MD, GY_SLEEP_MD, GY_LOW_POWER_MD,
1183 * @retval interface status (MANDATORY: return 0 -> no Error)
1184 *
1185 */
lsm6dsv16x_gy_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_mode_t * val)1186 int32_t lsm6dsv16x_gy_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_gy_mode_t *val)
1187 {
1188 lsm6dsv16x_ctrl2_t ctrl2;
1189 int32_t ret;
1190
1191 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL2, (uint8_t *)&ctrl2, 1);
1192 if (ret != 0)
1193 {
1194 return ret;
1195 }
1196
1197 switch (ctrl2.op_mode_g)
1198 {
1199 case LSM6DSV16X_GY_HIGH_PERFORMANCE_MD:
1200 *val = LSM6DSV16X_GY_HIGH_PERFORMANCE_MD;
1201 break;
1202
1203 case LSM6DSV16X_GY_HIGH_ACCURACY_ODR_MD:
1204 *val = LSM6DSV16X_GY_HIGH_ACCURACY_ODR_MD;
1205 break;
1206
1207 case LSM6DSV16X_GY_SLEEP_MD:
1208 *val = LSM6DSV16X_GY_SLEEP_MD;
1209 break;
1210
1211 case LSM6DSV16X_GY_LOW_POWER_MD:
1212 *val = LSM6DSV16X_GY_LOW_POWER_MD;
1213 break;
1214
1215 default:
1216 *val = LSM6DSV16X_GY_HIGH_PERFORMANCE_MD;
1217 break;
1218 }
1219
1220 return ret;
1221 }
1222
1223 /**
1224 * @brief Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[set]
1225 *
1226 * @param ctx read / write interface definitions
1227 * @param val Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
1228 * @retval interface status (MANDATORY: return 0 -> no Error)
1229 *
1230 */
lsm6dsv16x_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)1231 int32_t lsm6dsv16x_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
1232 {
1233 lsm6dsv16x_ctrl3_t ctrl3;
1234 int32_t ret;
1235
1236 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1237 if (ret == 0)
1238 {
1239 ctrl3.if_inc = val;
1240 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1241 }
1242
1243 return ret;
1244 }
1245
1246 /**
1247 * @brief Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[get]
1248 *
1249 * @param ctx read / write interface definitions
1250 * @param val Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
1251 * @retval interface status (MANDATORY: return 0 -> no Error)
1252 *
1253 */
lsm6dsv16x_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)1254 int32_t lsm6dsv16x_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
1255 {
1256 lsm6dsv16x_ctrl3_t ctrl3;
1257 int32_t ret;
1258
1259 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1260 *val = ctrl3.if_inc;
1261
1262 return ret;
1263 }
1264
1265 /**
1266 * @brief Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [set]
1267 *
1268 * @param ctx read / write interface definitions
1269 * @param val Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
1270 * @retval interface status (MANDATORY: return 0 -> no Error)
1271 *
1272 */
lsm6dsv16x_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)1273 int32_t lsm6dsv16x_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
1274 {
1275 lsm6dsv16x_ctrl3_t ctrl3;
1276 int32_t ret;
1277
1278 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1279
1280 if (ret == 0)
1281 {
1282 ctrl3.bdu = val;
1283 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1284 }
1285
1286 return ret;
1287 }
1288
1289 /**
1290 * @brief Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [get]
1291 *
1292 * @param ctx read / write interface definitions
1293 * @param val Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
1294 * @retval interface status (MANDATORY: return 0 -> no Error)
1295 *
1296 */
lsm6dsv16x_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)1297 int32_t lsm6dsv16x_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
1298 {
1299 lsm6dsv16x_ctrl3_t ctrl3;
1300 int32_t ret;
1301
1302 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL3, (uint8_t *)&ctrl3, 1);
1303 *val = ctrl3.bdu;
1304
1305 return ret;
1306 }
1307
1308 /**
1309 * @brief Configure ODR trigger. [set]
1310 *
1311 * @param ctx read / write interface definitions
1312 * @param val number of data in the reference period.
1313 * @retval interface status (MANDATORY: return 0 -> no Error)
1314 *
1315 */
lsm6dsv16x_odr_trig_cfg_set(const stmdev_ctx_t * ctx,uint8_t val)1316 int32_t lsm6dsv16x_odr_trig_cfg_set(const stmdev_ctx_t *ctx, uint8_t val)
1317 {
1318 lsm6dsv16x_odr_trig_cfg_t odr_trig;
1319 int32_t ret;
1320
1321 if (val >= 1U && val <= 3U)
1322 {
1323 return -1;
1324 }
1325
1326 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_ODR_TRIG_CFG, (uint8_t *)&odr_trig, 1);
1327
1328 if (ret == 0)
1329 {
1330 odr_trig.odr_trig_nodr = val;
1331 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_ODR_TRIG_CFG, (uint8_t *)&odr_trig, 1);
1332 }
1333
1334 return ret;
1335 }
1336
1337 /**
1338 * @brief Configure ODR trigger. [get]
1339 *
1340 * @param ctx read / write interface definitions
1341 * @param val number of data in the reference period.
1342 * @retval interface status (MANDATORY: return 0 -> no Error)
1343 *
1344 */
lsm6dsv16x_odr_trig_cfg_get(const stmdev_ctx_t * ctx,uint8_t * val)1345 int32_t lsm6dsv16x_odr_trig_cfg_get(const stmdev_ctx_t *ctx, uint8_t *val)
1346 {
1347 lsm6dsv16x_odr_trig_cfg_t odr_trig;
1348 int32_t ret;
1349
1350 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_ODR_TRIG_CFG, (uint8_t *)&odr_trig, 1);
1351 *val = odr_trig.odr_trig_nodr;
1352
1353 return ret;
1354 }
1355
1356 /**
1357 * @brief Enables pulsed data-ready mode (~75 us).[set]
1358 *
1359 * @param ctx read / write interface definitions
1360 * @param val DRDY_LATCHED, DRDY_PULSED,
1361 * @retval interface status (MANDATORY: return 0 -> no Error)
1362 *
1363 */
lsm6dsv16x_data_ready_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_data_ready_mode_t val)1364 int32_t lsm6dsv16x_data_ready_mode_set(const stmdev_ctx_t *ctx,
1365 lsm6dsv16x_data_ready_mode_t val)
1366 {
1367 lsm6dsv16x_ctrl4_t ctrl4;
1368 int32_t ret;
1369
1370 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
1371
1372 if (ret == 0)
1373 {
1374 ctrl4.drdy_pulsed = (uint8_t)val & 0x1U;
1375 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
1376 }
1377
1378 return ret;
1379 }
1380
1381 /**
1382 * @brief Enables pulsed data-ready mode (~75 us).[get]
1383 *
1384 * @param ctx read / write interface definitions
1385 * @param val DRDY_LATCHED, DRDY_PULSED,
1386 * @retval interface status (MANDATORY: return 0 -> no Error)
1387 *
1388 */
lsm6dsv16x_data_ready_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_data_ready_mode_t * val)1389 int32_t lsm6dsv16x_data_ready_mode_get(const stmdev_ctx_t *ctx,
1390 lsm6dsv16x_data_ready_mode_t *val)
1391 {
1392 lsm6dsv16x_ctrl4_t ctrl4;
1393 int32_t ret;
1394
1395 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
1396
1397 switch (ctrl4.drdy_pulsed)
1398 {
1399 case LSM6DSV16X_DRDY_LATCHED:
1400 *val = LSM6DSV16X_DRDY_LATCHED;
1401 break;
1402
1403 case LSM6DSV16X_DRDY_PULSED:
1404 *val = LSM6DSV16X_DRDY_PULSED;
1405 break;
1406
1407 default:
1408 *val = LSM6DSV16X_DRDY_LATCHED;
1409 break;
1410 }
1411
1412 return ret;
1413 }
1414
1415 /**
1416 * @brief Enables interrupt.[set]
1417 *
1418 * @param ctx read / write interface definitions
1419 * @param val enable/disable, latched/pulsed
1420 * @retval interface status (MANDATORY: return 0 -> no Error)
1421 *
1422 */
lsm6dsv16x_interrupt_enable_set(const stmdev_ctx_t * ctx,lsm6dsv16x_interrupt_mode_t val)1423 int32_t lsm6dsv16x_interrupt_enable_set(const stmdev_ctx_t *ctx,
1424 lsm6dsv16x_interrupt_mode_t val)
1425 {
1426 lsm6dsv16x_tap_cfg0_t cfg;
1427 lsm6dsv16x_functions_enable_t func;
1428 int32_t ret;
1429
1430 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&func, 1);
1431 func.interrupts_enable = val.enable;
1432 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&func, 1);
1433 if (ret != 0)
1434 {
1435 return ret;
1436 }
1437
1438 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&cfg, 1);
1439 cfg.lir = val.lir;
1440 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&cfg, 1);
1441
1442 return ret;
1443 }
1444
1445 /**
1446 * @brief Enables latched interrupt mode.[get]
1447 *
1448 * @param ctx read / write interface definitions
1449 * @param val enable/disable, latched/pulsed
1450 * @retval interface status (MANDATORY: return 0 -> no Error)
1451 *
1452 */
lsm6dsv16x_interrupt_enable_get(const stmdev_ctx_t * ctx,lsm6dsv16x_interrupt_mode_t * val)1453 int32_t lsm6dsv16x_interrupt_enable_get(const stmdev_ctx_t *ctx,
1454 lsm6dsv16x_interrupt_mode_t *val)
1455 {
1456 lsm6dsv16x_tap_cfg0_t cfg;
1457 lsm6dsv16x_functions_enable_t func;
1458 int32_t ret;
1459
1460 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&func, 1);
1461 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&cfg, 1);
1462 if (ret != 0)
1463 {
1464 return ret;
1465 }
1466
1467 val->enable = func.interrupts_enable;
1468 val->lir = cfg.lir;
1469
1470 return ret;
1471 }
1472
1473 /**
1474 * @brief Gyroscope full-scale selection[set]
1475 *
1476 * @param ctx read / write interface definitions
1477 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
1478 * @retval interface status (MANDATORY: return 0 -> no Error)
1479 *
1480 */
lsm6dsv16x_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_full_scale_t val)1481 int32_t lsm6dsv16x_gy_full_scale_set(const stmdev_ctx_t *ctx,
1482 lsm6dsv16x_gy_full_scale_t val)
1483 {
1484 lsm6dsv16x_ctrl6_t ctrl6;
1485 int32_t ret;
1486
1487 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
1488
1489 if (ret == 0)
1490 {
1491 ctrl6.fs_g = (uint8_t)val & 0xfu;
1492 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
1493 }
1494
1495 return ret;
1496 }
1497
1498 /**
1499 * @brief Gyroscope full-scale selection[get]
1500 *
1501 * @param ctx read / write interface definitions
1502 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
1503 * @retval interface status (MANDATORY: return 0 -> no Error)
1504 *
1505 */
lsm6dsv16x_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_full_scale_t * val)1506 int32_t lsm6dsv16x_gy_full_scale_get(const stmdev_ctx_t *ctx,
1507 lsm6dsv16x_gy_full_scale_t *val)
1508 {
1509 lsm6dsv16x_ctrl6_t ctrl6;
1510 int32_t ret;
1511
1512 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
1513 if (ret != 0)
1514 {
1515 return ret;
1516 }
1517
1518 switch (ctrl6.fs_g)
1519 {
1520 case LSM6DSV16X_125dps:
1521 *val = LSM6DSV16X_125dps;
1522 break;
1523
1524 case LSM6DSV16X_250dps:
1525 *val = LSM6DSV16X_250dps;
1526 break;
1527
1528 case LSM6DSV16X_500dps:
1529 *val = LSM6DSV16X_500dps;
1530 break;
1531
1532 case LSM6DSV16X_1000dps:
1533 *val = LSM6DSV16X_1000dps;
1534 break;
1535
1536 case LSM6DSV16X_2000dps:
1537 *val = LSM6DSV16X_2000dps;
1538 break;
1539
1540 case LSM6DSV16X_4000dps:
1541 *val = LSM6DSV16X_4000dps;
1542 break;
1543
1544 default:
1545 *val = LSM6DSV16X_125dps;
1546 break;
1547 }
1548
1549 return ret;
1550 }
1551
1552 /**
1553 * @brief Accelerometer full-scale selection.[set]
1554 *
1555 * @param ctx read / write interface definitions
1556 * @param val lsm6dsv16x_xl_full_scale_t
1557 * @retval interface status (MANDATORY: return 0 -> no Error)
1558 *
1559 */
lsm6dsv16x_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_full_scale_t val)1560 int32_t lsm6dsv16x_xl_full_scale_set(const stmdev_ctx_t *ctx,
1561 lsm6dsv16x_xl_full_scale_t val)
1562 {
1563 lsm6dsv16x_ctrl8_t ctrl8;
1564 int32_t ret;
1565
1566 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1567
1568 if (ret == 0)
1569 {
1570 ctrl8.fs_xl = (uint8_t)val & 0x3U;
1571 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1572 }
1573
1574 return ret;
1575 }
1576
1577 /**
1578 * @brief Accelerometer full-scale selection.[get]
1579 *
1580 * @param ctx read / write interface definitions
1581 * @param val lsm6dsv16x_xl_full_scale_t
1582 * @retval interface status (MANDATORY: return 0 -> no Error)
1583 *
1584 */
lsm6dsv16x_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_full_scale_t * val)1585 int32_t lsm6dsv16x_xl_full_scale_get(const stmdev_ctx_t *ctx,
1586 lsm6dsv16x_xl_full_scale_t *val)
1587 {
1588 lsm6dsv16x_ctrl8_t ctrl8;
1589 int32_t ret;
1590
1591 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1592 if (ret != 0)
1593 {
1594 return ret;
1595 }
1596
1597 switch (ctrl8.fs_xl)
1598 {
1599 case LSM6DSV16X_2g:
1600 *val = LSM6DSV16X_2g;
1601 break;
1602
1603 case LSM6DSV16X_4g:
1604 *val = LSM6DSV16X_4g;
1605 break;
1606
1607 case LSM6DSV16X_8g:
1608 *val = LSM6DSV16X_8g;
1609 break;
1610
1611 case LSM6DSV16X_16g:
1612 *val = LSM6DSV16X_16g;
1613 break;
1614
1615 default:
1616 *val = LSM6DSV16X_2g;
1617 break;
1618 }
1619
1620 return ret;
1621 }
1622
1623 /**
1624 * @brief It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.[set]
1625 *
1626 * @param ctx read / write interface definitions
1627 * @param val It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.
1628 * @retval interface status (MANDATORY: return 0 -> no Error)
1629 *
1630 */
lsm6dsv16x_xl_dual_channel_set(const stmdev_ctx_t * ctx,uint8_t val)1631 int32_t lsm6dsv16x_xl_dual_channel_set(const stmdev_ctx_t *ctx, uint8_t val)
1632 {
1633 lsm6dsv16x_ctrl8_t ctrl8;
1634 int32_t ret;
1635
1636 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1637
1638 if (ret == 0)
1639 {
1640 ctrl8.xl_dualc_en = val;
1641 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1642 }
1643
1644 return ret;
1645 }
1646
1647 /**
1648 * @brief It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.[get]
1649 *
1650 * @param ctx read / write interface definitions
1651 * @param val It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.
1652 * @retval interface status (MANDATORY: return 0 -> no Error)
1653 *
1654 */
lsm6dsv16x_xl_dual_channel_get(const stmdev_ctx_t * ctx,uint8_t * val)1655 int32_t lsm6dsv16x_xl_dual_channel_get(const stmdev_ctx_t *ctx, uint8_t *val)
1656 {
1657 lsm6dsv16x_ctrl8_t ctrl8;
1658 int32_t ret;
1659
1660 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
1661 *val = ctrl8.xl_dualc_en;
1662
1663 return ret;
1664 }
1665
1666 /**
1667 * @brief Accelerometer self-test selection.[set]
1668 *
1669 * @param ctx read / write interface definitions
1670 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1671 * @retval interface status (MANDATORY: return 0 -> no Error)
1672 *
1673 */
lsm6dsv16x_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_self_test_t val)1674 int32_t lsm6dsv16x_xl_self_test_set(const stmdev_ctx_t *ctx,
1675 lsm6dsv16x_xl_self_test_t val)
1676 {
1677 lsm6dsv16x_ctrl10_t ctrl10;
1678 int32_t ret;
1679
1680 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1681
1682 if (ret == 0)
1683 {
1684 ctrl10.st_xl = (uint8_t)val & 0x3U;
1685 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1686 }
1687
1688 return ret;
1689 }
1690
1691 /**
1692 * @brief Accelerometer self-test selection.[get]
1693 *
1694 * @param ctx read / write interface definitions
1695 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1696 * @retval interface status (MANDATORY: return 0 -> no Error)
1697 *
1698 */
lsm6dsv16x_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_self_test_t * val)1699 int32_t lsm6dsv16x_xl_self_test_get(const stmdev_ctx_t *ctx,
1700 lsm6dsv16x_xl_self_test_t *val)
1701 {
1702 lsm6dsv16x_ctrl10_t ctrl10;
1703 int32_t ret;
1704
1705 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1706 if (ret != 0)
1707 {
1708 return ret;
1709 }
1710
1711 switch (ctrl10.st_xl)
1712 {
1713 case LSM6DSV16X_XL_ST_DISABLE:
1714 *val = LSM6DSV16X_XL_ST_DISABLE;
1715 break;
1716
1717 case LSM6DSV16X_XL_ST_POSITIVE:
1718 *val = LSM6DSV16X_XL_ST_POSITIVE;
1719 break;
1720
1721 case LSM6DSV16X_XL_ST_NEGATIVE:
1722 *val = LSM6DSV16X_XL_ST_NEGATIVE;
1723 break;
1724
1725 default:
1726 *val = LSM6DSV16X_XL_ST_DISABLE;
1727 break;
1728 }
1729
1730 return ret;
1731 }
1732
1733 /**
1734 * @brief Gyroscope self-test selection.[set]
1735 *
1736 * @param ctx read / write interface definitions
1737 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1738 * @retval interface status (MANDATORY: return 0 -> no Error)
1739 *
1740 */
lsm6dsv16x_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_self_test_t val)1741 int32_t lsm6dsv16x_gy_self_test_set(const stmdev_ctx_t *ctx,
1742 lsm6dsv16x_gy_self_test_t val)
1743 {
1744 lsm6dsv16x_ctrl10_t ctrl10;
1745 int32_t ret;
1746
1747 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1748
1749 if (ret == 0)
1750 {
1751 ctrl10.st_g = (uint8_t)val & 0x3U;
1752 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1753 }
1754
1755 return ret;
1756 }
1757
1758 /**
1759 * @brief Gyroscope self-test selection.[get]
1760 *
1761 * @param ctx read / write interface definitions
1762 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1763 * @retval interface status (MANDATORY: return 0 -> no Error)
1764 *
1765 */
lsm6dsv16x_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_self_test_t * val)1766 int32_t lsm6dsv16x_gy_self_test_get(const stmdev_ctx_t *ctx,
1767 lsm6dsv16x_gy_self_test_t *val)
1768 {
1769 lsm6dsv16x_ctrl10_t ctrl10;
1770 int32_t ret;
1771
1772 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
1773 if (ret != 0)
1774 {
1775 return ret;
1776 }
1777
1778 switch (ctrl10.st_g)
1779 {
1780 case LSM6DSV16X_GY_ST_DISABLE:
1781 *val = LSM6DSV16X_GY_ST_DISABLE;
1782 break;
1783
1784 case LSM6DSV16X_GY_ST_POSITIVE:
1785 *val = LSM6DSV16X_GY_ST_POSITIVE;
1786 break;
1787
1788 case LSM6DSV16X_GY_ST_NEGATIVE:
1789 *val = LSM6DSV16X_GY_ST_NEGATIVE;
1790 break;
1791
1792 default:
1793 *val = LSM6DSV16X_GY_ST_DISABLE;
1794 break;
1795 }
1796
1797 return ret;
1798 }
1799
1800 /**
1801 * @brief SPI2 Accelerometer self-test selection.[set]
1802 *
1803 * @param ctx read / write interface definitions
1804 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1805 * @retval interface status (MANDATORY: return 0 -> no Error)
1806 *
1807 */
lsm6dsv16x_ois_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_xl_self_test_t val)1808 int32_t lsm6dsv16x_ois_xl_self_test_set(const stmdev_ctx_t *ctx,
1809 lsm6dsv16x_ois_xl_self_test_t val)
1810 {
1811 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
1812 int32_t ret;
1813
1814 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1815
1816 if (ret == 0)
1817 {
1818 spi2_int_ois.st_xl_ois = ((uint8_t)val & 0x3U);
1819 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1820 }
1821
1822 return ret;
1823 }
1824
1825 /**
1826 * @brief SPI2 Accelerometer self-test selection.[get]
1827 *
1828 * @param ctx read / write interface definitions
1829 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1830 * @retval interface status (MANDATORY: return 0 -> no Error)
1831 *
1832 */
lsm6dsv16x_ois_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_xl_self_test_t * val)1833 int32_t lsm6dsv16x_ois_xl_self_test_get(const stmdev_ctx_t *ctx,
1834 lsm6dsv16x_ois_xl_self_test_t *val)
1835 {
1836 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
1837 int32_t ret;
1838
1839 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1840 if (ret != 0)
1841 {
1842 return ret;
1843 }
1844
1845 switch (spi2_int_ois.st_xl_ois)
1846 {
1847 case LSM6DSV16X_OIS_XL_ST_DISABLE:
1848 *val = LSM6DSV16X_OIS_XL_ST_DISABLE;
1849 break;
1850
1851 case LSM6DSV16X_OIS_XL_ST_POSITIVE:
1852 *val = LSM6DSV16X_OIS_XL_ST_POSITIVE;
1853 break;
1854
1855 case LSM6DSV16X_OIS_XL_ST_NEGATIVE:
1856 *val = LSM6DSV16X_OIS_XL_ST_NEGATIVE;
1857 break;
1858
1859 default:
1860 *val = LSM6DSV16X_OIS_XL_ST_DISABLE;
1861 break;
1862 }
1863
1864 return ret;
1865 }
1866
1867 /**
1868 * @brief SPI2 Accelerometer self-test selection.[set]
1869 *
1870 * @param ctx read / write interface definitions
1871 * @param val GY_ST_DISABLE, GY_ST_POSITIVE, GY_ST_NEGATIVE, LSM6DSV16X_OIS_GY_ST_CLAMP_POS, LSM6DSV16X_OIS_GY_ST_CLAMP_NEG
1872 * @retval interface status (MANDATORY: return 0 -> no Error)
1873 *
1874 */
lsm6dsv16x_ois_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_gy_self_test_t val)1875 int32_t lsm6dsv16x_ois_gy_self_test_set(const stmdev_ctx_t *ctx,
1876 lsm6dsv16x_ois_gy_self_test_t val)
1877 {
1878 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
1879 int32_t ret;
1880
1881 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1882
1883 if (ret == 0)
1884 {
1885 spi2_int_ois.st_g_ois = ((uint8_t)val & 0x3U);
1886 spi2_int_ois.st_ois_clampdis = ((uint8_t)val & 0x04U) >> 2;
1887 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1888 }
1889
1890 return ret;
1891 }
1892
1893 /**
1894 * @brief SPI2 Accelerometer self-test selection.[get]
1895 *
1896 * @param ctx read / write interface definitions
1897 * @param val GY_ST_DISABLE, GY_ST_POSITIVE, GY_ST_NEGATIVE, LSM6DSV16X_OIS_GY_ST_CLAMP_POS, LSM6DSV16X_OIS_GY_ST_CLAMP_NEG
1898 * @retval interface status (MANDATORY: return 0 -> no Error)
1899 *
1900 */
lsm6dsv16x_ois_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_gy_self_test_t * val)1901 int32_t lsm6dsv16x_ois_gy_self_test_get(const stmdev_ctx_t *ctx,
1902 lsm6dsv16x_ois_gy_self_test_t *val)
1903 {
1904 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
1905 int32_t ret;
1906
1907 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
1908 if (ret != 0)
1909 {
1910 return ret;
1911 }
1912
1913 switch (spi2_int_ois.st_g_ois)
1914 {
1915 case LSM6DSV16X_OIS_GY_ST_DISABLE:
1916 *val = LSM6DSV16X_OIS_GY_ST_DISABLE;
1917 break;
1918
1919 case LSM6DSV16X_OIS_GY_ST_POSITIVE:
1920 *val = (spi2_int_ois.st_ois_clampdis == 1U) ? LSM6DSV16X_OIS_GY_ST_CLAMP_POS :
1921 LSM6DSV16X_OIS_GY_ST_POSITIVE;
1922 break;
1923
1924 case LSM6DSV16X_OIS_GY_ST_NEGATIVE:
1925 *val = (spi2_int_ois.st_ois_clampdis == 1U) ? LSM6DSV16X_OIS_GY_ST_CLAMP_NEG :
1926 LSM6DSV16X_OIS_GY_ST_NEGATIVE;
1927 break;
1928
1929 default:
1930 *val = LSM6DSV16X_OIS_GY_ST_DISABLE;
1931 break;
1932 }
1933
1934 return ret;
1935 }
1936
1937 /**
1938 * @defgroup interrupt_pins
1939 * @brief This section groups all the functions that manage
1940 * interrupt pins
1941 * @{
1942 *
1943 */
1944
1945 /**
1946 * @brief Select the signal that need to route on int1 pad[set]
1947 *
1948 * @param ctx Read / write interface definitions.(ptr)
1949 * @param val the signals to route on int1 pin.
1950 * @retval Interface status (MANDATORY: return 0 -> no Error).
1951 *
1952 */
lsm6dsv16x_pin_int1_route_set(const stmdev_ctx_t * ctx,lsm6dsv16x_pin_int_route_t * val)1953 int32_t lsm6dsv16x_pin_int1_route_set(const stmdev_ctx_t *ctx,
1954 lsm6dsv16x_pin_int_route_t *val)
1955 {
1956 lsm6dsv16x_int1_ctrl_t int1_ctrl;
1957 lsm6dsv16x_md1_cfg_t md1_cfg;
1958 int32_t ret;
1959
1960 /* not available on INT1 */
1961 if (val->drdy_temp == 1)
1962 {
1963 return -1;
1964 }
1965
1966 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
1967 if (ret != 0)
1968 {
1969 return ret;
1970 }
1971
1972 int1_ctrl.int1_drdy_xl = val->drdy_xl;
1973 int1_ctrl.int1_drdy_g = val->drdy_g;
1974 int1_ctrl.int1_fifo_th = val->fifo_th;
1975 int1_ctrl.int1_fifo_ovr = val->fifo_ovr;
1976 int1_ctrl.int1_fifo_full = val->fifo_full;
1977 int1_ctrl.int1_cnt_bdr = val->cnt_bdr;
1978
1979 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
1980 if (ret != 0)
1981 {
1982 return ret;
1983 }
1984
1985 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&md1_cfg, 1);
1986 if (ret != 0)
1987 {
1988 return ret;
1989 }
1990
1991 md1_cfg.int1_shub = val->shub;
1992 md1_cfg.int1_emb_func = val->emb_func;
1993 md1_cfg.int1_6d = val->sixd;
1994 md1_cfg.int1_single_tap = val->single_tap;
1995 md1_cfg.int1_double_tap = val->double_tap;
1996 md1_cfg.int1_wu = val->wakeup;
1997 md1_cfg.int1_ff = val->freefall;
1998 md1_cfg.int1_sleep_change = val->sleep_change;
1999
2000 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2001
2002 return ret;
2003 }
2004
2005 /**
2006 * @brief Select the signal that need to route on int1 pad.[get]
2007 *
2008 * @param ctx Read / write interface definitions.(ptr)
2009 * @param val the signals that are routed on int1 pin.(ptr)
2010 * @retval Interface status (MANDATORY: return 0 -> no Error).
2011 *
2012 */
lsm6dsv16x_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dsv16x_pin_int_route_t * val)2013 int32_t lsm6dsv16x_pin_int1_route_get(const stmdev_ctx_t *ctx,
2014 lsm6dsv16x_pin_int_route_t *val)
2015 {
2016 lsm6dsv16x_int1_ctrl_t int1_ctrl;
2017 lsm6dsv16x_md1_cfg_t md1_cfg;
2018 int32_t ret;
2019
2020 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
2021 if (ret != 0)
2022 {
2023 return ret;
2024 }
2025
2026 val->drdy_xl = int1_ctrl.int1_drdy_xl;
2027 val->drdy_g = int1_ctrl.int1_drdy_g;
2028 val->fifo_th = int1_ctrl.int1_fifo_th;
2029 val->fifo_ovr = int1_ctrl.int1_fifo_ovr;
2030 val->fifo_full = int1_ctrl.int1_fifo_full;
2031 val->cnt_bdr = int1_ctrl.int1_cnt_bdr;
2032
2033 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2034 if (ret != 0)
2035 {
2036 return ret;
2037 }
2038
2039 val->shub = md1_cfg.int1_shub;
2040 val->emb_func = md1_cfg.int1_emb_func;
2041 val->sixd = md1_cfg.int1_6d;
2042 val->single_tap = md1_cfg.int1_single_tap;
2043 val->double_tap = md1_cfg.int1_double_tap;
2044 val->wakeup = md1_cfg.int1_wu;
2045 val->freefall = md1_cfg.int1_ff;
2046 val->sleep_change = md1_cfg.int1_sleep_change;
2047
2048 return ret;
2049 }
2050
2051 /**
2052 * @brief Select the signal that need to route on int2 pad[set]
2053 *
2054 * @param ctx Read / write interface definitions.(ptr)
2055 * @param val the signals to route on int2 pin.
2056 * @retval Interface status (MANDATORY: return 0 -> no Error).
2057 *
2058 */
lsm6dsv16x_pin_int2_route_set(const stmdev_ctx_t * ctx,lsm6dsv16x_pin_int_route_t * val)2059 int32_t lsm6dsv16x_pin_int2_route_set(const stmdev_ctx_t *ctx,
2060 lsm6dsv16x_pin_int_route_t *val)
2061 {
2062 lsm6dsv16x_int2_ctrl_t int2_ctrl;
2063 lsm6dsv16x_ctrl4_t ctrl4;
2064 lsm6dsv16x_ctrl7_t ctrl7;
2065 lsm6dsv16x_md2_cfg_t md2_cfg;
2066 int32_t ret;
2067
2068 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
2069 if (ret != 0)
2070 {
2071 return ret;
2072 }
2073
2074 int2_ctrl.int2_drdy_xl = val->drdy_xl;
2075 int2_ctrl.int2_drdy_g = val->drdy_g;
2076 int2_ctrl.int2_fifo_th = val->fifo_th;
2077 int2_ctrl.int2_fifo_ovr = val->fifo_ovr;
2078 int2_ctrl.int2_fifo_full = val->fifo_full;
2079 int2_ctrl.int2_cnt_bdr = val->cnt_bdr;
2080 int2_ctrl.int2_drdy_g_eis = val->drdy_g_eis;
2081 int2_ctrl.int2_emb_func_endop = val->emb_func_endop;
2082
2083 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
2084 if (ret != 0)
2085 {
2086 return ret;
2087 }
2088
2089 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
2090 ctrl4.int2_drdy_temp = val->drdy_temp;
2091 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
2092 if (ret != 0)
2093 {
2094 return ret;
2095 }
2096
2097 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
2098 ctrl7.int2_drdy_ah_qvar = val->drdy_ah_qvar;
2099 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
2100 if (ret != 0)
2101 {
2102 return ret;
2103 }
2104
2105 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2106 if (ret != 0)
2107 {
2108 return ret;
2109 }
2110
2111 md2_cfg.int2_timestamp = val->timestamp;
2112 md2_cfg.int2_emb_func = val->emb_func;
2113 md2_cfg.int2_6d = val->sixd;
2114 md2_cfg.int2_single_tap = val->single_tap;
2115 md2_cfg.int2_double_tap = val->double_tap;
2116 md2_cfg.int2_wu = val->wakeup;
2117 md2_cfg.int2_ff = val->freefall;
2118 md2_cfg.int2_sleep_change = val->sleep_change;
2119
2120 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2121
2122 return ret;
2123 }
2124
2125 /**
2126 * @brief Select the signal that need to route on int2 pad.[get]
2127 *
2128 * @param ctx Read / write interface definitions.(ptr)
2129 * @param val the signals that are routed on int2 pin.(ptr)
2130 * @retval Interface status (MANDATORY: return 0 -> no Error).
2131 *
2132 */
lsm6dsv16x_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dsv16x_pin_int_route_t * val)2133 int32_t lsm6dsv16x_pin_int2_route_get(const stmdev_ctx_t *ctx,
2134 lsm6dsv16x_pin_int_route_t *val)
2135 {
2136 lsm6dsv16x_int2_ctrl_t int2_ctrl;
2137 lsm6dsv16x_ctrl4_t ctrl4;
2138 lsm6dsv16x_ctrl7_t ctrl7;
2139 lsm6dsv16x_md2_cfg_t md2_cfg;
2140 int32_t ret;
2141
2142 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
2143 if (ret != 0)
2144 {
2145 return ret;
2146 }
2147
2148 val->drdy_xl = int2_ctrl.int2_drdy_xl;
2149 val->drdy_g = int2_ctrl.int2_drdy_g;
2150 val->fifo_th = int2_ctrl.int2_fifo_th;
2151 val->fifo_ovr = int2_ctrl.int2_fifo_ovr;
2152 val->fifo_full = int2_ctrl.int2_fifo_full;
2153 val->cnt_bdr = int2_ctrl.int2_cnt_bdr;
2154 val->drdy_g_eis = int2_ctrl.int2_drdy_g_eis;
2155 val->emb_func_endop = int2_ctrl.int2_emb_func_endop;
2156
2157 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
2158 if (ret != 0)
2159 {
2160 return ret;
2161 }
2162
2163 val->drdy_temp = ctrl4.int2_drdy_temp;
2164
2165 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
2166 if (ret != 0)
2167 {
2168 return ret;
2169 }
2170
2171 val->drdy_ah_qvar = ctrl7.int2_drdy_ah_qvar;
2172
2173 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2174 if (ret != 0)
2175 {
2176 return ret;
2177 }
2178
2179 val->timestamp = md2_cfg.int2_timestamp;
2180 val->emb_func = md2_cfg.int2_emb_func;
2181 val->sixd = md2_cfg.int2_6d;
2182 val->single_tap = md2_cfg.int2_single_tap;
2183 val->double_tap = md2_cfg.int2_double_tap;
2184 val->wakeup = md2_cfg.int2_wu;
2185 val->freefall = md2_cfg.int2_ff;
2186 val->sleep_change = md2_cfg.int2_sleep_change;
2187
2188 return ret;
2189 }
2190
2191 /**
2192 * @brief routes embedded func interrupt signals on INT 1 pin.[set]
2193 *
2194 * @param ctx read / write interface definitions
2195 * @param val routes embedded func interrupt signals on INT 1 pin.
2196 * @retval interface status (MANDATORY: return 0 -> no Error)
2197 *
2198 */
lsm6dsv16x_emb_pin_int1_route_set(const stmdev_ctx_t * ctx,const lsm6dsv16x_emb_pin_int_route_t * val)2199 int32_t lsm6dsv16x_emb_pin_int1_route_set(const stmdev_ctx_t *ctx,
2200 const lsm6dsv16x_emb_pin_int_route_t *val)
2201 {
2202 lsm6dsv16x_emb_func_int1_t emb_func_int1;
2203 lsm6dsv16x_md1_cfg_t md1_cfg;
2204 int32_t ret;
2205
2206 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2207 if (ret == 0)
2208 {
2209 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
2210 }
2211
2212 if (ret == 0)
2213 {
2214 emb_func_int1.int1_tilt = val->tilt;
2215 emb_func_int1.int1_sig_mot = val->sig_mot;
2216 emb_func_int1.int1_step_detector = val->step_det;
2217 emb_func_int1.int1_fsm_lc = val->fsm_lc;
2218
2219 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
2220 }
2221 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2222
2223 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2224 if (ret == 0)
2225 {
2226 md1_cfg.int1_emb_func = 1;
2227 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2228 }
2229
2230 return ret;
2231 }
2232
2233 /**
2234 * @brief routes embedded func interrupt signals on INT 1 pin.[get]
2235 *
2236 * @param ctx read / write interface definitions
2237 * @param val routes embedded func interrupt signals on INT 1 pin.
2238 * @retval interface status (MANDATORY: return 0 -> no Error)
2239 *
2240 */
lsm6dsv16x_emb_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dsv16x_emb_pin_int_route_t * val)2241 int32_t lsm6dsv16x_emb_pin_int1_route_get(const stmdev_ctx_t *ctx,
2242 lsm6dsv16x_emb_pin_int_route_t *val)
2243 {
2244 lsm6dsv16x_emb_func_int1_t emb_func_int1;
2245 int32_t ret;
2246
2247 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2248 if (ret == 0)
2249 {
2250 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
2251 }
2252
2253 if (ret == 0)
2254 {
2255 val->tilt = emb_func_int1.int1_tilt;
2256 val->sig_mot = emb_func_int1.int1_sig_mot;
2257 val->step_det = emb_func_int1.int1_step_detector;
2258 val->fsm_lc = emb_func_int1.int1_fsm_lc;
2259 }
2260 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2261
2262 return ret;
2263 }
2264
2265 /**
2266 * @brief routes embedded func interrupt signals on INT 2 pin.[set]
2267 *
2268 * @param ctx read / write interface definitions
2269 * @param val routes embedded func interrupt signals on INT 2 pin.
2270 * @retval interface status (MANDATORY: return 0 -> no Error)
2271 *
2272 */
lsm6dsv16x_emb_pin_int2_route_set(const stmdev_ctx_t * ctx,const lsm6dsv16x_emb_pin_int_route_t * val)2273 int32_t lsm6dsv16x_emb_pin_int2_route_set(const stmdev_ctx_t *ctx,
2274 const lsm6dsv16x_emb_pin_int_route_t *val)
2275 {
2276 lsm6dsv16x_emb_func_int2_t emb_func_int2;
2277 lsm6dsv16x_md2_cfg_t md2_cfg;
2278 int32_t ret;
2279
2280 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2281 if (ret == 0)
2282 {
2283 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
2284 }
2285
2286 if (ret == 0)
2287 {
2288 emb_func_int2.int2_tilt = val->tilt;
2289 emb_func_int2.int2_sig_mot = val->sig_mot;
2290 emb_func_int2.int2_step_detector = val->step_det;
2291 emb_func_int2.int2_fsm_lc = val->fsm_lc;
2292
2293 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
2294 }
2295 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2296
2297 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2298 if (ret == 0)
2299 {
2300 md2_cfg.int2_emb_func = 1;
2301 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2302 }
2303
2304 return ret;
2305 }
2306
2307 /**
2308 * @brief routes embedded func interrupt signals on INT 2 pin.[get]
2309 *
2310 * @param ctx read / write interface definitions
2311 * @param val routes embedded func interrupt signals on INT 2 pin.
2312 * @retval interface status (MANDATORY: return 0 -> no Error)
2313 *
2314 */
lsm6dsv16x_emb_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dsv16x_emb_pin_int_route_t * val)2315 int32_t lsm6dsv16x_emb_pin_int2_route_get(const stmdev_ctx_t *ctx,
2316 lsm6dsv16x_emb_pin_int_route_t *val)
2317 {
2318 lsm6dsv16x_emb_func_int2_t emb_func_int2;
2319 int32_t ret;
2320
2321 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2322 if (ret == 0)
2323 {
2324 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
2325 }
2326
2327 if (ret == 0)
2328 {
2329 val->tilt = emb_func_int2.int2_tilt;
2330 val->sig_mot = emb_func_int2.int2_sig_mot;
2331 val->step_det = emb_func_int2.int2_step_detector;
2332 val->fsm_lc = emb_func_int2.int2_fsm_lc;
2333 }
2334 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2335
2336 return ret;
2337 }
2338
2339 /**
2340 * @brief Embedded Interrupt configuration mode.[set]
2341 *
2342 * @param ctx read / write interface definitions
2343 * @param val INT_PULSED, INT_LATCHED
2344 * @retval interface status (MANDATORY: return 0 -> no Error)
2345 *
2346 */
lsm6dsv16x_embedded_int_cfg_set(const stmdev_ctx_t * ctx,lsm6dsv16x_embedded_int_config_t val)2347 int32_t lsm6dsv16x_embedded_int_cfg_set(const stmdev_ctx_t *ctx,
2348 lsm6dsv16x_embedded_int_config_t val)
2349 {
2350 lsm6dsv16x_page_rw_t page_rw;
2351 int32_t ret;
2352
2353 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2354 if (ret == 0)
2355 {
2356 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2357
2358 switch (val)
2359 {
2360 case LSM6DSV16X_INT_LATCH_DISABLE:
2361 page_rw.emb_func_lir = 0;
2362 break;
2363
2364 case LSM6DSV16X_INT_LATCH_ENABLE:
2365 default:
2366 page_rw.emb_func_lir = 1;
2367 break;
2368 }
2369
2370 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2371 }
2372
2373 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2374
2375 return ret;
2376 }
2377
2378 /**
2379 * @brief Interrupt configuration mode.[get]
2380 *
2381 * @param ctx read / write interface definitions
2382 * @param val INT_DISABLED, INT_PULSED, INT_LATCHED
2383 * @retval interface status (MANDATORY: return 0 -> no Error)
2384 *
2385 */
lsm6dsv16x_embedded_int_cfg_get(const stmdev_ctx_t * ctx,lsm6dsv16x_embedded_int_config_t * val)2386 int32_t lsm6dsv16x_embedded_int_cfg_get(const stmdev_ctx_t *ctx,
2387 lsm6dsv16x_embedded_int_config_t *val)
2388 {
2389 lsm6dsv16x_page_rw_t page_rw;
2390 int32_t ret;
2391
2392 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2393 if (ret == 0)
2394 {
2395 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2396
2397 if (page_rw.emb_func_lir == 0U)
2398 {
2399 *val = LSM6DSV16X_INT_LATCH_DISABLE;
2400 }
2401 else
2402 {
2403 *val = LSM6DSV16X_INT_LATCH_ENABLE;
2404 }
2405 }
2406
2407 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2408
2409 return ret;
2410 }
2411
2412 /**
2413 * @brief Get the status of embedded functions.[get]
2414 *
2415 * @param ctx read / write interface definitions
2416 * @param val lsm6dsv16x_embedded_status_t ptr
2417 * @retval interface status (MANDATORY: return 0 -> no Error)
2418 *
2419 */
lsm6dsv16x_embedded_status_get(const stmdev_ctx_t * ctx,lsm6dsv16x_embedded_status_t * val)2420 int32_t lsm6dsv16x_embedded_status_get(const stmdev_ctx_t *ctx,
2421 lsm6dsv16x_embedded_status_t *val)
2422 {
2423 lsm6dsv16x_emb_func_status_mainpage_t emb_func_status;
2424 lsm6dsv16x_emb_func_src_t emb_func_src;
2425 int32_t ret;
2426
2427 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_STATUS_MAINPAGE, (uint8_t *)&emb_func_status, 1);
2428 if (ret != 0)
2429 {
2430 return ret;
2431 }
2432
2433 val->step_detector = emb_func_status.is_step_det;
2434 val->tilt = emb_func_status.is_tilt;
2435 val->sig_mot = emb_func_status.is_sigmot;
2436 val->fsm_lc = emb_func_status.is_fsm_lc;
2437
2438 /* embedded func */
2439 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2440 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
2441 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2442 if (ret != 0)
2443 {
2444 return ret;
2445 }
2446
2447 val->step_count_inc = emb_func_src.stepcounter_bit_set;
2448 val->step_count_overflow = emb_func_src.step_overflow;
2449 val->step_on_delta_time = emb_func_src.step_count_delta_ia;
2450 val->step_detector = emb_func_src.step_detected;
2451
2452 return ret;
2453 }
2454
2455 /**
2456 * @}
2457 *
2458 */
2459
2460 /**
2461 * @brief Get the status of all the interrupt sources.[get]
2462 *
2463 * @param ctx read / write interface definitions
2464 * @param val Get the status of all the interrupt sources.
2465 * @retval interface status (MANDATORY: return 0 -> no Error)
2466 *
2467 */
lsm6dsv16x_all_sources_get(const stmdev_ctx_t * ctx,lsm6dsv16x_all_sources_t * val)2468 int32_t lsm6dsv16x_all_sources_get(const stmdev_ctx_t *ctx,
2469 lsm6dsv16x_all_sources_t *val)
2470 {
2471 lsm6dsv16x_emb_func_status_mainpage_t emb_func_status_mainpage;
2472 lsm6dsv16x_emb_func_exec_status_t emb_func_exec_status;
2473 lsm6dsv16x_fsm_status_mainpage_t fsm_status_mainpage;
2474 lsm6dsv16x_mlc_status_mainpage_t mlc_status_mainpage;
2475 lsm6dsv16x_functions_enable_t functions_enable;
2476 lsm6dsv16x_emb_func_src_t emb_func_src;
2477 lsm6dsv16x_fifo_status2_t fifo_status2;
2478 lsm6dsv16x_all_int_src_t all_int_src;
2479 lsm6dsv16x_wake_up_src_t wake_up_src;
2480 lsm6dsv16x_status_reg_t status_reg;
2481 lsm6dsv16x_d6d_src_t d6d_src;
2482 lsm6dsv16x_tap_src_t tap_src;
2483 lsm6dsv16x_ui_status_reg_ois_t status_reg_ois;
2484 lsm6dsv16x_status_master_t status_shub;
2485 uint8_t buff[8];
2486 int32_t ret;
2487
2488 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
2489 functions_enable.dis_rst_lir_all_int = PROPERTY_ENABLE;
2490 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
2491 if (ret != 0)
2492 {
2493 return ret;
2494 }
2495
2496 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_STATUS1, (uint8_t *)&buff, 4);
2497 if (ret != 0)
2498 {
2499 return ret;
2500 }
2501
2502 bytecpy((uint8_t *)&fifo_status2, &buff[1]);
2503 bytecpy((uint8_t *)&all_int_src, &buff[2]);
2504 bytecpy((uint8_t *)&status_reg, &buff[3]);
2505
2506 val->fifo_ovr = fifo_status2.fifo_ovr_ia;
2507 val->fifo_bdr = fifo_status2.counter_bdr_ia;
2508 val->fifo_full = fifo_status2.fifo_full_ia;
2509 val->fifo_th = fifo_status2.fifo_wtm_ia;
2510
2511 val->free_fall = all_int_src.ff_ia;
2512 val->wake_up = all_int_src.wu_ia;
2513 val->six_d = all_int_src.d6d_ia;
2514
2515 val->drdy_xl = status_reg.xlda;
2516 val->drdy_gy = status_reg.gda;
2517 val->drdy_temp = status_reg.tda;
2518 val->drdy_ah_qvar = status_reg.ah_qvarda;
2519 val->drdy_eis = status_reg.gda_eis;
2520 val->drdy_ois = status_reg.ois_drdy;
2521 val->timestamp = status_reg.timestamp_endcount;
2522
2523 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
2524 functions_enable.dis_rst_lir_all_int = PROPERTY_DISABLE;
2525 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
2526 if (ret != 0)
2527 {
2528 return ret;
2529 }
2530
2531 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_STATUS_REG_OIS, (uint8_t *)&buff, 8);
2532 if (ret != 0)
2533 {
2534 return ret;
2535 }
2536
2537 bytecpy((uint8_t *)&status_reg_ois, &buff[0]);
2538 bytecpy((uint8_t *)&wake_up_src, &buff[1]);
2539 bytecpy((uint8_t *)&tap_src, &buff[2]);
2540 bytecpy((uint8_t *)&d6d_src, &buff[3]);
2541 bytecpy((uint8_t *)&emb_func_status_mainpage, &buff[5]);
2542 bytecpy((uint8_t *)&fsm_status_mainpage, &buff[6]);
2543 bytecpy((uint8_t *)&mlc_status_mainpage, &buff[7]);
2544
2545 val->gy_settling = status_reg_ois.gyro_settling;
2546 val->sleep_change = wake_up_src.sleep_change_ia;
2547 val->wake_up_x = wake_up_src.x_wu;
2548 val->wake_up_y = wake_up_src.y_wu;
2549 val->wake_up_z = wake_up_src.z_wu;
2550 val->sleep_state = wake_up_src.sleep_state;
2551
2552 val->tap_x = tap_src.x_tap;
2553 val->tap_y = tap_src.y_tap;
2554 val->tap_z = tap_src.z_tap;
2555 val->tap_sign = tap_src.tap_sign;
2556 val->double_tap = tap_src.double_tap;
2557 val->single_tap = tap_src.single_tap;
2558
2559 val->six_d_zl = d6d_src.zl;
2560 val->six_d_zh = d6d_src.zh;
2561 val->six_d_yl = d6d_src.yl;
2562 val->six_d_yh = d6d_src.yh;
2563 val->six_d_xl = d6d_src.xl;
2564 val->six_d_xh = d6d_src.xh;
2565
2566 val->step_detector = emb_func_status_mainpage.is_step_det;
2567 val->tilt = emb_func_status_mainpage.is_tilt;
2568 val->sig_mot = emb_func_status_mainpage.is_sigmot;
2569 val->fsm_lc = emb_func_status_mainpage.is_fsm_lc;
2570
2571 val->fsm1 = fsm_status_mainpage.is_fsm1;
2572 val->fsm2 = fsm_status_mainpage.is_fsm2;
2573 val->fsm3 = fsm_status_mainpage.is_fsm3;
2574 val->fsm4 = fsm_status_mainpage.is_fsm4;
2575 val->fsm5 = fsm_status_mainpage.is_fsm5;
2576 val->fsm6 = fsm_status_mainpage.is_fsm6;
2577 val->fsm7 = fsm_status_mainpage.is_fsm7;
2578 val->fsm8 = fsm_status_mainpage.is_fsm8;
2579
2580 val->mlc1 = mlc_status_mainpage.is_mlc1;
2581 val->mlc2 = mlc_status_mainpage.is_mlc2;
2582 val->mlc3 = mlc_status_mainpage.is_mlc3;
2583 val->mlc4 = mlc_status_mainpage.is_mlc4;
2584
2585 /* embedded func */
2586 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2587 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EXEC_STATUS, (uint8_t *)&emb_func_exec_status,
2588 1);
2589 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
2590 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2591 if (ret != 0)
2592 {
2593 return ret;
2594 }
2595
2596 val->emb_func_stand_by = emb_func_exec_status.emb_func_endop;
2597 val->emb_func_time_exceed = emb_func_exec_status.emb_func_exec_ovr;
2598 val->step_count_inc = emb_func_src.stepcounter_bit_set;
2599 val->step_count_overflow = emb_func_src.step_overflow;
2600 val->step_on_delta_time = emb_func_src.step_count_delta_ia;
2601
2602 val->step_detector = emb_func_src.step_detected;
2603
2604 /* sensor hub */
2605 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_STATUS_MASTER_MAINPAGE, (uint8_t *)&status_shub, 1);
2606 if (ret != 0)
2607 {
2608 return ret;
2609 }
2610
2611 val->sh_endop = status_shub.sens_hub_endop;
2612 val->sh_wr_once = status_shub.wr_once_done;
2613 val->sh_slave3_nack = status_shub.slave3_nack;
2614 val->sh_slave2_nack = status_shub.slave2_nack;
2615 val->sh_slave1_nack = status_shub.slave1_nack;
2616 val->sh_slave0_nack = status_shub.slave0_nack;
2617
2618 return ret;
2619 }
2620
lsm6dsv16x_flag_data_ready_get(const stmdev_ctx_t * ctx,lsm6dsv16x_data_ready_t * val)2621 int32_t lsm6dsv16x_flag_data_ready_get(const stmdev_ctx_t *ctx,
2622 lsm6dsv16x_data_ready_t *val)
2623 {
2624 lsm6dsv16x_status_reg_t status;
2625 int32_t ret;
2626
2627 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_STATUS_REG, (uint8_t *)&status, 1);
2628 if (ret != 0)
2629 {
2630 return ret;
2631 }
2632
2633 val->drdy_xl = status.xlda;
2634 val->drdy_gy = status.gda;
2635 val->drdy_temp = status.tda;
2636
2637 return ret;
2638 }
2639
2640 /**
2641 * @brief Mask status bit reset[set]
2642 *
2643 * @param ctx read / write interface definitions
2644 * @param val Mask to prevent status bit being reset
2645 * @retval interface status (MANDATORY: return 0 -> no Error)
2646 *
2647 */
lsm6dsv16x_int_ack_mask_set(const stmdev_ctx_t * ctx,uint8_t val)2648 int32_t lsm6dsv16x_int_ack_mask_set(const stmdev_ctx_t *ctx, uint8_t val)
2649 {
2650 int32_t ret;
2651
2652 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INT_ACK_MASK, &val, 1);
2653
2654 return ret;
2655 }
2656
2657 /**
2658 * @brief Mask status bit reset[get]
2659 *
2660 * @param ctx read / write interface definitions
2661 * @param val Mask to prevent status bit being reset
2662 * @retval interface status (MANDATORY: return 0 -> no Error)
2663 *
2664 */
lsm6dsv16x_int_ack_mask_get(const stmdev_ctx_t * ctx,uint8_t * val)2665 int32_t lsm6dsv16x_int_ack_mask_get(const stmdev_ctx_t *ctx, uint8_t *val)
2666 {
2667 int32_t ret;
2668
2669 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INT_ACK_MASK, val, 1);
2670
2671 return ret;
2672 }
2673
2674 /**
2675 * @brief Temperature data output register[get]
2676 *
2677 * @param ctx read / write interface definitions
2678 * @param val Temperature data output register
2679 * @retval interface status (MANDATORY: return 0 -> no Error)
2680 *
2681 */
lsm6dsv16x_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2682 int32_t lsm6dsv16x_temperature_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2683 {
2684 uint8_t buff[2];
2685 int32_t ret;
2686
2687 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_OUT_TEMP_L, &buff[0], 2);
2688 if (ret != 0)
2689 {
2690 return ret;
2691 }
2692
2693 *val = (int16_t)buff[1];
2694 *val = (*val * 256) + (int16_t)buff[0];
2695
2696 return ret;
2697 }
2698
2699 /**
2700 * @brief Angular rate sensor.[get]
2701 *
2702 * @param ctx read / write interface definitions
2703 * @param val Angular rate sensor.
2704 * @retval interface status (MANDATORY: return 0 -> no Error)
2705 *
2706 */
lsm6dsv16x_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2707 int32_t lsm6dsv16x_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2708 {
2709 uint8_t buff[6];
2710 int32_t ret;
2711
2712 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_OUTX_L_G, &buff[0], 6);
2713 if (ret != 0)
2714 {
2715 return ret;
2716 }
2717
2718 val[0] = (int16_t)buff[1];
2719 val[0] = (val[0] * 256) + (int16_t)buff[0];
2720 val[1] = (int16_t)buff[3];
2721 val[1] = (val[1] * 256) + (int16_t)buff[2];
2722 val[2] = (int16_t)buff[5];
2723 val[2] = (val[2] * 256) + (int16_t)buff[4];
2724
2725 return ret;
2726 }
2727
2728 /**
2729 * @brief Angular rate sensor.[get]
2730 *
2731 * @param ctx read / write interface definitions
2732 * @param val OIS Angular rate sensor (thru SPI2).
2733 * @retval interface status (MANDATORY: return 0 -> no Error)
2734 *
2735 */
lsm6dsv16x_ois_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2736 int32_t lsm6dsv16x_ois_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2737 {
2738 uint8_t buff[6];
2739 int32_t ret;
2740
2741 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_OUTX_L_G_OIS, &buff[0], 6);
2742 if (ret != 0)
2743 {
2744 return ret;
2745 }
2746
2747 val[0] = (int16_t)buff[1];
2748 val[0] = (*val * 256) + (int16_t)buff[0];
2749 val[1] = (int16_t)buff[3];
2750 val[1] = (*val * 256) + (int16_t)buff[2];
2751 val[2] = (int16_t)buff[5];
2752 val[2] = (*val * 256) + (int16_t)buff[4];
2753
2754 return ret;
2755 }
2756
2757 /**
2758 * @brief Angular rate sensor for OIS gyro or the EIS gyro channel.[get]
2759 *
2760 * @param ctx read / write interface definitions
2761 * @param val Angular rate sensor for OIS gyro or the EIS gyro channel.
2762 * @retval interface status (MANDATORY: return 0 -> no Error)
2763 *
2764 */
lsm6dsv16x_ois_eis_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2765 int32_t lsm6dsv16x_ois_eis_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2766 {
2767 uint8_t buff[6];
2768 int32_t ret;
2769
2770 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_OUTX_L_G_OIS_EIS, &buff[0], 6);
2771 if (ret != 0)
2772 {
2773 return ret;
2774 }
2775
2776 val[0] = (int16_t)buff[1];
2777 val[0] = (*val * 256) + (int16_t)buff[0];
2778 val[1] = (int16_t)buff[3];
2779 val[1] = (*val * 256) + (int16_t)buff[2];
2780 val[2] = (int16_t)buff[5];
2781 val[2] = (*val * 256) + (int16_t)buff[4];
2782
2783 return ret;
2784 }
2785
2786 /**
2787 * @brief Linear acceleration sensor.[get]
2788 *
2789 * @param ctx read / write interface definitions
2790 * @param val Linear acceleration sensor.
2791 * @retval interface status (MANDATORY: return 0 -> no Error)
2792 *
2793 */
lsm6dsv16x_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2794 int32_t lsm6dsv16x_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2795 {
2796 uint8_t buff[6];
2797 int32_t ret;
2798
2799 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_OUTX_L_A, &buff[0], 6);
2800 if (ret != 0)
2801 {
2802 return ret;
2803 }
2804
2805 val[0] = (int16_t)buff[1];
2806 val[0] = (val[0] * 256) + (int16_t)buff[0];
2807 val[1] = (int16_t)buff[3];
2808 val[1] = (val[1] * 256) + (int16_t)buff[2];
2809 val[2] = (int16_t)buff[5];
2810 val[2] = (val[2] * 256) + (int16_t)buff[4];
2811
2812 return ret;
2813 }
2814
2815 /**
2816 * @brief Linear acceleration sensor for Dual channel mode.[get]
2817 *
2818 * @param ctx read / write interface definitions
2819 * @param val Linear acceleration sensor or Dual channel mode.
2820 * @retval interface status (MANDATORY: return 0 -> no Error)
2821 *
2822 */
lsm6dsv16x_dual_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2823 int32_t lsm6dsv16x_dual_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2824 {
2825 uint8_t buff[6];
2826 int32_t ret;
2827
2828 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_OUTX_L_A_OIS_DUALC, &buff[0], 6);
2829 if (ret != 0)
2830 {
2831 return ret;
2832 }
2833
2834 val[0] = (int16_t)buff[1];
2835 val[0] = (val[0] * 256) + (int16_t)buff[0];
2836 val[1] = (int16_t)buff[3];
2837 val[1] = (val[1] * 256) + (int16_t)buff[2];
2838 val[2] = (int16_t)buff[5];
2839 val[2] = (val[2] * 256) + (int16_t)buff[4];
2840
2841 return ret;
2842 }
2843
2844 /**
2845 * @brief ah_qvar data output register.[get]
2846 *
2847 * @param ctx read / write interface definitions
2848 * @param val ah_qvar data output register.
2849 * @retval interface status (MANDATORY: return 0 -> no Error)
2850 *
2851 */
lsm6dsv16x_ah_qvar_raw_get(const stmdev_ctx_t * ctx,int16_t * val)2852 int32_t lsm6dsv16x_ah_qvar_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
2853 {
2854 uint8_t buff[2];
2855 int32_t ret;
2856
2857 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_AH_QVAR_OUT_L, &buff[0], 2);
2858 if (ret != 0)
2859 {
2860 return ret;
2861 }
2862
2863 *val = (int16_t)buff[1];
2864 *val = (*val * 256) + (int16_t)buff[0];
2865
2866 return ret;
2867 }
2868
2869 /**
2870 * @brief Difference in percentage of the effective ODR (and timestamp rate) with respect to the typical. Step: 0.13%. 8-bit format, 2's complement.[get]
2871 *
2872 * @param ctx read / write interface definitions
2873 * @param val Difference in percentage of the effective ODR (and timestamp rate) with respect to the typical. Step: 0.13%. 8-bit format, 2's complement.
2874 * @retval interface status (MANDATORY: return 0 -> no Error)
2875 *
2876 */
lsm6dsv16x_odr_cal_reg_get(const stmdev_ctx_t * ctx,int8_t * val)2877 int32_t lsm6dsv16x_odr_cal_reg_get(const stmdev_ctx_t *ctx, int8_t *val)
2878 {
2879 lsm6dsv16x_internal_freq_t internal_freq;
2880 int32_t ret;
2881
2882 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INTERNAL_FREQ, (uint8_t *)&internal_freq, 1);
2883 *val = (int8_t)internal_freq.freq_fine;
2884
2885 return ret;
2886 }
2887
2888 /**
2889 * @brief Write buffer in a page.[set]
2890 *
2891 * @param ctx read / write interface definitions
2892 * @param val Write buffer in a page.
2893 * @retval interface status (MANDATORY: return 0 -> no Error)
2894 *
2895 */
lsm6dsv16x_ln_pg_write(const stmdev_ctx_t * ctx,uint16_t address,uint8_t * buf,uint8_t len)2896 int32_t lsm6dsv16x_ln_pg_write(const stmdev_ctx_t *ctx, uint16_t address,
2897 uint8_t *buf, uint8_t len)
2898 {
2899 lsm6dsv16x_page_address_t page_address;
2900 lsm6dsv16x_page_sel_t page_sel;
2901 lsm6dsv16x_page_rw_t page_rw;
2902 uint8_t msb;
2903 uint8_t lsb;
2904 int32_t ret;
2905 uint8_t i ;
2906
2907 msb = ((uint8_t)(address >> 8) & 0x0FU);
2908 lsb = (uint8_t)address & 0xFFU;
2909
2910 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
2911 if (ret != 0)
2912 {
2913 return ret;
2914 }
2915
2916 /* set page write */
2917 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2918 page_rw.page_read = PROPERTY_DISABLE;
2919 page_rw.page_write = PROPERTY_ENABLE;
2920 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2921 if (ret != 0)
2922 {
2923 goto exit;
2924 }
2925
2926 /* select page */
2927 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
2928 page_sel.page_sel = msb;
2929 page_sel.not_used0 = 1; // Default value
2930 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
2931 if (ret != 0)
2932 {
2933 goto exit;
2934 }
2935
2936 /* set page addr */
2937 page_address.page_addr = lsb;
2938 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_ADDRESS,
2939 (uint8_t *)&page_address, 1);
2940 if (ret != 0)
2941 {
2942 goto exit;
2943 }
2944
2945 for (i = 0; ((i < len) && (ret == 0)); i++)
2946 {
2947 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_VALUE, &buf[i], 1);
2948 if (ret != 0)
2949 {
2950 goto exit;
2951 }
2952
2953 lsb++;
2954
2955 /* Check if page wrap */
2956 if (((lsb & 0xFFU) == 0x00U) && (ret == 0))
2957 {
2958 msb++;
2959 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
2960 if (ret != 0)
2961 {
2962 goto exit;
2963 }
2964
2965 page_sel.page_sel = msb;
2966 page_sel.not_used0 = 1; // Default value
2967 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
2968 if (ret != 0)
2969 {
2970 goto exit;
2971 }
2972 }
2973 }
2974
2975 page_sel.page_sel = 0;
2976 page_sel.not_used0 = 1;// Default value
2977 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
2978 if (ret != 0)
2979 {
2980 goto exit;
2981 }
2982
2983 /* unset page write */
2984 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2985 page_rw.page_read = PROPERTY_DISABLE;
2986 page_rw.page_write = PROPERTY_DISABLE;
2987 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
2988
2989 exit:
2990 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
2991
2992 return ret;
2993 }
2994
2995 /**
2996 * @defgroup Common
2997 * @brief This section groups common useful functions.
2998 * @{/
2999 *
3000 */
3001
3002 /**
3003 * @brief Read buffer in a page.[set]
3004 *
3005 * @param ctx read / write interface definitions
3006 * @param val Write buffer in a page.
3007 * @retval interface status (MANDATORY: return 0 -> no Error)
3008 *
3009 */
lsm6dsv16x_ln_pg_read(const stmdev_ctx_t * ctx,uint16_t address,uint8_t * buf,uint8_t len)3010 int32_t lsm6dsv16x_ln_pg_read(const stmdev_ctx_t *ctx, uint16_t address, uint8_t *buf,
3011 uint8_t len)
3012 {
3013 lsm6dsv16x_page_address_t page_address;
3014 lsm6dsv16x_page_sel_t page_sel;
3015 lsm6dsv16x_page_rw_t page_rw;
3016 uint8_t msb;
3017 uint8_t lsb;
3018 int32_t ret;
3019 uint8_t i ;
3020
3021 msb = ((uint8_t)(address >> 8) & 0x0FU);
3022 lsb = (uint8_t)address & 0xFFU;
3023
3024 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
3025 if (ret != 0)
3026 {
3027 return ret;
3028 }
3029
3030 /* set page write */
3031 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
3032 page_rw.page_read = PROPERTY_ENABLE;
3033 page_rw.page_write = PROPERTY_DISABLE;
3034 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
3035 if (ret != 0)
3036 {
3037 goto exit;
3038 }
3039
3040 /* select page */
3041 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
3042 page_sel.page_sel = msb;
3043 page_sel.not_used0 = 1; // Default value
3044 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
3045 if (ret != 0)
3046 {
3047 goto exit;
3048 }
3049
3050 /* set page addr */
3051 page_address.page_addr = lsb;
3052 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_ADDRESS,
3053 (uint8_t *)&page_address, 1);
3054 if (ret != 0)
3055 {
3056 goto exit;
3057 }
3058
3059 for (i = 0; ((i < len) && (ret == 0)); i++)
3060 {
3061 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_VALUE, &buf[i], 1);
3062 if (ret != 0)
3063 {
3064 goto exit;
3065 }
3066
3067 lsb++;
3068
3069 /* Check if page wrap */
3070 if (((lsb & 0xFFU) == 0x00U) && (ret == 0))
3071 {
3072 msb++;
3073 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
3074 if (ret != 0)
3075 {
3076 goto exit;
3077 }
3078
3079 page_sel.page_sel = msb;
3080 page_sel.not_used0 = 1; // Default value
3081 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
3082 if (ret != 0)
3083 {
3084 goto exit;
3085 }
3086 }
3087 }
3088
3089 page_sel.page_sel = 0;
3090 page_sel.not_used0 = 1;// Default value
3091 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_SEL, (uint8_t *)&page_sel, 1);
3092 if (ret != 0)
3093 {
3094 goto exit;
3095 }
3096
3097 /* unset page write */
3098 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
3099 page_rw.page_read = PROPERTY_DISABLE;
3100 page_rw.page_write = PROPERTY_DISABLE;
3101 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PAGE_RW, (uint8_t *)&page_rw, 1);
3102
3103 exit:
3104 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
3105
3106 return ret;
3107 }
3108
3109 /**
3110 * @brief Enable debug mode for embedded functions [set]
3111 *
3112 * @param ctx read / write interface definitions
3113 * @param val 0, 1
3114 * @retval interface status (MANDATORY: return 0 -> no Error)
3115 *
3116 */
lsm6dsv16x_emb_function_dbg_set(const stmdev_ctx_t * ctx,uint8_t val)3117 int32_t lsm6dsv16x_emb_function_dbg_set(const stmdev_ctx_t *ctx, uint8_t val)
3118 {
3119 lsm6dsv16x_ctrl10_t ctrl10;
3120 int32_t ret;
3121
3122 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
3123
3124 if (ret == 0)
3125 {
3126 ctrl10.emb_func_debug = val;
3127 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
3128 }
3129
3130 return ret;
3131 }
3132
3133 /**
3134 * @brief Enable debug mode for embedded functions [get]
3135 *
3136 * @param ctx read / write interface definitions
3137 * @param val 0, 1
3138 * @retval interface status (MANDATORY: return 0 -> no Error)
3139 *
3140 */
lsm6dsv16x_emb_function_dbg_get(const stmdev_ctx_t * ctx,uint8_t * val)3141 int32_t lsm6dsv16x_emb_function_dbg_get(const stmdev_ctx_t *ctx, uint8_t *val)
3142 {
3143 lsm6dsv16x_ctrl10_t ctrl10;
3144 int32_t ret;
3145
3146 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
3147 if (ret != 0)
3148 {
3149 return ret;
3150 }
3151
3152 *val = ctrl10.emb_func_debug;
3153
3154 return ret;
3155 }
3156
3157 /**
3158 * @}
3159 *
3160 */
3161
3162 /**
3163 * @defgroup Data ENable (DEN)
3164 * @brief This section groups all the functions concerning
3165 * DEN functionality.
3166 * @{
3167 *
3168 */
3169
3170 /**
3171 * @brief It changes the polarity of INT2 pin input trigger for data enable (DEN) or embedded functions.[set]
3172 *
3173 * @param ctx read / write interface definitions
3174 * @param val DEN_ACT_LOW, DEN_ACT_HIGH,
3175 * @retval interface status (MANDATORY: return 0 -> no Error)
3176 *
3177 */
lsm6dsv16x_den_polarity_set(const stmdev_ctx_t * ctx,lsm6dsv16x_den_polarity_t val)3178 int32_t lsm6dsv16x_den_polarity_set(const stmdev_ctx_t *ctx,
3179 lsm6dsv16x_den_polarity_t val)
3180 {
3181 lsm6dsv16x_ctrl4_t ctrl4;
3182 int32_t ret;
3183
3184 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
3185
3186 if (ret == 0)
3187 {
3188 ctrl4.int2_in_lh = (uint8_t)val & 0x1U;
3189 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
3190 }
3191
3192 return ret;
3193 }
3194
3195 /**
3196 * @brief It changes the polarity of INT2 pin input trigger for data enable (DEN) or embedded functions.[get]
3197 *
3198 * @param ctx read / write interface definitions
3199 * @param val DEN_ACT_LOW, DEN_ACT_HIGH,
3200 * @retval interface status (MANDATORY: return 0 -> no Error)
3201 *
3202 */
lsm6dsv16x_den_polarity_get(const stmdev_ctx_t * ctx,lsm6dsv16x_den_polarity_t * val)3203 int32_t lsm6dsv16x_den_polarity_get(const stmdev_ctx_t *ctx,
3204 lsm6dsv16x_den_polarity_t *val)
3205 {
3206 lsm6dsv16x_ctrl4_t ctrl4;
3207 int32_t ret;
3208
3209 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
3210 if (ret != 0)
3211 {
3212 return ret;
3213 }
3214
3215 switch (ctrl4.int2_in_lh)
3216 {
3217 case LSM6DSV16X_DEN_ACT_LOW:
3218 *val = LSM6DSV16X_DEN_ACT_LOW;
3219 break;
3220
3221 case LSM6DSV16X_DEN_ACT_HIGH:
3222 *val = LSM6DSV16X_DEN_ACT_HIGH;
3223 break;
3224
3225 default:
3226 *val = LSM6DSV16X_DEN_ACT_LOW;
3227 break;
3228 }
3229
3230 return ret;
3231 }
3232
3233 /**
3234 * @brief Data ENable (DEN) configuration.[set]
3235 *
3236 * @param ctx read / write interface definitions
3237 * @param val Data ENable (DEN) configuration.
3238 * @retval interface status (MANDATORY: return 0 -> no Error)
3239 *
3240 */
lsm6dsv16x_den_conf_set(const stmdev_ctx_t * ctx,lsm6dsv16x_den_conf_t val)3241 int32_t lsm6dsv16x_den_conf_set(const stmdev_ctx_t *ctx, lsm6dsv16x_den_conf_t val)
3242 {
3243 lsm6dsv16x_den_t den;
3244 int32_t ret;
3245
3246 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_DEN, (uint8_t *)&den, 1);
3247 if (ret != 0)
3248 {
3249 return ret;
3250 }
3251
3252 den.den_z = val.den_z;
3253 den.den_y = val.den_y;
3254 den.den_x = val.den_x;
3255
3256 den.lvl2_en = (uint8_t)val.mode & 0x1U;
3257 den.lvl1_en = ((uint8_t)val.mode & 0x2U) >> 1;
3258
3259 if (val.stamp_in_gy_data == PROPERTY_ENABLE && val.stamp_in_xl_data == PROPERTY_ENABLE)
3260 {
3261 den.den_xl_g = PROPERTY_DISABLE;
3262 den.den_xl_en = PROPERTY_ENABLE;
3263 }
3264 else if (val.stamp_in_gy_data == PROPERTY_ENABLE && val.stamp_in_xl_data == PROPERTY_DISABLE)
3265 {
3266 den.den_xl_g = PROPERTY_DISABLE;
3267 den.den_xl_en = PROPERTY_DISABLE;
3268 }
3269 else if (val.stamp_in_gy_data == PROPERTY_DISABLE && val.stamp_in_xl_data == PROPERTY_ENABLE)
3270 {
3271 den.den_xl_g = PROPERTY_ENABLE;
3272 den.den_xl_en = PROPERTY_DISABLE;
3273 }
3274 else
3275 {
3276 den.den_xl_g = PROPERTY_DISABLE;
3277 den.den_xl_en = PROPERTY_DISABLE;
3278 den.den_z = PROPERTY_DISABLE;
3279 den.den_y = PROPERTY_DISABLE;
3280 den.den_x = PROPERTY_DISABLE;
3281 den.lvl2_en = PROPERTY_DISABLE;
3282 den.lvl1_en = PROPERTY_DISABLE;
3283 }
3284
3285 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_DEN, (uint8_t *)&den, 1);
3286
3287 return ret;
3288 }
3289
3290
3291 /**
3292 * @brief Data ENable (DEN) configuration.[get]
3293 *
3294 * @param ctx read / write interface definitions
3295 * @param val Data ENable (DEN) configuration.
3296 * @retval interface status (MANDATORY: return 0 -> no Error)
3297 *
3298 */
lsm6dsv16x_den_conf_get(const stmdev_ctx_t * ctx,lsm6dsv16x_den_conf_t * val)3299 int32_t lsm6dsv16x_den_conf_get(const stmdev_ctx_t *ctx, lsm6dsv16x_den_conf_t *val)
3300 {
3301 lsm6dsv16x_den_t den;
3302 int32_t ret;
3303
3304 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_DEN, (uint8_t *)&den, 1);
3305 if (ret != 0)
3306 {
3307 return ret;
3308 }
3309
3310 val->den_z = den.den_z;
3311 val->den_y = den.den_y;
3312 val->den_x = den.den_x;
3313
3314 if ((den.den_x | den.den_y | den.den_z) == PROPERTY_ENABLE)
3315 {
3316 if (den.den_xl_g == PROPERTY_DISABLE && den.den_xl_en == PROPERTY_ENABLE)
3317 {
3318 val->stamp_in_gy_data = PROPERTY_ENABLE;
3319 val->stamp_in_xl_data = PROPERTY_ENABLE;
3320 }
3321 else if (den.den_xl_g == PROPERTY_DISABLE && den.den_xl_en == PROPERTY_DISABLE)
3322 {
3323 val->stamp_in_gy_data = PROPERTY_ENABLE;
3324 val->stamp_in_xl_data = PROPERTY_DISABLE;
3325 }
3326 else // ( (den.den_xl_g & !den.den_xl_en) == PROPERTY_ENABLE )
3327 {
3328 val->stamp_in_gy_data = PROPERTY_DISABLE;
3329 val->stamp_in_xl_data = PROPERTY_ENABLE;
3330 }
3331 }
3332 else
3333 {
3334 val->stamp_in_gy_data = PROPERTY_DISABLE;
3335 val->stamp_in_xl_data = PROPERTY_DISABLE;
3336 }
3337
3338 switch ((den.lvl1_en << 1) + den.lvl2_en)
3339 {
3340 case LSM6DSV16X_LEVEL_TRIGGER:
3341 val->mode = LSM6DSV16X_LEVEL_TRIGGER;
3342 break;
3343
3344 case LSM6DSV16X_LEVEL_LATCHED:
3345 val->mode = LSM6DSV16X_LEVEL_LATCHED;
3346 break;
3347
3348 default:
3349 val->mode = LSM6DSV16X_DEN_NOT_DEFINED;
3350 break;
3351 }
3352
3353 return ret;
3354 }
3355
3356 /**
3357 * @}
3358 *
3359 */
3360
3361 /**
3362 * @defgroup Electronic Image Stabilization (EIS)
3363 * @brief Electronic Image Stabilization (EIS)
3364 * @{/
3365 *
3366 */
3367
3368 /**
3369 * @brief Gyroscope full-scale selection for EIS channel. WARNING: 4000dps will be available only if also User Interface chain is set to 4000dps[set]
3370 *
3371 * @param ctx read / write interface definitions
3372 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
3373 * @retval interface status (MANDATORY: return 0 -> no Error)
3374 *
3375 */
lsm6dsv16x_eis_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16x_eis_gy_full_scale_t val)3376 int32_t lsm6dsv16x_eis_gy_full_scale_set(const stmdev_ctx_t *ctx,
3377 lsm6dsv16x_eis_gy_full_scale_t val)
3378 {
3379 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3380 int32_t ret;
3381
3382 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3383
3384 if (ret == 0)
3385 {
3386 ctrl_eis.fs_g_eis = (uint8_t)val & 0x7U;
3387 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3388 }
3389
3390 return ret;
3391 }
3392
3393 /**
3394 * @brief Gyroscope full-scale selection for EIS channel. WARNING: 4000dps will be available only if also User Interface chain is set to 4000dps[get]
3395 *
3396 * @param ctx read / write interface definitions
3397 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps
3398 * @retval interface status (MANDATORY: return 0 -> no Error)
3399 *
3400 */
lsm6dsv16x_eis_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16x_eis_gy_full_scale_t * val)3401 int32_t lsm6dsv16x_eis_gy_full_scale_get(const stmdev_ctx_t *ctx,
3402 lsm6dsv16x_eis_gy_full_scale_t *val)
3403 {
3404 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3405 int32_t ret;
3406
3407 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3408 if (ret != 0)
3409 {
3410 return ret;
3411 }
3412
3413 switch (ctrl_eis.fs_g_eis)
3414 {
3415 case LSM6DSV16X_EIS_125dps:
3416 *val = LSM6DSV16X_EIS_125dps;
3417 break;
3418
3419 case LSM6DSV16X_EIS_250dps:
3420 *val = LSM6DSV16X_EIS_250dps;
3421 break;
3422
3423 case LSM6DSV16X_EIS_500dps:
3424 *val = LSM6DSV16X_EIS_500dps;
3425 break;
3426
3427 case LSM6DSV16X_EIS_1000dps:
3428 *val = LSM6DSV16X_EIS_1000dps;
3429 break;
3430
3431 case LSM6DSV16X_EIS_2000dps:
3432 *val = LSM6DSV16X_EIS_2000dps;
3433 break;
3434
3435 default:
3436 *val = LSM6DSV16X_EIS_125dps;
3437 break;
3438 }
3439 return ret;
3440 }
3441
3442 /**
3443 * @brief Enables routing of gyroscope EIS outputs on SPI2 (OIS interface). The gyroscope data on SPI2 (OIS interface) cannot be read from User Interface (UI).[set]
3444 *
3445 * @param ctx read / write interface definitions
3446 * @param val Enables routing of gyroscope EIS outputs on SPI2 (OIS interface). The gyroscope data on SPI2 (OIS interface) cannot be read from User Interface (UI).
3447 * @retval interface status (MANDATORY: return 0 -> no Error)
3448 *
3449 */
lsm6dsv16x_eis_gy_on_spi2_set(const stmdev_ctx_t * ctx,uint8_t val)3450 int32_t lsm6dsv16x_eis_gy_on_spi2_set(const stmdev_ctx_t *ctx, uint8_t val)
3451 {
3452 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3453 int32_t ret;
3454
3455 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3456
3457 if (ret == 0)
3458 {
3459 ctrl_eis.g_eis_on_g_ois_out_reg = val;
3460 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3461 }
3462
3463 return ret;
3464 }
3465
3466 /**
3467 * @brief Enables routing of gyroscope EIS outputs on SPI2 (OIS interface). The gyroscope data on SPI2 (OIS interface) cannot be read from User Interface (UI).[get]
3468 *
3469 * @param ctx read / write interface definitions
3470 * @param val Enables routing of gyroscope EIS outputs on SPI2 (OIS interface). The gyroscope data on SPI2 (OIS interface) cannot be read from User Interface (UI).
3471 * @retval interface status (MANDATORY: return 0 -> no Error)
3472 *
3473 */
lsm6dsv16x_eis_gy_on_spi2_get(const stmdev_ctx_t * ctx,uint8_t * val)3474 int32_t lsm6dsv16x_eis_gy_on_spi2_get(const stmdev_ctx_t *ctx, uint8_t *val)
3475 {
3476 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3477 int32_t ret;
3478
3479 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3480 *val = ctrl_eis.g_eis_on_g_ois_out_reg;
3481
3482 return ret;
3483 }
3484
3485 /**
3486 * @brief Enables and selects the ODR of the gyroscope EIS channel.[set]
3487 *
3488 * @param ctx read / write interface definitions
3489 * @param val EIS_1920Hz, EIS_960Hz,
3490 * @retval interface status (MANDATORY: return 0 -> no Error)
3491 *
3492 */
lsm6dsv16x_gy_eis_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_eis_data_rate_t val)3493 int32_t lsm6dsv16x_gy_eis_data_rate_set(const stmdev_ctx_t *ctx,
3494 lsm6dsv16x_gy_eis_data_rate_t val)
3495 {
3496 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3497 int32_t ret;
3498
3499 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3500
3501 if (ret == 0)
3502 {
3503 ctrl_eis.odr_g_eis = (uint8_t)val & 0x03U;
3504 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3505 }
3506
3507 return ret;
3508 }
3509
3510 /**
3511 * @brief Enables and selects the ODR of the gyroscope EIS channel.[get]
3512 *
3513 * @param ctx read / write interface definitions
3514 * @param val EIS_1920Hz, EIS_960Hz,
3515 * @retval interface status (MANDATORY: return 0 -> no Error)
3516 *
3517 */
lsm6dsv16x_gy_eis_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_gy_eis_data_rate_t * val)3518 int32_t lsm6dsv16x_gy_eis_data_rate_get(const stmdev_ctx_t *ctx,
3519 lsm6dsv16x_gy_eis_data_rate_t *val)
3520 {
3521 lsm6dsv16x_ctrl_eis_t ctrl_eis;
3522 int32_t ret;
3523
3524 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
3525 if (ret != 0)
3526 {
3527 return ret;
3528 }
3529
3530 switch (ctrl_eis.odr_g_eis)
3531 {
3532 case LSM6DSV16X_EIS_ODR_OFF:
3533 *val = LSM6DSV16X_EIS_ODR_OFF;
3534 break;
3535
3536 case LSM6DSV16X_EIS_1920Hz:
3537 *val = LSM6DSV16X_EIS_1920Hz;
3538 break;
3539
3540 case LSM6DSV16X_EIS_960Hz:
3541 *val = LSM6DSV16X_EIS_960Hz;
3542 break;
3543
3544 default:
3545 *val = LSM6DSV16X_EIS_1920Hz;
3546 break;
3547 }
3548
3549 return ret;
3550 }
3551
3552 /**
3553 * @}
3554 *
3555 */
3556
3557 /**
3558 * @defgroup FIFO
3559 * @brief This section group all the functions concerning the FIFO usage
3560 * @{
3561 *
3562 */
3563
3564 /**
3565 * @brief FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).[set]
3566 *
3567 * @param ctx read / write interface definitions
3568 * @param val FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).
3569 * @retval interface status (MANDATORY: return 0 -> no Error)
3570 *
3571 */
lsm6dsv16x_fifo_watermark_set(const stmdev_ctx_t * ctx,uint8_t val)3572 int32_t lsm6dsv16x_fifo_watermark_set(const stmdev_ctx_t *ctx, uint8_t val)
3573 {
3574 lsm6dsv16x_fifo_ctrl1_t fifo_ctrl1;
3575 int32_t ret;
3576
3577 fifo_ctrl1.wtm = val;
3578 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
3579
3580 return ret;
3581 }
3582
3583 /**
3584 * @brief FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).[get]
3585 *
3586 * @param ctx read / write interface definitions
3587 * @param val FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).
3588 * @retval interface status (MANDATORY: return 0 -> no Error)
3589 *
3590 */
lsm6dsv16x_fifo_watermark_get(const stmdev_ctx_t * ctx,uint8_t * val)3591 int32_t lsm6dsv16x_fifo_watermark_get(const stmdev_ctx_t *ctx, uint8_t *val)
3592 {
3593 lsm6dsv16x_fifo_ctrl1_t fifo_ctrl1;
3594 int32_t ret;
3595
3596 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
3597 *val = fifo_ctrl1.wtm;
3598
3599 return ret;
3600 }
3601
3602 /**
3603 * @brief When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.[set]
3604 *
3605 * @param ctx read / write interface definitions
3606 * @param val When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.
3607 * @retval interface status (MANDATORY: return 0 -> no Error)
3608 *
3609 */
lsm6dsv16x_fifo_xl_dual_fsm_batch_set(const stmdev_ctx_t * ctx,uint8_t val)3610 int32_t lsm6dsv16x_fifo_xl_dual_fsm_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
3611 {
3612 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3613 int32_t ret;
3614
3615 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3616 if (ret == 0)
3617 {
3618 fifo_ctrl2.xl_dualc_batch_from_fsm = val;
3619 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3620 }
3621
3622 return ret;
3623 }
3624
3625 /**
3626 * @brief When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.[get]
3627 *
3628 * @param ctx read / write interface definitions
3629 * @param val When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.
3630 * @retval interface status (MANDATORY: return 0 -> no Error)
3631 *
3632 */
lsm6dsv16x_fifo_xl_dual_fsm_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)3633 int32_t lsm6dsv16x_fifo_xl_dual_fsm_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
3634 {
3635 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3636 int32_t ret;
3637
3638 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3639 *val = fifo_ctrl2.xl_dualc_batch_from_fsm;
3640
3641 return ret;
3642 }
3643
3644 /**
3645 * @brief It configures the compression algorithm to write non-compressed data at each rate.[set]
3646 *
3647 * @param ctx read / write interface definitions
3648 * @param val CMP_DISABLE, CMP_ALWAYS, CMP_8_TO_1, CMP_16_TO_1, CMP_32_TO_1,
3649 * @retval interface status (MANDATORY: return 0 -> no Error)
3650 *
3651 */
lsm6dsv16x_fifo_compress_algo_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_compress_algo_t val)3652 int32_t lsm6dsv16x_fifo_compress_algo_set(const stmdev_ctx_t *ctx,
3653 lsm6dsv16x_fifo_compress_algo_t val)
3654 {
3655 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3656 int32_t ret;
3657
3658 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3659 if (ret == 0)
3660 {
3661 fifo_ctrl2.uncompr_rate = (uint8_t)val & 0x03U;
3662 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3663 }
3664
3665 return ret;
3666 }
3667
3668 /**
3669 * @brief It configures the compression algorithm to write non-compressed data at each rate.[get]
3670 *
3671 * @param ctx read / write interface definitions
3672 * @param val CMP_DISABLE, CMP_ALWAYS, CMP_8_TO_1, CMP_16_TO_1, CMP_32_TO_1,
3673 * @retval interface status (MANDATORY: return 0 -> no Error)
3674 *
3675 */
lsm6dsv16x_fifo_compress_algo_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_compress_algo_t * val)3676 int32_t lsm6dsv16x_fifo_compress_algo_get(const stmdev_ctx_t *ctx,
3677 lsm6dsv16x_fifo_compress_algo_t *val)
3678 {
3679 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3680 int32_t ret;
3681
3682 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3683 if (ret != 0)
3684 {
3685 return ret;
3686 }
3687
3688 switch (fifo_ctrl2.uncompr_rate)
3689 {
3690 case LSM6DSV16X_CMP_DISABLE:
3691 *val = LSM6DSV16X_CMP_DISABLE;
3692 break;
3693
3694 case LSM6DSV16X_CMP_8_TO_1:
3695 *val = LSM6DSV16X_CMP_8_TO_1;
3696 break;
3697
3698 case LSM6DSV16X_CMP_16_TO_1:
3699 *val = LSM6DSV16X_CMP_16_TO_1;
3700 break;
3701
3702 case LSM6DSV16X_CMP_32_TO_1:
3703 *val = LSM6DSV16X_CMP_32_TO_1;
3704 break;
3705
3706 default:
3707 *val = LSM6DSV16X_CMP_DISABLE;
3708 break;
3709 }
3710 return ret;
3711 }
3712
3713 /**
3714 * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[set]
3715 *
3716 * @param ctx read / write interface definitions
3717 * @param val Enables ODR CHANGE virtual sensor to be batched in FIFO.
3718 * @retval interface status (MANDATORY: return 0 -> no Error)
3719 *
3720 */
lsm6dsv16x_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t * ctx,uint8_t val)3721 int32_t lsm6dsv16x_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t *ctx, uint8_t val)
3722 {
3723 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3724 int32_t ret;
3725
3726 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3727 if (ret == 0)
3728 {
3729 fifo_ctrl2.odr_chg_en = val;
3730 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3731 }
3732
3733 return ret;
3734 }
3735
3736 /**
3737 * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[get]
3738 *
3739 * @param ctx read / write interface definitions
3740 * @param val Enables ODR CHANGE virtual sensor to be batched in FIFO.
3741 * @retval interface status (MANDATORY: return 0 -> no Error)
3742 *
3743 */
lsm6dsv16x_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t * ctx,uint8_t * val)3744 int32_t lsm6dsv16x_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t *ctx,
3745 uint8_t *val)
3746 {
3747 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3748 int32_t ret;
3749
3750 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3751 *val = fifo_ctrl2.odr_chg_en;
3752
3753 return ret;
3754 }
3755
3756 /**
3757 * @brief Enables/Disables compression algorithm runtime.[set]
3758 *
3759 * @param ctx read / write interface definitions
3760 * @param val Enables/Disables compression algorithm runtime.
3761 * @retval interface status (MANDATORY: return 0 -> no Error)
3762 *
3763 */
lsm6dsv16x_fifo_compress_algo_real_time_set(const stmdev_ctx_t * ctx,uint8_t val)3764 int32_t lsm6dsv16x_fifo_compress_algo_real_time_set(const stmdev_ctx_t *ctx,
3765 uint8_t val)
3766 {
3767 lsm6dsv16x_emb_func_en_b_t emb_func_en_b;
3768 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3769
3770 int32_t ret;
3771
3772 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3773 fifo_ctrl2.fifo_compr_rt_en = val;
3774 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3775 if (ret != 0)
3776 {
3777 return ret;
3778 }
3779
3780 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
3781 if (ret != 0)
3782 {
3783 return ret;
3784 }
3785
3786 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
3787 emb_func_en_b.fifo_compr_en = val;
3788 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
3789 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
3790
3791 return ret;
3792 }
3793
3794 /**
3795 * @brief Enables/Disables compression algorithm runtime.[get]
3796 *
3797 * @param ctx read / write interface definitions
3798 * @param val Enables/Disables compression algorithm runtime.
3799 * @retval interface status (MANDATORY: return 0 -> no Error)
3800 *
3801 */
lsm6dsv16x_fifo_compress_algo_real_time_get(const stmdev_ctx_t * ctx,uint8_t * val)3802 int32_t lsm6dsv16x_fifo_compress_algo_real_time_get(const stmdev_ctx_t *ctx,
3803 uint8_t *val)
3804 {
3805 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3806 int32_t ret;
3807
3808 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3809
3810 *val = fifo_ctrl2.fifo_compr_rt_en;
3811
3812 return ret;
3813 }
3814
3815 /**
3816 * @brief Sensing chain FIFO stop values memorization at threshold level.[set]
3817 *
3818 * @param ctx read / write interface definitions
3819 * @param val Sensing chain FIFO stop values memorization at threshold level.
3820 * @retval interface status (MANDATORY: return 0 -> no Error)
3821 *
3822 */
lsm6dsv16x_fifo_stop_on_wtm_set(const stmdev_ctx_t * ctx,uint8_t val)3823 int32_t lsm6dsv16x_fifo_stop_on_wtm_set(const stmdev_ctx_t *ctx, uint8_t val)
3824 {
3825 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3826 int32_t ret;
3827
3828 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3829 if (ret == 0)
3830 {
3831 fifo_ctrl2.stop_on_wtm = val;
3832 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3833 }
3834
3835 return ret;
3836 }
3837
3838 /**
3839 * @brief Sensing chain FIFO stop values memorization at threshold level.[get]
3840 *
3841 * @param ctx read / write interface definitions
3842 * @param val Sensing chain FIFO stop values memorization at threshold level.
3843 * @retval interface status (MANDATORY: return 0 -> no Error)
3844 *
3845 */
lsm6dsv16x_fifo_stop_on_wtm_get(const stmdev_ctx_t * ctx,uint8_t * val)3846 int32_t lsm6dsv16x_fifo_stop_on_wtm_get(const stmdev_ctx_t *ctx, uint8_t *val)
3847 {
3848 lsm6dsv16x_fifo_ctrl2_t fifo_ctrl2;
3849 int32_t ret;
3850
3851 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
3852 *val = fifo_ctrl2.stop_on_wtm;
3853
3854 return ret;
3855 }
3856
3857 /**
3858 * @brief Selects Batch Data Rate (write frequency in FIFO) for accelerometer data.[set]
3859 *
3860 * @param ctx read / write interface definitions
3861 * @param val XL_NOT_BATCHED, XL_BATCHED_AT_1Hz875, XL_BATCHED_AT_7Hz5, XL_BATCHED_AT_15Hz, XL_BATCHED_AT_30Hz, XL_BATCHED_AT_60Hz, XL_BATCHED_AT_120Hz, XL_BATCHED_AT_240Hz, XL_BATCHED_AT_480Hz, XL_BATCHED_AT_960Hz, XL_BATCHED_AT_1920Hz, XL_BATCHED_AT_3840Hz, XL_BATCHED_AT_7680Hz,
3862 * @retval interface status (MANDATORY: return 0 -> no Error)
3863 *
3864 */
lsm6dsv16x_fifo_xl_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_xl_batch_t val)3865 int32_t lsm6dsv16x_fifo_xl_batch_set(const stmdev_ctx_t *ctx,
3866 lsm6dsv16x_fifo_xl_batch_t val)
3867 {
3868 lsm6dsv16x_fifo_ctrl3_t fifo_ctrl3;
3869 int32_t ret;
3870
3871 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
3872 if (ret == 0)
3873 {
3874 fifo_ctrl3.bdr_xl = (uint8_t)val & 0xFu;
3875 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
3876 }
3877
3878 return ret;
3879 }
3880
3881 /**
3882 * @brief Selects Batch Data Rate (write frequency in FIFO) for accelerometer data.[get]
3883 *
3884 * @param ctx read / write interface definitions
3885 * @param val XL_NOT_BATCHED, XL_BATCHED_AT_1Hz875, XL_BATCHED_AT_7Hz5, XL_BATCHED_AT_15Hz, XL_BATCHED_AT_30Hz, XL_BATCHED_AT_60Hz, XL_BATCHED_AT_120Hz, XL_BATCHED_AT_240Hz, XL_BATCHED_AT_480Hz, XL_BATCHED_AT_960Hz, XL_BATCHED_AT_1920Hz, XL_BATCHED_AT_3840Hz, XL_BATCHED_AT_7680Hz,
3886 * @retval interface status (MANDATORY: return 0 -> no Error)
3887 *
3888 */
lsm6dsv16x_fifo_xl_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_xl_batch_t * val)3889 int32_t lsm6dsv16x_fifo_xl_batch_get(const stmdev_ctx_t *ctx,
3890 lsm6dsv16x_fifo_xl_batch_t *val)
3891 {
3892 lsm6dsv16x_fifo_ctrl3_t fifo_ctrl3;
3893 int32_t ret;
3894
3895 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
3896 if (ret != 0)
3897 {
3898 return ret;
3899 }
3900
3901 switch (fifo_ctrl3.bdr_xl)
3902 {
3903 case LSM6DSV16X_XL_NOT_BATCHED:
3904 *val = LSM6DSV16X_XL_NOT_BATCHED;
3905 break;
3906
3907 case LSM6DSV16X_XL_BATCHED_AT_1Hz875:
3908 *val = LSM6DSV16X_XL_BATCHED_AT_1Hz875;
3909 break;
3910
3911 case LSM6DSV16X_XL_BATCHED_AT_7Hz5:
3912 *val = LSM6DSV16X_XL_BATCHED_AT_7Hz5;
3913 break;
3914
3915 case LSM6DSV16X_XL_BATCHED_AT_15Hz:
3916 *val = LSM6DSV16X_XL_BATCHED_AT_15Hz;
3917 break;
3918
3919 case LSM6DSV16X_XL_BATCHED_AT_30Hz:
3920 *val = LSM6DSV16X_XL_BATCHED_AT_30Hz;
3921 break;
3922
3923 case LSM6DSV16X_XL_BATCHED_AT_60Hz:
3924 *val = LSM6DSV16X_XL_BATCHED_AT_60Hz;
3925 break;
3926
3927 case LSM6DSV16X_XL_BATCHED_AT_120Hz:
3928 *val = LSM6DSV16X_XL_BATCHED_AT_120Hz;
3929 break;
3930
3931 case LSM6DSV16X_XL_BATCHED_AT_240Hz:
3932 *val = LSM6DSV16X_XL_BATCHED_AT_240Hz;
3933 break;
3934
3935 case LSM6DSV16X_XL_BATCHED_AT_480Hz:
3936 *val = LSM6DSV16X_XL_BATCHED_AT_480Hz;
3937 break;
3938
3939 case LSM6DSV16X_XL_BATCHED_AT_960Hz:
3940 *val = LSM6DSV16X_XL_BATCHED_AT_960Hz;
3941 break;
3942
3943 case LSM6DSV16X_XL_BATCHED_AT_1920Hz:
3944 *val = LSM6DSV16X_XL_BATCHED_AT_1920Hz;
3945 break;
3946
3947 case LSM6DSV16X_XL_BATCHED_AT_3840Hz:
3948 *val = LSM6DSV16X_XL_BATCHED_AT_3840Hz;
3949 break;
3950
3951 case LSM6DSV16X_XL_BATCHED_AT_7680Hz:
3952 *val = LSM6DSV16X_XL_BATCHED_AT_7680Hz;
3953 break;
3954
3955 default:
3956 *val = LSM6DSV16X_XL_NOT_BATCHED;
3957 break;
3958 }
3959
3960 return ret;
3961 }
3962
3963 /**
3964 * @brief Selects Batch Data Rate (write frequency in FIFO) for gyroscope data.[set]
3965 *
3966 * @param ctx read / write interface definitions
3967 * @param val GY_NOT_BATCHED, GY_BATCHED_AT_1Hz875, GY_BATCHED_AT_7Hz5, GY_BATCHED_AT_15Hz, GY_BATCHED_AT_30Hz, GY_BATCHED_AT_60Hz, GY_BATCHED_AT_120Hz, GY_BATCHED_AT_240Hz, GY_BATCHED_AT_480Hz, GY_BATCHED_AT_960Hz, GY_BATCHED_AT_1920Hz, GY_BATCHED_AT_3840Hz, GY_BATCHED_AT_7680Hz,
3968 * @retval interface status (MANDATORY: return 0 -> no Error)
3969 *
3970 */
lsm6dsv16x_fifo_gy_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_gy_batch_t val)3971 int32_t lsm6dsv16x_fifo_gy_batch_set(const stmdev_ctx_t *ctx,
3972 lsm6dsv16x_fifo_gy_batch_t val)
3973 {
3974 lsm6dsv16x_fifo_ctrl3_t fifo_ctrl3;
3975 int32_t ret;
3976
3977 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
3978 if (ret == 0)
3979 {
3980 fifo_ctrl3.bdr_gy = (uint8_t)val & 0x0Fu;
3981 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
3982 }
3983
3984 return ret;
3985 }
3986
3987 /**
3988 * @brief Selects Batch Data Rate (write frequency in FIFO) for gyroscope data.[get]
3989 *
3990 * @param ctx read / write interface definitions
3991 * @param val GY_NOT_BATCHED, GY_BATCHED_AT_1Hz875, GY_BATCHED_AT_7Hz5, GY_BATCHED_AT_15Hz, GY_BATCHED_AT_30Hz, GY_BATCHED_AT_60Hz, GY_BATCHED_AT_120Hz, GY_BATCHED_AT_240Hz, GY_BATCHED_AT_480Hz, GY_BATCHED_AT_960Hz, GY_BATCHED_AT_1920Hz, GY_BATCHED_AT_3840Hz, GY_BATCHED_AT_7680Hz,
3992 * @retval interface status (MANDATORY: return 0 -> no Error)
3993 *
3994 */
lsm6dsv16x_fifo_gy_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_gy_batch_t * val)3995 int32_t lsm6dsv16x_fifo_gy_batch_get(const stmdev_ctx_t *ctx,
3996 lsm6dsv16x_fifo_gy_batch_t *val)
3997 {
3998 lsm6dsv16x_fifo_ctrl3_t fifo_ctrl3;
3999 int32_t ret;
4000
4001 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4002 if (ret != 0)
4003 {
4004 return ret;
4005 }
4006
4007 switch (fifo_ctrl3.bdr_gy)
4008 {
4009 case LSM6DSV16X_GY_NOT_BATCHED:
4010 *val = LSM6DSV16X_GY_NOT_BATCHED;
4011 break;
4012
4013 case LSM6DSV16X_GY_BATCHED_AT_1Hz875:
4014 *val = LSM6DSV16X_GY_BATCHED_AT_1Hz875;
4015 break;
4016
4017 case LSM6DSV16X_GY_BATCHED_AT_7Hz5:
4018 *val = LSM6DSV16X_GY_BATCHED_AT_7Hz5;
4019 break;
4020
4021 case LSM6DSV16X_GY_BATCHED_AT_15Hz:
4022 *val = LSM6DSV16X_GY_BATCHED_AT_15Hz;
4023 break;
4024
4025 case LSM6DSV16X_GY_BATCHED_AT_30Hz:
4026 *val = LSM6DSV16X_GY_BATCHED_AT_30Hz;
4027 break;
4028
4029 case LSM6DSV16X_GY_BATCHED_AT_60Hz:
4030 *val = LSM6DSV16X_GY_BATCHED_AT_60Hz;
4031 break;
4032
4033 case LSM6DSV16X_GY_BATCHED_AT_120Hz:
4034 *val = LSM6DSV16X_GY_BATCHED_AT_120Hz;
4035 break;
4036
4037 case LSM6DSV16X_GY_BATCHED_AT_240Hz:
4038 *val = LSM6DSV16X_GY_BATCHED_AT_240Hz;
4039 break;
4040
4041 case LSM6DSV16X_GY_BATCHED_AT_480Hz:
4042 *val = LSM6DSV16X_GY_BATCHED_AT_480Hz;
4043 break;
4044
4045 case LSM6DSV16X_GY_BATCHED_AT_960Hz:
4046 *val = LSM6DSV16X_GY_BATCHED_AT_960Hz;
4047 break;
4048
4049 case LSM6DSV16X_GY_BATCHED_AT_1920Hz:
4050 *val = LSM6DSV16X_GY_BATCHED_AT_1920Hz;
4051 break;
4052
4053 case LSM6DSV16X_GY_BATCHED_AT_3840Hz:
4054 *val = LSM6DSV16X_GY_BATCHED_AT_3840Hz;
4055 break;
4056
4057 case LSM6DSV16X_GY_BATCHED_AT_7680Hz:
4058 *val = LSM6DSV16X_GY_BATCHED_AT_7680Hz;
4059 break;
4060
4061 default:
4062 *val = LSM6DSV16X_GY_NOT_BATCHED;
4063 break;
4064 }
4065 return ret;
4066 }
4067
4068
4069 /**
4070 * @brief FIFO mode selection.[set]
4071 *
4072 * @param ctx read / write interface definitions
4073 * @param val BYPASS_MODE, FIFO_MODE, STREAM_WTM_TO_FULL_MODE, STREAM_TO_FIFO_MODE, BYPASS_TO_STREAM_MODE, STREAM_MODE, BYPASS_TO_FIFO_MODE,
4074 * @retval interface status (MANDATORY: return 0 -> no Error)
4075 *
4076 */
lsm6dsv16x_fifo_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_mode_t val)4077 int32_t lsm6dsv16x_fifo_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_fifo_mode_t val)
4078 {
4079 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4080 int32_t ret;
4081
4082 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4083 if (ret == 0)
4084 {
4085 fifo_ctrl4.fifo_mode = (uint8_t)val & 0x07U;
4086 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4087 }
4088
4089 return ret;
4090 }
4091
4092 /**
4093 * @brief FIFO mode selection.[get]
4094 *
4095 * @param ctx read / write interface definitions
4096 * @param val BYPASS_MODE, FIFO_MODE, STREAM_WTM_TO_FULL_MODE, STREAM_TO_FIFO_MODE, BYPASS_TO_STREAM_MODE, STREAM_MODE, BYPASS_TO_FIFO_MODE,
4097 * @retval interface status (MANDATORY: return 0 -> no Error)
4098 *
4099 */
lsm6dsv16x_fifo_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_mode_t * val)4100 int32_t lsm6dsv16x_fifo_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_fifo_mode_t *val)
4101 {
4102 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4103 int32_t ret;
4104
4105 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4106 if (ret != 0)
4107 {
4108 return ret;
4109 }
4110
4111 switch (fifo_ctrl4.fifo_mode)
4112 {
4113 case LSM6DSV16X_BYPASS_MODE:
4114 *val = LSM6DSV16X_BYPASS_MODE;
4115 break;
4116
4117 case LSM6DSV16X_FIFO_MODE:
4118 *val = LSM6DSV16X_FIFO_MODE;
4119 break;
4120
4121 case LSM6DSV16X_STREAM_WTM_TO_FULL_MODE:
4122 *val = LSM6DSV16X_STREAM_WTM_TO_FULL_MODE;
4123 break;
4124
4125 case LSM6DSV16X_STREAM_TO_FIFO_MODE:
4126 *val = LSM6DSV16X_STREAM_TO_FIFO_MODE;
4127 break;
4128
4129 case LSM6DSV16X_BYPASS_TO_STREAM_MODE:
4130 *val = LSM6DSV16X_BYPASS_TO_STREAM_MODE;
4131 break;
4132
4133 case LSM6DSV16X_STREAM_MODE:
4134 *val = LSM6DSV16X_STREAM_MODE;
4135 break;
4136
4137 case LSM6DSV16X_BYPASS_TO_FIFO_MODE:
4138 *val = LSM6DSV16X_BYPASS_TO_FIFO_MODE;
4139 break;
4140
4141 default:
4142 *val = LSM6DSV16X_BYPASS_MODE;
4143 break;
4144 }
4145 return ret;
4146 }
4147
4148 /**
4149 * @brief Enables FIFO batching of EIS gyroscope output values.[set]
4150 *
4151 * @param ctx read / write interface definitions
4152 * @param val Enables FIFO batching of EIS gyroscope output values.
4153 * @retval interface status (MANDATORY: return 0 -> no Error)
4154 *
4155 */
lsm6dsv16x_fifo_gy_eis_batch_set(const stmdev_ctx_t * ctx,uint8_t val)4156 int32_t lsm6dsv16x_fifo_gy_eis_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
4157 {
4158 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4159 int32_t ret;
4160
4161 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4162 if (ret == 0)
4163 {
4164 fifo_ctrl4.g_eis_fifo_en = val;
4165 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4166 }
4167
4168 return ret;
4169 }
4170
4171 /**
4172 * @brief Enables FIFO batching of EIS gyroscope output values.[get]
4173 *
4174 * @param ctx read / write interface definitions
4175 * @param val Enables FIFO batching of EIS gyroscope output values.
4176 * @retval interface status (MANDATORY: return 0 -> no Error)
4177 *
4178 */
lsm6dsv16x_fifo_gy_eis_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)4179 int32_t lsm6dsv16x_fifo_gy_eis_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
4180 {
4181 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4182 int32_t ret;
4183
4184 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4185 *val = fifo_ctrl4.g_eis_fifo_en;
4186
4187 return ret;
4188 }
4189
4190 /**
4191 * @brief Selects batch data rate (write frequency in FIFO) for temperature data.[set]
4192 *
4193 * @param ctx read / write interface definitions
4194 * @param val TEMP_NOT_BATCHED, TEMP_BATCHED_AT_1Hz875, TEMP_BATCHED_AT_15Hz, TEMP_BATCHED_AT_60Hz,
4195 * @retval interface status (MANDATORY: return 0 -> no Error)
4196 *
4197 */
lsm6dsv16x_fifo_temp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_temp_batch_t val)4198 int32_t lsm6dsv16x_fifo_temp_batch_set(const stmdev_ctx_t *ctx,
4199 lsm6dsv16x_fifo_temp_batch_t val)
4200 {
4201 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4202 int32_t ret;
4203
4204 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4205 if (ret == 0)
4206 {
4207 fifo_ctrl4.odr_t_batch = (uint8_t)val & 0x03U;
4208 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4209 }
4210
4211 return ret;
4212 }
4213
4214 /**
4215 * @brief Selects batch data rate (write frequency in FIFO) for temperature data.[get]
4216 *
4217 * @param ctx read / write interface definitions
4218 * @param val TEMP_NOT_BATCHED, TEMP_BATCHED_AT_1Hz875, TEMP_BATCHED_AT_15Hz, TEMP_BATCHED_AT_60Hz,
4219 * @retval interface status (MANDATORY: return 0 -> no Error)
4220 *
4221 */
lsm6dsv16x_fifo_temp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_temp_batch_t * val)4222 int32_t lsm6dsv16x_fifo_temp_batch_get(const stmdev_ctx_t *ctx,
4223 lsm6dsv16x_fifo_temp_batch_t *val)
4224 {
4225 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4226 int32_t ret;
4227
4228 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4229 if (ret != 0)
4230 {
4231 return ret;
4232 }
4233
4234 switch (fifo_ctrl4.odr_t_batch)
4235 {
4236 case LSM6DSV16X_TEMP_NOT_BATCHED:
4237 *val = LSM6DSV16X_TEMP_NOT_BATCHED;
4238 break;
4239
4240 case LSM6DSV16X_TEMP_BATCHED_AT_1Hz875:
4241 *val = LSM6DSV16X_TEMP_BATCHED_AT_1Hz875;
4242 break;
4243
4244 case LSM6DSV16X_TEMP_BATCHED_AT_15Hz:
4245 *val = LSM6DSV16X_TEMP_BATCHED_AT_15Hz;
4246 break;
4247
4248 case LSM6DSV16X_TEMP_BATCHED_AT_60Hz:
4249 *val = LSM6DSV16X_TEMP_BATCHED_AT_60Hz;
4250 break;
4251
4252 default:
4253 *val = LSM6DSV16X_TEMP_NOT_BATCHED;
4254 break;
4255 }
4256 return ret;
4257 }
4258
4259 /**
4260 * @brief Selects decimation for timestamp batching in FIFO. Write rate will be the maximum rate between XL and GYRO BDR divided by decimation decoder.[set]
4261 *
4262 * @param ctx read / write interface definitions
4263 * @param val TMSTMP_NOT_BATCHED, TMSTMP_DEC_1, TMSTMP_DEC_8, TMSTMP_DEC_32,
4264 * @retval interface status (MANDATORY: return 0 -> no Error)
4265 *
4266 */
lsm6dsv16x_fifo_timestamp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_timestamp_batch_t val)4267 int32_t lsm6dsv16x_fifo_timestamp_batch_set(const stmdev_ctx_t *ctx,
4268 lsm6dsv16x_fifo_timestamp_batch_t val)
4269 {
4270 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4271 int32_t ret;
4272
4273 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4274 if (ret == 0)
4275 {
4276 fifo_ctrl4.dec_ts_batch = (uint8_t)val & 0x03U;
4277 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4278 }
4279
4280 return ret;
4281 }
4282
4283 /**
4284 * @brief Selects decimation for timestamp batching in FIFO. Write rate will be the maximum rate between XL and GYRO BDR divided by decimation decoder.[get]
4285 *
4286 * @param ctx read / write interface definitions
4287 * @param val TMSTMP_NOT_BATCHED, TMSTMP_DEC_1, TMSTMP_DEC_8, TMSTMP_DEC_32,
4288 * @retval interface status (MANDATORY: return 0 -> no Error)
4289 *
4290 */
lsm6dsv16x_fifo_timestamp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_timestamp_batch_t * val)4291 int32_t lsm6dsv16x_fifo_timestamp_batch_get(const stmdev_ctx_t *ctx,
4292 lsm6dsv16x_fifo_timestamp_batch_t *val)
4293 {
4294 lsm6dsv16x_fifo_ctrl4_t fifo_ctrl4;
4295 int32_t ret;
4296
4297 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
4298 if (ret != 0)
4299 {
4300 return ret;
4301 }
4302
4303 switch (fifo_ctrl4.dec_ts_batch)
4304 {
4305 case LSM6DSV16X_TMSTMP_NOT_BATCHED:
4306 *val = LSM6DSV16X_TMSTMP_NOT_BATCHED;
4307 break;
4308
4309 case LSM6DSV16X_TMSTMP_DEC_1:
4310 *val = LSM6DSV16X_TMSTMP_DEC_1;
4311 break;
4312
4313 case LSM6DSV16X_TMSTMP_DEC_8:
4314 *val = LSM6DSV16X_TMSTMP_DEC_8;
4315 break;
4316
4317 case LSM6DSV16X_TMSTMP_DEC_32:
4318 *val = LSM6DSV16X_TMSTMP_DEC_32;
4319 break;
4320
4321 default:
4322 *val = LSM6DSV16X_TMSTMP_NOT_BATCHED;
4323 break;
4324 }
4325
4326 return ret;
4327 }
4328
4329 /**
4330 * @brief The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.[set]
4331 *
4332 * @param ctx read / write interface definitions
4333 * @param val The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.
4334 * @retval interface status (MANDATORY: return 0 -> no Error)
4335 *
4336 */
lsm6dsv16x_fifo_batch_counter_threshold_set(const stmdev_ctx_t * ctx,uint16_t val)4337 int32_t lsm6dsv16x_fifo_batch_counter_threshold_set(const stmdev_ctx_t *ctx,
4338 uint16_t val)
4339 {
4340 lsm6dsv16x_counter_bdr_reg1_t counter_bdr_reg1;
4341 lsm6dsv16x_counter_bdr_reg2_t counter_bdr_reg2;
4342 int32_t ret;
4343
4344 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
4345
4346 if (ret == 0)
4347 {
4348 counter_bdr_reg2.cnt_bdr_th = (uint8_t)val & 0xFFU;
4349 counter_bdr_reg1.cnt_bdr_th = (uint8_t)(val >> 8) & 0x3U;
4350 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
4351 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG2, (uint8_t *)&counter_bdr_reg2, 1);
4352 }
4353
4354 return ret;
4355 }
4356
4357 /**
4358 * @brief The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.[get]
4359 *
4360 * @param ctx read / write interface definitions
4361 * @param val The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.
4362 * @retval interface status (MANDATORY: return 0 -> no Error)
4363 *
4364 */
lsm6dsv16x_fifo_batch_counter_threshold_get(const stmdev_ctx_t * ctx,uint16_t * val)4365 int32_t lsm6dsv16x_fifo_batch_counter_threshold_get(const stmdev_ctx_t *ctx,
4366 uint16_t *val)
4367 {
4368 uint8_t buff[2];
4369 int32_t ret;
4370
4371 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, &buff[0], 2);
4372 if (ret != 0)
4373 {
4374 return ret;
4375 }
4376
4377 *val = (uint16_t)buff[0] & 0x3U;
4378 *val = (*val * 256U) + (uint16_t)buff[1];
4379
4380 return ret;
4381 }
4382
4383 /**
4384 * @brief Selects the trigger for the internal counter of batch events between the accelerometer, gyroscope and EIS gyroscope.[set]
4385 *
4386 * @param ctx read / write interface definitions
4387 * @param val XL_BATCH_EVENT, GY_BATCH_EVENT, GY_EIS_BATCH_EVENT,
4388 * @retval interface status (MANDATORY: return 0 -> no Error)
4389 *
4390 */
lsm6dsv16x_fifo_batch_cnt_event_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_batch_cnt_event_t val)4391 int32_t lsm6dsv16x_fifo_batch_cnt_event_set(const stmdev_ctx_t *ctx,
4392 lsm6dsv16x_fifo_batch_cnt_event_t val)
4393 {
4394 lsm6dsv16x_counter_bdr_reg1_t counter_bdr_reg1;
4395 int32_t ret;
4396
4397 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
4398 if (ret == 0)
4399 {
4400 counter_bdr_reg1.trig_counter_bdr = (uint8_t)val & 0x03U;
4401 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
4402 }
4403
4404 return ret;
4405 }
4406
4407 /**
4408 * @brief Selects the trigger for the internal counter of batch events between the accelerometer, gyroscope and EIS gyroscope.[get]
4409 *
4410 * @param ctx read / write interface definitions
4411 * @param val XL_BATCH_EVENT, GY_BATCH_EVENT, GY_EIS_BATCH_EVENT,
4412 * @retval interface status (MANDATORY: return 0 -> no Error)
4413 *
4414 */
lsm6dsv16x_fifo_batch_cnt_event_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_batch_cnt_event_t * val)4415 int32_t lsm6dsv16x_fifo_batch_cnt_event_get(const stmdev_ctx_t *ctx,
4416 lsm6dsv16x_fifo_batch_cnt_event_t *val)
4417 {
4418 lsm6dsv16x_counter_bdr_reg1_t counter_bdr_reg1;
4419 int32_t ret;
4420
4421 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
4422 if (ret != 0)
4423 {
4424 return ret;
4425 }
4426
4427 switch (counter_bdr_reg1.trig_counter_bdr)
4428 {
4429 case LSM6DSV16X_XL_BATCH_EVENT:
4430 *val = LSM6DSV16X_XL_BATCH_EVENT;
4431 break;
4432
4433 case LSM6DSV16X_GY_BATCH_EVENT:
4434 *val = LSM6DSV16X_GY_BATCH_EVENT;
4435 break;
4436
4437 case LSM6DSV16X_GY_EIS_BATCH_EVENT:
4438 *val = LSM6DSV16X_GY_EIS_BATCH_EVENT;
4439 break;
4440
4441 default:
4442 *val = LSM6DSV16X_XL_BATCH_EVENT;
4443 break;
4444 }
4445
4446 return ret;
4447 }
4448
lsm6dsv16x_fifo_status_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_status_t * val)4449 int32_t lsm6dsv16x_fifo_status_get(const stmdev_ctx_t *ctx,
4450 lsm6dsv16x_fifo_status_t *val)
4451 {
4452 uint8_t buff[2];
4453 lsm6dsv16x_fifo_status2_t status;
4454 int32_t ret;
4455
4456 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_STATUS1, (uint8_t *)&buff[0], 2);
4457 if (ret != 0)
4458 {
4459 return ret;
4460 }
4461
4462 bytecpy((uint8_t *)&status, &buff[1]);
4463
4464 val->fifo_bdr = status.counter_bdr_ia;
4465 val->fifo_ovr = status.fifo_ovr_ia;
4466 val->fifo_full = status.fifo_full_ia;
4467 val->fifo_th = status.fifo_wtm_ia;
4468
4469 val->fifo_level = (uint16_t)buff[1] & 0x01U;
4470 val->fifo_level = (val->fifo_level * 256U) + buff[0];
4471
4472 return ret;
4473 }
4474
4475
4476 /**
4477 * @brief FIFO data output[get]
4478 *
4479 * @param ctx read / write interface definitions
4480 * @param val lsm6dsv16x_fifo_out_raw_t
4481 * @retval interface status (MANDATORY: return 0 -> no Error)
4482 *
4483 */
lsm6dsv16x_fifo_out_raw_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_out_raw_t * val)4484 int32_t lsm6dsv16x_fifo_out_raw_get(const stmdev_ctx_t *ctx,
4485 lsm6dsv16x_fifo_out_raw_t *val)
4486 {
4487 lsm6dsv16x_fifo_data_out_tag_t fifo_data_out_tag;
4488 uint8_t buff[7];
4489 int32_t ret;
4490
4491 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FIFO_DATA_OUT_TAG, buff, 7);
4492 if (ret != 0)
4493 {
4494 return ret;
4495 }
4496
4497 bytecpy((uint8_t *)&fifo_data_out_tag, &buff[0]);
4498
4499 switch (fifo_data_out_tag.tag_sensor)
4500 {
4501 case LSM6DSV16X_FIFO_EMPTY:
4502 val->tag = LSM6DSV16X_FIFO_EMPTY;
4503 break;
4504
4505 case LSM6DSV16X_GY_NC_TAG:
4506 val->tag = LSM6DSV16X_GY_NC_TAG;
4507 break;
4508
4509 case LSM6DSV16X_XL_NC_TAG:
4510 val->tag = LSM6DSV16X_XL_NC_TAG;
4511 break;
4512
4513 case LSM6DSV16X_TIMESTAMP_TAG:
4514 val->tag = LSM6DSV16X_TIMESTAMP_TAG;
4515 break;
4516
4517 case LSM6DSV16X_TEMPERATURE_TAG:
4518 val->tag = LSM6DSV16X_TEMPERATURE_TAG;
4519 break;
4520
4521 case LSM6DSV16X_CFG_CHANGE_TAG:
4522 val->tag = LSM6DSV16X_CFG_CHANGE_TAG;
4523 break;
4524
4525 case LSM6DSV16X_XL_NC_T_2_TAG:
4526 val->tag = LSM6DSV16X_XL_NC_T_2_TAG;
4527 break;
4528
4529 case LSM6DSV16X_XL_NC_T_1_TAG:
4530 val->tag = LSM6DSV16X_XL_NC_T_1_TAG;
4531 break;
4532
4533 case LSM6DSV16X_XL_2XC_TAG:
4534 val->tag = LSM6DSV16X_XL_2XC_TAG;
4535 break;
4536
4537 case LSM6DSV16X_XL_3XC_TAG:
4538 val->tag = LSM6DSV16X_XL_3XC_TAG;
4539 break;
4540
4541 case LSM6DSV16X_GY_NC_T_2_TAG:
4542 val->tag = LSM6DSV16X_GY_NC_T_2_TAG;
4543 break;
4544
4545 case LSM6DSV16X_GY_NC_T_1_TAG:
4546 val->tag = LSM6DSV16X_GY_NC_T_1_TAG;
4547 break;
4548
4549 case LSM6DSV16X_GY_2XC_TAG:
4550 val->tag = LSM6DSV16X_GY_2XC_TAG;
4551 break;
4552
4553 case LSM6DSV16X_GY_3XC_TAG:
4554 val->tag = LSM6DSV16X_GY_3XC_TAG;
4555 break;
4556
4557 case LSM6DSV16X_SENSORHUB_SLAVE0_TAG:
4558 val->tag = LSM6DSV16X_SENSORHUB_SLAVE0_TAG;
4559 break;
4560
4561 case LSM6DSV16X_SENSORHUB_SLAVE1_TAG:
4562 val->tag = LSM6DSV16X_SENSORHUB_SLAVE1_TAG;
4563 break;
4564
4565 case LSM6DSV16X_SENSORHUB_SLAVE2_TAG:
4566 val->tag = LSM6DSV16X_SENSORHUB_SLAVE2_TAG;
4567 break;
4568
4569 case LSM6DSV16X_SENSORHUB_SLAVE3_TAG:
4570 val->tag = LSM6DSV16X_SENSORHUB_SLAVE3_TAG;
4571 break;
4572
4573 case LSM6DSV16X_STEP_COUNTER_TAG:
4574 val->tag = LSM6DSV16X_STEP_COUNTER_TAG;
4575 break;
4576
4577 case LSM6DSV16X_SFLP_GAME_ROTATION_VECTOR_TAG:
4578 val->tag = LSM6DSV16X_SFLP_GAME_ROTATION_VECTOR_TAG;
4579 break;
4580
4581 case LSM6DSV16X_SFLP_GYROSCOPE_BIAS_TAG:
4582 val->tag = LSM6DSV16X_SFLP_GYROSCOPE_BIAS_TAG;
4583 break;
4584
4585 case LSM6DSV16X_SFLP_GRAVITY_VECTOR_TAG:
4586 val->tag = LSM6DSV16X_SFLP_GRAVITY_VECTOR_TAG;
4587 break;
4588
4589 case LSM6DSV16X_SENSORHUB_NACK_TAG:
4590 val->tag = LSM6DSV16X_SENSORHUB_NACK_TAG;
4591 break;
4592
4593 case LSM6DSV16X_MLC_RESULT_TAG:
4594 val->tag = LSM6DSV16X_MLC_RESULT_TAG;
4595 break;
4596
4597 case LSM6DSV16X_MLC_FILTER:
4598 val->tag = LSM6DSV16X_MLC_FILTER;
4599 break;
4600
4601 case LSM6DSV16X_MLC_FEATURE:
4602 val->tag = LSM6DSV16X_MLC_FEATURE;
4603 break;
4604
4605 case LSM6DSV16X_XL_DUAL_CORE:
4606 val->tag = LSM6DSV16X_XL_DUAL_CORE;
4607 break;
4608
4609 case LSM6DSV16X_GY_ENHANCED_EIS:
4610 val->tag = LSM6DSV16X_GY_ENHANCED_EIS;
4611 break;
4612
4613 default:
4614 val->tag = LSM6DSV16X_FIFO_EMPTY;
4615 break;
4616 }
4617
4618 val->cnt = fifo_data_out_tag.tag_cnt;
4619
4620 val->data[0] = buff[1];
4621 val->data[1] = buff[2];
4622 val->data[2] = buff[3];
4623 val->data[3] = buff[4];
4624 val->data[4] = buff[5];
4625 val->data[5] = buff[6];
4626
4627 return ret;
4628 }
4629
4630 /**
4631 * @brief Batching in FIFO buffer of step counter value.[set]
4632 *
4633 * @param ctx read / write interface definitions
4634 * @param val Batching in FIFO buffer of step counter value.
4635 * @retval interface status (MANDATORY: return 0 -> no Error)
4636 *
4637 */
lsm6dsv16x_fifo_stpcnt_batch_set(const stmdev_ctx_t * ctx,uint8_t val)4638 int32_t lsm6dsv16x_fifo_stpcnt_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
4639 {
4640 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4641 int32_t ret;
4642
4643 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4644 if (ret != 0)
4645 {
4646 return ret;
4647 }
4648
4649 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4650 emb_func_fifo_en_a.step_counter_fifo_en = val;
4651 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4652
4653 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4654
4655 return ret;
4656 }
4657
4658 /**
4659 * @brief Batching in FIFO buffer of step counter value.[get]
4660 *
4661 * @param ctx read / write interface definitions
4662 * @param val Batching in FIFO buffer of step counter value.
4663 * @retval interface status (MANDATORY: return 0 -> no Error)
4664 *
4665 */
lsm6dsv16x_fifo_stpcnt_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)4666 int32_t lsm6dsv16x_fifo_stpcnt_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
4667 {
4668 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4669 int32_t ret;
4670
4671 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4672 if (ret != 0)
4673 {
4674 return ret;
4675 }
4676
4677 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4678 *val = emb_func_fifo_en_a.step_counter_fifo_en;
4679
4680 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4681
4682 return ret;
4683 }
4684
4685 /**
4686 * @brief Batching in FIFO buffer of machine learning core results.[set]
4687 *
4688 * @param ctx read / write interface definitions
4689 * @param val Batching in FIFO buffer of machine learning core results.
4690 * @retval interface status (MANDATORY: return 0 -> no Error)
4691 *
4692 */
lsm6dsv16x_fifo_mlc_batch_set(const stmdev_ctx_t * ctx,uint8_t val)4693 int32_t lsm6dsv16x_fifo_mlc_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
4694 {
4695 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4696 int32_t ret;
4697
4698 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4699 if (ret != 0)
4700 {
4701 return ret;
4702 }
4703
4704 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4705 emb_func_fifo_en_a.mlc_fifo_en = val;
4706 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4707
4708 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4709
4710 return ret;
4711 }
4712
4713 /**
4714 * @brief Batching in FIFO buffer of machine learning core results.[get]
4715 *
4716 * @param ctx read / write interface definitions
4717 * @param val Batching in FIFO buffer of machine learning core results.
4718 * @retval interface status (MANDATORY: return 0 -> no Error)
4719 *
4720 */
lsm6dsv16x_fifo_mlc_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)4721 int32_t lsm6dsv16x_fifo_mlc_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
4722 {
4723 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4724 int32_t ret;
4725
4726 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4727 if (ret != 0)
4728 {
4729 return ret;
4730 }
4731
4732 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4733 *val = emb_func_fifo_en_a.mlc_fifo_en;
4734
4735 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4736
4737 return ret;
4738 }
4739
4740 /**
4741 * @brief Enables batching in FIFO buffer of machine learning core filters and features.[set]
4742 *
4743 * @param ctx read / write interface definitions
4744 * @param val Enables batching in FIFO buffer of machine learning core filters and features.
4745 * @retval interface status (MANDATORY: return 0 -> no Error)
4746 *
4747 */
lsm6dsv16x_fifo_mlc_filt_batch_set(const stmdev_ctx_t * ctx,uint8_t val)4748 int32_t lsm6dsv16x_fifo_mlc_filt_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
4749 {
4750 lsm6dsv16x_emb_func_fifo_en_b_t emb_func_fifo_en_b;
4751 int32_t ret;
4752
4753 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4754 if (ret != 0)
4755 {
4756 return ret;
4757 }
4758
4759 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_B, (uint8_t *)&emb_func_fifo_en_b, 1);
4760 emb_func_fifo_en_b.mlc_filter_feature_fifo_en = val;
4761 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_B, (uint8_t *)&emb_func_fifo_en_b, 1);
4762
4763 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4764
4765 return ret;
4766 }
4767
4768 /**
4769 * @brief Enables batching in FIFO buffer of machine learning core filters and features.[get]
4770 *
4771 * @param ctx read / write interface definitions
4772 * @param val Enables batching in FIFO buffer of machine learning core filters and features.
4773 * @retval interface status (MANDATORY: return 0 -> no Error)
4774 *
4775 */
lsm6dsv16x_fifo_mlc_filt_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)4776 int32_t lsm6dsv16x_fifo_mlc_filt_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
4777 {
4778 lsm6dsv16x_emb_func_fifo_en_b_t emb_func_fifo_en_b;
4779 int32_t ret;
4780
4781 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4782 if (ret != 0)
4783 {
4784 return ret;
4785 }
4786
4787 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_B, (uint8_t *)&emb_func_fifo_en_b, 1);
4788 *val = emb_func_fifo_en_b.mlc_filter_feature_fifo_en;
4789
4790 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4791
4792 return ret;
4793 }
4794
4795 /**
4796 * @brief Enable FIFO data batching of slave idx.[set]
4797 *
4798 * @param ctx read / write interface definitions
4799 * @param val Enable FIFO data batching of slave idx.
4800 * @retval interface status (MANDATORY: return 0 -> no Error)
4801 *
4802 */
lsm6dsv16x_fifo_sh_batch_slave_set(const stmdev_ctx_t * ctx,uint8_t idx,uint8_t val)4803 int32_t lsm6dsv16x_fifo_sh_batch_slave_set(const stmdev_ctx_t *ctx, uint8_t idx, uint8_t val)
4804 {
4805 lsm6dsv16x_slv0_config_t slv_config;
4806 int32_t ret;
4807
4808 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
4809 if (ret != 0)
4810 {
4811 return ret;
4812 }
4813
4814 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SLV0_CONFIG + idx * 3U, (uint8_t *)&slv_config, 1);
4815 slv_config.batch_ext_sens_0_en = val;
4816 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_CONFIG + idx * 3U, (uint8_t *)&slv_config, 1);
4817
4818 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4819
4820 return ret;
4821 }
4822
4823 /**
4824 * @brief Enable FIFO data batching of slave idx.[get]
4825 *
4826 * @param ctx read / write interface definitions
4827 * @param val Enable FIFO data batching of slave idx.
4828 * @retval interface status (MANDATORY: return 0 -> no Error)
4829 *
4830 */
lsm6dsv16x_fifo_sh_batch_slave_get(const stmdev_ctx_t * ctx,uint8_t idx,uint8_t * val)4831 int32_t lsm6dsv16x_fifo_sh_batch_slave_get(const stmdev_ctx_t *ctx, uint8_t idx, uint8_t *val)
4832 {
4833 lsm6dsv16x_slv0_config_t slv_config;
4834 int32_t ret;
4835
4836 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
4837 if (ret != 0)
4838 {
4839 return ret;
4840 }
4841
4842 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SLV0_CONFIG + idx * 3U, (uint8_t *)&slv_config, 1);
4843 *val = slv_config.batch_ext_sens_0_en;
4844
4845 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4846
4847 return ret;
4848 }
4849
4850 /**
4851 * @brief Batching in FIFO buffer of SFLP.[set]
4852 *
4853 * @param ctx read / write interface definitions
4854 * @param val Batching in FIFO buffer of SFLP values.
4855 * @retval interface status (MANDATORY: return 0 -> no Error)
4856 *
4857 */
lsm6dsv16x_fifo_sflp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_sflp_raw_t val)4858 int32_t lsm6dsv16x_fifo_sflp_batch_set(const stmdev_ctx_t *ctx,
4859 lsm6dsv16x_fifo_sflp_raw_t val)
4860 {
4861 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4862 int32_t ret;
4863
4864 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4865 if (ret == 0)
4866 {
4867 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4868 emb_func_fifo_en_a.sflp_game_fifo_en = val.game_rotation;
4869 emb_func_fifo_en_a.sflp_gravity_fifo_en = val.gravity;
4870 emb_func_fifo_en_a.sflp_gbias_fifo_en = val.gbias;
4871 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A,
4872 (uint8_t *)&emb_func_fifo_en_a, 1);
4873 }
4874
4875 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4876
4877 return ret;
4878 }
4879
4880 /**
4881 * @brief Batching in FIFO buffer of SFLP.[get]
4882 *
4883 * @param ctx read / write interface definitions
4884 * @param val Batching in FIFO buffer of SFLP values.
4885 * @retval interface status (MANDATORY: return 0 -> no Error)
4886 *
4887 */
lsm6dsv16x_fifo_sflp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fifo_sflp_raw_t * val)4888 int32_t lsm6dsv16x_fifo_sflp_batch_get(const stmdev_ctx_t *ctx,
4889 lsm6dsv16x_fifo_sflp_raw_t *val)
4890 {
4891 lsm6dsv16x_emb_func_fifo_en_a_t emb_func_fifo_en_a;
4892 int32_t ret;
4893
4894 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
4895 if (ret == 0)
4896 {
4897 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
4898
4899 val->game_rotation = emb_func_fifo_en_a.sflp_game_fifo_en;
4900 val->gravity = emb_func_fifo_en_a.sflp_gravity_fifo_en;
4901 val->gbias = emb_func_fifo_en_a.sflp_gbias_fifo_en;
4902 }
4903
4904 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
4905
4906 return ret;
4907 }
4908
4909 /**
4910 * @}
4911 *
4912 */
4913
4914 /**
4915 * @defgroup Filters
4916 * @brief This section group all the functions concerning the
4917 * filters configuration
4918 * @{
4919 *
4920 */
4921
4922 /**
4923 * @brief Protocol anti-spike filters.[set]
4924 *
4925 * @param ctx read / write interface definitions
4926 * @param val AUTO, ALWAYS_ACTIVE,
4927 * @retval interface status (MANDATORY: return 0 -> no Error)
4928 *
4929 */
lsm6dsv16x_filt_anti_spike_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_anti_spike_t val)4930 int32_t lsm6dsv16x_filt_anti_spike_set(const stmdev_ctx_t *ctx,
4931 lsm6dsv16x_filt_anti_spike_t val)
4932 {
4933 lsm6dsv16x_if_cfg_t if_cfg;
4934 int32_t ret;
4935
4936 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
4937
4938 if (ret == 0)
4939 {
4940 if_cfg.asf_ctrl = (uint8_t)val & 0x01U;
4941 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
4942 }
4943
4944 return ret;
4945 }
4946
4947 /**
4948 * @brief Protocol anti-spike filters.[get]
4949 *
4950 * @param ctx read / write interface definitions
4951 * @param val AUTO, ALWAYS_ACTIVE,
4952 * @retval interface status (MANDATORY: return 0 -> no Error)
4953 *
4954 */
lsm6dsv16x_filt_anti_spike_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_anti_spike_t * val)4955 int32_t lsm6dsv16x_filt_anti_spike_get(const stmdev_ctx_t *ctx,
4956 lsm6dsv16x_filt_anti_spike_t *val)
4957 {
4958 lsm6dsv16x_if_cfg_t if_cfg;
4959 int32_t ret;
4960
4961 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
4962 if (ret != 0)
4963 {
4964 return ret;
4965 }
4966
4967 switch (if_cfg.asf_ctrl)
4968 {
4969 case LSM6DSV16X_AUTO:
4970 *val = LSM6DSV16X_AUTO;
4971 break;
4972
4973 case LSM6DSV16X_ALWAYS_ACTIVE:
4974 *val = LSM6DSV16X_ALWAYS_ACTIVE;
4975 break;
4976
4977 default:
4978 *val = LSM6DSV16X_AUTO;
4979 break;
4980 }
4981
4982 return ret;
4983 }
4984
4985 /**
4986 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[set]
4987 *
4988 * @param ctx read / write interface definitions
4989 * @param val It masks DRDY and Interrupts RQ until filter settling ends.
4990 * @retval interface status (MANDATORY: return 0 -> no Error)
4991 *
4992 */
lsm6dsv16x_filt_settling_mask_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_settling_mask_t val)4993 int32_t lsm6dsv16x_filt_settling_mask_set(const stmdev_ctx_t *ctx,
4994 lsm6dsv16x_filt_settling_mask_t val)
4995 {
4996 lsm6dsv16x_emb_func_cfg_t emb_func_cfg;
4997 lsm6dsv16x_ui_int_ois_t ui_int_ois;
4998 lsm6dsv16x_ctrl4_t ctrl4;
4999 int32_t ret;
5000
5001 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
5002 ctrl4.drdy_mask = val.drdy;
5003 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
5004 if (ret != 0)
5005 {
5006 return ret;
5007 }
5008
5009 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
5010 emb_func_cfg.emb_func_irq_mask_xl_settl = val.irq_xl;
5011 emb_func_cfg.emb_func_irq_mask_g_settl = val.irq_g;
5012 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
5013 if (ret != 0)
5014 {
5015 return ret;
5016 }
5017
5018 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_INT_OIS, (uint8_t *)&ui_int_ois, 1);
5019 ui_int_ois.drdy_mask_ois = val.ois_drdy;
5020 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_INT_OIS, (uint8_t *)&ui_int_ois, 1);
5021
5022 return ret;
5023 }
5024
5025 /**
5026 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[get]
5027 *
5028 * @param ctx read / write interface definitions
5029 * @param val It masks DRDY and Interrupts RQ until filter settling ends.
5030 * @retval interface status (MANDATORY: return 0 -> no Error)
5031 *
5032 */
lsm6dsv16x_filt_settling_mask_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_settling_mask_t * val)5033 int32_t lsm6dsv16x_filt_settling_mask_get(const stmdev_ctx_t *ctx,
5034 lsm6dsv16x_filt_settling_mask_t *val)
5035 {
5036 lsm6dsv16x_emb_func_cfg_t emb_func_cfg;
5037 lsm6dsv16x_ui_int_ois_t ui_int_ois;
5038 lsm6dsv16x_ctrl4_t ctrl4;
5039 int32_t ret;
5040
5041 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL4, (uint8_t *)&ctrl4, 1);
5042 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
5043 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_INT_OIS, (uint8_t *)&ui_int_ois, 1);
5044
5045 val->irq_xl = emb_func_cfg.emb_func_irq_mask_xl_settl;
5046 val->irq_g = emb_func_cfg.emb_func_irq_mask_g_settl;
5047 val->drdy = ctrl4.drdy_mask;
5048
5049 return ret;
5050 }
5051
5052 /**
5053 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[set]
5054 *
5055 * @param ctx read / write interface definitions
5056 * @param val It masks DRDY and Interrupts RQ until filter settling ends from OIS interface.
5057 * @retval interface status (MANDATORY: return 0 -> no Error)
5058 *
5059 */
lsm6dsv16x_filt_ois_settling_mask_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_ois_settling_mask_t val)5060 int32_t lsm6dsv16x_filt_ois_settling_mask_set(const stmdev_ctx_t *ctx,
5061 lsm6dsv16x_filt_ois_settling_mask_t val)
5062 {
5063 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
5064 int32_t ret;
5065
5066 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
5067
5068 if (ret == 0)
5069 {
5070 spi2_int_ois.drdy_mask_ois = val.ois_drdy;
5071 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
5072 }
5073
5074 return ret;
5075 }
5076
5077 /**
5078 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[get]
5079 *
5080 * @param ctx read / write interface definitions
5081 * @param val It masks DRDY and Interrupts RQ until filter settling ends.
5082 * @retval interface status (MANDATORY: return 0 -> no Error)
5083 *
5084 */
lsm6dsv16x_filt_ois_settling_mask_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_ois_settling_mask_t * val)5085 int32_t lsm6dsv16x_filt_ois_settling_mask_get(const stmdev_ctx_t *ctx,
5086 lsm6dsv16x_filt_ois_settling_mask_t *val)
5087 {
5088
5089 lsm6dsv16x_spi2_int_ois_t spi2_int_ois;
5090 int32_t ret;
5091
5092 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_INT_OIS, (uint8_t *)&spi2_int_ois, 1);
5093 val->ois_drdy = spi2_int_ois.drdy_mask_ois;
5094
5095 return ret;
5096 }
5097
5098 /**
5099 * @brief Gyroscope low-pass filter (LPF1) bandwidth selection.[set]
5100 *
5101 * @param ctx read / write interface definitions
5102 * @param val GY_ULTRA_LIGHT, GY_VERY_LIGHT, GY_LIGHT, GY_MEDIUM, GY_STRONG, GY_VERY_STRONG, GY_AGGRESSIVE, GY_XTREME,
5103 * @retval interface status (MANDATORY: return 0 -> no Error)
5104 *
5105 */
lsm6dsv16x_filt_gy_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_lp1_bandwidth_t val)5106 int32_t lsm6dsv16x_filt_gy_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
5107 lsm6dsv16x_filt_gy_lp1_bandwidth_t val)
5108 {
5109 lsm6dsv16x_ctrl6_t ctrl6;
5110 int32_t ret;
5111
5112 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
5113 if (ret == 0)
5114 {
5115 ctrl6.lpf1_g_bw = (uint8_t)val & 0x0Fu;
5116 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
5117 }
5118
5119 return ret;
5120 }
5121
5122 /**
5123 * @brief Gyroscope low-pass filter (LPF1) bandwidth selection.[get]
5124 *
5125 * @param ctx read / write interface definitions
5126 * @param val GY_ULTRA_LIGHT, GY_VERY_LIGHT, GY_LIGHT, GY_MEDIUM, GY_STRONG, GY_VERY_STRONG, GY_AGGRESSIVE, GY_XTREME,
5127 * @retval interface status (MANDATORY: return 0 -> no Error)
5128 *
5129 */
lsm6dsv16x_filt_gy_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_lp1_bandwidth_t * val)5130 int32_t lsm6dsv16x_filt_gy_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
5131 lsm6dsv16x_filt_gy_lp1_bandwidth_t *val)
5132 {
5133 lsm6dsv16x_ctrl6_t ctrl6;
5134 int32_t ret;
5135
5136 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL6, (uint8_t *)&ctrl6, 1);
5137 if (ret != 0)
5138 {
5139 return ret;
5140 }
5141
5142 switch (ctrl6.lpf1_g_bw)
5143 {
5144 case LSM6DSV16X_GY_ULTRA_LIGHT:
5145 *val = LSM6DSV16X_GY_ULTRA_LIGHT;
5146 break;
5147
5148 case LSM6DSV16X_GY_VERY_LIGHT:
5149 *val = LSM6DSV16X_GY_VERY_LIGHT;
5150 break;
5151
5152 case LSM6DSV16X_GY_LIGHT:
5153 *val = LSM6DSV16X_GY_LIGHT;
5154 break;
5155
5156 case LSM6DSV16X_GY_MEDIUM:
5157 *val = LSM6DSV16X_GY_MEDIUM;
5158 break;
5159
5160 case LSM6DSV16X_GY_STRONG:
5161 *val = LSM6DSV16X_GY_STRONG;
5162 break;
5163
5164 case LSM6DSV16X_GY_VERY_STRONG:
5165 *val = LSM6DSV16X_GY_VERY_STRONG;
5166 break;
5167
5168 case LSM6DSV16X_GY_AGGRESSIVE:
5169 *val = LSM6DSV16X_GY_AGGRESSIVE;
5170 break;
5171
5172 case LSM6DSV16X_GY_XTREME:
5173 *val = LSM6DSV16X_GY_XTREME;
5174 break;
5175
5176 default:
5177 *val = LSM6DSV16X_GY_ULTRA_LIGHT;
5178 break;
5179 }
5180
5181 return ret;
5182 }
5183
5184 /**
5185 * @brief It enables gyroscope digital LPF1 filter. If the OIS chain is disabled, the bandwidth can be selected through LPF1_G_BW.[set]
5186 *
5187 * @param ctx read / write interface definitions
5188 * @param val It enables gyroscope digital LPF1 filter. If the OIS chain is disabled, the bandwidth can be selected through LPF1_G_BW.
5189 * @retval interface status (MANDATORY: return 0 -> no Error)
5190 *
5191 */
lsm6dsv16x_filt_gy_lp1_set(const stmdev_ctx_t * ctx,uint8_t val)5192 int32_t lsm6dsv16x_filt_gy_lp1_set(const stmdev_ctx_t *ctx, uint8_t val)
5193 {
5194 lsm6dsv16x_ctrl7_t ctrl7;
5195 int32_t ret;
5196
5197 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
5198 if (ret == 0)
5199 {
5200 ctrl7.lpf1_g_en = val;
5201 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
5202 }
5203
5204 return ret;
5205 }
5206
5207
5208 /**
5209 * @brief It enables gyroscope digital LPF1 filter. If the OIS chain is disabled, the bandwidth can be selected through LPF1_G_BW.[get]
5210 *
5211 * @param ctx read / write interface definitions
5212 * @param val It enables gyroscope digital LPF1 filter. If the OIS chain is disabled, the bandwidth can be selected through LPF1_G_BW.
5213 * @retval interface status (MANDATORY: return 0 -> no Error)
5214 *
5215 */
lsm6dsv16x_filt_gy_lp1_get(const stmdev_ctx_t * ctx,uint8_t * val)5216 int32_t lsm6dsv16x_filt_gy_lp1_get(const stmdev_ctx_t *ctx, uint8_t *val)
5217 {
5218 lsm6dsv16x_ctrl7_t ctrl7;
5219 int32_t ret;
5220
5221 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
5222 *val = ctrl7.lpf1_g_en;
5223
5224 return ret;
5225 }
5226
5227 /**
5228 * @brief Accelerometer LPF2 and high pass filter configuration and cutoff setting.[set]
5229 *
5230 * @param ctx read / write interface definitions
5231 * @param val XL_ULTRA_LIGHT, XL_VERY_LIGHT, XL_LIGHT, XL_MEDIUM, XL_STRONG, XL_VERY_STRONG, XL_AGGRESSIVE, XL_XTREME,
5232 * @retval interface status (MANDATORY: return 0 -> no Error)
5233 *
5234 */
lsm6dsv16x_filt_xl_lp2_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_lp2_bandwidth_t val)5235 int32_t lsm6dsv16x_filt_xl_lp2_bandwidth_set(const stmdev_ctx_t *ctx,
5236 lsm6dsv16x_filt_xl_lp2_bandwidth_t val)
5237 {
5238 lsm6dsv16x_ctrl8_t ctrl8;
5239 int32_t ret;
5240
5241 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
5242 if (ret == 0)
5243 {
5244 ctrl8.hp_lpf2_xl_bw = (uint8_t)val & 0x07U;
5245 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
5246 }
5247
5248 return ret;
5249 }
5250
5251 /**
5252 * @brief Accelerometer LPF2 and high pass filter configuration and cutoff setting.[get]
5253 *
5254 * @param ctx read / write interface definitions
5255 * @param val XL_ULTRA_LIGHT, XL_VERY_LIGHT, XL_LIGHT, XL_MEDIUM, XL_STRONG, XL_VERY_STRONG, XL_AGGRESSIVE, XL_XTREME,
5256 * @retval interface status (MANDATORY: return 0 -> no Error)
5257 *
5258 */
lsm6dsv16x_filt_xl_lp2_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_lp2_bandwidth_t * val)5259 int32_t lsm6dsv16x_filt_xl_lp2_bandwidth_get(const stmdev_ctx_t *ctx,
5260 lsm6dsv16x_filt_xl_lp2_bandwidth_t *val)
5261 {
5262 lsm6dsv16x_ctrl8_t ctrl8;
5263 int32_t ret;
5264
5265 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL8, (uint8_t *)&ctrl8, 1);
5266 if (ret != 0)
5267 {
5268 return ret;
5269 }
5270
5271 switch (ctrl8.hp_lpf2_xl_bw)
5272 {
5273 case LSM6DSV16X_XL_ULTRA_LIGHT:
5274 *val = LSM6DSV16X_XL_ULTRA_LIGHT;
5275 break;
5276
5277 case LSM6DSV16X_XL_VERY_LIGHT:
5278 *val = LSM6DSV16X_XL_VERY_LIGHT;
5279 break;
5280
5281 case LSM6DSV16X_XL_LIGHT:
5282 *val = LSM6DSV16X_XL_LIGHT;
5283 break;
5284
5285 case LSM6DSV16X_XL_MEDIUM:
5286 *val = LSM6DSV16X_XL_MEDIUM;
5287 break;
5288
5289 case LSM6DSV16X_XL_STRONG:
5290 *val = LSM6DSV16X_XL_STRONG;
5291 break;
5292
5293 case LSM6DSV16X_XL_VERY_STRONG:
5294 *val = LSM6DSV16X_XL_VERY_STRONG;
5295 break;
5296
5297 case LSM6DSV16X_XL_AGGRESSIVE:
5298 *val = LSM6DSV16X_XL_AGGRESSIVE;
5299 break;
5300
5301 case LSM6DSV16X_XL_XTREME:
5302 *val = LSM6DSV16X_XL_XTREME;
5303 break;
5304
5305 default:
5306 *val = LSM6DSV16X_XL_ULTRA_LIGHT;
5307 break;
5308 }
5309
5310 return ret;
5311 }
5312
5313 /**
5314 * @brief Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.[set]
5315 *
5316 * @param ctx read / write interface definitions
5317 * @param val Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.
5318 * @retval interface status (MANDATORY: return 0 -> no Error)
5319 *
5320 */
lsm6dsv16x_filt_xl_lp2_set(const stmdev_ctx_t * ctx,uint8_t val)5321 int32_t lsm6dsv16x_filt_xl_lp2_set(const stmdev_ctx_t *ctx, uint8_t val)
5322 {
5323 lsm6dsv16x_ctrl9_t ctrl9;
5324 int32_t ret;
5325
5326 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5327 if (ret == 0)
5328 {
5329 ctrl9.lpf2_xl_en = val;
5330 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5331 }
5332
5333 return ret;
5334 }
5335
5336 /**
5337 * @brief Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.[get]
5338 *
5339 * @param ctx read / write interface definitions
5340 * @param val Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.
5341 * @retval interface status (MANDATORY: return 0 -> no Error)
5342 *
5343 */
lsm6dsv16x_filt_xl_lp2_get(const stmdev_ctx_t * ctx,uint8_t * val)5344 int32_t lsm6dsv16x_filt_xl_lp2_get(const stmdev_ctx_t *ctx, uint8_t *val)
5345 {
5346 lsm6dsv16x_ctrl9_t ctrl9;
5347 int32_t ret;
5348
5349 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5350 *val = ctrl9.lpf2_xl_en;
5351
5352 return ret;
5353 }
5354
5355 /**
5356 * @brief Accelerometer slope filter / high-pass filter selection.[set]
5357 *
5358 * @param ctx read / write interface definitions
5359 * @param val Accelerometer slope filter / high-pass filter selection.
5360 * @retval interface status (MANDATORY: return 0 -> no Error)
5361 *
5362 */
lsm6dsv16x_filt_xl_hp_set(const stmdev_ctx_t * ctx,uint8_t val)5363 int32_t lsm6dsv16x_filt_xl_hp_set(const stmdev_ctx_t *ctx, uint8_t val)
5364 {
5365 lsm6dsv16x_ctrl9_t ctrl9;
5366 int32_t ret;
5367
5368 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5369 if (ret == 0)
5370 {
5371 ctrl9.hp_slope_xl_en = val;
5372 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5373 }
5374
5375 return ret;
5376 }
5377
5378 /**
5379 * @brief Accelerometer slope filter / high-pass filter selection.[get]
5380 *
5381 * @param ctx read / write interface definitions
5382 * @param val Accelerometer slope filter / high-pass filter selection.
5383 * @retval interface status (MANDATORY: return 0 -> no Error)
5384 *
5385 */
lsm6dsv16x_filt_xl_hp_get(const stmdev_ctx_t * ctx,uint8_t * val)5386 int32_t lsm6dsv16x_filt_xl_hp_get(const stmdev_ctx_t *ctx, uint8_t *val)
5387 {
5388 lsm6dsv16x_ctrl9_t ctrl9;
5389 int32_t ret;
5390
5391 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5392 *val = ctrl9.hp_slope_xl_en;
5393
5394 return ret;
5395 }
5396
5397 /**
5398 * @brief Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.[set]
5399 *
5400 * @param ctx read / write interface definitions
5401 * @param val Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.
5402 * @retval interface status (MANDATORY: return 0 -> no Error)
5403 *
5404 */
lsm6dsv16x_filt_xl_fast_settling_set(const stmdev_ctx_t * ctx,uint8_t val)5405 int32_t lsm6dsv16x_filt_xl_fast_settling_set(const stmdev_ctx_t *ctx, uint8_t val)
5406 {
5407 lsm6dsv16x_ctrl9_t ctrl9;
5408 int32_t ret;
5409
5410 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5411 if (ret == 0)
5412 {
5413 ctrl9.xl_fastsettl_mode = val;
5414 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5415 }
5416
5417 return ret;
5418 }
5419
5420 /**
5421 * @brief Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.[get]
5422 *
5423 * @param ctx read / write interface definitions
5424 * @param val Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.
5425 * @retval interface status (MANDATORY: return 0 -> no Error)
5426 *
5427 */
lsm6dsv16x_filt_xl_fast_settling_get(const stmdev_ctx_t * ctx,uint8_t * val)5428 int32_t lsm6dsv16x_filt_xl_fast_settling_get(const stmdev_ctx_t *ctx, uint8_t *val)
5429 {
5430 lsm6dsv16x_ctrl9_t ctrl9;
5431 int32_t ret;
5432
5433 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5434 *val = ctrl9.xl_fastsettl_mode;
5435
5436 return ret;
5437 }
5438
5439 /**
5440 * @brief Accelerometer high-pass filter mode.[set]
5441 *
5442 * @param ctx read / write interface definitions
5443 * @param val HP_MD_NORMAL, HP_MD_REFERENCE,
5444 * @retval interface status (MANDATORY: return 0 -> no Error)
5445 *
5446 */
lsm6dsv16x_filt_xl_hp_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_hp_mode_t val)5447 int32_t lsm6dsv16x_filt_xl_hp_mode_set(const stmdev_ctx_t *ctx,
5448 lsm6dsv16x_filt_xl_hp_mode_t val)
5449 {
5450 lsm6dsv16x_ctrl9_t ctrl9;
5451 int32_t ret;
5452
5453 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5454 if (ret == 0)
5455 {
5456 ctrl9.hp_ref_mode_xl = (uint8_t)val & 0x01U;
5457 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5458 }
5459
5460 return ret;
5461 }
5462
5463 /**
5464 * @brief Accelerometer high-pass filter mode.[get]
5465 *
5466 * @param ctx read / write interface definitions
5467 * @param val HP_MD_NORMAL, HP_MD_REFERENCE,
5468 * @retval interface status (MANDATORY: return 0 -> no Error)
5469 *
5470 */
lsm6dsv16x_filt_xl_hp_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_hp_mode_t * val)5471 int32_t lsm6dsv16x_filt_xl_hp_mode_get(const stmdev_ctx_t *ctx,
5472 lsm6dsv16x_filt_xl_hp_mode_t *val)
5473 {
5474 lsm6dsv16x_ctrl9_t ctrl9;
5475 int32_t ret;
5476
5477 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL9, (uint8_t *)&ctrl9, 1);
5478 if (ret != 0)
5479 {
5480 return ret;
5481 }
5482
5483 switch (ctrl9.hp_ref_mode_xl)
5484 {
5485 case LSM6DSV16X_HP_MD_NORMAL:
5486 *val = LSM6DSV16X_HP_MD_NORMAL;
5487 break;
5488
5489 case LSM6DSV16X_HP_MD_REFERENCE:
5490 *val = LSM6DSV16X_HP_MD_REFERENCE;
5491 break;
5492
5493 default:
5494 *val = LSM6DSV16X_HP_MD_NORMAL;
5495 break;
5496 }
5497
5498 return ret;
5499 }
5500
5501 /**
5502 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity functions.[set]
5503 *
5504 * @param ctx read / write interface definitions
5505 * @param val WK_FEED_SLOPE, WK_FEED_HIGH_PASS, WK_FEED_LP_WITH_OFFSET,
5506 * @retval interface status (MANDATORY: return 0 -> no Error)
5507 *
5508 */
lsm6dsv16x_filt_wkup_act_feed_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_wkup_act_feed_t val)5509 int32_t lsm6dsv16x_filt_wkup_act_feed_set(const stmdev_ctx_t *ctx,
5510 lsm6dsv16x_filt_wkup_act_feed_t val)
5511 {
5512 lsm6dsv16x_wake_up_ths_t wake_up_ths;
5513 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5514 int32_t ret;
5515
5516 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
5517 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5518 if (ret != 0)
5519 {
5520 return ret;
5521 }
5522
5523 tap_cfg0.slope_fds = (uint8_t)val & 0x01U;
5524 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5525 if (ret != 0)
5526 {
5527 return ret;
5528 }
5529
5530 wake_up_ths.usr_off_on_wu = ((uint8_t)val & 0x02U) >> 1;
5531 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
5532
5533 return ret;
5534 }
5535
5536 /**
5537 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity functions.[get]
5538 *
5539 * @param ctx read / write interface definitions
5540 * @param val WK_FEED_SLOPE, WK_FEED_HIGH_PASS, WK_FEED_LP_WITH_OFFSET,
5541 * @retval interface status (MANDATORY: return 0 -> no Error)
5542 *
5543 */
lsm6dsv16x_filt_wkup_act_feed_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_wkup_act_feed_t * val)5544 int32_t lsm6dsv16x_filt_wkup_act_feed_get(const stmdev_ctx_t *ctx,
5545 lsm6dsv16x_filt_wkup_act_feed_t *val)
5546 {
5547 lsm6dsv16x_wake_up_ths_t wake_up_ths;
5548 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5549 int32_t ret;
5550
5551 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
5552 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5553 if (ret != 0)
5554 {
5555 return ret;
5556 }
5557
5558 switch ((wake_up_ths.usr_off_on_wu << 1) + tap_cfg0.slope_fds)
5559 {
5560 case LSM6DSV16X_WK_FEED_SLOPE:
5561 *val = LSM6DSV16X_WK_FEED_SLOPE;
5562 break;
5563
5564 case LSM6DSV16X_WK_FEED_HIGH_PASS:
5565 *val = LSM6DSV16X_WK_FEED_HIGH_PASS;
5566 break;
5567
5568 case LSM6DSV16X_WK_FEED_LP_WITH_OFFSET:
5569 *val = LSM6DSV16X_WK_FEED_LP_WITH_OFFSET;
5570 break;
5571
5572 default:
5573 *val = LSM6DSV16X_WK_FEED_SLOPE;
5574 break;
5575 }
5576
5577 return ret;
5578 }
5579
5580 /**
5581 * @brief Mask hw function triggers when xl is settling.[set]
5582 *
5583 * @param ctx read / write interface definitions
5584 * @param val 0 or 1,
5585 * @retval interface status (MANDATORY: return 0 -> no Error)
5586 *
5587 */
lsm6dsv16x_mask_trigger_xl_settl_set(const stmdev_ctx_t * ctx,uint8_t val)5588 int32_t lsm6dsv16x_mask_trigger_xl_settl_set(const stmdev_ctx_t *ctx, uint8_t val)
5589 {
5590 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5591 int32_t ret;
5592
5593 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5594
5595 if (ret == 0)
5596 {
5597 tap_cfg0.hw_func_mask_xl_settl = val & 0x01U;
5598 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5599 }
5600
5601 return ret;
5602 }
5603
5604 /**
5605 * @brief Mask hw function triggers when xl is settling.[get]
5606 *
5607 * @param ctx read / write interface definitions
5608 * @param val 0 or 1,
5609 * @retval interface status (MANDATORY: return 0 -> no Error)
5610 *
5611 */
lsm6dsv16x_mask_trigger_xl_settl_get(const stmdev_ctx_t * ctx,uint8_t * val)5612 int32_t lsm6dsv16x_mask_trigger_xl_settl_get(const stmdev_ctx_t *ctx, uint8_t *val)
5613 {
5614 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5615 int32_t ret;
5616
5617 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5618 *val = tap_cfg0.hw_func_mask_xl_settl;
5619
5620 return ret;
5621 }
5622
5623 /**
5624 * @brief LPF2 filter on 6D (sixd) function selection.[set]
5625 *
5626 * @param ctx read / write interface definitions
5627 * @param val SIXD_FEED_ODR_DIV_2, SIXD_FEED_LOW_PASS,
5628 * @retval interface status (MANDATORY: return 0 -> no Error)
5629 *
5630 */
lsm6dsv16x_filt_sixd_feed_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_sixd_feed_t val)5631 int32_t lsm6dsv16x_filt_sixd_feed_set(const stmdev_ctx_t *ctx,
5632 lsm6dsv16x_filt_sixd_feed_t val)
5633 {
5634 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5635 int32_t ret;
5636
5637 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5638
5639 if (ret == 0)
5640 {
5641 tap_cfg0.low_pass_on_6d = (uint8_t)val & 0x01U;
5642 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5643 }
5644
5645 return ret;
5646 }
5647
5648 /**
5649 * @brief LPF2 filter on 6D (sixd) function selection.[get]
5650 *
5651 * @param ctx read / write interface definitions
5652 * @param val SIXD_FEED_ODR_DIV_2, SIXD_FEED_LOW_PASS,
5653 * @retval interface status (MANDATORY: return 0 -> no Error)
5654 *
5655 */
lsm6dsv16x_filt_sixd_feed_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_sixd_feed_t * val)5656 int32_t lsm6dsv16x_filt_sixd_feed_get(const stmdev_ctx_t *ctx,
5657 lsm6dsv16x_filt_sixd_feed_t *val)
5658 {
5659 lsm6dsv16x_tap_cfg0_t tap_cfg0;
5660 int32_t ret;
5661
5662 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
5663 if (ret != 0)
5664 {
5665 return ret;
5666 }
5667
5668 switch (tap_cfg0.low_pass_on_6d)
5669 {
5670 case LSM6DSV16X_SIXD_FEED_ODR_DIV_2:
5671 *val = LSM6DSV16X_SIXD_FEED_ODR_DIV_2;
5672 break;
5673
5674 case LSM6DSV16X_SIXD_FEED_LOW_PASS:
5675 *val = LSM6DSV16X_SIXD_FEED_LOW_PASS;
5676 break;
5677
5678 default:
5679 *val = LSM6DSV16X_SIXD_FEED_ODR_DIV_2;
5680 break;
5681 }
5682
5683 return ret;
5684 }
5685
5686 /**
5687 * @brief Gyroscope digital LPF_EIS filter bandwidth selection.[set]
5688 *
5689 * @param ctx read / write interface definitions
5690 * @param val EIS_LP_NORMAL, EIS_LP_LIGHT,
5691 * @retval interface status (MANDATORY: return 0 -> no Error)
5692 *
5693 */
lsm6dsv16x_filt_gy_eis_lp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_eis_lp_bandwidth_t val)5694 int32_t lsm6dsv16x_filt_gy_eis_lp_bandwidth_set(const stmdev_ctx_t *ctx,
5695 lsm6dsv16x_filt_gy_eis_lp_bandwidth_t val)
5696 {
5697 lsm6dsv16x_ctrl_eis_t ctrl_eis;
5698 int32_t ret;
5699
5700 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
5701
5702 if (ret == 0)
5703 {
5704 ctrl_eis.lpf_g_eis_bw = (uint8_t)val & 0x01U;
5705 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
5706 }
5707
5708 return ret;
5709 }
5710
5711 /**
5712 * @brief Gyroscope digital LPF_EIS filter bandwidth selection.[get]
5713 *
5714 * @param ctx read / write interface definitions
5715 * @param val EIS_LP_NORMAL, EIS_LP_LIGHT,
5716 * @retval interface status (MANDATORY: return 0 -> no Error)
5717 *
5718 */
lsm6dsv16x_filt_gy_eis_lp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_eis_lp_bandwidth_t * val)5719 int32_t lsm6dsv16x_filt_gy_eis_lp_bandwidth_get(const stmdev_ctx_t *ctx,
5720 lsm6dsv16x_filt_gy_eis_lp_bandwidth_t *val)
5721 {
5722 lsm6dsv16x_ctrl_eis_t ctrl_eis;
5723 int32_t ret;
5724
5725 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_EIS, (uint8_t *)&ctrl_eis, 1);
5726 if (ret != 0)
5727 {
5728 return ret;
5729 }
5730
5731 switch (ctrl_eis.lpf_g_eis_bw)
5732 {
5733 case LSM6DSV16X_EIS_LP_NORMAL:
5734 *val = LSM6DSV16X_EIS_LP_NORMAL;
5735 break;
5736
5737 case LSM6DSV16X_EIS_LP_LIGHT:
5738 *val = LSM6DSV16X_EIS_LP_LIGHT;
5739 break;
5740
5741 default:
5742 *val = LSM6DSV16X_EIS_LP_NORMAL;
5743 break;
5744 }
5745
5746 return ret;
5747 }
5748
5749 /**
5750 * @brief Gyroscope OIS digital LPF1 filter bandwidth selection. This function works also on OIS interface (SPI2_CTRL2_OIS = UI_CTRL2_OIS).[set]
5751 *
5752 * @param ctx read / write interface definitions
5753 * @param val OIS_GY_LP_NORMAL, OIS_GY_LP_STRONG, OIS_GY_LP_AGGRESSIVE, OIS_GY_LP_LIGHT,
5754 * @retval interface status (MANDATORY: return 0 -> no Error)
5755 *
5756 */
lsm6dsv16x_filt_gy_ois_lp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_ois_lp_bandwidth_t val)5757 int32_t lsm6dsv16x_filt_gy_ois_lp_bandwidth_set(const stmdev_ctx_t *ctx,
5758 lsm6dsv16x_filt_gy_ois_lp_bandwidth_t val)
5759 {
5760 lsm6dsv16x_ui_ctrl2_ois_t ui_ctrl2_ois;
5761 int32_t ret;
5762
5763 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
5764
5765 if (ret == 0)
5766 {
5767 ui_ctrl2_ois.lpf1_g_ois_bw = (uint8_t)val & 0x03U;
5768 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
5769 }
5770
5771 return ret;
5772 }
5773
5774 /**
5775 * @brief Gyroscope OIS digital LPF1 filter bandwidth selection. This function works also on OIS interface (SPI2_CTRL2_OIS = UI_CTRL2_OIS).[get]
5776 *
5777 * @param ctx read / write interface definitions
5778 * @param val OIS_GY_LP_NORMAL, OIS_GY_LP_STRONG, OIS_GY_LP_AGGRESSIVE, OIS_GY_LP_LIGHT,
5779 * @retval interface status (MANDATORY: return 0 -> no Error)
5780 *
5781 */
lsm6dsv16x_filt_gy_ois_lp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_gy_ois_lp_bandwidth_t * val)5782 int32_t lsm6dsv16x_filt_gy_ois_lp_bandwidth_get(const stmdev_ctx_t *ctx,
5783 lsm6dsv16x_filt_gy_ois_lp_bandwidth_t *val)
5784 {
5785
5786 lsm6dsv16x_ui_ctrl2_ois_t ui_ctrl2_ois;
5787 int32_t ret;
5788
5789 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
5790 if (ret != 0)
5791 {
5792 return ret;
5793 }
5794
5795 switch (ui_ctrl2_ois.lpf1_g_ois_bw)
5796 {
5797 case LSM6DSV16X_OIS_GY_LP_NORMAL:
5798 *val = LSM6DSV16X_OIS_GY_LP_NORMAL;
5799 break;
5800
5801 case LSM6DSV16X_OIS_GY_LP_STRONG:
5802 *val = LSM6DSV16X_OIS_GY_LP_STRONG;
5803 break;
5804
5805 case LSM6DSV16X_OIS_GY_LP_AGGRESSIVE:
5806 *val = LSM6DSV16X_OIS_GY_LP_AGGRESSIVE;
5807 break;
5808
5809 case LSM6DSV16X_OIS_GY_LP_LIGHT:
5810 *val = LSM6DSV16X_OIS_GY_LP_LIGHT;
5811 break;
5812
5813 default:
5814 *val = LSM6DSV16X_OIS_GY_LP_NORMAL;
5815 break;
5816 }
5817
5818 return ret;
5819 }
5820
5821 /**
5822 * @brief Selects accelerometer OIS channel bandwidth. This function works also on OIS interface (SPI2_CTRL3_OIS = UI_CTRL3_OIS).[set]
5823 *
5824 * @param ctx read / write interface definitions
5825 * @param val OIS_XL_LP_ULTRA_LIGHT, OIS_XL_LP_VERY_LIGHT, OIS_XL_LP_LIGHT, OIS_XL_LP_NORMAL, OIS_XL_LP_STRONG, OIS_XL_LP_VERY_STRONG, OIS_XL_LP_AGGRESSIVE, OIS_XL_LP_XTREME,
5826 * @retval interface status (MANDATORY: return 0 -> no Error)
5827 *
5828 */
lsm6dsv16x_filt_xl_ois_lp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_ois_lp_bandwidth_t val)5829 int32_t lsm6dsv16x_filt_xl_ois_lp_bandwidth_set(const stmdev_ctx_t *ctx,
5830 lsm6dsv16x_filt_xl_ois_lp_bandwidth_t val)
5831 {
5832 lsm6dsv16x_ui_ctrl3_ois_t ui_ctrl3_ois;
5833 int32_t ret;
5834
5835 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
5836
5837 if (ret == 0)
5838 {
5839 ui_ctrl3_ois.lpf_xl_ois_bw = (uint8_t)val & 0x07U;
5840 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
5841 }
5842
5843 return ret;
5844 }
5845
5846 /**
5847 * @brief Selects accelerometer OIS channel bandwidth. This function works also on OIS interface (SPI2_CTRL3_OIS = UI_CTRL3_OIS).[get]
5848 *
5849 * @param ctx read / write interface definitions
5850 * @param val OIS_XL_LP_ULTRA_LIGHT, OIS_XL_LP_VERY_LIGHT, OIS_XL_LP_LIGHT, OIS_XL_LP_NORMAL, OIS_XL_LP_STRONG, OIS_XL_LP_VERY_STRONG, OIS_XL_LP_AGGRESSIVE, OIS_XL_LP_XTREME,
5851 * @retval interface status (MANDATORY: return 0 -> no Error)
5852 *
5853 */
lsm6dsv16x_filt_xl_ois_lp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16x_filt_xl_ois_lp_bandwidth_t * val)5854 int32_t lsm6dsv16x_filt_xl_ois_lp_bandwidth_get(const stmdev_ctx_t *ctx,
5855 lsm6dsv16x_filt_xl_ois_lp_bandwidth_t *val)
5856 {
5857 lsm6dsv16x_ui_ctrl3_ois_t ui_ctrl3_ois;
5858 int32_t ret;
5859
5860 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
5861 if (ret != 0)
5862 {
5863 return ret;
5864 }
5865
5866 switch (ui_ctrl3_ois.lpf_xl_ois_bw)
5867 {
5868 case LSM6DSV16X_OIS_XL_LP_ULTRA_LIGHT:
5869 *val = LSM6DSV16X_OIS_XL_LP_ULTRA_LIGHT;
5870 break;
5871
5872 case LSM6DSV16X_OIS_XL_LP_VERY_LIGHT:
5873 *val = LSM6DSV16X_OIS_XL_LP_VERY_LIGHT;
5874 break;
5875
5876 case LSM6DSV16X_OIS_XL_LP_LIGHT:
5877 *val = LSM6DSV16X_OIS_XL_LP_LIGHT;
5878 break;
5879
5880 case LSM6DSV16X_OIS_XL_LP_NORMAL:
5881 *val = LSM6DSV16X_OIS_XL_LP_NORMAL;
5882 break;
5883
5884 case LSM6DSV16X_OIS_XL_LP_STRONG:
5885 *val = LSM6DSV16X_OIS_XL_LP_STRONG;
5886 break;
5887
5888 case LSM6DSV16X_OIS_XL_LP_VERY_STRONG:
5889 *val = LSM6DSV16X_OIS_XL_LP_VERY_STRONG;
5890 break;
5891
5892 case LSM6DSV16X_OIS_XL_LP_AGGRESSIVE:
5893 *val = LSM6DSV16X_OIS_XL_LP_AGGRESSIVE;
5894 break;
5895
5896 case LSM6DSV16X_OIS_XL_LP_XTREME:
5897 *val = LSM6DSV16X_OIS_XL_LP_XTREME;
5898 break;
5899
5900 default:
5901 *val = LSM6DSV16X_OIS_XL_LP_ULTRA_LIGHT;
5902 break;
5903 }
5904
5905 return ret;
5906 }
5907
5908 /**
5909 * @}
5910 *
5911 */
5912
5913 /**
5914 * @defgroup Finite State Machine (FSM)
5915 * @brief This section groups all the functions that manage the
5916 * state_machine.
5917 * @{
5918 *
5919 */
5920
5921 /**
5922 * @brief Enables the control of the CTRL registers to FSM (FSM can change some configurations of the device autonomously).[set]
5923 *
5924 * @param ctx read / write interface definitions
5925 * @param val PROTECT_CTRL_REGS, WRITE_CTRL_REG,
5926 * @retval interface status (MANDATORY: return 0 -> no Error)
5927 *
5928 */
lsm6dsv16x_fsm_permission_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_permission_t val)5929 int32_t lsm6dsv16x_fsm_permission_set(const stmdev_ctx_t *ctx,
5930 lsm6dsv16x_fsm_permission_t val)
5931 {
5932 lsm6dsv16x_func_cfg_access_t func_cfg_access;
5933 int32_t ret;
5934
5935 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
5936
5937 if (ret == 0)
5938 {
5939 func_cfg_access.fsm_wr_ctrl_en = (uint8_t)val & 0x01U;
5940 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
5941 }
5942
5943 return ret;
5944 }
5945
5946 /**
5947 * @brief Enables the control of the CTRL registers to FSM (FSM can change some configurations of the device autonomously).[get]
5948 *
5949 * @param ctx read / write interface definitions
5950 * @param val PROTECT_CTRL_REGS, WRITE_CTRL_REG,
5951 * @retval interface status (MANDATORY: return 0 -> no Error)
5952 *
5953 */
lsm6dsv16x_fsm_permission_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_permission_t * val)5954 int32_t lsm6dsv16x_fsm_permission_get(const stmdev_ctx_t *ctx,
5955 lsm6dsv16x_fsm_permission_t *val)
5956 {
5957 lsm6dsv16x_func_cfg_access_t func_cfg_access;
5958 int32_t ret;
5959
5960 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
5961 if (ret != 0)
5962 {
5963 return ret;
5964 }
5965
5966 switch (func_cfg_access.fsm_wr_ctrl_en)
5967 {
5968 case LSM6DSV16X_PROTECT_CTRL_REGS:
5969 *val = LSM6DSV16X_PROTECT_CTRL_REGS;
5970 break;
5971
5972 case LSM6DSV16X_WRITE_CTRL_REG:
5973 *val = LSM6DSV16X_WRITE_CTRL_REG;
5974 break;
5975
5976 default:
5977 *val = LSM6DSV16X_PROTECT_CTRL_REGS;
5978 break;
5979 }
5980
5981 return ret;
5982 }
5983
5984 /**
5985 * @brief Get the FSM permission status
5986 *
5987 * @param ctx read / write interface definitions
5988 * @param val 0: All reg writable from std if - 1: some regs are under FSM control.
5989 * @retval interface status (MANDATORY: return 0 -> no Error)
5990 *
5991 */
lsm6dsv16x_fsm_permission_status(const stmdev_ctx_t * ctx,uint8_t * val)5992 int32_t lsm6dsv16x_fsm_permission_status(const stmdev_ctx_t *ctx, uint8_t *val)
5993 {
5994 lsm6dsv16x_ctrl_status_t ctrl_status;
5995 int32_t ret;
5996
5997 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL_STATUS, (uint8_t *)&ctrl_status, 1);
5998
5999 *val = ctrl_status.fsm_wr_ctrl_status;
6000
6001 return ret;
6002 }
6003
6004 /**
6005 * @brief Enable Finite State Machine (FSM) feature.[set]
6006 *
6007 * @param ctx read / write interface definitions
6008 * @param val Enable Finite State Machine (FSM) feature.
6009 * @retval interface status (MANDATORY: return 0 -> no Error)
6010 *
6011 */
lsm6dsv16x_fsm_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_mode_t val)6012 int32_t lsm6dsv16x_fsm_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_fsm_mode_t val)
6013 {
6014 lsm6dsv16x_emb_func_en_b_t emb_func_en_b;
6015 lsm6dsv16x_fsm_enable_t fsm_enable;
6016 int32_t ret;
6017
6018 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6019 if (ret != 0)
6020 {
6021 return ret;
6022 }
6023
6024 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
6025 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6026 if (ret != 0)
6027 {
6028 goto exit;
6029 }
6030
6031 if ((val.fsm1_en | val.fsm2_en | val.fsm3_en | val.fsm4_en
6032 | val.fsm5_en | val.fsm6_en | val.fsm7_en | val.fsm8_en) == PROPERTY_ENABLE)
6033 {
6034 emb_func_en_b.fsm_en = PROPERTY_ENABLE;
6035 }
6036 else
6037 {
6038 emb_func_en_b.fsm_en = PROPERTY_DISABLE;
6039 }
6040
6041 fsm_enable.fsm1_en = val.fsm1_en;
6042 fsm_enable.fsm2_en = val.fsm2_en;
6043 fsm_enable.fsm3_en = val.fsm3_en;
6044 fsm_enable.fsm4_en = val.fsm4_en;
6045 fsm_enable.fsm5_en = val.fsm5_en;
6046 fsm_enable.fsm6_en = val.fsm6_en;
6047 fsm_enable.fsm7_en = val.fsm7_en;
6048 fsm_enable.fsm8_en = val.fsm8_en;
6049
6050 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6051 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
6052
6053 exit:
6054 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6055
6056 return ret;
6057 }
6058
6059 /**
6060 * @brief Enable Finite State Machine (FSM) feature.[get]
6061 *
6062 * @param ctx read / write interface definitions
6063 * @param val Enable Finite State Machine (FSM) feature.
6064 * @retval interface status (MANDATORY: return 0 -> no Error)
6065 *
6066 */
lsm6dsv16x_fsm_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_mode_t * val)6067 int32_t lsm6dsv16x_fsm_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_fsm_mode_t *val)
6068 {
6069 lsm6dsv16x_fsm_enable_t fsm_enable;
6070 int32_t ret;
6071
6072 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6073 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6074 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6075 if (ret != 0)
6076 {
6077 return ret;
6078 }
6079
6080 val->fsm1_en = fsm_enable.fsm1_en;
6081 val->fsm2_en = fsm_enable.fsm2_en;
6082 val->fsm3_en = fsm_enable.fsm3_en;
6083 val->fsm4_en = fsm_enable.fsm4_en;
6084 val->fsm5_en = fsm_enable.fsm5_en;
6085 val->fsm6_en = fsm_enable.fsm6_en;
6086 val->fsm7_en = fsm_enable.fsm7_en;
6087 val->fsm8_en = fsm_enable.fsm8_en;
6088
6089 return ret;
6090 }
6091
6092 /**
6093 * @brief FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).[set]
6094 *
6095 * @param ctx read / write interface definitions
6096 * @param val FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).
6097 * @retval interface status (MANDATORY: return 0 -> no Error)
6098 *
6099 */
lsm6dsv16x_fsm_long_cnt_set(const stmdev_ctx_t * ctx,uint16_t val)6100 int32_t lsm6dsv16x_fsm_long_cnt_set(const stmdev_ctx_t *ctx, uint16_t val)
6101 {
6102 uint8_t buff[2];
6103 int32_t ret;
6104
6105 buff[1] = (uint8_t)(val / 256U);
6106 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6107
6108 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6109 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FSM_LONG_COUNTER_L, (uint8_t *)&buff[0], 2);
6110 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6111
6112 return ret;
6113 }
6114
6115 /**
6116 * @brief FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).[get]
6117 *
6118 * @param ctx read / write interface definitions
6119 * @param val FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).
6120 * @retval interface status (MANDATORY: return 0 -> no Error)
6121 *
6122 */
lsm6dsv16x_fsm_long_cnt_get(const stmdev_ctx_t * ctx,uint16_t * val)6123 int32_t lsm6dsv16x_fsm_long_cnt_get(const stmdev_ctx_t *ctx, uint16_t *val)
6124 {
6125 uint8_t buff[2];
6126 int32_t ret;
6127
6128 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6129 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_LONG_COUNTER_L, &buff[0], 2);
6130 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6131 if (ret != 0)
6132 {
6133 return ret;
6134 }
6135
6136 *val = buff[1];
6137 *val = (*val * 256U) + buff[0];
6138
6139 return ret;
6140 }
6141
6142 /**
6143 * @brief FSM output registers[get]
6144 *
6145 * @param ctx read / write interface definitions
6146 * @param val FSM output registers
6147 * @retval interface status (MANDATORY: return 0 -> no Error)
6148 *
6149 */
lsm6dsv16x_fsm_out_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_out_t * val)6150 int32_t lsm6dsv16x_fsm_out_get(const stmdev_ctx_t *ctx, lsm6dsv16x_fsm_out_t *val)
6151 {
6152 int32_t ret;
6153
6154 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6155 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_OUTS1, (uint8_t *)val, 8);
6156 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6157
6158 return ret;
6159 }
6160
6161 /**
6162 * @brief Finite State Machine Output Data Rate (ODR) configuration.[set]
6163 *
6164 * @param ctx read / write interface definitions
6165 * @param val FSM_15Hz, FSM_30Hz, FSM_60Hz, FSM_120Hz, FSM_240Hz, FSM_480Hz, FSM_960Hz,
6166 * @retval interface status (MANDATORY: return 0 -> no Error)
6167 *
6168 */
lsm6dsv16x_fsm_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_data_rate_t val)6169 int32_t lsm6dsv16x_fsm_data_rate_set(const stmdev_ctx_t *ctx,
6170 lsm6dsv16x_fsm_data_rate_t val)
6171 {
6172 lsm6dsv16x_fsm_odr_t fsm_odr;
6173 int32_t ret;
6174
6175 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6176 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6177 if (ret != 0)
6178 {
6179 goto exit;
6180 }
6181
6182 fsm_odr.fsm_odr = (uint8_t)val & 0x07U;
6183 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6184
6185 exit:
6186 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6187
6188 return ret;
6189 }
6190
6191 /**
6192 * @brief Finite State Machine Output Data Rate (ODR) configuration.[get]
6193 *
6194 * @param ctx read / write interface definitions
6195 * @param val FSM_15Hz, FSM_30Hz, FSM_60Hz, FSM_120Hz, FSM_240Hz, FSM_480Hz, FSM_960Hz,
6196 * @retval interface status (MANDATORY: return 0 -> no Error)
6197 *
6198 */
lsm6dsv16x_fsm_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_data_rate_t * val)6199 int32_t lsm6dsv16x_fsm_data_rate_get(const stmdev_ctx_t *ctx,
6200 lsm6dsv16x_fsm_data_rate_t *val)
6201 {
6202 lsm6dsv16x_fsm_odr_t fsm_odr;
6203 int32_t ret;
6204
6205 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6206 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6207 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6208 if (ret != 0)
6209 {
6210 return ret;
6211 }
6212
6213 switch (fsm_odr.fsm_odr)
6214 {
6215 case LSM6DSV16X_FSM_15Hz:
6216 *val = LSM6DSV16X_FSM_15Hz;
6217 break;
6218
6219 case LSM6DSV16X_FSM_30Hz:
6220 *val = LSM6DSV16X_FSM_30Hz;
6221 break;
6222
6223 case LSM6DSV16X_FSM_60Hz:
6224 *val = LSM6DSV16X_FSM_60Hz;
6225 break;
6226
6227 case LSM6DSV16X_FSM_120Hz:
6228 *val = LSM6DSV16X_FSM_120Hz;
6229 break;
6230
6231 case LSM6DSV16X_FSM_240Hz:
6232 *val = LSM6DSV16X_FSM_240Hz;
6233 break;
6234
6235 case LSM6DSV16X_FSM_480Hz:
6236 *val = LSM6DSV16X_FSM_480Hz;
6237 break;
6238
6239 case LSM6DSV16X_FSM_960Hz:
6240 *val = LSM6DSV16X_FSM_960Hz;
6241 break;
6242
6243 default:
6244 *val = LSM6DSV16X_FSM_15Hz;
6245 break;
6246 }
6247
6248 return ret;
6249 }
6250
6251 /*
6252 * Original conversion routines taken from: https://github.com/numpy/numpy
6253 *
6254 * uint16_t npy_floatbits_to_halfbits(uint32_t f);
6255 * uint16_t npy_float_to_half(float_t f);
6256 *
6257 * Released under BSD-3-Clause License
6258 */
6259
6260 #define NPY_HALF_GENERATE_OVERFLOW 0 /* do not trigger FP overflow */
6261 #define NPY_HALF_GENERATE_UNDERFLOW 0 /* do not trigger FP underflow */
6262 #ifndef NPY_HALF_ROUND_TIES_TO_EVEN
6263 #define NPY_HALF_ROUND_TIES_TO_EVEN 1
6264 #endif
6265
npy_floatbits_to_halfbits(uint32_t f)6266 static uint16_t npy_floatbits_to_halfbits(uint32_t f)
6267 {
6268 uint32_t f_exp, f_sig;
6269 uint16_t h_sgn, h_exp, h_sig;
6270
6271 h_sgn = (uint16_t)((f & 0x80000000u) >> 16);
6272 f_exp = (f & 0x7f800000u);
6273
6274 /* Exponent overflow/NaN converts to signed inf/NaN */
6275 if (f_exp >= 0x47800000u)
6276 {
6277 if (f_exp == 0x7f800000u)
6278 {
6279 /* Inf or NaN */
6280 f_sig = (f & 0x007fffffu);
6281 if (f_sig != 0U)
6282 {
6283 /* NaN - propagate the flag in the significand... */
6284 uint16_t ret = (uint16_t)(0x7c00u + (f_sig >> 13));
6285 /* ...but make sure it stays a NaN */
6286 if (ret == 0x7c00u)
6287 {
6288 ret++;
6289 }
6290 return h_sgn + ret;
6291 }
6292 else
6293 {
6294 /* signed inf */
6295 return (uint16_t)(h_sgn + 0x7c00u);
6296 }
6297 }
6298 else
6299 {
6300 /* overflow to signed inf */
6301 #if NPY_HALF_GENERATE_OVERFLOW
6302 npy_set_floatstatus_overflow();
6303 #endif
6304 return (uint16_t)(h_sgn + 0x7c00u);
6305 }
6306 }
6307
6308 /* Exponent underflow converts to a subnormal half or signed zero */
6309 if (f_exp <= 0x38000000u)
6310 {
6311 /*
6312 * Signed zeros, subnormal floats, and floats with small
6313 * exponents all convert to signed zero half-floats.
6314 */
6315 if (f_exp < 0x33000000u)
6316 {
6317 #if NPY_HALF_GENERATE_UNDERFLOW
6318 /* If f != 0, it underflowed to 0 */
6319 if ((f & 0x7fffffff) != 0)
6320 {
6321 npy_set_floatstatus_underflow();
6322 }
6323 #endif
6324 return h_sgn;
6325 }
6326 /* Make the subnormal significand */
6327 f_exp >>= 23;
6328 f_sig = (0x00800000u + (f & 0x007fffffu));
6329 #if NPY_HALF_GENERATE_UNDERFLOW
6330 /* If it's not exactly represented, it underflowed */
6331 if ((f_sig & (((uint32_t)1 << (126 - f_exp)) - 1)) != 0)
6332 {
6333 npy_set_floatstatus_underflow();
6334 }
6335 #endif
6336 /*
6337 * Usually the significand is shifted by 13. For subnormals an
6338 * additional shift needs to occur. This shift is one for the largest
6339 * exponent giving a subnormal `f_exp = 0x38000000 >> 23 = 112`, which
6340 * offsets the new first bit. At most the shift can be 1+10 bits.
6341 */
6342 f_sig >>= (113U - f_exp);
6343 /* Handle rounding by adding 1 to the bit beyond half precision */
6344 #if NPY_HALF_ROUND_TIES_TO_EVEN
6345 /*
6346 * If the last bit in the half significand is 0 (already even), and
6347 * the remaining bit pattern is 1000...0, then we do not add one
6348 * to the bit after the half significand. However, the (113 - f_exp)
6349 * shift can lose up to 11 bits, so the || checks them in the original.
6350 * In all other cases, we can just add one.
6351 */
6352 if (((f_sig & 0x00003fffu) != 0x00001000u) || (f & 0x000007ffu))
6353 {
6354 f_sig += 0x00001000u;
6355 }
6356 #else
6357 f_sig += 0x00001000u;
6358 #endif
6359 h_sig = (uint16_t)(f_sig >> 13);
6360 /*
6361 * If the rounding causes a bit to spill into h_exp, it will
6362 * increment h_exp from zero to one and h_sig will be zero.
6363 * This is the correct result.
6364 */
6365 return (uint16_t)(h_sgn + h_sig);
6366 }
6367
6368 /* Regular case with no overflow or underflow */
6369 h_exp = (uint16_t)((f_exp - 0x38000000u) >> 13);
6370 /* Handle rounding by adding 1 to the bit beyond half precision */
6371 f_sig = (f & 0x007fffffu);
6372 #if NPY_HALF_ROUND_TIES_TO_EVEN
6373 /*
6374 * If the last bit in the half significand is 0 (already even), and
6375 * the remaining bit pattern is 1000...0, then we do not add one
6376 * to the bit after the half significand. In all other cases, we do.
6377 */
6378 if ((f_sig & 0x00003fffu) != 0x00001000u)
6379 {
6380 f_sig += 0x00001000u;
6381 }
6382 #else
6383 f_sig += 0x00001000u;
6384 #endif
6385 h_sig = (uint16_t)(f_sig >> 13);
6386 /*
6387 * If the rounding causes a bit to spill into h_exp, it will
6388 * increment h_exp by one and h_sig will be zero. This is the
6389 * correct result. h_exp may increment to 15, at greatest, in
6390 * which case the result overflows to a signed inf.
6391 */
6392 #if NPY_HALF_GENERATE_OVERFLOW
6393 h_sig += h_exp;
6394 if (h_sig == 0x7c00u)
6395 {
6396 npy_set_floatstatus_overflow();
6397 }
6398 return h_sgn + h_sig;
6399 #else
6400 return h_sgn + h_exp + h_sig;
6401 #endif
6402 }
6403
npy_float_to_half(float_t f)6404 static uint16_t npy_float_to_half(float_t f)
6405 {
6406 union
6407 {
6408 float_t f;
6409 uint32_t fbits;
6410 } conv;
6411 conv.f = f;
6412 return npy_floatbits_to_halfbits(conv.fbits);
6413 }
6414
6415 /**
6416 * @brief SFLP GBIAS value. The register value is expressed as half-precision
6417 * floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent
6418 * bits; F: 10 fraction bits).[set]
6419 *
6420 * @param ctx read / write interface definitions
6421 * @param val GBIAS x/y/z val.
6422 * @retval interface status (MANDATORY: return 0 -> no Error)
6423 *
6424 */
lsm6dsv16x_sflp_game_gbias_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sflp_gbias_t * val)6425 int32_t lsm6dsv16x_sflp_game_gbias_set(const stmdev_ctx_t *ctx,
6426 lsm6dsv16x_sflp_gbias_t *val)
6427 {
6428 lsm6dsv16x_sflp_data_rate_t sflp_odr;
6429 lsm6dsv16x_emb_func_exec_status_t emb_func_sts;
6430 lsm6dsv16x_data_ready_t drdy;
6431 lsm6dsv16x_xl_full_scale_t xl_fs;
6432 lsm6dsv16x_ctrl10_t ctrl10;
6433 uint8_t master_config;
6434 uint8_t emb_func_en_saved[2];
6435 uint8_t conf_saved[2];
6436 uint8_t reg_zero[2] = {0x0, 0x0};
6437 uint16_t gbias_hf[3];
6438 float_t k = 0.005f;
6439 int16_t xl_data[3];
6440 int32_t data_tmp;
6441 uint8_t *data_ptr = (uint8_t *)&data_tmp;
6442 uint8_t i, j;
6443 int32_t ret;
6444
6445 ret = lsm6dsv16x_sflp_data_rate_get(ctx, &sflp_odr);
6446 if (ret != 0)
6447 {
6448 return ret;
6449 }
6450
6451 /* Calculate k factor */
6452 switch (sflp_odr)
6453 {
6454 default:
6455 case LSM6DSV16X_SFLP_15Hz:
6456 k = 0.04f;
6457 break;
6458 case LSM6DSV16X_SFLP_30Hz:
6459 k = 0.02f;
6460 break;
6461 case LSM6DSV16X_SFLP_60Hz:
6462 k = 0.01f;
6463 break;
6464 case LSM6DSV16X_SFLP_120Hz:
6465 k = 0.005f;
6466 break;
6467 case LSM6DSV16X_SFLP_240Hz:
6468 k = 0.0025f;
6469 break;
6470 case LSM6DSV16X_SFLP_480Hz:
6471 k = 0.00125f;
6472 break;
6473 }
6474
6475 /* compute gbias as half precision float in order to be put in embedded advanced feature register */
6476 gbias_hf[0] = npy_float_to_half(val->gbias_x * (3.14159265358979323846f / 180.0f) / k);
6477 gbias_hf[1] = npy_float_to_half(val->gbias_y * (3.14159265358979323846f / 180.0f) / k);
6478 gbias_hf[2] = npy_float_to_half(val->gbias_z * (3.14159265358979323846f / 180.0f) / k);
6479
6480 /* Save sensor configuration and set high-performance mode (if the sensor is in power-down mode, turn it on) */
6481 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL1, conf_saved, 2);
6482 ret += lsm6dsv16x_xl_mode_set(ctx, LSM6DSV16X_XL_HIGH_PERFORMANCE_MD);
6483 ret += lsm6dsv16x_gy_mode_set(ctx, LSM6DSV16X_GY_HIGH_PERFORMANCE_MD);
6484 if (((uint8_t)conf_saved[0] & 0x0FU) == (uint8_t)LSM6DSV16X_ODR_OFF)
6485 {
6486 ret += lsm6dsv16x_xl_data_rate_set(ctx, LSM6DSV16X_ODR_AT_120Hz);
6487 }
6488
6489 /* Make sure to turn the sensor-hub master off */
6490 ret += lsm6dsv16x_sh_master_get(ctx, &master_config);
6491 ret += lsm6dsv16x_sh_master_set(ctx, 0);
6492
6493 /* disable algos */
6494 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6495 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, emb_func_en_saved, 2);
6496 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, reg_zero, 2);
6497 do
6498 {
6499 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EXEC_STATUS,
6500 (uint8_t *)&emb_func_sts, 1);
6501 } while (emb_func_sts.emb_func_endop != 1U);
6502 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6503
6504 // enable gbias setting
6505 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
6506 ctrl10.emb_func_debug = 1;
6507 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
6508
6509 /* enable algos */
6510 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6511 emb_func_en_saved[0] |= 0x02U; /* force SFLP GAME en */
6512 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, emb_func_en_saved,
6513 2);
6514 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6515
6516 ret += lsm6dsv16x_xl_full_scale_get(ctx, &xl_fs);
6517
6518 /* Read XL data */
6519 do
6520 {
6521 ret += lsm6dsv16x_flag_data_ready_get(ctx, &drdy);
6522 } while (drdy.drdy_xl != 1U);
6523 ret += lsm6dsv16x_acceleration_raw_get(ctx, xl_data);
6524
6525 /* force sflp initialization */
6526 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
6527 for (i = 0; i < 3U; i++)
6528 {
6529 j = 0;
6530 data_tmp = (int32_t)xl_data[i];
6531 data_tmp <<= xl_fs; // shift based on current fs
6532 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_1 + 3U * i,
6533 &data_ptr[j++], 1);
6534 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_2 + 3U * i,
6535 &data_ptr[j++], 1);
6536 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_3 + 3U * i, &data_ptr[j],
6537 1);
6538 }
6539 for (i = 0; i < 3U; i++)
6540 {
6541 j = 0;
6542 data_tmp = 0;
6543 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_10 + 3U * i,
6544 &data_ptr[j++], 1);
6545 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_11 + 3U * i,
6546 &data_ptr[j++], 1);
6547 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SENSOR_HUB_12 + 3U * i, &data_ptr[j],
6548 1);
6549 }
6550 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6551
6552 // wait end_op (and at least 30 us)
6553 ctx->mdelay(1);
6554 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
6555 do
6556 {
6557 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EXEC_STATUS,
6558 (uint8_t *)&emb_func_sts, 1);
6559 } while (emb_func_sts.emb_func_endop != 1U);
6560 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
6561
6562 /* write gbias in embedded advanced features registers */
6563 ret += lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_SFLP_GAME_GBIASX_L,
6564 (uint8_t *)gbias_hf, 6);
6565
6566 /* reload previous sensor configuration */
6567 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL1, conf_saved, 2);
6568
6569 // disable gbias setting
6570 ctrl10.emb_func_debug = 0;
6571 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL10, (uint8_t *)&ctrl10, 1);
6572
6573 /* reload previous master configuration */
6574 ret += lsm6dsv16x_sh_master_set(ctx, master_config);
6575
6576 return ret;
6577 }
6578
6579 /**
6580 * @brief External sensor sensitivity value register for the Finite State Machine (r/w). This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits). Default value is 0x1624 (when using an external magnetometer this value corresponds to 0.0015 gauss/LSB).[set]
6581 *
6582 * @param ctx read / write interface definitions
6583 * @param val External sensor sensitivity value register for the Finite State Machine (r/w). This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits). Default value is 0x1624 (when using an external magnetometer this value corresponds to 0.0015 gauss/LSB).
6584 * @retval interface status (MANDATORY: return 0 -> no Error)
6585 *
6586 */
lsm6dsv16x_fsm_ext_sens_sensitivity_set(const stmdev_ctx_t * ctx,uint16_t val)6587 int32_t lsm6dsv16x_fsm_ext_sens_sensitivity_set(const stmdev_ctx_t *ctx, uint16_t val)
6588 {
6589 uint8_t buff[2];
6590 int32_t ret;
6591
6592 buff[1] = (uint8_t)(val / 256U);
6593 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6594 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_FSM_EXT_SENSITIVITY_L, (uint8_t *)&buff[0], 2);
6595
6596 return ret;
6597 }
6598
6599 /**
6600 * @brief External sensor sensitivity value register for the Finite State Machine (r/w). This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits). Default value is 0x1624 (when using an external magnetometer this value corresponds to 0.0015 gauss/LSB).[get]
6601 *
6602 * @param ctx read / write interface definitions
6603 * @param val External sensor sensitivity value register for the Finite State Machine (r/w). This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits). Default value is 0x1624 (when using an external magnetometer this value corresponds to 0.0015 gauss/LSB).
6604 * @retval interface status (MANDATORY: return 0 -> no Error)
6605 *
6606 */
lsm6dsv16x_fsm_ext_sens_sensitivity_get(const stmdev_ctx_t * ctx,uint16_t * val)6607 int32_t lsm6dsv16x_fsm_ext_sens_sensitivity_get(const stmdev_ctx_t *ctx,
6608 uint16_t *val)
6609 {
6610 uint8_t buff[2];
6611 int32_t ret;
6612
6613 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_FSM_EXT_SENSITIVITY_L, &buff[0], 2);
6614 if (ret != 0)
6615 {
6616 return ret;
6617 }
6618
6619 *val = buff[1];
6620 *val = (*val * 256U) + buff[0];
6621
6622 return ret;
6623 }
6624
6625 /**
6626 * @brief External sensor offsets (X,Y,Z). The values are expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).[set]
6627 *
6628 * @param ctx read / write interface definitions
6629 * @param val External sensor offsets (X,Y,Z). The values are expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).
6630 * @retval interface status (MANDATORY: return 0 -> no Error)
6631 *
6632 */
lsm6dsv16x_fsm_ext_sens_offset_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_fsm_ext_sens_offset_t val)6633 int32_t lsm6dsv16x_fsm_ext_sens_offset_set(const stmdev_ctx_t *ctx,
6634 lsm6dsv16x_xl_fsm_ext_sens_offset_t val)
6635 {
6636 uint8_t buff[6];
6637 int32_t ret;
6638
6639 buff[1] = (uint8_t)(val.x / 256U);
6640 buff[0] = (uint8_t)(val.x - (buff[1] * 256U));
6641 buff[3] = (uint8_t)(val.y / 256U);
6642 buff[2] = (uint8_t)(val.y - (buff[3] * 256U));
6643 buff[5] = (uint8_t)(val.z / 256U);
6644 buff[4] = (uint8_t)(val.z - (buff[5] * 256U));
6645 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_FSM_EXT_OFFX_L, (uint8_t *)&buff[0], 6);
6646
6647 return ret;
6648 }
6649
6650 /**
6651 * @brief External sensor offsets (X,Y,Z). The values are expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).[get]
6652 *
6653 * @param ctx read / write interface definitions
6654 * @param val External sensor offsets (X,Y,Z). The values are expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).
6655 * @retval interface status (MANDATORY: return 0 -> no Error)
6656 *
6657 */
lsm6dsv16x_fsm_ext_sens_offset_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_fsm_ext_sens_offset_t * val)6658 int32_t lsm6dsv16x_fsm_ext_sens_offset_get(const stmdev_ctx_t *ctx,
6659 lsm6dsv16x_xl_fsm_ext_sens_offset_t *val)
6660 {
6661 uint8_t buff[6];
6662 int32_t ret;
6663
6664 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_FSM_EXT_OFFX_L, &buff[0], 6);
6665 if (ret != 0)
6666 {
6667 return ret;
6668 }
6669
6670 val->x = buff[1];
6671 val->x = (val->x * 256U) + buff[0];
6672 val->y = buff[3];
6673 val->y = (val->y * 256U) + buff[2];
6674 val->z = buff[5];
6675 val->z = (val->z * 256U) + buff[4];
6676
6677 return ret;
6678 }
6679
6680 /**
6681 * @brief External sensor transformation matrix. The value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).[set]
6682 *
6683 * @param ctx read / write interface definitions
6684 * @param val External sensor transformation matrix. The value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).
6685 * @retval interface status (MANDATORY: return 0 -> no Error)
6686 *
6687 */
lsm6dsv16x_fsm_ext_sens_matrix_set(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_fsm_ext_sens_matrix_t val)6688 int32_t lsm6dsv16x_fsm_ext_sens_matrix_set(const stmdev_ctx_t *ctx,
6689 lsm6dsv16x_xl_fsm_ext_sens_matrix_t val)
6690 {
6691 uint8_t buff[12];
6692 int32_t ret;
6693
6694 buff[1] = (uint8_t)(val.xx / 256U);
6695 buff[0] = (uint8_t)(val.xx - (buff[1] * 256U));
6696 buff[3] = (uint8_t)(val.xy / 256U);
6697 buff[2] = (uint8_t)(val.xy - (buff[3] * 256U));
6698 buff[5] = (uint8_t)(val.xz / 256U);
6699 buff[4] = (uint8_t)(val.xz - (buff[5] * 256U));
6700 buff[7] = (uint8_t)(val.yy / 256U);
6701 buff[6] = (uint8_t)(val.yy - (buff[7] * 256U));
6702 buff[9] = (uint8_t)(val.yz / 256U);
6703 buff[8] = (uint8_t)(val.yz - (buff[9] * 256U));
6704 buff[11] = (uint8_t)(val.zz / 256U);
6705 buff[10] = (uint8_t)(val.zz - (buff[11] * 256U));
6706 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_FSM_EXT_MATRIX_XX_L, (uint8_t *)&buff[0], 12);
6707
6708 return ret;
6709 }
6710
6711 /**
6712 * @brief External sensor transformation matrix. The value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).[get]
6713 *
6714 * @param ctx read / write interface definitions
6715 * @param val External sensor transformation matrix. The value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).
6716 * @retval interface status (MANDATORY: return 0 -> no Error)
6717 *
6718 */
lsm6dsv16x_fsm_ext_sens_matrix_get(const stmdev_ctx_t * ctx,lsm6dsv16x_xl_fsm_ext_sens_matrix_t * val)6719 int32_t lsm6dsv16x_fsm_ext_sens_matrix_get(const stmdev_ctx_t *ctx,
6720 lsm6dsv16x_xl_fsm_ext_sens_matrix_t *val)
6721 {
6722 uint8_t buff[12];
6723 int32_t ret;
6724
6725 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_FSM_EXT_MATRIX_XX_L, &buff[0], 12);
6726 if (ret != 0)
6727 {
6728 return ret;
6729 }
6730
6731 val->xx = buff[1];
6732 val->xx = (val->xx * 256U) + buff[0];
6733 val->xy = buff[3];
6734 val->xy = (val->xy * 256U) + buff[2];
6735 val->xz = buff[5];
6736 val->xz = (val->xz * 256U) + buff[4];
6737 val->yy = buff[7];
6738 val->yy = (val->yy * 256U) + buff[6];
6739 val->yz = buff[9];
6740 val->yz = (val->yz * 256U) + buff[8];
6741 val->zz = buff[11];
6742 val->zz = (val->zz * 256U) + buff[10];
6743
6744 return ret;
6745 }
6746
6747 /**
6748 * @brief External sensor z-axis coordinates rotation.[set]
6749 *
6750 * @param ctx read / write interface definitions
6751 * @param val Z_EQ_Y, Z_EQ_MIN_Y, Z_EQ_X, Z_EQ_MIN_X, Z_EQ_MIN_Z, Z_EQ_Z,
6752 * @retval interface status (MANDATORY: return 0 -> no Error)
6753 *
6754 */
lsm6dsv16x_fsm_ext_sens_z_orient_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_z_orient_t val)6755 int32_t lsm6dsv16x_fsm_ext_sens_z_orient_set(const stmdev_ctx_t *ctx,
6756 lsm6dsv16x_fsm_ext_sens_z_orient_t val)
6757 {
6758 lsm6dsv16x_ext_cfg_a_t ext_cfg_a;
6759 int32_t ret;
6760
6761 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6762 ext_cfg_a.ext_z_axis = (uint8_t)val & 0x07U;
6763 ret += lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6764
6765 return ret;
6766 }
6767
6768 /**
6769 * @brief External sensor z-axis coordinates rotation.[get]
6770 *
6771 * @param ctx read / write interface definitions
6772 * @param val Z_EQ_Y, Z_EQ_MIN_Y, Z_EQ_X, Z_EQ_MIN_X, Z_EQ_MIN_Z, Z_EQ_Z,
6773 * @retval interface status (MANDATORY: return 0 -> no Error)
6774 *
6775 */
lsm6dsv16x_fsm_ext_sens_z_orient_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_z_orient_t * val)6776 int32_t lsm6dsv16x_fsm_ext_sens_z_orient_get(const stmdev_ctx_t *ctx,
6777 lsm6dsv16x_fsm_ext_sens_z_orient_t *val)
6778 {
6779 lsm6dsv16x_ext_cfg_a_t ext_cfg_a;
6780 int32_t ret;
6781
6782 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6783 if (ret != 0)
6784 {
6785 return ret;
6786 }
6787
6788 switch (ext_cfg_a.ext_z_axis)
6789 {
6790 case LSM6DSV16X_Z_EQ_Y:
6791 *val = LSM6DSV16X_Z_EQ_Y;
6792 break;
6793
6794 case LSM6DSV16X_Z_EQ_MIN_Y:
6795 *val = LSM6DSV16X_Z_EQ_MIN_Y;
6796 break;
6797
6798 case LSM6DSV16X_Z_EQ_X:
6799 *val = LSM6DSV16X_Z_EQ_X;
6800 break;
6801
6802 case LSM6DSV16X_Z_EQ_MIN_X:
6803 *val = LSM6DSV16X_Z_EQ_MIN_X;
6804 break;
6805
6806 case LSM6DSV16X_Z_EQ_MIN_Z:
6807 *val = LSM6DSV16X_Z_EQ_MIN_Z;
6808 break;
6809
6810 case LSM6DSV16X_Z_EQ_Z:
6811 *val = LSM6DSV16X_Z_EQ_Z;
6812 break;
6813
6814 default:
6815 *val = LSM6DSV16X_Z_EQ_Y;
6816 break;
6817 }
6818
6819 return ret;
6820 }
6821
6822 /**
6823 * @brief External sensor Y-axis coordinates rotation.[set]
6824 *
6825 * @param ctx read / write interface definitions
6826 * @param val Y_EQ_Y, Y_EQ_MIN_Y, Y_EQ_X, Y_EQ_MIN_X, Y_EQ_MIN_Z, Y_EQ_Z,
6827 * @retval interface status (MANDATORY: return 0 -> no Error)
6828 *
6829 */
lsm6dsv16x_fsm_ext_sens_y_orient_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_y_orient_t val)6830 int32_t lsm6dsv16x_fsm_ext_sens_y_orient_set(const stmdev_ctx_t *ctx,
6831 lsm6dsv16x_fsm_ext_sens_y_orient_t val)
6832 {
6833 lsm6dsv16x_ext_cfg_a_t ext_cfg_a;
6834 int32_t ret;
6835
6836 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6837 if (ret == 0)
6838 {
6839 ext_cfg_a.ext_y_axis = (uint8_t)val & 0x7U;
6840 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6841 }
6842
6843 return ret;
6844 }
6845
6846 /**
6847 * @brief External sensor Y-axis coordinates rotation.[get]
6848 *
6849 * @param ctx read / write interface definitions
6850 * @param val Y_EQ_Y, Y_EQ_MIN_Y, Y_EQ_X, Y_EQ_MIN_X, Y_EQ_MIN_Z, Y_EQ_Z,
6851 * @retval interface status (MANDATORY: return 0 -> no Error)
6852 *
6853 */
lsm6dsv16x_fsm_ext_sens_y_orient_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_y_orient_t * val)6854 int32_t lsm6dsv16x_fsm_ext_sens_y_orient_get(const stmdev_ctx_t *ctx,
6855 lsm6dsv16x_fsm_ext_sens_y_orient_t *val)
6856 {
6857 lsm6dsv16x_ext_cfg_a_t ext_cfg_a;
6858 int32_t ret;
6859
6860 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_A, (uint8_t *)&ext_cfg_a, 1);
6861 if (ret != 0)
6862 {
6863 return ret;
6864 }
6865
6866 switch (ext_cfg_a.ext_y_axis)
6867 {
6868 case LSM6DSV16X_Y_EQ_Y:
6869 *val = LSM6DSV16X_Y_EQ_Y;
6870 break;
6871
6872 case LSM6DSV16X_Y_EQ_MIN_Y:
6873 *val = LSM6DSV16X_Y_EQ_MIN_Y;
6874 break;
6875
6876 case LSM6DSV16X_Y_EQ_X:
6877 *val = LSM6DSV16X_Y_EQ_X;
6878 break;
6879
6880 case LSM6DSV16X_Y_EQ_MIN_X:
6881 *val = LSM6DSV16X_Y_EQ_MIN_X;
6882 break;
6883
6884 case LSM6DSV16X_Y_EQ_MIN_Z:
6885 *val = LSM6DSV16X_Y_EQ_MIN_Z;
6886 break;
6887
6888 case LSM6DSV16X_Y_EQ_Z:
6889 *val = LSM6DSV16X_Y_EQ_Z;
6890 break;
6891
6892 default:
6893 *val = LSM6DSV16X_Y_EQ_Y;
6894 break;
6895 }
6896
6897 return ret;
6898 }
6899
6900 /**
6901 * @brief External sensor X-axis coordinates rotation.[set]
6902 *
6903 * @param ctx read / write interface definitions
6904 * @param val X_EQ_Y, X_EQ_MIN_Y, X_EQ_X, X_EQ_MIN_X, X_EQ_MIN_Z, X_EQ_Z,
6905 * @retval interface status (MANDATORY: return 0 -> no Error)
6906 *
6907 */
lsm6dsv16x_fsm_ext_sens_x_orient_set(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_x_orient_t val)6908 int32_t lsm6dsv16x_fsm_ext_sens_x_orient_set(const stmdev_ctx_t *ctx,
6909 lsm6dsv16x_fsm_ext_sens_x_orient_t val)
6910 {
6911 lsm6dsv16x_ext_cfg_b_t ext_cfg_b;
6912 int32_t ret;
6913
6914 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_B, (uint8_t *)&ext_cfg_b, 1);
6915 if (ret == 0)
6916 {
6917 ext_cfg_b.ext_x_axis = (uint8_t)val & 0x7U;
6918 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EXT_CFG_B, (uint8_t *)&ext_cfg_b, 1);
6919 }
6920
6921 return ret;
6922 }
6923
6924 /**
6925 * @brief External sensor X-axis coordinates rotation.[get]
6926 *
6927 * @param ctx read / write interface definitions
6928 * @param val X_EQ_Y, X_EQ_MIN_Y, X_EQ_X, X_EQ_MIN_X, X_EQ_MIN_Z, X_EQ_Z,
6929 * @retval interface status (MANDATORY: return 0 -> no Error)
6930 *
6931 */
lsm6dsv16x_fsm_ext_sens_x_orient_get(const stmdev_ctx_t * ctx,lsm6dsv16x_fsm_ext_sens_x_orient_t * val)6932 int32_t lsm6dsv16x_fsm_ext_sens_x_orient_get(const stmdev_ctx_t *ctx,
6933 lsm6dsv16x_fsm_ext_sens_x_orient_t *val)
6934 {
6935 lsm6dsv16x_ext_cfg_b_t ext_cfg_b;
6936 int32_t ret;
6937
6938 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EXT_CFG_B, (uint8_t *)&ext_cfg_b, 1);
6939 if (ret != 0)
6940 {
6941 return ret;
6942 }
6943
6944 switch (ext_cfg_b.ext_x_axis)
6945 {
6946 case LSM6DSV16X_X_EQ_Y:
6947 *val = LSM6DSV16X_X_EQ_Y;
6948 break;
6949
6950 case LSM6DSV16X_X_EQ_MIN_Y:
6951 *val = LSM6DSV16X_X_EQ_MIN_Y;
6952 break;
6953
6954 case LSM6DSV16X_X_EQ_X:
6955 *val = LSM6DSV16X_X_EQ_X;
6956 break;
6957
6958 case LSM6DSV16X_X_EQ_MIN_X:
6959 *val = LSM6DSV16X_X_EQ_MIN_X;
6960 break;
6961
6962 case LSM6DSV16X_X_EQ_MIN_Z:
6963 *val = LSM6DSV16X_X_EQ_MIN_Z;
6964 break;
6965
6966 case LSM6DSV16X_X_EQ_Z:
6967 *val = LSM6DSV16X_X_EQ_Z;
6968 break;
6969
6970 default:
6971 *val = LSM6DSV16X_X_EQ_Y;
6972 break;
6973 }
6974
6975 return ret;
6976 }
6977
6978 /**
6979 * @brief FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.[set]
6980 *
6981 * @param ctx read / write interface definitions
6982 * @param val FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.
6983 * @retval interface status (MANDATORY: return 0 -> no Error)
6984 *
6985 */
lsm6dsv16x_fsm_long_cnt_timeout_set(const stmdev_ctx_t * ctx,uint16_t val)6986 int32_t lsm6dsv16x_fsm_long_cnt_timeout_set(const stmdev_ctx_t *ctx, uint16_t val)
6987 {
6988 uint8_t buff[2];
6989 int32_t ret;
6990
6991 buff[1] = (uint8_t)(val / 256U);
6992 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6993 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_LC_TIMEOUT_L,
6994 (uint8_t *)&buff[0], 2);
6995
6996 return ret;
6997 }
6998
6999 /**
7000 * @brief FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.[get]
7001 *
7002 * @param ctx read / write interface definitions
7003 * @param val FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.
7004 * @retval interface status (MANDATORY: return 0 -> no Error)
7005 *
7006 */
lsm6dsv16x_fsm_long_cnt_timeout_get(const stmdev_ctx_t * ctx,uint16_t * val)7007 int32_t lsm6dsv16x_fsm_long_cnt_timeout_get(const stmdev_ctx_t *ctx, uint16_t *val)
7008 {
7009 uint8_t buff[2];
7010 int32_t ret;
7011
7012 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_LC_TIMEOUT_L, &buff[0],
7013 2);
7014 if (ret != 0)
7015 {
7016 return ret;
7017 }
7018
7019 *val = buff[1];
7020 *val = (*val * 256U) + buff[0];
7021
7022 return ret;
7023 }
7024
7025 /**
7026 * @brief FSM number of programs.[set]
7027 *
7028 * @param ctx read / write interface definitions
7029 * @param val FSM number of programs.
7030 * @retval interface status (MANDATORY: return 0 -> no Error)
7031 *
7032 */
lsm6dsv16x_fsm_number_of_programs_set(const stmdev_ctx_t * ctx,uint8_t val)7033 int32_t lsm6dsv16x_fsm_number_of_programs_set(const stmdev_ctx_t *ctx, uint8_t val)
7034 {
7035 lsm6dsv16x_fsm_programs_t fsm_programs;
7036 int32_t ret;
7037
7038 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_PROGRAMS,
7039 (uint8_t *)&fsm_programs, 1);
7040 if (ret == 0)
7041 {
7042 fsm_programs.fsm_n_prog = val;
7043 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_PROGRAMS,
7044 (uint8_t *)&fsm_programs, 1);
7045 }
7046
7047 return ret;
7048 }
7049
7050 /**
7051 * @brief FSM number of programs.[get]
7052 *
7053 * @param ctx read / write interface definitions
7054 * @param val FSM number of programs.
7055 * @retval interface status (MANDATORY: return 0 -> no Error)
7056 *
7057 */
lsm6dsv16x_fsm_number_of_programs_get(const stmdev_ctx_t * ctx,uint8_t * val)7058 int32_t lsm6dsv16x_fsm_number_of_programs_get(const stmdev_ctx_t *ctx, uint8_t *val)
7059 {
7060 lsm6dsv16x_fsm_programs_t fsm_programs;
7061 int32_t ret;
7062
7063 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_PROGRAMS,
7064 (uint8_t *)&fsm_programs, 1);
7065 *val = fsm_programs.fsm_n_prog;
7066
7067 return ret;
7068 }
7069
7070 /**
7071 * @brief FSM start address. First available address is 0x35C.[set]
7072 *
7073 * @param ctx read / write interface definitions
7074 * @param val FSM start address. First available address is 0x35C.
7075 * @retval interface status (MANDATORY: return 0 -> no Error)
7076 *
7077 */
lsm6dsv16x_fsm_start_address_set(const stmdev_ctx_t * ctx,uint16_t val)7078 int32_t lsm6dsv16x_fsm_start_address_set(const stmdev_ctx_t *ctx, uint16_t val)
7079 {
7080 uint8_t buff[2];
7081 int32_t ret;
7082
7083 buff[1] = (uint8_t)(val / 256U);
7084 buff[0] = (uint8_t)(val - (buff[1] * 256U));
7085 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_START_ADD_L,
7086 (uint8_t *)&buff[0], 2);
7087
7088 return ret;
7089 }
7090
7091 /**
7092 * @brief FSM start address. First available address is 0x35C.[get]
7093 *
7094 * @param ctx read / write interface definitions
7095 * @param val FSM start address. First available address is 0x35C.
7096 * @retval interface status (MANDATORY: return 0 -> no Error)
7097 *
7098 */
lsm6dsv16x_fsm_start_address_get(const stmdev_ctx_t * ctx,uint16_t * val)7099 int32_t lsm6dsv16x_fsm_start_address_get(const stmdev_ctx_t *ctx, uint16_t *val)
7100 {
7101 uint8_t buff[2];
7102 int32_t ret;
7103
7104 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_FSM_START_ADD_L, &buff[0], 2);
7105 if (ret != 0)
7106 {
7107 return ret;
7108 }
7109
7110 *val = buff[1];
7111 *val = (*val * 256U) + buff[0];
7112
7113 return ret;
7114 }
7115
7116 /**
7117 * @}
7118 *
7119 */
7120
7121 /**
7122 * @defgroup Free fall
7123 * @brief This section group all the functions concerning the free
7124 * fall detection.
7125 * @{
7126 *
7127 */
7128
7129 /**
7130 * @brief Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time[set]
7131 *
7132 * @param ctx read / write interface definitions
7133 * @param val Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time
7134 * @retval interface status (MANDATORY: return 0 -> no Error)
7135 *
7136 */
lsm6dsv16x_ff_time_windows_set(const stmdev_ctx_t * ctx,uint8_t val)7137 int32_t lsm6dsv16x_ff_time_windows_set(const stmdev_ctx_t *ctx, uint8_t val)
7138 {
7139 lsm6dsv16x_wake_up_dur_t wake_up_dur;
7140 lsm6dsv16x_free_fall_t free_fall;
7141 int32_t ret;
7142
7143 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
7144 wake_up_dur.ff_dur = ((uint8_t)val & 0x20U) >> 5;
7145 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
7146 if (ret != 0)
7147 {
7148 return ret;
7149 }
7150
7151 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7152 free_fall.ff_dur = (uint8_t)val & 0x1FU;
7153 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7154
7155 return ret;
7156 }
7157
7158 /**
7159 * @brief Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time[get]
7160 *
7161 * @param ctx read / write interface definitions
7162 * @param val Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time
7163 * @retval interface status (MANDATORY: return 0 -> no Error)
7164 *
7165 */
lsm6dsv16x_ff_time_windows_get(const stmdev_ctx_t * ctx,uint8_t * val)7166 int32_t lsm6dsv16x_ff_time_windows_get(const stmdev_ctx_t *ctx, uint8_t *val)
7167 {
7168 lsm6dsv16x_wake_up_dur_t wake_up_dur;
7169 lsm6dsv16x_free_fall_t free_fall;
7170 int32_t ret;
7171
7172 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
7173 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7174
7175 *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
7176
7177 return ret;
7178 }
7179
7180 /**
7181 * @brief Free fall threshold setting.[set]
7182 *
7183 * @param ctx read / write interface definitions
7184 * @param val 156_mg, 219_mg, 250_mg, 312_mg, 344_mg, 406_mg, 469_mg, 500_mg,
7185 * @retval interface status (MANDATORY: return 0 -> no Error)
7186 *
7187 */
lsm6dsv16x_ff_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ff_thresholds_t val)7188 int32_t lsm6dsv16x_ff_thresholds_set(const stmdev_ctx_t *ctx,
7189 lsm6dsv16x_ff_thresholds_t val)
7190 {
7191 lsm6dsv16x_free_fall_t free_fall;
7192 int32_t ret;
7193
7194 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7195 if (ret == 0)
7196 {
7197 free_fall.ff_ths = (uint8_t)val & 0x7U;
7198 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7199 }
7200
7201 return ret;
7202 }
7203
7204 /**
7205 * @brief Free fall threshold setting.[get]
7206 *
7207 * @param ctx read / write interface definitions
7208 * @param val 156_mg, 219_mg, 250_mg, 312_mg, 344_mg, 406_mg, 469_mg, 500_mg,
7209 * @retval interface status (MANDATORY: return 0 -> no Error)
7210 *
7211 */
lsm6dsv16x_ff_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ff_thresholds_t * val)7212 int32_t lsm6dsv16x_ff_thresholds_get(const stmdev_ctx_t *ctx,
7213 lsm6dsv16x_ff_thresholds_t *val)
7214 {
7215 lsm6dsv16x_free_fall_t free_fall;
7216 int32_t ret;
7217
7218 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FREE_FALL, (uint8_t *)&free_fall, 1);
7219 if (ret != 0)
7220 {
7221 return ret;
7222 }
7223
7224 switch (free_fall.ff_ths)
7225 {
7226 case LSM6DSV16X_156_mg:
7227 *val = LSM6DSV16X_156_mg;
7228 break;
7229
7230 case LSM6DSV16X_219_mg:
7231 *val = LSM6DSV16X_219_mg;
7232 break;
7233
7234 case LSM6DSV16X_250_mg:
7235 *val = LSM6DSV16X_250_mg;
7236 break;
7237
7238 case LSM6DSV16X_312_mg:
7239 *val = LSM6DSV16X_312_mg;
7240 break;
7241
7242 case LSM6DSV16X_344_mg:
7243 *val = LSM6DSV16X_344_mg;
7244 break;
7245
7246 case LSM6DSV16X_406_mg:
7247 *val = LSM6DSV16X_406_mg;
7248 break;
7249
7250 case LSM6DSV16X_469_mg:
7251 *val = LSM6DSV16X_469_mg;
7252 break;
7253
7254 case LSM6DSV16X_500_mg:
7255 *val = LSM6DSV16X_500_mg;
7256 break;
7257
7258 default:
7259 *val = LSM6DSV16X_156_mg;
7260 break;
7261 }
7262
7263 return ret;
7264 }
7265
7266 /**
7267 * @}
7268 *
7269 */
7270
7271 /**
7272 * @defgroup Machine Learning Core (MLC)
7273 * @brief This section group all the functions concerning the
7274 * usage of Machine Learning Core
7275 * @{
7276 *
7277 */
7278
7279 /**
7280 * @brief It enables Machine Learning Core feature (MLC).
7281 * When the Machine Learning Core is enabled the Finite State Machine (FSM)
7282 * programs are executed before executing the MLC algorithms.[set]
7283 *
7284 * @param ctx read / write interface definitions
7285 * @param val MLC_OFF, MLC_ON, MLC_BEFORE_FSM,
7286 * @retval interface status (MANDATORY: return 0 -> no Error)
7287 *
7288 */
lsm6dsv16x_mlc_set(const stmdev_ctx_t * ctx,lsm6dsv16x_mlc_mode_t val)7289 int32_t lsm6dsv16x_mlc_set(const stmdev_ctx_t *ctx, lsm6dsv16x_mlc_mode_t val)
7290 {
7291 lsm6dsv16x_emb_func_en_b_t emb_en_b;
7292 lsm6dsv16x_emb_func_en_a_t emb_en_a;
7293 int32_t ret;
7294
7295 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
7296 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_en_a, 1);
7297 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_en_b, 1);
7298 if (ret != 0)
7299 {
7300 goto exit;
7301 }
7302
7303 switch (val)
7304 {
7305 case LSM6DSV16X_MLC_OFF:
7306 emb_en_a.mlc_before_fsm_en = 0;
7307 emb_en_b.mlc_en = 0;
7308 break;
7309 case LSM6DSV16X_MLC_ON:
7310 emb_en_a.mlc_before_fsm_en = 0;
7311 emb_en_b.mlc_en = 1;
7312 break;
7313 case LSM6DSV16X_MLC_ON_BEFORE_FSM:
7314 emb_en_a.mlc_before_fsm_en = 1;
7315 emb_en_b.mlc_en = 0;
7316 break;
7317 default:
7318 break;
7319 }
7320
7321 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_en_a, 1);
7322 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_en_b, 1);
7323
7324 exit:
7325 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
7326
7327 return ret;
7328 }
7329
7330 /**
7331 * @brief It enables Machine Learning Core feature (MLC).
7332 * When the Machine Learning Core is enabled the Finite State Machine (FSM)
7333 * programs are executed before executing the MLC algorithms.[get]
7334 *
7335 * @param ctx read / write interface definitions
7336 * @param val MLC_OFF, MLC_ON, MLC_BEFORE_FSM,
7337 * @retval interface status (MANDATORY: return 0 -> no Error)
7338 *
7339 */
lsm6dsv16x_mlc_get(const stmdev_ctx_t * ctx,lsm6dsv16x_mlc_mode_t * val)7340 int32_t lsm6dsv16x_mlc_get(const stmdev_ctx_t *ctx, lsm6dsv16x_mlc_mode_t *val)
7341 {
7342 lsm6dsv16x_emb_func_en_b_t emb_en_b;
7343 lsm6dsv16x_emb_func_en_a_t emb_en_a;
7344 int32_t ret;
7345
7346 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
7347 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_en_a, 1);
7348 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_en_b, 1);
7349 if (ret != 0)
7350 {
7351 goto exit;
7352 }
7353
7354 if (emb_en_a.mlc_before_fsm_en == 0U && emb_en_b.mlc_en == 0U)
7355 {
7356 *val = LSM6DSV16X_MLC_OFF;
7357 }
7358 else if (emb_en_a.mlc_before_fsm_en == 0U && emb_en_b.mlc_en == 1U)
7359 {
7360 *val = LSM6DSV16X_MLC_ON;
7361 }
7362 else if (emb_en_a.mlc_before_fsm_en == 1U)
7363 {
7364 *val = LSM6DSV16X_MLC_ON_BEFORE_FSM;
7365 }
7366 else
7367 {
7368 /* Do nothing */
7369 }
7370
7371 exit:
7372 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
7373
7374 return ret;
7375 }
7376
7377 /**
7378 * @brief Machine Learning Core Output Data Rate (ODR) configuration.[set]
7379 *
7380 * @param ctx read / write interface definitions
7381 * @param val MLC_15Hz, MLC_30Hz, MLC_60Hz, MLC_120Hz, MLC_240Hz, MLC_480Hz, MLC_960Hz,
7382 * @retval interface status (MANDATORY: return 0 -> no Error)
7383 *
7384 */
lsm6dsv16x_mlc_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_mlc_data_rate_t val)7385 int32_t lsm6dsv16x_mlc_data_rate_set(const stmdev_ctx_t *ctx,
7386 lsm6dsv16x_mlc_data_rate_t val)
7387 {
7388 lsm6dsv16x_mlc_odr_t mlc_odr;
7389 int32_t ret;
7390
7391 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
7392 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MLC_ODR, (uint8_t *)&mlc_odr, 1);
7393 if (ret != 0)
7394 {
7395 goto exit;
7396 }
7397
7398 mlc_odr.mlc_odr = (uint8_t)val & 0x07U;
7399 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MLC_ODR, (uint8_t *)&mlc_odr, 1);
7400
7401 exit:
7402 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
7403
7404 return ret;
7405 }
7406
7407 /**
7408 * @brief Machine Learning Core Output Data Rate (ODR) configuration.[get]
7409 *
7410 * @param ctx read / write interface definitions
7411 * @param val MLC_15Hz, MLC_30Hz, MLC_60Hz, MLC_120Hz, MLC_240Hz, MLC_480Hz, MLC_960Hz,
7412 * @retval interface status (MANDATORY: return 0 -> no Error)
7413 *
7414 */
lsm6dsv16x_mlc_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_mlc_data_rate_t * val)7415 int32_t lsm6dsv16x_mlc_data_rate_get(const stmdev_ctx_t *ctx,
7416 lsm6dsv16x_mlc_data_rate_t *val)
7417 {
7418 lsm6dsv16x_mlc_odr_t mlc_odr;
7419 int32_t ret;
7420
7421 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
7422 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MLC_ODR, (uint8_t *)&mlc_odr, 1);
7423 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
7424 if (ret != 0)
7425 {
7426 return ret;
7427 }
7428
7429 switch (mlc_odr.mlc_odr)
7430 {
7431 case LSM6DSV16X_MLC_15Hz:
7432 *val = LSM6DSV16X_MLC_15Hz;
7433 break;
7434
7435 case LSM6DSV16X_MLC_30Hz:
7436 *val = LSM6DSV16X_MLC_30Hz;
7437 break;
7438
7439 case LSM6DSV16X_MLC_60Hz:
7440 *val = LSM6DSV16X_MLC_60Hz;
7441 break;
7442
7443 case LSM6DSV16X_MLC_120Hz:
7444 *val = LSM6DSV16X_MLC_120Hz;
7445 break;
7446
7447 case LSM6DSV16X_MLC_240Hz:
7448 *val = LSM6DSV16X_MLC_240Hz;
7449 break;
7450
7451 case LSM6DSV16X_MLC_480Hz:
7452 *val = LSM6DSV16X_MLC_480Hz;
7453 break;
7454
7455 case LSM6DSV16X_MLC_960Hz:
7456 *val = LSM6DSV16X_MLC_960Hz;
7457 break;
7458
7459 default:
7460 *val = LSM6DSV16X_MLC_15Hz;
7461 break;
7462 }
7463
7464 return ret;
7465 }
7466
7467 /**
7468 * @brief Output value of all MLC decision trees.[get]
7469 *
7470 * @param ctx read / write interface definitions
7471 * @param val Output value of all MLC decision trees.
7472 * @retval interface status (MANDATORY: return 0 -> no Error)
7473 *
7474 */
lsm6dsv16x_mlc_out_get(const stmdev_ctx_t * ctx,lsm6dsv16x_mlc_out_t * val)7475 int32_t lsm6dsv16x_mlc_out_get(const stmdev_ctx_t *ctx, lsm6dsv16x_mlc_out_t *val)
7476 {
7477 int32_t ret;
7478
7479 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
7480 if (ret == 0)
7481 {
7482 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MLC1_SRC, (uint8_t *)val, 4);
7483 }
7484 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
7485
7486 return ret;
7487 }
7488
7489 /**
7490 * @brief External sensor sensitivity value register for the Machine Learning Core. This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).Default value is 0x3C00 (when using an external magnetometer this value corresponds to 1 gauss/LSB).[set]
7491 *
7492 * @param ctx read / write interface definitions
7493 * @param val External sensor sensitivity value register for the Machine Learning Core. This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).Default value is 0x3C00 (when using an external magnetometer this value corresponds to 1 gauss/LSB).
7494 * @retval interface status (MANDATORY: return 0 -> no Error)
7495 *
7496 */
lsm6dsv16x_mlc_ext_sens_sensitivity_set(const stmdev_ctx_t * ctx,uint16_t val)7497 int32_t lsm6dsv16x_mlc_ext_sens_sensitivity_set(const stmdev_ctx_t *ctx, uint16_t val)
7498 {
7499 uint8_t buff[2];
7500 int32_t ret;
7501
7502 buff[1] = (uint8_t)(val / 256U);
7503 buff[0] = (uint8_t)(val - (buff[1] * 256U));
7504
7505 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_MLC_EXT_SENSITIVITY_L,
7506 (uint8_t *)&buff[0], 2);
7507
7508 return ret;
7509 }
7510
7511 /**
7512 * @brief External sensor sensitivity value register for the Machine Learning Core. This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).Default value is 0x3C00 (when using an external magnetometer this value corresponds to 1 gauss/LSB).[get]
7513 *
7514 * @param ctx read / write interface definitions
7515 * @param val External sensor sensitivity value register for the Machine Learning Core. This register corresponds to the conversion value of the external sensor. The register value is expressed as half-precision floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent bits; F: 10 fraction bits).Default value is 0x3C00 (when using an external magnetometer this value corresponds to 1 gauss/LSB).
7516 * @retval interface status (MANDATORY: return 0 -> no Error)
7517 *
7518 */
lsm6dsv16x_mlc_ext_sens_sensitivity_get(const stmdev_ctx_t * ctx,uint16_t * val)7519 int32_t lsm6dsv16x_mlc_ext_sens_sensitivity_get(const stmdev_ctx_t *ctx,
7520 uint16_t *val)
7521 {
7522 uint8_t buff[2];
7523 int32_t ret;
7524
7525 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_MLC_EXT_SENSITIVITY_L,
7526 &buff[0], 2);
7527 if (ret != 0)
7528 {
7529 return ret;
7530 }
7531
7532 *val = buff[1];
7533 *val = (*val * 256U) + buff[0];
7534
7535 return ret;
7536 }
7537
7538 /**
7539 * @}
7540 *
7541 */
7542
7543 /**
7544 * @defgroup Optical Image Stabilization (OIS)
7545 * @brief This section groups all the functions concerning
7546 * Optical Image Stabilization (OIS).
7547 * @{
7548 *
7549 */
7550
7551 /**
7552 * @brief Enable the full control of OIS configurations from the UI (User Interface).[set]
7553 *
7554 * @param ctx read / write interface definitions
7555 * @param val OIS_CTRL_FROM_OIS, OIS_CTRL_FROM_UI,
7556 * @retval interface status (MANDATORY: return 0 -> no Error)
7557 *
7558 */
lsm6dsv16x_ois_ctrl_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_ctrl_mode_t val)7559 int32_t lsm6dsv16x_ois_ctrl_mode_set(const stmdev_ctx_t *ctx,
7560 lsm6dsv16x_ois_ctrl_mode_t val)
7561 {
7562 lsm6dsv16x_func_cfg_access_t func_cfg_access;
7563 int32_t ret;
7564
7565 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7566 if (ret == 0)
7567 {
7568 func_cfg_access.ois_ctrl_from_ui = (uint8_t)val & 0x1U;
7569 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7570 }
7571
7572 return ret;
7573 }
7574
7575 /**
7576 * @brief Enable the full control of OIS configurations from the UI (User Interface).[get]
7577 *
7578 * @param ctx read / write interface definitions
7579 * @param val OIS_CTRL_FROM_OIS, OIS_CTRL_FROM_UI,
7580 * @retval interface status (MANDATORY: return 0 -> no Error)
7581 *
7582 */
lsm6dsv16x_ois_ctrl_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_ctrl_mode_t * val)7583 int32_t lsm6dsv16x_ois_ctrl_mode_get(const stmdev_ctx_t *ctx,
7584 lsm6dsv16x_ois_ctrl_mode_t *val)
7585 {
7586 lsm6dsv16x_func_cfg_access_t func_cfg_access;
7587 int32_t ret;
7588
7589 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7590 if (ret != 0)
7591 {
7592 return ret;
7593 }
7594
7595 switch (func_cfg_access.ois_ctrl_from_ui)
7596 {
7597 case LSM6DSV16X_OIS_CTRL_FROM_OIS:
7598 *val = LSM6DSV16X_OIS_CTRL_FROM_OIS;
7599 break;
7600
7601 case LSM6DSV16X_OIS_CTRL_FROM_UI:
7602 *val = LSM6DSV16X_OIS_CTRL_FROM_UI;
7603 break;
7604
7605 default:
7606 *val = LSM6DSV16X_OIS_CTRL_FROM_OIS;
7607 break;
7608 }
7609
7610 return ret;
7611 }
7612
7613 /**
7614 * @brief Resets the control registers of OIS from the UI (User Interface)[set]
7615 *
7616 * @param ctx read / write interface definitions
7617 * @param val Resets the control registers of OIS from the UI (User Interface)
7618 * @retval interface status (MANDATORY: return 0 -> no Error)
7619 *
7620 */
lsm6dsv16x_ois_reset_set(const stmdev_ctx_t * ctx,int8_t val)7621 int32_t lsm6dsv16x_ois_reset_set(const stmdev_ctx_t *ctx, int8_t val)
7622 {
7623 lsm6dsv16x_func_cfg_access_t func_cfg_access;
7624 int32_t ret;
7625
7626 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7627 if (ret == 0)
7628 {
7629 func_cfg_access.spi2_reset = (uint8_t)val;
7630 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7631 }
7632
7633 return ret;
7634 }
7635
7636 /**
7637 * @brief Resets the control registers of OIS from the UI (User Interface)[get]
7638 *
7639 * @param ctx read / write interface definitions
7640 * @param val Resets the control registers of OIS from the UI (User Interface)
7641 * @retval interface status (MANDATORY: return 0 -> no Error)
7642 *
7643 */
lsm6dsv16x_ois_reset_get(const stmdev_ctx_t * ctx,int8_t * val)7644 int32_t lsm6dsv16x_ois_reset_get(const stmdev_ctx_t *ctx, int8_t *val)
7645 {
7646 lsm6dsv16x_func_cfg_access_t func_cfg_access;
7647 int32_t ret;
7648
7649 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
7650 *val = (int8_t)func_cfg_access.spi2_reset;
7651
7652 return ret;
7653 }
7654
7655 /**
7656 * @brief Enable/disable pull up on OIS interface.[set]
7657 *
7658 * @param ctx read / write interface definitions
7659 * @param val Enable/disable pull up on OIS interface.
7660 * @retval interface status (MANDATORY: return 0 -> no Error)
7661 *
7662 */
lsm6dsv16x_ois_interface_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)7663 int32_t lsm6dsv16x_ois_interface_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
7664 {
7665 lsm6dsv16x_pin_ctrl_t pin_ctrl;
7666 int32_t ret;
7667
7668 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7669 if (ret == 0)
7670 {
7671 pin_ctrl.ois_pu_dis = val;
7672 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7673 }
7674
7675 return ret;
7676 }
7677
7678 /**
7679 * @brief Enable/disable pull up on OIS interface.[get]
7680 *
7681 * @param ctx read / write interface definitions
7682 * @param val Enable/disable pull up on OIS interface.
7683 * @retval interface status (MANDATORY: return 0 -> no Error)
7684 *
7685 */
lsm6dsv16x_ois_interface_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)7686 int32_t lsm6dsv16x_ois_interface_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
7687 {
7688 lsm6dsv16x_pin_ctrl_t pin_ctrl;
7689 int32_t ret;
7690
7691 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7692 *val = pin_ctrl.ois_pu_dis;
7693
7694 return ret;
7695 }
7696
7697 /**
7698 * @brief Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.[set]
7699 *
7700 * @param ctx read / write interface definitions
7701 * @param val Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.
7702 * @retval interface status (MANDATORY: return 0 -> no Error)
7703 *
7704 */
lsm6dsv16x_ois_handshake_from_ui_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_handshake_t val)7705 int32_t lsm6dsv16x_ois_handshake_from_ui_set(const stmdev_ctx_t *ctx,
7706 lsm6dsv16x_ois_handshake_t val)
7707 {
7708 lsm6dsv16x_ui_handshake_ctrl_t ui_handshake_ctrl;
7709 int32_t ret;
7710
7711 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_HANDSHAKE_CTRL, (uint8_t *)&ui_handshake_ctrl, 1);
7712 if (ret == 0)
7713 {
7714 ui_handshake_ctrl.ui_shared_ack = val.ack;
7715 ui_handshake_ctrl.ui_shared_req = val.req;
7716 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_HANDSHAKE_CTRL, (uint8_t *)&ui_handshake_ctrl, 1);
7717 }
7718
7719 return ret;
7720 }
7721
7722 /**
7723 * @brief Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.[get]
7724 *
7725 * @param ctx read / write interface definitions
7726 * @param val Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.
7727 * @retval interface status (MANDATORY: return 0 -> no Error)
7728 *
7729 */
lsm6dsv16x_ois_handshake_from_ui_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_handshake_t * val)7730 int32_t lsm6dsv16x_ois_handshake_from_ui_get(const stmdev_ctx_t *ctx,
7731 lsm6dsv16x_ois_handshake_t *val)
7732 {
7733 lsm6dsv16x_ui_handshake_ctrl_t ui_handshake_ctrl;
7734 int32_t ret;
7735
7736 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_HANDSHAKE_CTRL, (uint8_t *)&ui_handshake_ctrl, 1);
7737 if (ret != 0)
7738 {
7739 return ret;
7740 }
7741
7742 val->ack = ui_handshake_ctrl.ui_shared_ack;
7743 val->req = ui_handshake_ctrl.ui_shared_req;
7744
7745 return ret;
7746 }
7747
7748 /**
7749 * @brief Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.[set]
7750 *
7751 * @param ctx read / write interface definitions
7752 * @param val Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.
7753 * @retval interface status (MANDATORY: return 0 -> no Error)
7754 *
7755 */
lsm6dsv16x_ois_handshake_from_ois_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_handshake_t val)7756 int32_t lsm6dsv16x_ois_handshake_from_ois_set(const stmdev_ctx_t *ctx,
7757 lsm6dsv16x_ois_handshake_t val)
7758 {
7759 lsm6dsv16x_spi2_handshake_ctrl_t spi2_handshake_ctrl;
7760 int32_t ret;
7761
7762 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_HANDSHAKE_CTRL, (uint8_t *)&spi2_handshake_ctrl, 1);
7763 if (ret == 0)
7764 {
7765 spi2_handshake_ctrl.spi2_shared_ack = val.ack;
7766 spi2_handshake_ctrl.spi2_shared_req = val.req;
7767 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SPI2_HANDSHAKE_CTRL, (uint8_t *)&spi2_handshake_ctrl, 1);
7768 }
7769
7770 return ret;
7771 }
7772
7773 /**
7774 * @brief Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.[get]
7775 *
7776 * @param ctx read / write interface definitions
7777 * @param val Handshake for (User Interface) UI / (OIS interface) SPI2 shared registers. ACK: This bit acknowledges the handshake. If the secondary interface is not accessing the shared registers, this bit is set to 1 by the device and the R/W operation on the UI_SPI2_SHARED registers is allowed on the primary interface. REQ: This bit is used by the primary interface master to request access to the UI_SPI2_SHARED registers. When the R/W operation is finished, the master must reset this bit.
7778 * @retval interface status (MANDATORY: return 0 -> no Error)
7779 *
7780 */
lsm6dsv16x_ois_handshake_from_ois_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_handshake_t * val)7781 int32_t lsm6dsv16x_ois_handshake_from_ois_get(const stmdev_ctx_t *ctx,
7782 lsm6dsv16x_ois_handshake_t *val)
7783 {
7784 lsm6dsv16x_spi2_handshake_ctrl_t spi2_handshake_ctrl;
7785 int32_t ret;
7786
7787 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SPI2_HANDSHAKE_CTRL, (uint8_t *)&spi2_handshake_ctrl, 1);
7788 if (ret != 0)
7789 {
7790 return ret;
7791 }
7792
7793 val->ack = spi2_handshake_ctrl.spi2_shared_ack;
7794 val->req = spi2_handshake_ctrl.spi2_shared_req;
7795
7796 return ret;
7797 }
7798
7799 /**
7800 * @brief User interface (UI) / SPI2 (OIS) shared registers[set]
7801 *
7802 * @param ctx read / write interface definitions
7803 * @param val User interface (UI) / SPI2 (OIS) shared registers
7804 * @retval interface status (MANDATORY: return 0 -> no Error)
7805 *
7806 */
lsm6dsv16x_ois_shared_set(const stmdev_ctx_t * ctx,uint8_t val[6])7807 int32_t lsm6dsv16x_ois_shared_set(const stmdev_ctx_t *ctx, uint8_t val[6])
7808 {
7809 int32_t ret;
7810
7811 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_SPI2_SHARED_0, val, 6);
7812
7813 return ret;
7814 }
7815
7816 /**
7817 * @brief User interface (UI) / SPI2 (OIS) shared registers[get]
7818 *
7819 * @param ctx read / write interface definitions
7820 * @param val User interface (UI) / SPI2 (OIS) shared registers
7821 * @retval interface status (MANDATORY: return 0 -> no Error)
7822 *
7823 */
lsm6dsv16x_ois_shared_get(const stmdev_ctx_t * ctx,uint8_t val[6])7824 int32_t lsm6dsv16x_ois_shared_get(const stmdev_ctx_t *ctx, uint8_t val[6])
7825 {
7826 int32_t ret;
7827
7828 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_SPI2_SHARED_0, val, 6);
7829
7830 return ret;
7831 }
7832
7833 /**
7834 * @brief In User Interface (UI) full control mode, enables SPI2 (OIS Interface) for reading OIS data. This function works also on OIS (UI_CTRL1_OIS = SPI2_CTRL1_OIS).[set]
7835 *
7836 * @param ctx read / write interface definitions
7837 * @param val In User Interface (UI) full control mode, enables SPI2 (OIS Interface) for reading OIS data.
7838 * @retval interface status (MANDATORY: return 0 -> no Error)
7839 *
7840 */
lsm6dsv16x_ois_on_spi2_set(const stmdev_ctx_t * ctx,uint8_t val)7841 int32_t lsm6dsv16x_ois_on_spi2_set(const stmdev_ctx_t *ctx, uint8_t val)
7842 {
7843 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
7844 int32_t ret;
7845
7846 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7847 if (ret == 0)
7848 {
7849 ui_ctrl1_ois.spi2_read_en = val;
7850 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7851 }
7852
7853 return ret;
7854 }
7855
7856 /**
7857 * @brief In User Interface (UI) full control mode, enables SPI2 (OIS Interface) for reading OIS data. This function works also on OIS (UI_CTRL1_OIS = SPI2_CTRL1_OIS).[get]
7858 *
7859 * @param ctx read / write interface definitions
7860 * @param val In User Interface (UI) full control mode, enables SPI2 (OIS Interface) for reading OIS data.
7861 * @retval interface status (MANDATORY: return 0 -> no Error)
7862 *
7863 */
lsm6dsv16x_ois_on_spi2_get(const stmdev_ctx_t * ctx,uint8_t * val)7864 int32_t lsm6dsv16x_ois_on_spi2_get(const stmdev_ctx_t *ctx, uint8_t *val)
7865 {
7866 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
7867 int32_t ret;
7868
7869 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7870 *val = ui_ctrl1_ois.spi2_read_en;
7871
7872 return ret;
7873 }
7874
7875 /**
7876 * @brief Enables gyroscope/accelerometer OIS chain. This function works also on OIS (UI_CTRL1_OIS = SPI2_CTRL1_OIS).[set]
7877 *
7878 * @param ctx read / write interface definitions
7879 * @param val Enables gyroscope/accelerometer OIS chain.
7880 * @retval interface status (MANDATORY: return 0 -> no Error)
7881 *
7882 */
lsm6dsv16x_ois_chain_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_chain_t val)7883 int32_t lsm6dsv16x_ois_chain_set(const stmdev_ctx_t *ctx, lsm6dsv16x_ois_chain_t val)
7884 {
7885 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
7886 int32_t ret;
7887
7888 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7889 if (ret == 0)
7890 {
7891 ui_ctrl1_ois.ois_g_en = val.gy;
7892 ui_ctrl1_ois.ois_xl_en = val.xl;
7893 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7894 }
7895
7896 return ret;
7897 }
7898
7899 /**
7900 * @brief Enables gyroscope/accelerometer OIS chain.[get]
7901 *
7902 * @param ctx read / write interface definitions
7903 * @param val Enables gyroscope/accelerometer OIS chain.
7904 * @retval interface status (MANDATORY: return 0 -> no Error)
7905 *
7906 */
lsm6dsv16x_ois_chain_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_chain_t * val)7907 int32_t lsm6dsv16x_ois_chain_get(const stmdev_ctx_t *ctx, lsm6dsv16x_ois_chain_t *val)
7908 {
7909 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
7910 int32_t ret;
7911
7912 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
7913 if (ret != 0)
7914 {
7915 return ret;
7916 }
7917
7918 val->gy = ui_ctrl1_ois.ois_g_en;
7919 val->xl = ui_ctrl1_ois.ois_xl_en;
7920
7921 return ret;
7922 }
7923
7924 /**
7925 * @brief Gyroscope OIS full-scale selection[set]
7926 *
7927 * @param ctx read / write interface definitions
7928 * @param val OIS_125dps, OIS_250dps, OIS_500dps, OIS_1000dps, OIS_2000dps,
7929 * @retval interface status (MANDATORY: return 0 -> no Error)
7930 *
7931 */
lsm6dsv16x_ois_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_gy_full_scale_t val)7932 int32_t lsm6dsv16x_ois_gy_full_scale_set(const stmdev_ctx_t *ctx,
7933 lsm6dsv16x_ois_gy_full_scale_t val)
7934 {
7935 lsm6dsv16x_ui_ctrl2_ois_t ui_ctrl2_ois;
7936 int32_t ret;
7937
7938 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
7939 if (ret == 0)
7940 {
7941 ui_ctrl2_ois.fs_g_ois = (uint8_t)val & 0x03U;
7942 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
7943 }
7944
7945 return ret;
7946 }
7947
7948 /**
7949 * @brief Gyroscope OIS full-scale selection[get]
7950 *
7951 * @param ctx read / write interface definitions
7952 * @param val OIS_125dps, OIS_250dps, OIS_500dps, OIS_1000dps, OIS_2000dps,
7953 * @retval interface status (MANDATORY: return 0 -> no Error)
7954 *
7955 */
lsm6dsv16x_ois_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_gy_full_scale_t * val)7956 int32_t lsm6dsv16x_ois_gy_full_scale_get(const stmdev_ctx_t *ctx,
7957 lsm6dsv16x_ois_gy_full_scale_t *val)
7958 {
7959 lsm6dsv16x_ui_ctrl2_ois_t ui_ctrl2_ois;
7960 int32_t ret;
7961
7962 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL2_OIS, (uint8_t *)&ui_ctrl2_ois, 1);
7963 if (ret != 0)
7964 {
7965 return ret;
7966 }
7967
7968 switch (ui_ctrl2_ois.fs_g_ois)
7969 {
7970 case LSM6DSV16X_OIS_125dps:
7971 *val = LSM6DSV16X_OIS_125dps;
7972 break;
7973
7974 case LSM6DSV16X_OIS_250dps:
7975 *val = LSM6DSV16X_OIS_250dps;
7976 break;
7977
7978 case LSM6DSV16X_OIS_500dps:
7979 *val = LSM6DSV16X_OIS_500dps;
7980 break;
7981
7982 case LSM6DSV16X_OIS_1000dps:
7983 *val = LSM6DSV16X_OIS_1000dps;
7984 break;
7985
7986 case LSM6DSV16X_OIS_2000dps:
7987 *val = LSM6DSV16X_OIS_2000dps;
7988 break;
7989
7990 default:
7991 *val = LSM6DSV16X_OIS_125dps;
7992 break;
7993 }
7994
7995 return ret;
7996 }
7997
7998 /**
7999 * @brief Selects accelerometer OIS channel full-scale.[set]
8000 *
8001 * @param ctx read / write interface definitions
8002 * @param val lsm6dsv16x_ois_xl_full_scale_t
8003 * @retval interface status (MANDATORY: return 0 -> no Error)
8004 *
8005 */
lsm6dsv16x_ois_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_xl_full_scale_t val)8006 int32_t lsm6dsv16x_ois_xl_full_scale_set(const stmdev_ctx_t *ctx,
8007 lsm6dsv16x_ois_xl_full_scale_t val)
8008 {
8009 lsm6dsv16x_ui_ctrl3_ois_t ui_ctrl3_ois;
8010 int32_t ret;
8011
8012 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
8013 if (ret == 0)
8014 {
8015 ui_ctrl3_ois.fs_xl_ois = (uint8_t)val & 0x3U;
8016 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
8017 }
8018
8019 return ret;
8020 }
8021
8022 /**
8023 * @brief Selects accelerometer OIS channel full-scale.[get]
8024 *
8025 * @param ctx read / write interface definitions
8026 * @param val lsm6dsv16x_ois_xl_full_scale_t
8027 * @retval interface status (MANDATORY: return 0 -> no Error)
8028 *
8029 */
lsm6dsv16x_ois_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ois_xl_full_scale_t * val)8030 int32_t lsm6dsv16x_ois_xl_full_scale_get(const stmdev_ctx_t *ctx,
8031 lsm6dsv16x_ois_xl_full_scale_t *val)
8032 {
8033 lsm6dsv16x_ui_ctrl3_ois_t ui_ctrl3_ois;
8034 int32_t ret;
8035
8036 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL3_OIS, (uint8_t *)&ui_ctrl3_ois, 1);
8037 if (ret != 0)
8038 {
8039 return ret;
8040 }
8041
8042 switch (ui_ctrl3_ois.fs_xl_ois)
8043 {
8044 case LSM6DSV16X_OIS_2g:
8045 *val = LSM6DSV16X_OIS_2g;
8046 break;
8047
8048 case LSM6DSV16X_OIS_4g:
8049 *val = LSM6DSV16X_OIS_4g;
8050 break;
8051
8052 case LSM6DSV16X_OIS_8g:
8053 *val = LSM6DSV16X_OIS_8g;
8054 break;
8055
8056 case LSM6DSV16X_OIS_16g:
8057 *val = LSM6DSV16X_OIS_16g;
8058 break;
8059
8060 default:
8061 *val = LSM6DSV16X_OIS_2g;
8062 break;
8063 }
8064
8065 return ret;
8066 }
8067
8068 /**
8069 * @}
8070 *
8071 */
8072
8073 /**
8074 * @defgroup Orientation 6D (and 4D)
8075 * @brief This section groups all the functions concerning six position
8076 * detection (6D).
8077 * @{
8078 *
8079 */
8080
8081 /**
8082 * @brief Threshold for 4D/6D function.[set]
8083 *
8084 * @param ctx read / write interface definitions
8085 * @param val DEG_80, DEG_70, DEG_60, DEG_50,
8086 * @retval interface status (MANDATORY: return 0 -> no Error)
8087 *
8088 */
lsm6dsv16x_6d_threshold_set(const stmdev_ctx_t * ctx,lsm6dsv16x_6d_threshold_t val)8089 int32_t lsm6dsv16x_6d_threshold_set(const stmdev_ctx_t *ctx,
8090 lsm6dsv16x_6d_threshold_t val)
8091 {
8092 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
8093 int32_t ret;
8094
8095 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8096 if (ret == 0)
8097 {
8098 tap_ths_6d.sixd_ths = (uint8_t)val & 0x03U;
8099 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8100 }
8101
8102 return ret;
8103 }
8104
8105 /**
8106 * @brief Threshold for 4D/6D function.[get]
8107 *
8108 * @param ctx read / write interface definitions
8109 * @param val DEG_80, DEG_70, DEG_60, DEG_50,
8110 * @retval interface status (MANDATORY: return 0 -> no Error)
8111 *
8112 */
lsm6dsv16x_6d_threshold_get(const stmdev_ctx_t * ctx,lsm6dsv16x_6d_threshold_t * val)8113 int32_t lsm6dsv16x_6d_threshold_get(const stmdev_ctx_t *ctx,
8114 lsm6dsv16x_6d_threshold_t *val)
8115 {
8116 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
8117 int32_t ret;
8118
8119 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8120 if (ret != 0)
8121 {
8122 return ret;
8123 }
8124
8125 switch (tap_ths_6d.sixd_ths)
8126 {
8127 case LSM6DSV16X_DEG_80:
8128 *val = LSM6DSV16X_DEG_80;
8129 break;
8130
8131 case LSM6DSV16X_DEG_70:
8132 *val = LSM6DSV16X_DEG_70;
8133 break;
8134
8135 case LSM6DSV16X_DEG_60:
8136 *val = LSM6DSV16X_DEG_60;
8137 break;
8138
8139 case LSM6DSV16X_DEG_50:
8140 *val = LSM6DSV16X_DEG_50;
8141 break;
8142
8143 default:
8144 *val = LSM6DSV16X_DEG_80;
8145 break;
8146 }
8147
8148 return ret;
8149 }
8150
8151 /**
8152 * @brief 4D orientation detection enable. Z-axis position detection is disabled.[set]
8153 *
8154 * @param ctx read / write interface definitions
8155 * @param val 4D orientation detection enable. Z-axis position detection is disabled.
8156 * @retval interface status (MANDATORY: return 0 -> no Error)
8157 *
8158 */
lsm6dsv16x_4d_mode_set(const stmdev_ctx_t * ctx,uint8_t val)8159 int32_t lsm6dsv16x_4d_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
8160 {
8161 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
8162 int32_t ret;
8163
8164 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8165 if (ret == 0)
8166 {
8167 tap_ths_6d.d4d_en = val;
8168 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8169 }
8170
8171 return ret;
8172 }
8173
8174 /**
8175 * @brief 4D orientation detection enable. Z-axis position detection is disabled.[get]
8176 *
8177 * @param ctx read / write interface definitions
8178 * @param val 4D orientation detection enable. Z-axis position detection is disabled.
8179 * @retval interface status (MANDATORY: return 0 -> no Error)
8180 *
8181 */
lsm6dsv16x_4d_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)8182 int32_t lsm6dsv16x_4d_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
8183 {
8184 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
8185 int32_t ret;
8186
8187 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
8188 *val = tap_ths_6d.d4d_en;
8189
8190 return ret;
8191 }
8192
8193 /**
8194 * @}
8195 *
8196 */
8197
8198 /**
8199 * @defgroup AH_QVAR
8200 * @brief This section group all the functions concerning the
8201 * usage of AH_QVAR
8202 * @{
8203 *
8204 */
8205
8206 /**
8207 * @brief Configures the equivalent input impedance of the AH_QVAR buffers.[set]
8208 *
8209 * @param ctx read / write interface definitions
8210 * @param val 2400MOhm, 730MOhm, 300MOhm, 255MOhm,
8211 * @retval interface status (MANDATORY: return 0 -> no Error)
8212 *
8213 */
lsm6dsv16x_ah_qvar_zin_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ah_qvar_zin_t val)8214 int32_t lsm6dsv16x_ah_qvar_zin_set(const stmdev_ctx_t *ctx,
8215 lsm6dsv16x_ah_qvar_zin_t val)
8216 {
8217 lsm6dsv16x_ctrl7_t ctrl7;
8218 int32_t ret;
8219
8220 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8221 if (ret == 0)
8222 {
8223 ctrl7.ah_qvar_c_zin = (uint8_t)val & 0x03U;
8224 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8225 }
8226
8227 return ret;
8228 }
8229
8230 /**
8231 * @brief Configures the equivalent input impedance of the AH_QVAR buffers.[get]
8232 *
8233 * @param ctx read / write interface definitions
8234 * @param val 2400MOhm, 730MOhm, 300MOhm, 255MOhm,
8235 * @retval interface status (MANDATORY: return 0 -> no Error)
8236 *
8237 */
lsm6dsv16x_ah_qvar_zin_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ah_qvar_zin_t * val)8238 int32_t lsm6dsv16x_ah_qvar_zin_get(const stmdev_ctx_t *ctx,
8239 lsm6dsv16x_ah_qvar_zin_t *val)
8240 {
8241 lsm6dsv16x_ctrl7_t ctrl7;
8242 int32_t ret;
8243
8244 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8245 if (ret != 0)
8246 {
8247 return ret;
8248 }
8249
8250 switch (ctrl7.ah_qvar_c_zin)
8251 {
8252 case LSM6DSV16X_2400MOhm:
8253 *val = LSM6DSV16X_2400MOhm;
8254 break;
8255
8256 case LSM6DSV16X_730MOhm:
8257 *val = LSM6DSV16X_730MOhm;
8258 break;
8259
8260 case LSM6DSV16X_300MOhm:
8261 *val = LSM6DSV16X_300MOhm;
8262 break;
8263
8264 case LSM6DSV16X_255MOhm:
8265 *val = LSM6DSV16X_255MOhm;
8266 break;
8267
8268 default:
8269 *val = LSM6DSV16X_2400MOhm;
8270 break;
8271 }
8272
8273 return ret;
8274 }
8275
8276 /**
8277 * @brief Enables AH_QVAR chain. When this bit is set to ‘1’, the AH_QVAR buffers are connected to the SDx/AH1/Qvar1 and SCx/AH2/Qvar2 pins. Before setting this bit to 1, the accelerometer and gyroscope sensor have to be configured in power-down mode.[set]
8278 *
8279 * @param ctx read / write interface definitions
8280 * @param val Enables AH_QVAR chain. When this bit is set to ‘1’, the AH_QVAR buffers are connected to the SDx/AH1/Qvar1 and SCx/AH2/Qvar2 pins. Before setting this bit to 1, the accelerometer and gyroscope sensor have to be configured in power-down mode.
8281 * @retval interface status (MANDATORY: return 0 -> no Error)
8282 *
8283 */
lsm6dsv16x_ah_qvar_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ah_qvar_mode_t val)8284 int32_t lsm6dsv16x_ah_qvar_mode_set(const stmdev_ctx_t *ctx,
8285 lsm6dsv16x_ah_qvar_mode_t val)
8286 {
8287 lsm6dsv16x_ctrl7_t ctrl7;
8288 int32_t ret;
8289
8290 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8291 if (ret == 0)
8292 {
8293 ctrl7.ah_qvar_en = val.ah_qvar_en;
8294 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8295 }
8296
8297 return ret;
8298 }
8299
8300 /**
8301 * @brief Enables AH_QVAR chain. When this bit is set to ‘1’, the AH_QVAR buffers are connected to the SDx/AH1/Qvar1 and SCx/AH2/Qvar2 pins. Before setting this bit to 1, the accelerometer and gyroscope sensor have to be configured in power-down mode.[get]
8302 *
8303 * @param ctx read / write interface definitions
8304 * @param val Enables AH_QVAR chain. When this bit is set to ‘1’, the AH_QVAR buffers are connected to the SDx/AH1/Qvar1 and SCx/AH2/Qvar2 pins. Before setting this bit to 1, the accelerometer and gyroscope sensor have to be configured in power-down mode.
8305 * @retval interface status (MANDATORY: return 0 -> no Error)
8306 *
8307 */
lsm6dsv16x_ah_qvar_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ah_qvar_mode_t * val)8308 int32_t lsm6dsv16x_ah_qvar_mode_get(const stmdev_ctx_t *ctx,
8309 lsm6dsv16x_ah_qvar_mode_t *val)
8310 {
8311 lsm6dsv16x_ctrl7_t ctrl7;
8312 int32_t ret;
8313
8314 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL7, (uint8_t *)&ctrl7, 1);
8315 val->ah_qvar_en = ctrl7.ah_qvar_en;
8316
8317 return ret;
8318 }
8319
8320 /**
8321 * @}
8322 *
8323 */
8324
8325 /**
8326 * @defgroup SenseWire (I3C)
8327 * @brief This section group all the functions concerning the
8328 * usage of SenseWire (I3C)
8329 * @{
8330 *
8331 */
8332
8333 /**
8334 * @brief Selects the action the device will perform after "Reset whole chip" I3C pattern.[set]
8335 *
8336 * @param ctx read / write interface definitions
8337 * @param val SW_RST_DYN_ADDRESS_RST, GLOBAL_RST,
8338 * @retval interface status (MANDATORY: return 0 -> no Error)
8339 *
8340 */
lsm6dsv16x_i3c_reset_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_i3c_reset_mode_t val)8341 int32_t lsm6dsv16x_i3c_reset_mode_set(const stmdev_ctx_t *ctx,
8342 lsm6dsv16x_i3c_reset_mode_t val)
8343 {
8344 lsm6dsv16x_pin_ctrl_t pin_ctrl;
8345 int32_t ret;
8346
8347 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
8348 if (ret == 0)
8349 {
8350 pin_ctrl.ibhr_por_en = (uint8_t)val & 0x01U;
8351 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
8352 }
8353
8354 return ret;
8355 }
8356
8357 /**
8358 * @brief Selects the action the device will perform after "Reset whole chip" I3C pattern.[get]
8359 *
8360 * @param ctx read / write interface definitions
8361 * @param val SW_RST_DYN_ADDRESS_RST, I3C_GLOBAL_RST,
8362 * @retval interface status (MANDATORY: return 0 -> no Error)
8363 *
8364 */
lsm6dsv16x_i3c_reset_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_i3c_reset_mode_t * val)8365 int32_t lsm6dsv16x_i3c_reset_mode_get(const stmdev_ctx_t *ctx,
8366 lsm6dsv16x_i3c_reset_mode_t *val)
8367 {
8368 lsm6dsv16x_pin_ctrl_t pin_ctrl;
8369 int32_t ret;
8370
8371 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
8372 if (ret != 0)
8373 {
8374 return ret;
8375 }
8376
8377 switch (pin_ctrl.ibhr_por_en)
8378 {
8379 case LSM6DSV16X_SW_RST_DYN_ADDRESS_RST:
8380 *val = LSM6DSV16X_SW_RST_DYN_ADDRESS_RST;
8381 break;
8382
8383 case LSM6DSV16X_I3C_GLOBAL_RST:
8384 *val = LSM6DSV16X_I3C_GLOBAL_RST;
8385 break;
8386
8387 default:
8388 *val = LSM6DSV16X_SW_RST_DYN_ADDRESS_RST;
8389 break;
8390 }
8391
8392 return ret;
8393 }
8394
8395 /**
8396 * @brief Enable/Disable INT pin when I3C is used.[set]
8397 *
8398 * @param ctx read / write interface definitions
8399 * @param val 0: disabled, 1: enabled
8400 * @retval interface status (MANDATORY: return 0 -> no Error)
8401 *
8402 */
lsm6dsv16x_i3c_int_en_set(const stmdev_ctx_t * ctx,uint8_t val)8403 int32_t lsm6dsv16x_i3c_int_en_set(const stmdev_ctx_t *ctx, uint8_t val)
8404 {
8405 lsm6dsv16x_ctrl5_t ctrl5;
8406 int32_t ret;
8407
8408 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8409 if (ret == 0)
8410 {
8411 ctrl5.int_en_i3c = (uint8_t)val & 0x01U;
8412 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8413 }
8414
8415 return ret;
8416 }
8417
8418 /**
8419 * @brief Enable/Disable INT pin when I3C is used.[get]
8420 *
8421 * @param ctx read / write interface definitions
8422 * @param val 0: disabled, 1: enabled
8423 * @retval interface status (MANDATORY: return 0 -> no Error)
8424 *
8425 */
lsm6dsv16x_i3c_int_en_get(const stmdev_ctx_t * ctx,uint8_t * val)8426 int32_t lsm6dsv16x_i3c_int_en_get(const stmdev_ctx_t *ctx, uint8_t *val)
8427 {
8428 lsm6dsv16x_ctrl5_t ctrl5;
8429 int32_t ret;
8430
8431 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8432 *val = ctrl5.int_en_i3c;
8433
8434 return ret;
8435 }
8436
8437 /**
8438 * @brief Select the us activity time for IBI (In-Band Interrupt) with I3C[set]
8439 *
8440 * @param ctx read / write interface definitions
8441 * @param val IBI_2us, IBI_50us, IBI_1ms, IBI_25ms,
8442 * @retval interface status (MANDATORY: return 0 -> no Error)
8443 *
8444 */
lsm6dsv16x_i3c_ibi_time_set(const stmdev_ctx_t * ctx,lsm6dsv16x_i3c_ibi_time_t val)8445 int32_t lsm6dsv16x_i3c_ibi_time_set(const stmdev_ctx_t *ctx,
8446 lsm6dsv16x_i3c_ibi_time_t val)
8447 {
8448 lsm6dsv16x_ctrl5_t ctrl5;
8449 int32_t ret;
8450
8451 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8452 if (ret == 0)
8453 {
8454 ctrl5.bus_act_sel = (uint8_t)val & 0x03U;
8455 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8456 }
8457
8458 return ret;
8459 }
8460
8461 /**
8462 * @brief Select the us activity time for IBI (In-Band Interrupt) with I3C[get]
8463 *
8464 * @param ctx read / write interface definitions
8465 * @param val IBI_2us, IBI_50us, IBI_1ms, IBI_25ms,
8466 * @retval interface status (MANDATORY: return 0 -> no Error)
8467 *
8468 */
lsm6dsv16x_i3c_ibi_time_get(const stmdev_ctx_t * ctx,lsm6dsv16x_i3c_ibi_time_t * val)8469 int32_t lsm6dsv16x_i3c_ibi_time_get(const stmdev_ctx_t *ctx,
8470 lsm6dsv16x_i3c_ibi_time_t *val)
8471 {
8472 lsm6dsv16x_ctrl5_t ctrl5;
8473 int32_t ret;
8474
8475 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_CTRL5, (uint8_t *)&ctrl5, 1);
8476 if (ret != 0)
8477 {
8478 return ret;
8479 }
8480
8481 switch (ctrl5.bus_act_sel)
8482 {
8483 case LSM6DSV16X_IBI_2us:
8484 *val = LSM6DSV16X_IBI_2us;
8485 break;
8486
8487 case LSM6DSV16X_IBI_50us:
8488 *val = LSM6DSV16X_IBI_50us;
8489 break;
8490
8491 case LSM6DSV16X_IBI_1ms:
8492 *val = LSM6DSV16X_IBI_1ms;
8493 break;
8494
8495 case LSM6DSV16X_IBI_25ms:
8496 *val = LSM6DSV16X_IBI_25ms;
8497 break;
8498
8499 default:
8500 *val = LSM6DSV16X_IBI_2us;
8501 break;
8502 }
8503
8504 return ret;
8505 }
8506
8507 /**
8508 * @}
8509 *
8510 */
8511
8512 /**
8513 * @defgroup Sensor hub
8514 * @brief This section groups all the functions that manage the
8515 * sensor hub.
8516 * @{
8517 *
8518 */
8519
8520 /**
8521 * @brief Sensor Hub master I2C pull-up enable.[set]
8522 *
8523 * @param ctx read / write interface definitions
8524 * @param val Sensor Hub master I2C pull-up enable.
8525 * @retval interface status (MANDATORY: return 0 -> no Error)
8526 *
8527 */
lsm6dsv16x_sh_master_interface_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)8528 int32_t lsm6dsv16x_sh_master_interface_pull_up_set(const stmdev_ctx_t *ctx,
8529 uint8_t val)
8530 {
8531 lsm6dsv16x_if_cfg_t if_cfg;
8532 int32_t ret;
8533
8534 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
8535 if (ret == 0)
8536 {
8537 if_cfg.shub_pu_en = val;
8538 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
8539 }
8540
8541 return ret;
8542 }
8543
8544 /**
8545 * @brief Sensor Hub master I2C pull-up enable.[get]
8546 *
8547 * @param ctx read / write interface definitions
8548 * @param val Sensor Hub master I2C pull-up enable.
8549 * @retval interface status (MANDATORY: return 0 -> no Error)
8550 *
8551 */
lsm6dsv16x_sh_master_interface_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)8552 int32_t lsm6dsv16x_sh_master_interface_pull_up_get(const stmdev_ctx_t *ctx,
8553 uint8_t *val)
8554 {
8555 lsm6dsv16x_if_cfg_t if_cfg;
8556 int32_t ret;
8557
8558 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
8559 *val = if_cfg.shub_pu_en;
8560
8561 return ret;
8562 }
8563
8564 /**
8565 * @brief Sensor hub output registers.[get]
8566 *
8567 * @param ctx read / write interface definitions
8568 * @param val Sensor hub output registers.
8569 * @retval interface status (MANDATORY: return 0 -> no Error)
8570 *
8571 */
lsm6dsv16x_sh_read_data_raw_get(const stmdev_ctx_t * ctx,uint8_t * val,uint8_t len)8572 int32_t lsm6dsv16x_sh_read_data_raw_get(const stmdev_ctx_t *ctx, uint8_t *val,
8573 uint8_t len)
8574 {
8575 int32_t ret;
8576
8577 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8578 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SENSOR_HUB_1, val, len);
8579 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8580
8581 return ret;
8582 }
8583
8584 /**
8585 * @brief Number of external sensors to be read by the sensor hub.[set]
8586 *
8587 * @param ctx read / write interface definitions
8588 * @param val SLV_0, SLV_0_1, SLV_0_1_2, SLV_0_1_2_3,
8589 * @retval interface status (MANDATORY: return 0 -> no Error)
8590 *
8591 */
lsm6dsv16x_sh_slave_connected_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_slave_connected_t val)8592 int32_t lsm6dsv16x_sh_slave_connected_set(const stmdev_ctx_t *ctx,
8593 lsm6dsv16x_sh_slave_connected_t val)
8594 {
8595 lsm6dsv16x_master_config_t master_config;
8596 int32_t ret;
8597
8598 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8599 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8600 if (ret != 0)
8601 {
8602 goto exit;
8603 }
8604
8605 master_config.aux_sens_on = (uint8_t)val & 0x3U;
8606 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8607
8608 exit:
8609 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8610
8611 return ret;
8612 }
8613
8614 /**
8615 * @brief Number of external sensors to be read by the sensor hub.[get]
8616 *
8617 * @param ctx read / write interface definitions
8618 * @param val SLV_0, SLV_0_1, SLV_0_1_2, SLV_0_1_2_3,
8619 * @retval interface status (MANDATORY: return 0 -> no Error)
8620 *
8621 */
lsm6dsv16x_sh_slave_connected_get(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_slave_connected_t * val)8622 int32_t lsm6dsv16x_sh_slave_connected_get(const stmdev_ctx_t *ctx,
8623 lsm6dsv16x_sh_slave_connected_t *val)
8624 {
8625 lsm6dsv16x_master_config_t master_config;
8626 int32_t ret;
8627
8628 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8629 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8630 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8631 if (ret != 0)
8632 {
8633 return ret;
8634 }
8635
8636 switch (master_config.aux_sens_on)
8637 {
8638 case LSM6DSV16X_SLV_0:
8639 *val = LSM6DSV16X_SLV_0;
8640 break;
8641
8642 case LSM6DSV16X_SLV_0_1:
8643 *val = LSM6DSV16X_SLV_0_1;
8644 break;
8645
8646 case LSM6DSV16X_SLV_0_1_2:
8647 *val = LSM6DSV16X_SLV_0_1_2;
8648 break;
8649
8650 case LSM6DSV16X_SLV_0_1_2_3:
8651 *val = LSM6DSV16X_SLV_0_1_2_3;
8652 break;
8653
8654 default:
8655 *val = LSM6DSV16X_SLV_0;
8656 break;
8657 }
8658
8659 return ret;
8660 }
8661
8662 /**
8663 * @brief Sensor hub I2C master enable.[set]
8664 *
8665 * @param ctx read / write interface definitions
8666 * @param val Sensor hub I2C master enable.
8667 * @retval interface status (MANDATORY: return 0 -> no Error)
8668 *
8669 */
lsm6dsv16x_sh_master_set(const stmdev_ctx_t * ctx,uint8_t val)8670 int32_t lsm6dsv16x_sh_master_set(const stmdev_ctx_t *ctx, uint8_t val)
8671 {
8672 lsm6dsv16x_master_config_t master_config;
8673 int32_t ret;
8674
8675 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8676 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8677 if (ret != 0)
8678 {
8679 goto exit;
8680 }
8681
8682 master_config.master_on = val;
8683 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8684
8685 exit:
8686 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8687
8688 return ret;
8689 }
8690
8691 /**
8692 * @brief Sensor hub I2C master enable.[get]
8693 *
8694 * @param ctx read / write interface definitions
8695 * @param val Sensor hub I2C master enable.
8696 * @retval interface status (MANDATORY: return 0 -> no Error)
8697 *
8698 */
lsm6dsv16x_sh_master_get(const stmdev_ctx_t * ctx,uint8_t * val)8699 int32_t lsm6dsv16x_sh_master_get(const stmdev_ctx_t *ctx, uint8_t *val)
8700 {
8701 lsm6dsv16x_master_config_t master_config;
8702 int32_t ret;
8703
8704 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8705 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8706
8707 *val = master_config.master_on;
8708
8709 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8710
8711 return ret;
8712 }
8713
8714 /**
8715 * @brief I2C interface pass-through.[set]
8716 *
8717 * @param ctx read / write interface definitions
8718 * @param val I2C interface pass-through.
8719 * @retval interface status (MANDATORY: return 0 -> no Error)
8720 *
8721 */
lsm6dsv16x_sh_pass_through_set(const stmdev_ctx_t * ctx,uint8_t val)8722 int32_t lsm6dsv16x_sh_pass_through_set(const stmdev_ctx_t *ctx, uint8_t val)
8723 {
8724 lsm6dsv16x_master_config_t master_config;
8725 int32_t ret;
8726
8727 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8728 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8729 if (ret != 0)
8730 {
8731 goto exit;
8732 }
8733
8734 master_config.pass_through_mode = val;
8735 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8736
8737 exit:
8738 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8739
8740 return ret;
8741 }
8742
8743 /**
8744 * @brief I2C interface pass-through.[get]
8745 *
8746 * @param ctx read / write interface definitions
8747 * @param val I2C interface pass-through.
8748 * @retval interface status (MANDATORY: return 0 -> no Error)
8749 *
8750 */
lsm6dsv16x_sh_pass_through_get(const stmdev_ctx_t * ctx,uint8_t * val)8751 int32_t lsm6dsv16x_sh_pass_through_get(const stmdev_ctx_t *ctx, uint8_t *val)
8752 {
8753 lsm6dsv16x_master_config_t master_config;
8754 int32_t ret;
8755
8756 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8757 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8758
8759 *val = master_config.pass_through_mode;
8760
8761 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8762
8763 return ret;
8764 }
8765
8766 /**
8767 * @brief Sensor hub trigger signal selection.[set]
8768 *
8769 * @param ctx read / write interface definitions
8770 * @param val SH_TRG_XL_GY_DRDY, SH_TRIG_INT2,
8771 * @retval interface status (MANDATORY: return 0 -> no Error)
8772 *
8773 */
lsm6dsv16x_sh_syncro_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_syncro_mode_t val)8774 int32_t lsm6dsv16x_sh_syncro_mode_set(const stmdev_ctx_t *ctx,
8775 lsm6dsv16x_sh_syncro_mode_t val)
8776 {
8777 lsm6dsv16x_master_config_t master_config;
8778 int32_t ret;
8779
8780 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8781 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8782 if (ret != 0)
8783 {
8784 goto exit;
8785 }
8786
8787 master_config.start_config = (uint8_t)val & 0x01U;
8788 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8789
8790 exit:
8791 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8792
8793 return ret;
8794 }
8795
8796 /**
8797 * @brief Sensor hub trigger signal selection.[get]
8798 *
8799 * @param ctx read / write interface definitions
8800 * @param val SH_TRG_XL_GY_DRDY, SH_TRIG_INT2,
8801 * @retval interface status (MANDATORY: return 0 -> no Error)
8802 *
8803 */
lsm6dsv16x_sh_syncro_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_syncro_mode_t * val)8804 int32_t lsm6dsv16x_sh_syncro_mode_get(const stmdev_ctx_t *ctx,
8805 lsm6dsv16x_sh_syncro_mode_t *val)
8806 {
8807 lsm6dsv16x_master_config_t master_config;
8808 int32_t ret;
8809
8810 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8811 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8812 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8813 if (ret != 0)
8814 {
8815 return ret;
8816 }
8817
8818 switch (master_config.start_config)
8819 {
8820 case LSM6DSV16X_SH_TRG_XL_GY_DRDY:
8821 *val = LSM6DSV16X_SH_TRG_XL_GY_DRDY;
8822 break;
8823
8824 case LSM6DSV16X_SH_TRIG_INT2:
8825 *val = LSM6DSV16X_SH_TRIG_INT2;
8826 break;
8827
8828 default:
8829 *val = LSM6DSV16X_SH_TRG_XL_GY_DRDY;
8830 break;
8831 }
8832
8833 return ret;
8834 }
8835
8836 /**
8837 * @brief Slave 0 write operation is performed only at the first sensor hub cycle.[set]
8838 *
8839 * @param ctx read / write interface definitions
8840 * @param val EACH_SH_CYCLE, ONLY_FIRST_CYCLE,
8841 * @retval interface status (MANDATORY: return 0 -> no Error)
8842 *
8843 */
lsm6dsv16x_sh_write_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_write_mode_t val)8844 int32_t lsm6dsv16x_sh_write_mode_set(const stmdev_ctx_t *ctx,
8845 lsm6dsv16x_sh_write_mode_t val)
8846 {
8847 lsm6dsv16x_master_config_t master_config;
8848 int32_t ret;
8849
8850 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8851 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8852 if (ret != 0)
8853 {
8854 goto exit;
8855 }
8856
8857 master_config.write_once = (uint8_t)val & 0x01U;
8858 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8859
8860 exit:
8861 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8862
8863 return ret;
8864 }
8865
8866 /**
8867 * @brief Slave 0 write operation is performed only at the first sensor hub cycle.[get]
8868 *
8869 * @param ctx read / write interface definitions
8870 * @param val EACH_SH_CYCLE, ONLY_FIRST_CYCLE,
8871 * @retval interface status (MANDATORY: return 0 -> no Error)
8872 *
8873 */
lsm6dsv16x_sh_write_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_write_mode_t * val)8874 int32_t lsm6dsv16x_sh_write_mode_get(const stmdev_ctx_t *ctx,
8875 lsm6dsv16x_sh_write_mode_t *val)
8876 {
8877 lsm6dsv16x_master_config_t master_config;
8878 int32_t ret;
8879
8880 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8881 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8882 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8883 if (ret != 0)
8884 {
8885 return ret;
8886 }
8887
8888 switch (master_config.write_once)
8889 {
8890 case LSM6DSV16X_EACH_SH_CYCLE:
8891 *val = LSM6DSV16X_EACH_SH_CYCLE;
8892 break;
8893
8894 case LSM6DSV16X_ONLY_FIRST_CYCLE:
8895 *val = LSM6DSV16X_ONLY_FIRST_CYCLE;
8896 break;
8897
8898 default:
8899 *val = LSM6DSV16X_EACH_SH_CYCLE;
8900 break;
8901 }
8902
8903 return ret;
8904 }
8905
8906 /**
8907 * @brief Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.[set]
8908 *
8909 * @param ctx read / write interface definitions
8910 * @param val Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.
8911 * @retval interface status (MANDATORY: return 0 -> no Error)
8912 *
8913 */
lsm6dsv16x_sh_reset_set(const stmdev_ctx_t * ctx,uint8_t val)8914 int32_t lsm6dsv16x_sh_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
8915 {
8916 lsm6dsv16x_master_config_t master_config;
8917 int32_t ret;
8918
8919 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8920 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8921 if (ret != 0)
8922 {
8923 goto exit;
8924 }
8925
8926 master_config.rst_master_regs = val;
8927 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8928
8929 exit:
8930 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8931
8932 return ret;
8933 }
8934
8935 /**
8936 * @brief Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.[get]
8937 *
8938 * @param ctx read / write interface definitions
8939 * @param val Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.
8940 * @retval interface status (MANDATORY: return 0 -> no Error)
8941 *
8942 */
lsm6dsv16x_sh_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)8943 int32_t lsm6dsv16x_sh_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
8944 {
8945 lsm6dsv16x_master_config_t master_config;
8946 int32_t ret;
8947
8948 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8949 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_MASTER_CONFIG, (uint8_t *)&master_config, 1);
8950
8951 *val = master_config.rst_master_regs;
8952
8953 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
8954
8955 return ret;
8956 }
8957
8958 /**
8959 * @brief Configure slave 0 for perform a write.[set]
8960 *
8961 * @param ctx read / write interface definitions
8962 * @param val a structure that contain
8963 * - uint8_t slv1_add; 8 bit i2c device address
8964 * - uint8_t slv1_subadd; 8 bit register device address
8965 * - uint8_t slv1_data; 8 bit data to write
8966 * @retval interface status (MANDATORY: return 0 -> no Error)
8967 *
8968 */
lsm6dsv16x_sh_cfg_write(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_cfg_write_t * val)8969 int32_t lsm6dsv16x_sh_cfg_write(const stmdev_ctx_t *ctx,
8970 lsm6dsv16x_sh_cfg_write_t *val)
8971 {
8972 lsm6dsv16x_slv0_add_t reg;
8973 int32_t ret;
8974
8975 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
8976 if (ret != 0)
8977 {
8978 return ret;
8979 }
8980
8981 reg.slave0_add = val->slv0_add;
8982 reg.rw_0 = 0;
8983 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_ADD, (uint8_t *)®, 1);
8984 if (ret != 0)
8985 {
8986 goto exit;
8987 }
8988
8989 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_SUBADD,
8990 &(val->slv0_subadd), 1);
8991 if (ret != 0)
8992 {
8993 goto exit;
8994 }
8995
8996 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_DATAWRITE_SLV0,
8997 &(val->slv0_data), 1);
8998
8999 exit:
9000 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9001
9002 return ret;
9003 }
9004
9005 /**
9006 * @brief Rate at which the master communicates.[set]
9007 *
9008 * @param ctx read / write interface definitions
9009 * @param val SH_15Hz, SH_30Hz, SH_60Hz, SH_120Hz, SH_240Hz, SH_480Hz,
9010 * @retval interface status (MANDATORY: return 0 -> no Error)
9011 *
9012 */
lsm6dsv16x_sh_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_data_rate_t val)9013 int32_t lsm6dsv16x_sh_data_rate_set(const stmdev_ctx_t *ctx,
9014 lsm6dsv16x_sh_data_rate_t val)
9015 {
9016 lsm6dsv16x_slv0_config_t slv0_config;
9017 int32_t ret;
9018
9019 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
9020 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
9021 if (ret != 0)
9022 {
9023 goto exit;
9024 }
9025
9026 slv0_config.shub_odr = (uint8_t)val & 0x07U;
9027 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
9028
9029 exit:
9030 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9031
9032 return ret;
9033 }
9034
9035 /**
9036 * @brief Rate at which the master communicates.[get]
9037 *
9038 * @param ctx read / write interface definitions
9039 * @param val SH_15Hz, SH_30Hz, SH_60Hz, SH_120Hz, SH_240Hz, SH_480Hz,
9040 * @retval interface status (MANDATORY: return 0 -> no Error)
9041 *
9042 */
lsm6dsv16x_sh_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_sh_data_rate_t * val)9043 int32_t lsm6dsv16x_sh_data_rate_get(const stmdev_ctx_t *ctx,
9044 lsm6dsv16x_sh_data_rate_t *val)
9045 {
9046 lsm6dsv16x_slv0_config_t slv0_config;
9047 int32_t ret;
9048
9049 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
9050 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
9051 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9052 if (ret != 0)
9053 {
9054 return ret;
9055 }
9056
9057 switch (slv0_config.shub_odr)
9058 {
9059 case LSM6DSV16X_SH_15Hz:
9060 *val = LSM6DSV16X_SH_15Hz;
9061 break;
9062
9063 case LSM6DSV16X_SH_30Hz:
9064 *val = LSM6DSV16X_SH_30Hz;
9065 break;
9066
9067 case LSM6DSV16X_SH_60Hz:
9068 *val = LSM6DSV16X_SH_60Hz;
9069 break;
9070
9071 case LSM6DSV16X_SH_120Hz:
9072 *val = LSM6DSV16X_SH_120Hz;
9073 break;
9074
9075 case LSM6DSV16X_SH_240Hz:
9076 *val = LSM6DSV16X_SH_240Hz;
9077 break;
9078
9079 case LSM6DSV16X_SH_480Hz:
9080 *val = LSM6DSV16X_SH_480Hz;
9081 break;
9082
9083 default:
9084 *val = LSM6DSV16X_SH_15Hz;
9085 break;
9086 }
9087
9088 return ret;
9089 }
9090
9091 /**
9092 * @brief Configure slave idx for perform a read.[set]
9093 *
9094 * @param ctx read / write interface definitions
9095 * @param val Structure that contain
9096 * - uint8_t slv_add; 8 bit i2c device address
9097 * - uint8_t slv_subadd; 8 bit register device address
9098 * - uint8_t slv_len; num of bit to read
9099 * @retval interface status (MANDATORY: return 0 -> no Error)
9100 *
9101 */
lsm6dsv16x_sh_slv_cfg_read(const stmdev_ctx_t * ctx,uint8_t idx,lsm6dsv16x_sh_cfg_read_t * val)9102 int32_t lsm6dsv16x_sh_slv_cfg_read(const stmdev_ctx_t *ctx, uint8_t idx,
9103 lsm6dsv16x_sh_cfg_read_t *val)
9104 {
9105 lsm6dsv16x_slv0_add_t slv_add;
9106 lsm6dsv16x_slv0_config_t slv_config;
9107 int32_t ret;
9108
9109 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_SENSOR_HUB_MEM_BANK);
9110 if (ret != 0)
9111 {
9112 return ret;
9113 }
9114
9115 slv_add.slave0_add = val->slv_add;
9116 slv_add.rw_0 = 1;
9117 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_ADD + idx * 3U,
9118 (uint8_t *)&slv_add, 1);
9119 if (ret != 0)
9120 {
9121 goto exit;
9122 }
9123
9124 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_SUBADD + idx * 3U,
9125 &(val->slv_subadd), 1);
9126 if (ret != 0)
9127 {
9128 goto exit;
9129 }
9130
9131 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SLV0_CONFIG + idx * 3U,
9132 (uint8_t *)&slv_config, 1);
9133 if (ret != 0)
9134 {
9135 goto exit;
9136 }
9137
9138 slv_config.slave0_numop = val->slv_len;
9139 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SLV0_CONFIG + idx * 3U,
9140 (uint8_t *)&slv_config, 1);
9141
9142 exit:
9143 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9144
9145 return ret;
9146 }
9147
9148 /**
9149 * @brief Sensor hub source register.[get]
9150 *
9151 * @param ctx read / write interface definitions
9152 * @param val union of registers from STATUS_MASTER to
9153 * @retval interface status (MANDATORY: return 0 -> no Error)
9154 *
9155 */
lsm6dsv16x_sh_status_get(const stmdev_ctx_t * ctx,lsm6dsv16x_status_master_t * val)9156 int32_t lsm6dsv16x_sh_status_get(const stmdev_ctx_t *ctx,
9157 lsm6dsv16x_status_master_t *val)
9158 {
9159 int32_t ret;
9160
9161 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_STATUS_MASTER_MAINPAGE, (uint8_t *) val, 1);
9162
9163 return ret;
9164 }
9165
9166 /**
9167 * @}
9168 *
9169 */
9170
9171 /**
9172 * @defgroup Serial interfaces
9173 * @brief This section groups all the functions concerning
9174 * serial interfaces management (not auxiliary)
9175 * @{
9176 *
9177 */
9178
9179 /**
9180 * @brief Enables pull-up on SDO pin of UI (User Interface).[set]
9181 *
9182 * @param ctx read / write interface definitions
9183 * @param val Enables pull-up on SDO pin of UI (User Interface).
9184 * @retval interface status (MANDATORY: return 0 -> no Error)
9185 *
9186 */
lsm6dsv16x_ui_sdo_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)9187 int32_t lsm6dsv16x_ui_sdo_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
9188 {
9189 lsm6dsv16x_pin_ctrl_t pin_ctrl;
9190 int32_t ret;
9191
9192 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
9193 if (ret == 0)
9194 {
9195 pin_ctrl.sdo_pu_en = val;
9196 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
9197 }
9198
9199 return ret;
9200 }
9201
9202 /**
9203 * @brief Enables pull-up on SDO pin of UI (User Interface).[get]
9204 *
9205 * @param ctx read / write interface definitions
9206 * @param val Enables pull-up on SDO pin of UI (User Interface).
9207 * @retval interface status (MANDATORY: return 0 -> no Error)
9208 *
9209 */
lsm6dsv16x_ui_sdo_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)9210 int32_t lsm6dsv16x_ui_sdo_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
9211 {
9212 lsm6dsv16x_pin_ctrl_t pin_ctrl;
9213 int32_t ret;
9214
9215 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
9216 *val = pin_ctrl.sdo_pu_en;
9217
9218 return ret;
9219 }
9220
9221 /**
9222 * @brief Disables I2C and I3C on UI (User Interface).[set]
9223 *
9224 * @param ctx read / write interface definitions
9225 * @param val I2C_I3C_ENABLE, I2C_I3C_DISABLE,
9226 * @retval interface status (MANDATORY: return 0 -> no Error)
9227 *
9228 */
lsm6dsv16x_ui_i2c_i3c_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_ui_i2c_i3c_mode_t val)9229 int32_t lsm6dsv16x_ui_i2c_i3c_mode_set(const stmdev_ctx_t *ctx,
9230 lsm6dsv16x_ui_i2c_i3c_mode_t val)
9231 {
9232 lsm6dsv16x_if_cfg_t if_cfg;
9233 int32_t ret;
9234
9235 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9236 if (ret == 0)
9237 {
9238 if_cfg.i2c_i3c_disable = (uint8_t)val & 0x1U;
9239 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9240 }
9241
9242 return ret;
9243 }
9244
9245 /**
9246 * @brief Disables I2C and I3C on UI (User Interface).[get]
9247 *
9248 * @param ctx read / write interface definitions
9249 * @param val I2C_I3C_ENABLE, I2C_I3C_DISABLE,
9250 * @retval interface status (MANDATORY: return 0 -> no Error)
9251 *
9252 */
lsm6dsv16x_ui_i2c_i3c_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_ui_i2c_i3c_mode_t * val)9253 int32_t lsm6dsv16x_ui_i2c_i3c_mode_get(const stmdev_ctx_t *ctx,
9254 lsm6dsv16x_ui_i2c_i3c_mode_t *val)
9255 {
9256 lsm6dsv16x_if_cfg_t if_cfg;
9257 int32_t ret;
9258
9259 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9260 if (ret != 0)
9261 {
9262 return ret;
9263 }
9264
9265 switch (if_cfg.i2c_i3c_disable)
9266 {
9267 case LSM6DSV16X_I2C_I3C_ENABLE:
9268 *val = LSM6DSV16X_I2C_I3C_ENABLE;
9269 break;
9270
9271 case LSM6DSV16X_I2C_I3C_DISABLE:
9272 *val = LSM6DSV16X_I2C_I3C_DISABLE;
9273 break;
9274
9275 default:
9276 *val = LSM6DSV16X_I2C_I3C_ENABLE;
9277 break;
9278 }
9279
9280 return ret;
9281 }
9282
9283 /**
9284 * @brief SPI Serial Interface Mode selection.[set]
9285 *
9286 * @param ctx read / write interface definitions
9287 * @param val SPI_4_WIRE, SPI_3_WIRE,
9288 * @retval interface status (MANDATORY: return 0 -> no Error)
9289 *
9290 */
lsm6dsv16x_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_spi_mode_t val)9291 int32_t lsm6dsv16x_spi_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_spi_mode_t val)
9292 {
9293 lsm6dsv16x_if_cfg_t if_cfg;
9294 int32_t ret;
9295
9296 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9297 if (ret == 0)
9298 {
9299 if_cfg.sim = (uint8_t)val & 0x01U;
9300 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9301 }
9302
9303 return ret;
9304 }
9305
9306 /**
9307 * @brief SPI Serial Interface Mode selection.[get]
9308 *
9309 * @param ctx read / write interface definitions
9310 * @param val SPI_4_WIRE, SPI_3_WIRE,
9311 * @retval interface status (MANDATORY: return 0 -> no Error)
9312 *
9313 */
lsm6dsv16x_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_spi_mode_t * val)9314 int32_t lsm6dsv16x_spi_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_spi_mode_t *val)
9315 {
9316 lsm6dsv16x_if_cfg_t if_cfg;
9317 int32_t ret;
9318
9319 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9320 if (ret != 0)
9321 {
9322 return ret;
9323 }
9324
9325 switch (if_cfg.sim)
9326 {
9327 case LSM6DSV16X_SPI_4_WIRE:
9328 *val = LSM6DSV16X_SPI_4_WIRE;
9329 break;
9330
9331 case LSM6DSV16X_SPI_3_WIRE:
9332 *val = LSM6DSV16X_SPI_3_WIRE;
9333 break;
9334
9335 default:
9336 *val = LSM6DSV16X_SPI_4_WIRE;
9337 break;
9338 }
9339
9340 return ret;
9341 }
9342
9343 /**
9344 * @brief Enables pull-up on SDA pin.[set]
9345 *
9346 * @param ctx read / write interface definitions
9347 * @param val Enables pull-up on SDA pin.
9348 * @retval interface status (MANDATORY: return 0 -> no Error)
9349 *
9350 */
lsm6dsv16x_ui_sda_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)9351 int32_t lsm6dsv16x_ui_sda_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
9352 {
9353 lsm6dsv16x_if_cfg_t if_cfg;
9354 int32_t ret;
9355
9356 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9357 if (ret == 0)
9358 {
9359 if_cfg.sda_pu_en = val;
9360 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9361 }
9362
9363 return ret;
9364 }
9365
9366 /**
9367 * @brief Enables pull-up on SDA pin.[get]
9368 *
9369 * @param ctx read / write interface definitions
9370 * @param val Enables pull-up on SDA pin.
9371 * @retval interface status (MANDATORY: return 0 -> no Error)
9372 *
9373 */
lsm6dsv16x_ui_sda_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)9374 int32_t lsm6dsv16x_ui_sda_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
9375 {
9376 lsm6dsv16x_if_cfg_t if_cfg;
9377 int32_t ret;
9378
9379 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_IF_CFG, (uint8_t *)&if_cfg, 1);
9380 *val = if_cfg.sda_pu_en;
9381
9382 return ret;
9383 }
9384
9385 /**
9386 * @brief SPI2 (OIS Inteface) Serial Interface Mode selection. This function works also on OIS (UI_CTRL1_OIS = SPI2_CTRL1_OIS).[set]
9387 *
9388 * @param ctx read / write interface definitions
9389 * @param val SPI2_4_WIRE, SPI2_3_WIRE,
9390 * @retval interface status (MANDATORY: return 0 -> no Error)
9391 *
9392 */
lsm6dsv16x_spi2_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_spi2_mode_t val)9393 int32_t lsm6dsv16x_spi2_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_spi2_mode_t val)
9394 {
9395 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
9396 int32_t ret;
9397
9398 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
9399 if (ret == 0)
9400 {
9401 ui_ctrl1_ois.sim_ois = (uint8_t)val & 0x01U;
9402 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
9403 }
9404
9405 return ret;
9406 }
9407
9408 /**
9409 * @brief SPI2 (OIS Inteface) Serial Interface Mode selection. This function works also on OIS (UI_CTRL1_OIS = SPI2_CTRL1_OIS).[get]
9410 *
9411 * @param ctx read / write interface definitions
9412 * @param val SPI2_4_WIRE, SPI2_3_WIRE,
9413 * @retval interface status (MANDATORY: return 0 -> no Error)
9414 *
9415 */
lsm6dsv16x_spi2_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_spi2_mode_t * val)9416 int32_t lsm6dsv16x_spi2_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_spi2_mode_t *val)
9417 {
9418 lsm6dsv16x_ui_ctrl1_ois_t ui_ctrl1_ois;
9419 int32_t ret;
9420
9421 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_UI_CTRL1_OIS, (uint8_t *)&ui_ctrl1_ois, 1);
9422 if (ret != 0)
9423 {
9424 return ret;
9425 }
9426
9427 switch (ui_ctrl1_ois.sim_ois)
9428 {
9429 case LSM6DSV16X_SPI2_4_WIRE:
9430 *val = LSM6DSV16X_SPI2_4_WIRE;
9431 break;
9432
9433 case LSM6DSV16X_SPI2_3_WIRE:
9434 *val = LSM6DSV16X_SPI2_3_WIRE;
9435 break;
9436
9437 default:
9438 *val = LSM6DSV16X_SPI2_4_WIRE;
9439 break;
9440 }
9441
9442 return ret;
9443 }
9444
9445 /**
9446 * @}
9447 *
9448 */
9449
9450 /**
9451 * @defgroup Significant motion detection
9452 * @brief This section groups all the functions that manage the
9453 * significant motion detection.
9454 * @{
9455 *
9456 */
9457
9458
9459 /**
9460 * @brief Enables significant motion detection function.[set]
9461 *
9462 * @param ctx read / write interface definitions
9463 * @param val Enables significant motion detection function.
9464 * @retval interface status (MANDATORY: return 0 -> no Error)
9465 *
9466 */
lsm6dsv16x_sigmot_mode_set(const stmdev_ctx_t * ctx,uint8_t val)9467 int32_t lsm6dsv16x_sigmot_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
9468 {
9469 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9470 int32_t ret;
9471
9472 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9473 if (ret != 0)
9474 {
9475 return ret;
9476 }
9477
9478 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9479 emb_func_en_a.sign_motion_en = val;
9480 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9481
9482 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9483
9484 return ret;
9485 }
9486
9487 /**
9488 * @brief Enables significant motion detection function.[get]
9489 *
9490 * @param ctx read / write interface definitions
9491 * @param val Enables significant motion detection function.
9492 * @retval interface status (MANDATORY: return 0 -> no Error)
9493 *
9494 */
lsm6dsv16x_sigmot_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)9495 int32_t lsm6dsv16x_sigmot_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
9496 {
9497 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9498 int32_t ret;
9499
9500 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9501 if (ret != 0)
9502 {
9503 return ret;
9504 }
9505
9506 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9507 *val = emb_func_en_a.sign_motion_en;
9508
9509 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9510
9511 return ret;
9512 }
9513
9514 /**
9515 * @}
9516 *
9517 */
9518
9519 /**
9520 * @defgroup Step Counter (Pedometer)
9521 * @brief This section groups all the functions that manage pedometer.
9522 * @{
9523 *
9524 */
9525
9526 /**
9527 * @brief Step counter mode[set]
9528 *
9529 * @param ctx read / write interface definitions
9530 * @param val Step counter mode
9531 * @retval interface status (MANDATORY: return 0 -> no Error)
9532 *
9533 */
lsm6dsv16x_stpcnt_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_stpcnt_mode_t val)9534 int32_t lsm6dsv16x_stpcnt_mode_set(const stmdev_ctx_t *ctx,
9535 lsm6dsv16x_stpcnt_mode_t val)
9536 {
9537 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9538 lsm6dsv16x_emb_func_en_b_t emb_func_en_b;
9539 lsm6dsv16x_pedo_cmd_reg_t pedo_cmd_reg;
9540 int32_t ret;
9541
9542 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9543 if (ret != 0)
9544 {
9545 return ret;
9546 }
9547
9548 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9549 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
9550 if (ret != 0)
9551 {
9552 goto exit;
9553 }
9554
9555 if ((val.false_step_rej == PROPERTY_ENABLE)
9556 && ((emb_func_en_a.mlc_before_fsm_en & emb_func_en_b.mlc_en) ==
9557 PROPERTY_DISABLE))
9558 {
9559 emb_func_en_a.mlc_before_fsm_en = PROPERTY_ENABLE;
9560 }
9561
9562 emb_func_en_a.pedo_en = val.step_counter_enable;
9563 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9564
9565 exit:
9566 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9567
9568 if (ret == 0)
9569 {
9570 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_CMD_REG,
9571 (uint8_t *)&pedo_cmd_reg, 1);
9572 pedo_cmd_reg.fp_rejection_en = val.false_step_rej;
9573 ret += lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_CMD_REG,
9574 (uint8_t *)&pedo_cmd_reg, 1);
9575 }
9576
9577 return ret;
9578 }
9579
9580 /**
9581 * @brief Step counter mode[get]
9582 *
9583 * @param ctx read / write interface definitions
9584 * @param val false_step_rej, step_counter, step_detector,
9585 * @retval interface status (MANDATORY: return 0 -> no Error)
9586 *
9587 */
lsm6dsv16x_stpcnt_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_stpcnt_mode_t * val)9588 int32_t lsm6dsv16x_stpcnt_mode_get(const stmdev_ctx_t *ctx,
9589 lsm6dsv16x_stpcnt_mode_t *val)
9590 {
9591 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9592 lsm6dsv16x_pedo_cmd_reg_t pedo_cmd_reg;
9593 int32_t ret;
9594
9595 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9596 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9597 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9598 if (ret != 0)
9599 {
9600 return ret;
9601 }
9602
9603 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_CMD_REG,
9604 (uint8_t *)&pedo_cmd_reg, 1);
9605 if (ret != 0)
9606 {
9607 return ret;
9608 }
9609
9610 val->false_step_rej = pedo_cmd_reg.fp_rejection_en;
9611 val->step_counter_enable = emb_func_en_a.pedo_en;
9612
9613 return ret;
9614 }
9615
9616 /**
9617 * @brief Step counter output, number of detected steps.[get]
9618 *
9619 * @param ctx read / write interface definitions
9620 * @param val Step counter output, number of detected steps.
9621 * @retval interface status (MANDATORY: return 0 -> no Error)
9622 *
9623 */
lsm6dsv16x_stpcnt_steps_get(const stmdev_ctx_t * ctx,uint16_t * val)9624 int32_t lsm6dsv16x_stpcnt_steps_get(const stmdev_ctx_t *ctx, uint16_t *val)
9625 {
9626 uint8_t buff[2];
9627 int32_t ret;
9628
9629 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9630 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_STEP_COUNTER_L, &buff[0], 2);
9631 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9632 if (ret != 0)
9633 {
9634 return ret;
9635 }
9636
9637 *val = buff[1];
9638 *val = (*val * 256U) + buff[0];
9639
9640 return ret;
9641 }
9642
9643 /**
9644 * @brief Reset step counter.[set]
9645 *
9646 * @param ctx read / write interface definitions
9647 * @param val Reset step counter.
9648 * @retval interface status (MANDATORY: return 0 -> no Error)
9649 *
9650 */
lsm6dsv16x_stpcnt_rst_step_set(const stmdev_ctx_t * ctx,uint8_t val)9651 int32_t lsm6dsv16x_stpcnt_rst_step_set(const stmdev_ctx_t *ctx, uint8_t val)
9652 {
9653 lsm6dsv16x_emb_func_src_t emb_func_src;
9654 int32_t ret;
9655
9656 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9657 if (ret != 0)
9658 {
9659 return ret;
9660 }
9661
9662 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
9663 if (ret != 0)
9664 {
9665 goto exit;
9666 }
9667
9668 emb_func_src.pedo_rst_step = val;
9669 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
9670
9671 exit:
9672 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9673
9674 return ret;
9675 }
9676
9677 /**
9678 * @brief Reset step counter.[get]
9679 *
9680 * @param ctx read / write interface definitions
9681 * @param val Reset step counter.
9682 * @retval interface status (MANDATORY: return 0 -> no Error)
9683 *
9684 */
lsm6dsv16x_stpcnt_rst_step_get(const stmdev_ctx_t * ctx,uint8_t * val)9685 int32_t lsm6dsv16x_stpcnt_rst_step_get(const stmdev_ctx_t *ctx, uint8_t *val)
9686 {
9687 lsm6dsv16x_emb_func_src_t emb_func_src;
9688 int32_t ret;
9689
9690 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9691 if (ret != 0)
9692 {
9693 return ret;
9694 }
9695
9696 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
9697 *val = emb_func_src.pedo_rst_step;
9698
9699 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9700
9701 return ret;
9702 }
9703
9704 /**
9705 * @brief Pedometer debounce configuration.[set]
9706 *
9707 * @param ctx read / write interface definitions
9708 * @param val Pedometer debounce configuration.
9709 * @retval interface status (MANDATORY: return 0 -> no Error)
9710 *
9711 */
lsm6dsv16x_stpcnt_debounce_set(const stmdev_ctx_t * ctx,uint8_t val)9712 int32_t lsm6dsv16x_stpcnt_debounce_set(const stmdev_ctx_t *ctx, uint8_t val)
9713 {
9714 lsm6dsv16x_pedo_deb_steps_conf_t pedo_deb_steps_conf;
9715 int32_t ret;
9716
9717 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_DEB_STEPS_CONF,
9718 (uint8_t *)&pedo_deb_steps_conf, 1);
9719 if (ret == 0)
9720 {
9721 pedo_deb_steps_conf.deb_step = val;
9722 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_DEB_STEPS_CONF,
9723 (uint8_t *)&pedo_deb_steps_conf, 1);
9724 }
9725
9726 return ret;
9727 }
9728
9729 /**
9730 * @brief Pedometer debounce configuration.[get]
9731 *
9732 * @param ctx read / write interface definitions
9733 * @param val Pedometer debounce configuration.
9734 * @retval interface status (MANDATORY: return 0 -> no Error)
9735 *
9736 */
lsm6dsv16x_stpcnt_debounce_get(const stmdev_ctx_t * ctx,uint8_t * val)9737 int32_t lsm6dsv16x_stpcnt_debounce_get(const stmdev_ctx_t *ctx, uint8_t *val)
9738 {
9739 lsm6dsv16x_pedo_deb_steps_conf_t pedo_deb_steps_conf;
9740 int32_t ret;
9741
9742 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_DEB_STEPS_CONF,
9743 (uint8_t *)&pedo_deb_steps_conf, 1);
9744 *val = pedo_deb_steps_conf.deb_step;
9745
9746 return ret;
9747 }
9748
9749 /**
9750 * @brief Time period register for step detection on delta time.[set]
9751 *
9752 * @param ctx read / write interface definitions
9753 * @param val Time period register for step detection on delta time.
9754 * @retval interface status (MANDATORY: return 0 -> no Error)
9755 *
9756 */
lsm6dsv16x_stpcnt_period_set(const stmdev_ctx_t * ctx,uint16_t val)9757 int32_t lsm6dsv16x_stpcnt_period_set(const stmdev_ctx_t *ctx, uint16_t val)
9758 {
9759 uint8_t buff[2];
9760 int32_t ret;
9761
9762 buff[1] = (uint8_t)(val / 256U);
9763 buff[0] = (uint8_t)(val - (buff[1] * 256U));
9764 ret = lsm6dsv16x_ln_pg_write(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_SC_DELTAT_L,
9765 (uint8_t *)&buff[0], 2);
9766
9767 return ret;
9768 }
9769
9770 /**
9771 * @brief Time period register for step detection on delta time.[get]
9772 *
9773 * @param ctx read / write interface definitions
9774 * @param val Time period register for step detection on delta time.
9775 * @retval interface status (MANDATORY: return 0 -> no Error)
9776 *
9777 */
lsm6dsv16x_stpcnt_period_get(const stmdev_ctx_t * ctx,uint16_t * val)9778 int32_t lsm6dsv16x_stpcnt_period_get(const stmdev_ctx_t *ctx, uint16_t *val)
9779 {
9780 uint8_t buff[2];
9781 int32_t ret;
9782
9783 ret = lsm6dsv16x_ln_pg_read(ctx, LSM6DSV16X_EMB_ADV_PG_1 + LSM6DSV16X_PEDO_SC_DELTAT_L, &buff[0],
9784 2);
9785 if (ret != 0)
9786 {
9787 return ret;
9788 }
9789
9790 *val = buff[1];
9791 *val = (*val * 256U) + buff[0];
9792
9793 return ret;
9794 }
9795
9796 /**
9797 * @}
9798 *
9799 */
9800
9801 /**
9802 * @defgroup Sensor Fusion Low Power (SFLP)
9803 * @brief This section groups all the functions that manage pedometer.
9804 * @{
9805 *
9806 */
9807
9808 /**
9809 * @brief Enable SFLP Game Rotation Vector (6x).[set]
9810 *
9811 * @param ctx read / write interface definitions
9812 * @param val Enable/Disable game rotation value (0/1).
9813 * @retval interface status (MANDATORY: return 0 -> no Error)
9814 *
9815 */
lsm6dsv16x_sflp_game_rotation_set(const stmdev_ctx_t * ctx,uint8_t val)9816 int32_t lsm6dsv16x_sflp_game_rotation_set(const stmdev_ctx_t *ctx, uint8_t val)
9817 {
9818 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9819 int32_t ret;
9820
9821 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9822 if (ret != 0)
9823 {
9824 return ret;
9825 }
9826
9827 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9828 if (ret != 0)
9829 {
9830 goto exit;
9831 }
9832
9833 emb_func_en_a.sflp_game_en = val;
9834 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A,
9835 (uint8_t *)&emb_func_en_a, 1);
9836
9837 exit:
9838 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9839
9840 return ret;
9841 }
9842
9843 /**
9844 * @brief Enable SFLP Game Rotation Vector (6x).[get]
9845 *
9846 * @param ctx read / write interface definitions
9847 * @param val Enable/Disable game rotation value (0/1).
9848 * @retval interface status (MANDATORY: return 0 -> no Error)
9849 *
9850 */
lsm6dsv16x_sflp_game_rotation_get(const stmdev_ctx_t * ctx,uint8_t * val)9851 int32_t lsm6dsv16x_sflp_game_rotation_get(const stmdev_ctx_t *ctx, uint8_t *val)
9852 {
9853 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
9854 int32_t ret;
9855
9856 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9857 if (ret != 0)
9858 {
9859 return ret;
9860 }
9861
9862 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
9863 *val = emb_func_en_a.sflp_game_en;
9864
9865 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9866
9867 return ret;
9868 }
9869
9870 /**
9871 * @brief SFLP Data Rate (ODR) configuration.[set]
9872 *
9873 * @param ctx read / write interface definitions
9874 * @param val SFLP_15Hz, SFLP_30Hz, SFLP_60Hz, SFLP_120Hz, SFLP_240Hz, SFLP_480Hz
9875 * @retval interface status (MANDATORY: return 0 -> no Error)
9876 *
9877 */
lsm6dsv16x_sflp_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16x_sflp_data_rate_t val)9878 int32_t lsm6dsv16x_sflp_data_rate_set(const stmdev_ctx_t *ctx,
9879 lsm6dsv16x_sflp_data_rate_t val)
9880 {
9881 lsm6dsv16x_sflp_odr_t sflp_odr;
9882 int32_t ret;
9883
9884 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9885 if (ret != 0)
9886 {
9887 return ret;
9888 }
9889
9890 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SFLP_ODR, (uint8_t *)&sflp_odr, 1);
9891 if (ret != 0)
9892 {
9893 goto exit;
9894 }
9895
9896 sflp_odr.sflp_game_odr = (uint8_t)val & 0x07U;
9897 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_SFLP_ODR, (uint8_t *)&sflp_odr, 1);
9898
9899 exit:
9900 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9901
9902 return ret;
9903 }
9904
9905 /**
9906 * @brief SFLP Data Rate (ODR) configuration.[get]
9907 *
9908 * @param ctx read / write interface definitions
9909 * @param val SFLP_15Hz, SFLP_30Hz, SFLP_60Hz, SFLP_120Hz, SFLP_240Hz, SFLP_480Hz
9910 * @retval interface status (MANDATORY: return 0 -> no Error)
9911 *
9912 */
lsm6dsv16x_sflp_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16x_sflp_data_rate_t * val)9913 int32_t lsm6dsv16x_sflp_data_rate_get(const stmdev_ctx_t *ctx,
9914 lsm6dsv16x_sflp_data_rate_t *val)
9915 {
9916 lsm6dsv16x_sflp_odr_t sflp_odr;
9917 int32_t ret;
9918
9919 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
9920 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_SFLP_ODR, (uint8_t *)&sflp_odr, 1);
9921 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
9922 if (ret != 0)
9923 {
9924 return ret;
9925 }
9926
9927 switch (sflp_odr.sflp_game_odr)
9928 {
9929 case LSM6DSV16X_SFLP_15Hz:
9930 *val = LSM6DSV16X_SFLP_15Hz;
9931 break;
9932
9933 case LSM6DSV16X_SFLP_30Hz:
9934 *val = LSM6DSV16X_SFLP_30Hz;
9935 break;
9936
9937 case LSM6DSV16X_SFLP_60Hz:
9938 *val = LSM6DSV16X_SFLP_60Hz;
9939 break;
9940
9941 case LSM6DSV16X_SFLP_120Hz:
9942 *val = LSM6DSV16X_SFLP_120Hz;
9943 break;
9944
9945 case LSM6DSV16X_SFLP_240Hz:
9946 *val = LSM6DSV16X_SFLP_240Hz;
9947 break;
9948
9949 case LSM6DSV16X_SFLP_480Hz:
9950 *val = LSM6DSV16X_SFLP_480Hz;
9951 break;
9952
9953 default:
9954 *val = LSM6DSV16X_SFLP_15Hz;
9955 break;
9956 }
9957
9958 return ret;
9959 }
9960
9961 /**
9962 * @}
9963 *
9964 */
9965
9966 /**
9967 * @defgroup Tap - Double Tap
9968 * @brief This section groups all the functions that manage the
9969 * tap and double tap event generation.
9970 * @{
9971 *
9972 */
9973
9974 /**
9975 * @brief Enable axis for Tap - Double Tap detection.[set]
9976 *
9977 * @param ctx read / write interface definitions
9978 * @param val Enable axis for Tap - Double Tap detection.
9979 * @retval interface status (MANDATORY: return 0 -> no Error)
9980 *
9981 */
lsm6dsv16x_tap_detection_set(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_detection_t val)9982 int32_t lsm6dsv16x_tap_detection_set(const stmdev_ctx_t *ctx,
9983 lsm6dsv16x_tap_detection_t val)
9984 {
9985 lsm6dsv16x_tap_cfg0_t tap_cfg0;
9986 int32_t ret;
9987
9988 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
9989 if (ret == 0)
9990 {
9991 tap_cfg0.tap_x_en = val.tap_x_en;
9992 tap_cfg0.tap_y_en = val.tap_y_en;
9993 tap_cfg0.tap_z_en = val.tap_z_en;
9994 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
9995 }
9996
9997 return ret;
9998 }
9999
10000 /**
10001 * @brief Enable axis for Tap - Double Tap detection.[get]
10002 *
10003 * @param ctx read / write interface definitions
10004 * @param val Enable axis for Tap - Double Tap detection.
10005 * @retval interface status (MANDATORY: return 0 -> no Error)
10006 *
10007 */
lsm6dsv16x_tap_detection_get(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_detection_t * val)10008 int32_t lsm6dsv16x_tap_detection_get(const stmdev_ctx_t *ctx,
10009 lsm6dsv16x_tap_detection_t *val)
10010 {
10011 lsm6dsv16x_tap_cfg0_t tap_cfg0;
10012 int32_t ret;
10013
10014 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
10015 if (ret != 0)
10016 {
10017 return ret;
10018 }
10019
10020 val->tap_x_en = tap_cfg0.tap_x_en;
10021 val->tap_y_en = tap_cfg0.tap_y_en;
10022 val->tap_z_en = tap_cfg0.tap_z_en;
10023
10024 return ret;
10025 }
10026
10027 /**
10028 * @brief axis Tap - Double Tap recognition thresholds.[set]
10029 *
10030 * @param ctx read / write interface definitions
10031 * @param val axis Tap - Double Tap recognition thresholds.
10032 * @retval interface status (MANDATORY: return 0 -> no Error)
10033 *
10034 */
lsm6dsv16x_tap_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_thresholds_t val)10035 int32_t lsm6dsv16x_tap_thresholds_set(const stmdev_ctx_t *ctx,
10036 lsm6dsv16x_tap_thresholds_t val)
10037 {
10038 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
10039 lsm6dsv16x_tap_cfg2_t tap_cfg2;
10040 lsm6dsv16x_tap_cfg1_t tap_cfg1;
10041 int32_t ret;
10042
10043 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10044 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
10045 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
10046 if (ret != 0)
10047 {
10048 return ret;
10049 }
10050
10051 tap_cfg1.tap_ths_x = val.x;
10052 tap_cfg2.tap_ths_y = val.y;
10053 tap_ths_6d.tap_ths_z = val.z;
10054
10055 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
10056 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
10057 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10058
10059 return ret;
10060 }
10061
10062 /**
10063 * @brief axis Tap - Double Tap recognition thresholds.[get]
10064 *
10065 * @param ctx read / write interface definitions
10066 * @param val axis Tap - Double Tap recognition thresholds.
10067 * @retval interface status (MANDATORY: return 0 -> no Error)
10068 *
10069 */
lsm6dsv16x_tap_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_thresholds_t * val)10070 int32_t lsm6dsv16x_tap_thresholds_get(const stmdev_ctx_t *ctx,
10071 lsm6dsv16x_tap_thresholds_t *val)
10072 {
10073 lsm6dsv16x_tap_ths_6d_t tap_ths_6d;
10074 lsm6dsv16x_tap_cfg2_t tap_cfg2;
10075 lsm6dsv16x_tap_cfg1_t tap_cfg1;
10076 int32_t ret;
10077
10078 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10079 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
10080 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
10081 if (ret != 0)
10082 {
10083 return ret;
10084 }
10085
10086 val->x = tap_cfg1.tap_ths_x;
10087 val->y = tap_cfg2.tap_ths_y;
10088 val->z = tap_ths_6d.tap_ths_z;
10089
10090 return ret;
10091 }
10092
10093 /**
10094 * @brief Selection of axis priority for TAP detection.[set]
10095 *
10096 * @param ctx read / write interface definitions
10097 * @param val XYZ , YXZ , XZY, ZYX , YZX , ZXY ,
10098 * @retval interface status (MANDATORY: return 0 -> no Error)
10099 *
10100 */
lsm6dsv16x_tap_axis_priority_set(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_axis_priority_t val)10101 int32_t lsm6dsv16x_tap_axis_priority_set(const stmdev_ctx_t *ctx,
10102 lsm6dsv16x_tap_axis_priority_t val)
10103 {
10104 lsm6dsv16x_tap_cfg1_t tap_cfg1;
10105 int32_t ret;
10106
10107 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10108 if (ret == 0)
10109 {
10110 tap_cfg1.tap_priority = (uint8_t)val & 0x7U;
10111 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10112 }
10113
10114 return ret;
10115 }
10116
10117 /**
10118 * @brief Selection of axis priority for TAP detection.[get]
10119 *
10120 * @param ctx read / write interface definitions
10121 * @param val XYZ , YXZ , XZY, ZYX , YZX , ZXY ,
10122 * @retval interface status (MANDATORY: return 0 -> no Error)
10123 *
10124 */
lsm6dsv16x_tap_axis_priority_get(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_axis_priority_t * val)10125 int32_t lsm6dsv16x_tap_axis_priority_get(const stmdev_ctx_t *ctx,
10126 lsm6dsv16x_tap_axis_priority_t *val)
10127 {
10128 lsm6dsv16x_tap_cfg1_t tap_cfg1;
10129 int32_t ret;
10130
10131 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
10132 if (ret != 0)
10133 {
10134 return ret;
10135 }
10136
10137 switch (tap_cfg1.tap_priority)
10138 {
10139 case LSM6DSV16X_XYZ :
10140 *val = LSM6DSV16X_XYZ ;
10141 break;
10142
10143 case LSM6DSV16X_YXZ :
10144 *val = LSM6DSV16X_YXZ ;
10145 break;
10146
10147 case LSM6DSV16X_XZY:
10148 *val = LSM6DSV16X_XZY;
10149 break;
10150
10151 case LSM6DSV16X_ZYX :
10152 *val = LSM6DSV16X_ZYX ;
10153 break;
10154
10155 case LSM6DSV16X_YZX :
10156 *val = LSM6DSV16X_YZX ;
10157 break;
10158
10159 case LSM6DSV16X_ZXY :
10160 *val = LSM6DSV16X_ZXY ;
10161 break;
10162
10163 default:
10164 *val = LSM6DSV16X_XYZ ;
10165 break;
10166 }
10167
10168 return ret;
10169 }
10170
10171 /**
10172 * @brief Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.[set]
10173 *
10174 * @param ctx read / write interface definitions
10175 * @param val Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.
10176 * @retval interface status (MANDATORY: return 0 -> no Error)
10177 *
10178 */
lsm6dsv16x_tap_time_windows_set(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_time_windows_t val)10179 int32_t lsm6dsv16x_tap_time_windows_set(const stmdev_ctx_t *ctx,
10180 lsm6dsv16x_tap_time_windows_t val)
10181 {
10182 lsm6dsv16x_tap_dur_t tap_dur;
10183 int32_t ret;
10184
10185 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_DUR, (uint8_t *)&tap_dur, 1);
10186 if (ret == 0)
10187 {
10188 tap_dur.shock = val.shock;
10189 tap_dur.quiet = val.quiet;
10190 tap_dur.dur = val.tap_gap;
10191 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_TAP_DUR, (uint8_t *)&tap_dur, 1);
10192 }
10193
10194 return ret;
10195 }
10196
10197 /**
10198 * @brief Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.[get]
10199 *
10200 * @param ctx read / write interface definitions
10201 * @param val Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.
10202 * @retval interface status (MANDATORY: return 0 -> no Error)
10203 *
10204 */
lsm6dsv16x_tap_time_windows_get(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_time_windows_t * val)10205 int32_t lsm6dsv16x_tap_time_windows_get(const stmdev_ctx_t *ctx,
10206 lsm6dsv16x_tap_time_windows_t *val)
10207 {
10208 lsm6dsv16x_tap_dur_t tap_dur;
10209 int32_t ret;
10210
10211 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TAP_DUR, (uint8_t *)&tap_dur, 1);
10212 if (ret != 0)
10213 {
10214 return ret;
10215 }
10216
10217 val->shock = tap_dur.shock;
10218 val->quiet = tap_dur.quiet;
10219 val->tap_gap = tap_dur.dur;
10220
10221 return ret;
10222 }
10223
10224 /**
10225 * @brief Single/double-tap event enable.[set]
10226 *
10227 * @param ctx read / write interface definitions
10228 * @param val ONLY_SINGLE, BOTH_SINGLE_DOUBLE,
10229 * @retval interface status (MANDATORY: return 0 -> no Error)
10230 *
10231 */
lsm6dsv16x_tap_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_mode_t val)10232 int32_t lsm6dsv16x_tap_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_tap_mode_t val)
10233 {
10234 lsm6dsv16x_wake_up_ths_t wake_up_ths;
10235 int32_t ret;
10236
10237 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10238 if (ret == 0)
10239 {
10240 wake_up_ths.single_double_tap = (uint8_t)val & 0x01U;
10241 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10242 }
10243
10244 return ret;
10245 }
10246
10247 /**
10248 * @brief Single/double-tap event enable.[get]
10249 *
10250 * @param ctx read / write interface definitions
10251 * @param val ONLY_SINGLE, BOTH_SINGLE_DOUBLE,
10252 * @retval interface status (MANDATORY: return 0 -> no Error)
10253 *
10254 */
lsm6dsv16x_tap_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_tap_mode_t * val)10255 int32_t lsm6dsv16x_tap_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_tap_mode_t *val)
10256 {
10257 lsm6dsv16x_wake_up_ths_t wake_up_ths;
10258 int32_t ret;
10259
10260 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10261 if (ret != 0)
10262 {
10263 return ret;
10264 }
10265
10266 switch (wake_up_ths.single_double_tap)
10267 {
10268 case LSM6DSV16X_ONLY_SINGLE:
10269 *val = LSM6DSV16X_ONLY_SINGLE;
10270 break;
10271
10272 case LSM6DSV16X_BOTH_SINGLE_DOUBLE:
10273 *val = LSM6DSV16X_BOTH_SINGLE_DOUBLE;
10274 break;
10275
10276 default:
10277 *val = LSM6DSV16X_ONLY_SINGLE;
10278 break;
10279 }
10280
10281 return ret;
10282 }
10283
10284 /**
10285 * @}
10286 *
10287 */
10288
10289 /**
10290 * @defgroup Tilt detection
10291 * @brief This section groups all the functions that manage the tilt
10292 * event detection.
10293 * @{
10294 *
10295 */
10296
10297 /**
10298 * @brief Tilt calculation.[set]
10299 *
10300 * @param ctx read / write interface definitions
10301 * @param val Tilt calculation.
10302 * @retval interface status (MANDATORY: return 0 -> no Error)
10303 *
10304 */
lsm6dsv16x_tilt_mode_set(const stmdev_ctx_t * ctx,uint8_t val)10305 int32_t lsm6dsv16x_tilt_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
10306 {
10307 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
10308 int32_t ret;
10309
10310 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
10311 if (ret != 0)
10312 {
10313 return ret;
10314 }
10315
10316 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
10317 emb_func_en_a.tilt_en = val;
10318 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
10319
10320 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
10321
10322 return ret;
10323 }
10324
10325 /**
10326 * @brief Tilt calculation.[get]
10327 *
10328 * @param ctx read / write interface definitions
10329 * @param val Tilt calculation.
10330 * @retval interface status (MANDATORY: return 0 -> no Error)
10331 *
10332 */
lsm6dsv16x_tilt_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)10333 int32_t lsm6dsv16x_tilt_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
10334 {
10335 lsm6dsv16x_emb_func_en_a_t emb_func_en_a;
10336 int32_t ret;
10337
10338 ret = lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_EMBED_FUNC_MEM_BANK);
10339 if (ret != 0)
10340 {
10341 return ret;
10342 }
10343
10344 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
10345 *val = emb_func_en_a.tilt_en;
10346
10347 ret += lsm6dsv16x_mem_bank_set(ctx, LSM6DSV16X_MAIN_MEM_BANK);
10348
10349 return ret;
10350 }
10351
10352 /**
10353 * @}
10354 *
10355 */
10356
10357 /**
10358 * @defgroup Timestamp
10359 * @brief This section groups all the functions that manage the
10360 * timestamp generation.
10361 * @{
10362 *
10363 */
10364
10365 /**
10366 * @brief Timestamp data output.[get]
10367 *
10368 * @param ctx read / write interface definitions
10369 * @param val Timestamp data output.
10370 * @retval interface status (MANDATORY: return 0 -> no Error)
10371 *
10372 */
lsm6dsv16x_timestamp_raw_get(const stmdev_ctx_t * ctx,uint32_t * val)10373 int32_t lsm6dsv16x_timestamp_raw_get(const stmdev_ctx_t *ctx, uint32_t *val)
10374 {
10375 uint8_t buff[4];
10376 int32_t ret;
10377
10378 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_TIMESTAMP0, &buff[0], 4);
10379 if (ret != 0)
10380 {
10381 return ret;
10382 }
10383
10384 *val = buff[3];
10385 *val = (*val * 256U) + buff[2];
10386 *val = (*val * 256U) + buff[1];
10387 *val = (*val * 256U) + buff[0];
10388
10389 return ret;
10390 }
10391
10392 /**
10393 * @brief Enables timestamp counter.[set]
10394 *
10395 * @param ctx read / write interface definitions
10396 * @param val Enables timestamp counter.
10397 * @retval interface status (MANDATORY: return 0 -> no Error)
10398 *
10399 */
lsm6dsv16x_timestamp_set(const stmdev_ctx_t * ctx,uint8_t val)10400 int32_t lsm6dsv16x_timestamp_set(const stmdev_ctx_t *ctx, uint8_t val)
10401 {
10402 lsm6dsv16x_functions_enable_t functions_enable;
10403 int32_t ret;
10404
10405 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10406 if (ret == 0)
10407 {
10408 functions_enable.timestamp_en = val;
10409 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10410 }
10411
10412 return ret;
10413 }
10414
10415 /**
10416 * @brief Enables timestamp counter.[get]
10417 *
10418 * @param ctx read / write interface definitions
10419 * @param val Enables timestamp counter.
10420 * @retval interface status (MANDATORY: return 0 -> no Error)
10421 *
10422 */
lsm6dsv16x_timestamp_get(const stmdev_ctx_t * ctx,uint8_t * val)10423 int32_t lsm6dsv16x_timestamp_get(const stmdev_ctx_t *ctx, uint8_t *val)
10424 {
10425 lsm6dsv16x_functions_enable_t functions_enable;
10426 int32_t ret;
10427
10428 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10429 *val = functions_enable.timestamp_en;
10430
10431 return ret;
10432 }
10433
10434 /**
10435 * @}
10436 *
10437 */
10438
10439 /**
10440 * @defgroup Wake Up - Activity - Inactivity (Sleep)
10441 * @brief This section groups all the functions that manage the Wake Up
10442 * event generation.
10443 * @{
10444 *
10445 */
10446
10447 /**
10448 * @brief Enable activity/inactivity (sleep) function.[set]
10449 *
10450 * @param ctx read / write interface definitions
10451 * @param val XL_AND_GY_NOT_AFFECTED, XL_LOW_POWER_GY_NOT_AFFECTED, XL_LOW_POWER_GY_SLEEP, XL_LOW_POWER_GY_POWER_DOWN,
10452 * @retval interface status (MANDATORY: return 0 -> no Error)
10453 *
10454 */
lsm6dsv16x_act_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16x_act_mode_t val)10455 int32_t lsm6dsv16x_act_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16x_act_mode_t val)
10456 {
10457 lsm6dsv16x_functions_enable_t functions_enable;
10458 int32_t ret;
10459
10460 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10461 if (ret == 0)
10462 {
10463 functions_enable.inact_en = (uint8_t)val & 0x3U;
10464 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10465 }
10466
10467 return ret;
10468 }
10469
10470 /**
10471 * @brief Enable activity/inactivity (sleep) function.[get]
10472 *
10473 * @param ctx read / write interface definitions
10474 * @param val XL_AND_GY_NOT_AFFECTED, XL_LOW_POWER_GY_NOT_AFFECTED, XL_LOW_POWER_GY_SLEEP, XL_LOW_POWER_GY_POWER_DOWN,
10475 * @retval interface status (MANDATORY: return 0 -> no Error)
10476 *
10477 */
lsm6dsv16x_act_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16x_act_mode_t * val)10478 int32_t lsm6dsv16x_act_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16x_act_mode_t *val)
10479 {
10480 lsm6dsv16x_functions_enable_t functions_enable;
10481 int32_t ret;
10482
10483 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
10484 if (ret != 0)
10485 {
10486 return ret;
10487 }
10488
10489 switch (functions_enable.inact_en)
10490 {
10491 case LSM6DSV16X_XL_AND_GY_NOT_AFFECTED:
10492 *val = LSM6DSV16X_XL_AND_GY_NOT_AFFECTED;
10493 break;
10494
10495 case LSM6DSV16X_XL_LOW_POWER_GY_NOT_AFFECTED:
10496 *val = LSM6DSV16X_XL_LOW_POWER_GY_NOT_AFFECTED;
10497 break;
10498
10499 case LSM6DSV16X_XL_LOW_POWER_GY_SLEEP:
10500 *val = LSM6DSV16X_XL_LOW_POWER_GY_SLEEP;
10501 break;
10502
10503 case LSM6DSV16X_XL_LOW_POWER_GY_POWER_DOWN:
10504 *val = LSM6DSV16X_XL_LOW_POWER_GY_POWER_DOWN;
10505 break;
10506
10507 default:
10508 *val = LSM6DSV16X_XL_AND_GY_NOT_AFFECTED;
10509 break;
10510 }
10511
10512 return ret;
10513 }
10514
10515 /**
10516 * @brief Duration in the transition from Stationary to Motion (from Inactivity to Activity).[set]
10517 *
10518 * @param ctx read / write interface definitions
10519 * @param val SLEEP_TO_ACT_AT_1ST_SAMPLE, SLEEP_TO_ACT_AT_2ND_SAMPLE, SLEEP_TO_ACT_AT_3RD_SAMPLE, SLEEP_TO_ACT_AT_4th_SAMPLE,
10520 * @retval interface status (MANDATORY: return 0 -> no Error)
10521 *
10522 */
lsm6dsv16x_act_from_sleep_to_act_dur_set(const stmdev_ctx_t * ctx,lsm6dsv16x_act_from_sleep_to_act_dur_t val)10523 int32_t lsm6dsv16x_act_from_sleep_to_act_dur_set(const stmdev_ctx_t *ctx,
10524 lsm6dsv16x_act_from_sleep_to_act_dur_t val)
10525 {
10526 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10527 int32_t ret;
10528
10529 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10530 if (ret == 0)
10531 {
10532 inactivity_dur.inact_dur = (uint8_t)val & 0x3U;
10533 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10534 }
10535
10536 return ret;
10537 }
10538
10539 /**
10540 * @brief Duration in the transition from Stationary to Motion (from Inactivity to Activity).[get]
10541 *
10542 * @param ctx read / write interface definitions
10543 * @param val SLEEP_TO_ACT_AT_1ST_SAMPLE, SLEEP_TO_ACT_AT_2ND_SAMPLE, SLEEP_TO_ACT_AT_3RD_SAMPLE, SLEEP_TO_ACT_AT_4th_SAMPLE,
10544 * @retval interface status (MANDATORY: return 0 -> no Error)
10545 *
10546 */
lsm6dsv16x_act_from_sleep_to_act_dur_get(const stmdev_ctx_t * ctx,lsm6dsv16x_act_from_sleep_to_act_dur_t * val)10547 int32_t lsm6dsv16x_act_from_sleep_to_act_dur_get(const stmdev_ctx_t *ctx,
10548 lsm6dsv16x_act_from_sleep_to_act_dur_t *val)
10549 {
10550 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10551 int32_t ret;
10552
10553 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10554 if (ret != 0)
10555 {
10556 return ret;
10557 }
10558
10559 switch (inactivity_dur.inact_dur)
10560 {
10561 case LSM6DSV16X_SLEEP_TO_ACT_AT_1ST_SAMPLE:
10562 *val = LSM6DSV16X_SLEEP_TO_ACT_AT_1ST_SAMPLE;
10563 break;
10564
10565 case LSM6DSV16X_SLEEP_TO_ACT_AT_2ND_SAMPLE:
10566 *val = LSM6DSV16X_SLEEP_TO_ACT_AT_2ND_SAMPLE;
10567 break;
10568
10569 case LSM6DSV16X_SLEEP_TO_ACT_AT_3RD_SAMPLE:
10570 *val = LSM6DSV16X_SLEEP_TO_ACT_AT_3RD_SAMPLE;
10571 break;
10572
10573 case LSM6DSV16X_SLEEP_TO_ACT_AT_4th_SAMPLE:
10574 *val = LSM6DSV16X_SLEEP_TO_ACT_AT_4th_SAMPLE;
10575 break;
10576
10577 default:
10578 *val = LSM6DSV16X_SLEEP_TO_ACT_AT_1ST_SAMPLE;
10579 break;
10580 }
10581
10582 return ret;
10583 }
10584
10585 /**
10586 * @brief Selects the accelerometer data rate during Inactivity.[set]
10587 *
10588 * @param ctx read / write interface definitions
10589 * @param val 1Hz875, 15Hz, 30Hz, 60Hz,
10590 * @retval interface status (MANDATORY: return 0 -> no Error)
10591 *
10592 */
lsm6dsv16x_act_sleep_xl_odr_set(const stmdev_ctx_t * ctx,lsm6dsv16x_act_sleep_xl_odr_t val)10593 int32_t lsm6dsv16x_act_sleep_xl_odr_set(const stmdev_ctx_t *ctx,
10594 lsm6dsv16x_act_sleep_xl_odr_t val)
10595 {
10596 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10597 int32_t ret;
10598
10599 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10600 if (ret == 0)
10601 {
10602 inactivity_dur.xl_inact_odr = (uint8_t)val & 0x03U;
10603 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10604 }
10605
10606 return ret;
10607 }
10608
10609 /**
10610 * @brief Selects the accelerometer data rate during Inactivity.[get]
10611 *
10612 * @param ctx read / write interface definitions
10613 * @param val 1Hz875, 15Hz, 30Hz, 60Hz,
10614 * @retval interface status (MANDATORY: return 0 -> no Error)
10615 *
10616 */
lsm6dsv16x_act_sleep_xl_odr_get(const stmdev_ctx_t * ctx,lsm6dsv16x_act_sleep_xl_odr_t * val)10617 int32_t lsm6dsv16x_act_sleep_xl_odr_get(const stmdev_ctx_t *ctx,
10618 lsm6dsv16x_act_sleep_xl_odr_t *val)
10619 {
10620 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10621 int32_t ret;
10622
10623 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10624 if (ret != 0)
10625 {
10626 return ret;
10627 }
10628
10629 switch (inactivity_dur.xl_inact_odr)
10630 {
10631 case LSM6DSV16X_1Hz875:
10632 *val = LSM6DSV16X_1Hz875;
10633 break;
10634
10635 case LSM6DSV16X_15Hz:
10636 *val = LSM6DSV16X_15Hz;
10637 break;
10638
10639 case LSM6DSV16X_30Hz:
10640 *val = LSM6DSV16X_30Hz;
10641 break;
10642
10643 case LSM6DSV16X_60Hz:
10644 *val = LSM6DSV16X_60Hz;
10645 break;
10646
10647 default:
10648 *val = LSM6DSV16X_1Hz875;
10649 break;
10650 }
10651
10652 return ret;
10653 }
10654
10655 /**
10656 * @brief Wakeup and activity/inactivity threshold.[set]
10657 *
10658 * @param ctx read / write interface definitions
10659 * @param val Wakeup and activity/inactivity threshold.
10660 * @retval interface status (MANDATORY: return 0 -> no Error)
10661 *
10662 */
lsm6dsv16x_act_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16x_act_thresholds_t * val)10663 int32_t lsm6dsv16x_act_thresholds_set(const stmdev_ctx_t *ctx,
10664 lsm6dsv16x_act_thresholds_t *val)
10665 {
10666 lsm6dsv16x_inactivity_ths_t inactivity_ths;
10667 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10668 lsm6dsv16x_wake_up_ths_t wake_up_ths;
10669 lsm6dsv16x_wake_up_dur_t wake_up_dur;
10670 int32_t ret;
10671
10672 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10673 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
10674 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10675 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10676 if (ret != 0)
10677 {
10678 return ret;
10679 }
10680
10681 inactivity_dur.wu_inact_ths_w = val->inactivity_cfg.wu_inact_ths_w;
10682 inactivity_dur.xl_inact_odr = val->inactivity_cfg.xl_inact_odr;
10683 inactivity_dur.inact_dur = val->inactivity_cfg.inact_dur;
10684
10685 inactivity_ths.inact_ths = val->inactivity_ths;
10686 wake_up_ths.wk_ths = val->threshold;
10687 wake_up_dur.wake_dur = val->duration;
10688
10689 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10690 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
10691 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10692 ret += lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10693
10694 return ret;
10695 }
10696
10697 /**
10698 * @brief Wakeup and activity/inactivity threshold.[get]
10699 *
10700 * @param ctx read / write interface definitions
10701 * @param val Wakeup and activity/inactivity threshold.
10702 * @retval interface status (MANDATORY: return 0 -> no Error)
10703 *
10704 */
lsm6dsv16x_act_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16x_act_thresholds_t * val)10705 int32_t lsm6dsv16x_act_thresholds_get(const stmdev_ctx_t *ctx,
10706 lsm6dsv16x_act_thresholds_t *val)
10707 {
10708 lsm6dsv16x_inactivity_dur_t inactivity_dur;
10709 lsm6dsv16x_inactivity_ths_t inactivity_ths;
10710 lsm6dsv16x_wake_up_ths_t wake_up_ths;
10711 lsm6dsv16x_wake_up_dur_t wake_up_dur;
10712 int32_t ret;
10713
10714 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
10715 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
10716 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
10717 ret += lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10718 if (ret != 0)
10719 {
10720 return ret;
10721 }
10722
10723 val->inactivity_cfg.wu_inact_ths_w = inactivity_dur.wu_inact_ths_w;
10724 val->inactivity_cfg.xl_inact_odr = inactivity_dur.xl_inact_odr;
10725 val->inactivity_cfg.inact_dur = inactivity_dur.inact_dur;
10726
10727 val->inactivity_ths = inactivity_ths.inact_ths;
10728 val->threshold = wake_up_ths.wk_ths;
10729 val->duration = wake_up_dur.wake_dur;
10730
10731 return ret;
10732 }
10733
10734 /**
10735 * @brief Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time. [set]
10736 *
10737 * @param ctx read / write interface definitions
10738 * @param val Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time.
10739 * @retval interface status (MANDATORY: return 0 -> no Error)
10740 *
10741 */
lsm6dsv16x_act_wkup_time_windows_set(const stmdev_ctx_t * ctx,lsm6dsv16x_act_wkup_time_windows_t val)10742 int32_t lsm6dsv16x_act_wkup_time_windows_set(const stmdev_ctx_t *ctx,
10743 lsm6dsv16x_act_wkup_time_windows_t val)
10744 {
10745 lsm6dsv16x_wake_up_dur_t wake_up_dur;
10746 int32_t ret;
10747
10748 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10749 if (ret == 0)
10750 {
10751 wake_up_dur.wake_dur = val.shock;
10752 wake_up_dur.sleep_dur = val.quiet;
10753 ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10754 }
10755
10756 return ret;
10757 }
10758
10759 /**
10760 * @brief Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time. [get]
10761 *
10762 * @param ctx read / write interface definitions
10763 * @param val Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time.
10764 * @retval interface status (MANDATORY: return 0 -> no Error)
10765 *
10766 */
lsm6dsv16x_act_wkup_time_windows_get(const stmdev_ctx_t * ctx,lsm6dsv16x_act_wkup_time_windows_t * val)10767 int32_t lsm6dsv16x_act_wkup_time_windows_get(const stmdev_ctx_t *ctx,
10768 lsm6dsv16x_act_wkup_time_windows_t *val)
10769 {
10770 lsm6dsv16x_wake_up_dur_t wake_up_dur;
10771 int32_t ret;
10772
10773 ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
10774 if (ret != 0)
10775 {
10776 return ret;
10777 }
10778
10779 val->shock = wake_up_dur.wake_dur;
10780 val->quiet = wake_up_dur.sleep_dur;
10781
10782 return ret;
10783 }
10784
10785 /**
10786 * @}
10787 *
10788 */
10789