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