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