1 /**
2   ******************************************************************************
3   * @file    lsm6dsrx_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   LSM6DSRX driver file
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2021 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 "lsm6dsrx_reg.h"
21 
22 /**
23   * @defgroup    LSM6DSRX
24   * @brief       This file provides a set of functions needed to drive the
25   *              lsm6dsrx enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup    LSM6DSRX_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   read / write interface definitions(ptr)
43   * @param  reg   register to read
44   * @param  data  pointer to buffer that store the data read(ptr)
45   * @param  len   number of consecutive register to read
46   * @retval       interface status (MANDATORY: return 0 -> no Error)
47   *
48   */
lsm6dsrx_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lsm6dsrx_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   read / write interface definitions(ptr)
69   * @param  reg   register to write
70   * @param  data  pointer to data to write in register reg(ptr)
71   * @param  len   number of consecutive register to write
72   * @retval       interface status (MANDATORY: return 0 -> no Error)
73   *
74   */
lsm6dsrx_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lsm6dsrx_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    LSM6DSRX_Sensitivity
98   * @brief       These functions convert raw-data into engineering units.
99   * @{
100   *
101   */
102 
lsm6dsrx_from_fs2g_to_mg(int16_t lsb)103 float_t lsm6dsrx_from_fs2g_to_mg(int16_t lsb)
104 {
105   return ((float_t)lsb * 0.061f);
106 }
107 
lsm6dsrx_from_fs4g_to_mg(int16_t lsb)108 float_t lsm6dsrx_from_fs4g_to_mg(int16_t lsb)
109 {
110   return ((float_t)lsb * 0.122f);
111 }
112 
lsm6dsrx_from_fs8g_to_mg(int16_t lsb)113 float_t lsm6dsrx_from_fs8g_to_mg(int16_t lsb)
114 {
115   return ((float_t)lsb * 0.244f);
116 }
117 
lsm6dsrx_from_fs16g_to_mg(int16_t lsb)118 float_t lsm6dsrx_from_fs16g_to_mg(int16_t lsb)
119 {
120   return ((float_t)lsb * 0.488f);
121 }
122 
lsm6dsrx_from_fs125dps_to_mdps(int16_t lsb)123 float_t lsm6dsrx_from_fs125dps_to_mdps(int16_t lsb)
124 {
125   return ((float_t)lsb * 4.375f);
126 }
127 
lsm6dsrx_from_fs250dps_to_mdps(int16_t lsb)128 float_t lsm6dsrx_from_fs250dps_to_mdps(int16_t lsb)
129 {
130   return ((float_t)lsb * 8.75f);
131 }
132 
lsm6dsrx_from_fs500dps_to_mdps(int16_t lsb)133 float_t lsm6dsrx_from_fs500dps_to_mdps(int16_t lsb)
134 {
135   return ((float_t)lsb * 17.50f);
136 }
137 
lsm6dsrx_from_fs1000dps_to_mdps(int16_t lsb)138 float_t lsm6dsrx_from_fs1000dps_to_mdps(int16_t lsb)
139 {
140   return ((float_t)lsb * 35.0f);
141 }
142 
lsm6dsrx_from_fs2000dps_to_mdps(int16_t lsb)143 float_t lsm6dsrx_from_fs2000dps_to_mdps(int16_t lsb)
144 {
145   return ((float_t)lsb * 70.0f);
146 }
147 
lsm6dsrx_from_fs4000dps_to_mdps(int16_t lsb)148 float_t lsm6dsrx_from_fs4000dps_to_mdps(int16_t lsb)
149 {
150   return ((float_t)lsb * 140.0f);
151 }
152 
lsm6dsrx_from_lsb_to_celsius(int16_t lsb)153 float_t lsm6dsrx_from_lsb_to_celsius(int16_t lsb)
154 {
155   return (((float_t)lsb / 256.0f) + 25.0f);
156 }
157 
lsm6dsrx_from_lsb_to_nsec(uint32_t lsb)158 uint64_t lsm6dsrx_from_lsb_to_nsec(uint32_t lsb)
159 {
160   return ((uint64_t)lsb * 25000ULL);
161 }
162 
163 /**
164   * @}
165   *
166   */
167 
168 /**
169   * @defgroup   LSM9DS1_Data_generation
170   * @brief      This section groups all the functions concerning data
171   *             generation
172   * @{
173   *
174   */
175 
176 /**
177   * @brief  Accelerometer full-scale selection[set]
178   *
179   * @param  ctx    Read / write interface definitions.(ptr)
180   * @param  val    Change the values of fs_xl in reg CTRL1_XL
181   * @retval        Interface status (MANDATORY: return 0 -> no Error).
182   *
183   */
lsm6dsrx_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsrx_fs_xl_t val)184 int32_t lsm6dsrx_xl_full_scale_set(const stmdev_ctx_t *ctx,
185                                    lsm6dsrx_fs_xl_t val)
186 {
187   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
188   int32_t ret;
189   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
190                           (uint8_t *)&ctrl1_xl, 1);
191 
192   if (ret == 0)
193   {
194     ctrl1_xl.fs_xl = (uint8_t)val;
195     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_XL,
196                              (uint8_t *)&ctrl1_xl, 1);
197   }
198 
199   return ret;
200 }
201 
202 /**
203   * @brief  Accelerometer full-scale selection.[get]
204   *
205   * @param  ctx    Read / write interface definitions.(ptr)
206   * @param  val    Get the values of fs_xl in reg CTRL1_XL
207   * @retval        Interface status (MANDATORY: return 0 -> no Error).
208   *
209   */
lsm6dsrx_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsrx_fs_xl_t * val)210 int32_t lsm6dsrx_xl_full_scale_get(const stmdev_ctx_t *ctx,
211                                    lsm6dsrx_fs_xl_t *val)
212 {
213   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
214   int32_t ret;
215   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
216                           (uint8_t *)&ctrl1_xl, 1);
217 
218   switch (ctrl1_xl.fs_xl)
219   {
220     case LSM6DSRX_2g:
221       *val = LSM6DSRX_2g;
222       break;
223 
224     case LSM6DSRX_16g:
225       *val = LSM6DSRX_16g;
226       break;
227 
228     case LSM6DSRX_4g:
229       *val = LSM6DSRX_4g;
230       break;
231 
232     case LSM6DSRX_8g:
233       *val = LSM6DSRX_8g;
234       break;
235 
236     default:
237       *val = LSM6DSRX_2g;
238       break;
239   }
240 
241   return ret;
242 }
243 
244 /**
245   * @brief  Accelerometer UI data rate selection.[set]
246   *
247   * @param  ctx    Read / write interface definitions.(ptr)
248   * @param  val    Change the values of odr_xl in reg CTRL1_XL
249   * @retval        Interface status (MANDATORY: return 0 -> no Error).
250   *
251   */
lsm6dsrx_xl_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsrx_odr_xl_t val)252 int32_t lsm6dsrx_xl_data_rate_set(const stmdev_ctx_t *ctx,
253                                   lsm6dsrx_odr_xl_t val)
254 {
255   lsm6dsrx_odr_xl_t odr_xl =  val;
256   lsm6dsrx_emb_fsm_enable_t fsm_enable;
257   lsm6dsrx_fsm_odr_t fsm_odr;
258   uint8_t mlc_enable;
259   lsm6dsrx_mlc_odr_t mlc_odr;
260   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
261   int32_t ret;
262 
263   /* Check the Finite State Machine data rate constraints */
264   ret =  lsm6dsrx_fsm_enable_get(ctx, &fsm_enable);
265 
266   if (ret == 0)
267   {
268     if ((fsm_enable.fsm_enable_a.fsm1_en  |
269          fsm_enable.fsm_enable_a.fsm2_en  |
270          fsm_enable.fsm_enable_a.fsm3_en  |
271          fsm_enable.fsm_enable_a.fsm4_en  |
272          fsm_enable.fsm_enable_a.fsm5_en  |
273          fsm_enable.fsm_enable_a.fsm6_en  |
274          fsm_enable.fsm_enable_a.fsm7_en  |
275          fsm_enable.fsm_enable_a.fsm8_en  |
276          fsm_enable.fsm_enable_b.fsm9_en  |
277          fsm_enable.fsm_enable_b.fsm10_en |
278          fsm_enable.fsm_enable_b.fsm11_en |
279          fsm_enable.fsm_enable_b.fsm12_en |
280          fsm_enable.fsm_enable_b.fsm13_en |
281          fsm_enable.fsm_enable_b.fsm14_en |
282          fsm_enable.fsm_enable_b.fsm15_en |
283          fsm_enable.fsm_enable_b.fsm16_en) == PROPERTY_ENABLE)
284     {
285       ret =  lsm6dsrx_fsm_data_rate_get(ctx, &fsm_odr);
286 
287       if (ret == 0)
288       {
289         switch (fsm_odr)
290         {
291           case LSM6DSRX_ODR_FSM_12Hz5:
292             if (val == LSM6DSRX_XL_ODR_OFF)
293             {
294               odr_xl = LSM6DSRX_XL_ODR_12Hz5;
295             }
296 
297             else
298             {
299               odr_xl = val;
300             }
301 
302             break;
303 
304           case LSM6DSRX_ODR_FSM_26Hz:
305             if (val == LSM6DSRX_XL_ODR_OFF)
306             {
307               odr_xl = LSM6DSRX_XL_ODR_26Hz;
308             }
309 
310             else if (val == LSM6DSRX_XL_ODR_12Hz5)
311             {
312               odr_xl = LSM6DSRX_XL_ODR_26Hz;
313             }
314 
315             else
316             {
317               odr_xl = val;
318             }
319 
320             break;
321 
322           case LSM6DSRX_ODR_FSM_52Hz:
323             if (val == LSM6DSRX_XL_ODR_OFF)
324             {
325               odr_xl = LSM6DSRX_XL_ODR_52Hz;
326             }
327 
328             else if (val == LSM6DSRX_XL_ODR_12Hz5)
329             {
330               odr_xl = LSM6DSRX_XL_ODR_52Hz;
331             }
332 
333             else if (val == LSM6DSRX_XL_ODR_26Hz)
334             {
335               odr_xl = LSM6DSRX_XL_ODR_52Hz;
336             }
337 
338             else
339             {
340               odr_xl = val;
341             }
342 
343             break;
344 
345           case LSM6DSRX_ODR_FSM_104Hz:
346             if (val == LSM6DSRX_XL_ODR_OFF)
347             {
348               odr_xl = LSM6DSRX_XL_ODR_104Hz;
349             }
350 
351             else if (val == LSM6DSRX_XL_ODR_12Hz5)
352             {
353               odr_xl = LSM6DSRX_XL_ODR_104Hz;
354             }
355 
356             else if (val == LSM6DSRX_XL_ODR_26Hz)
357             {
358               odr_xl = LSM6DSRX_XL_ODR_104Hz;
359             }
360 
361             else if (val == LSM6DSRX_XL_ODR_52Hz)
362             {
363               odr_xl = LSM6DSRX_XL_ODR_104Hz;
364             }
365 
366             else
367             {
368               odr_xl = val;
369             }
370 
371             break;
372 
373           default:
374             odr_xl = val;
375             break;
376         }
377       }
378     }
379   }
380 
381   /* Check the Machine Learning Core data rate constraints */
382   mlc_enable = PROPERTY_DISABLE;
383 
384   if (ret == 0)
385   {
386     ret =  lsm6dsrx_mlc_get(ctx, &mlc_enable);
387 
388     if (mlc_enable == PROPERTY_ENABLE)
389     {
390       ret =  lsm6dsrx_mlc_data_rate_get(ctx, &mlc_odr);
391 
392       if (ret == 0)
393       {
394         switch (mlc_odr)
395         {
396           case LSM6DSRX_ODR_PRGS_12Hz5:
397             if (val == LSM6DSRX_XL_ODR_OFF)
398             {
399               odr_xl = LSM6DSRX_XL_ODR_12Hz5;
400             }
401 
402             else
403             {
404               odr_xl = val;
405             }
406 
407             break;
408 
409           case LSM6DSRX_ODR_PRGS_26Hz:
410             if (val == LSM6DSRX_XL_ODR_OFF)
411             {
412               odr_xl = LSM6DSRX_XL_ODR_26Hz;
413             }
414 
415             else if (val == LSM6DSRX_XL_ODR_12Hz5)
416             {
417               odr_xl = LSM6DSRX_XL_ODR_26Hz;
418             }
419 
420             else
421             {
422               odr_xl = val;
423             }
424 
425             break;
426 
427           case LSM6DSRX_ODR_PRGS_52Hz:
428             if (val == LSM6DSRX_XL_ODR_OFF)
429             {
430               odr_xl = LSM6DSRX_XL_ODR_52Hz;
431             }
432 
433             else if (val == LSM6DSRX_XL_ODR_12Hz5)
434             {
435               odr_xl = LSM6DSRX_XL_ODR_52Hz;
436             }
437 
438             else if (val == LSM6DSRX_XL_ODR_26Hz)
439             {
440               odr_xl = LSM6DSRX_XL_ODR_52Hz;
441             }
442 
443             else
444             {
445               odr_xl = val;
446             }
447 
448             break;
449 
450           case LSM6DSRX_ODR_PRGS_104Hz:
451             if (val == LSM6DSRX_XL_ODR_OFF)
452             {
453               odr_xl = LSM6DSRX_XL_ODR_104Hz;
454             }
455 
456             else if (val == LSM6DSRX_XL_ODR_12Hz5)
457             {
458               odr_xl = LSM6DSRX_XL_ODR_104Hz;
459             }
460 
461             else if (val == LSM6DSRX_XL_ODR_26Hz)
462             {
463               odr_xl = LSM6DSRX_XL_ODR_104Hz;
464             }
465 
466             else if (val == LSM6DSRX_XL_ODR_52Hz)
467             {
468               odr_xl = LSM6DSRX_XL_ODR_104Hz;
469             }
470 
471             else
472             {
473               odr_xl = val;
474             }
475 
476             break;
477 
478           default:
479             odr_xl = val;
480             break;
481         }
482       }
483     }
484   }
485 
486   if (ret == 0)
487   {
488     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
489                             (uint8_t *)&ctrl1_xl, 1);
490   }
491 
492   if (ret == 0)
493   {
494     ctrl1_xl.odr_xl = (uint8_t)odr_xl;
495     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_XL,
496                              (uint8_t *)&ctrl1_xl, 1);
497   }
498 
499   return ret;
500 }
501 
502 /**
503   * @brief  Accelerometer UI data rate selection.[get]
504   *
505   * @param  ctx    Read / write interface definitions.(ptr)
506   * @param  val    Get the values of odr_xl in reg CTRL1_XL
507   * @retval        Interface status (MANDATORY: return 0 -> no Error).
508   *
509   */
lsm6dsrx_xl_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsrx_odr_xl_t * val)510 int32_t lsm6dsrx_xl_data_rate_get(const stmdev_ctx_t *ctx,
511                                   lsm6dsrx_odr_xl_t *val)
512 {
513   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
514   int32_t ret;
515   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
516                           (uint8_t *)&ctrl1_xl, 1);
517 
518   switch (ctrl1_xl.odr_xl)
519   {
520     case LSM6DSRX_XL_ODR_OFF:
521       *val = LSM6DSRX_XL_ODR_OFF;
522       break;
523 
524     case LSM6DSRX_XL_ODR_12Hz5:
525       *val = LSM6DSRX_XL_ODR_12Hz5;
526       break;
527 
528     case LSM6DSRX_XL_ODR_26Hz:
529       *val = LSM6DSRX_XL_ODR_26Hz;
530       break;
531 
532     case LSM6DSRX_XL_ODR_52Hz:
533       *val = LSM6DSRX_XL_ODR_52Hz;
534       break;
535 
536     case LSM6DSRX_XL_ODR_104Hz:
537       *val = LSM6DSRX_XL_ODR_104Hz;
538       break;
539 
540     case LSM6DSRX_XL_ODR_208Hz:
541       *val = LSM6DSRX_XL_ODR_208Hz;
542       break;
543 
544     case LSM6DSRX_XL_ODR_416Hz:
545       *val = LSM6DSRX_XL_ODR_416Hz;
546       break;
547 
548     case LSM6DSRX_XL_ODR_833Hz:
549       *val = LSM6DSRX_XL_ODR_833Hz;
550       break;
551 
552     case LSM6DSRX_XL_ODR_1666Hz:
553       *val = LSM6DSRX_XL_ODR_1666Hz;
554       break;
555 
556     case LSM6DSRX_XL_ODR_3332Hz:
557       *val = LSM6DSRX_XL_ODR_3332Hz;
558       break;
559 
560     case LSM6DSRX_XL_ODR_6667Hz:
561       *val = LSM6DSRX_XL_ODR_6667Hz;
562       break;
563 
564     case LSM6DSRX_XL_ODR_1Hz6:
565       *val = LSM6DSRX_XL_ODR_1Hz6;
566       break;
567 
568     default:
569       *val = LSM6DSRX_XL_ODR_OFF;
570       break;
571   }
572 
573   return ret;
574 }
575 
576 /**
577   * @brief  Gyroscope UI chain full-scale selection.[set]
578   *
579   * @param  ctx    Read / write interface definitions.(ptr)
580   * @param  val    Change the values of fs_g in reg CTRL2_G
581   * @retval        Interface status (MANDATORY: return 0 -> no Error).
582   *
583   */
lsm6dsrx_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsrx_fs_g_t val)584 int32_t lsm6dsrx_gy_full_scale_set(const stmdev_ctx_t *ctx,
585                                    lsm6dsrx_fs_g_t val)
586 {
587   lsm6dsrx_ctrl2_g_t ctrl2_g;
588   int32_t ret;
589   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_G,
590                           (uint8_t *)&ctrl2_g, 1);
591 
592   if (ret == 0)
593   {
594     ctrl2_g.fs_g = (uint8_t)val;
595     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL2_G,
596                              (uint8_t *)&ctrl2_g, 1);
597   }
598 
599   return ret;
600 }
601 
602 /**
603   * @brief  Gyroscope UI chain full-scale selection.[get]
604   *
605   * @param  ctx    Read / write interface definitions.(ptr)
606   * @param  val    Get the values of fs_g in reg CTRL2_G
607   * @retval        Interface status (MANDATORY: return 0 -> no Error).
608   *
609   */
lsm6dsrx_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsrx_fs_g_t * val)610 int32_t lsm6dsrx_gy_full_scale_get(const stmdev_ctx_t *ctx,
611                                    lsm6dsrx_fs_g_t *val)
612 {
613   lsm6dsrx_ctrl2_g_t ctrl2_g;
614   int32_t ret;
615   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_G,
616                           (uint8_t *)&ctrl2_g, 1);
617 
618   switch (ctrl2_g.fs_g)
619   {
620     case LSM6DSRX_125dps:
621       *val = LSM6DSRX_125dps;
622       break;
623 
624     case LSM6DSRX_250dps:
625       *val = LSM6DSRX_250dps;
626       break;
627 
628     case LSM6DSRX_500dps:
629       *val = LSM6DSRX_500dps;
630       break;
631 
632     case LSM6DSRX_1000dps:
633       *val = LSM6DSRX_1000dps;
634       break;
635 
636     case LSM6DSRX_2000dps:
637       *val = LSM6DSRX_2000dps;
638       break;
639 
640     case LSM6DSRX_4000dps:
641       *val = LSM6DSRX_4000dps;
642       break;
643 
644     default:
645       *val = LSM6DSRX_125dps;
646       break;
647   }
648 
649   return ret;
650 }
651 
652 /**
653   * @brief  Gyroscope data rate.[set]
654   *
655   * @param  ctx    Read / write interface definitions.(ptr)
656   * @param  val    Change the values of odr_g in reg CTRL2_G
657   * @retval        Interface status (MANDATORY: return 0 -> no Error).
658   *
659   */
lsm6dsrx_gy_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsrx_odr_g_t val)660 int32_t lsm6dsrx_gy_data_rate_set(const stmdev_ctx_t *ctx,
661                                   lsm6dsrx_odr_g_t val)
662 {
663   lsm6dsrx_odr_g_t odr_gy =  val;
664   lsm6dsrx_emb_fsm_enable_t fsm_enable;
665   lsm6dsrx_fsm_odr_t fsm_odr;
666   uint8_t mlc_enable;
667   lsm6dsrx_mlc_odr_t mlc_odr;
668   lsm6dsrx_ctrl2_g_t ctrl2_g;
669   int32_t ret;
670 
671   /* Check the Finite State Machine data rate constraints */
672   ret =  lsm6dsrx_fsm_enable_get(ctx, &fsm_enable);
673 
674   if (ret == 0)
675   {
676     if ((fsm_enable.fsm_enable_a.fsm1_en  |
677          fsm_enable.fsm_enable_a.fsm2_en  |
678          fsm_enable.fsm_enable_a.fsm3_en  |
679          fsm_enable.fsm_enable_a.fsm4_en  |
680          fsm_enable.fsm_enable_a.fsm5_en  |
681          fsm_enable.fsm_enable_a.fsm6_en  |
682          fsm_enable.fsm_enable_a.fsm7_en  |
683          fsm_enable.fsm_enable_a.fsm8_en  |
684          fsm_enable.fsm_enable_b.fsm9_en  |
685          fsm_enable.fsm_enable_b.fsm10_en |
686          fsm_enable.fsm_enable_b.fsm11_en |
687          fsm_enable.fsm_enable_b.fsm12_en |
688          fsm_enable.fsm_enable_b.fsm13_en |
689          fsm_enable.fsm_enable_b.fsm14_en |
690          fsm_enable.fsm_enable_b.fsm15_en |
691          fsm_enable.fsm_enable_b.fsm16_en) == PROPERTY_ENABLE)
692     {
693       ret =  lsm6dsrx_fsm_data_rate_get(ctx, &fsm_odr);
694 
695       if (ret == 0)
696       {
697         switch (fsm_odr)
698         {
699           case LSM6DSRX_ODR_FSM_12Hz5:
700             if (val == LSM6DSRX_GY_ODR_OFF)
701             {
702               odr_gy = LSM6DSRX_GY_ODR_12Hz5;
703             }
704 
705             else
706             {
707               odr_gy = val;
708             }
709 
710             break;
711 
712           case LSM6DSRX_ODR_FSM_26Hz:
713             if (val == LSM6DSRX_GY_ODR_OFF)
714             {
715               odr_gy = LSM6DSRX_GY_ODR_26Hz;
716             }
717 
718             else if (val == LSM6DSRX_GY_ODR_12Hz5)
719             {
720               odr_gy = LSM6DSRX_GY_ODR_26Hz;
721             }
722 
723             else
724             {
725               odr_gy = val;
726             }
727 
728             break;
729 
730           case LSM6DSRX_ODR_FSM_52Hz:
731             if (val == LSM6DSRX_GY_ODR_OFF)
732             {
733               odr_gy = LSM6DSRX_GY_ODR_52Hz;
734             }
735 
736             else if (val == LSM6DSRX_GY_ODR_12Hz5)
737             {
738               odr_gy = LSM6DSRX_GY_ODR_52Hz;
739             }
740 
741             else if (val == LSM6DSRX_GY_ODR_26Hz)
742             {
743               odr_gy = LSM6DSRX_GY_ODR_52Hz;
744             }
745 
746             else
747             {
748               odr_gy = val;
749             }
750 
751             break;
752 
753           case LSM6DSRX_ODR_FSM_104Hz:
754             if (val == LSM6DSRX_GY_ODR_OFF)
755             {
756               odr_gy = LSM6DSRX_GY_ODR_104Hz;
757             }
758 
759             else if (val == LSM6DSRX_GY_ODR_12Hz5)
760             {
761               odr_gy = LSM6DSRX_GY_ODR_104Hz;
762             }
763 
764             else if (val == LSM6DSRX_GY_ODR_26Hz)
765             {
766               odr_gy = LSM6DSRX_GY_ODR_104Hz;
767             }
768 
769             else if (val == LSM6DSRX_GY_ODR_52Hz)
770             {
771               odr_gy = LSM6DSRX_GY_ODR_104Hz;
772             }
773 
774             else
775             {
776               odr_gy = val;
777             }
778 
779             break;
780 
781           default:
782             odr_gy = val;
783             break;
784         }
785       }
786     }
787   }
788 
789   /* Check the Machine Learning Core data rate constraints */
790   mlc_enable = PROPERTY_DISABLE;
791 
792   if (ret == 0)
793   {
794     ret =  lsm6dsrx_mlc_get(ctx, &mlc_enable);
795 
796     if (mlc_enable == PROPERTY_ENABLE)
797     {
798       ret =  lsm6dsrx_mlc_data_rate_get(ctx, &mlc_odr);
799 
800       if (ret == 0)
801       {
802         switch (mlc_odr)
803         {
804           case LSM6DSRX_ODR_PRGS_12Hz5:
805             if (val == LSM6DSRX_GY_ODR_OFF)
806             {
807               odr_gy = LSM6DSRX_GY_ODR_12Hz5;
808             }
809 
810             else
811             {
812               odr_gy = val;
813             }
814 
815             break;
816 
817           case LSM6DSRX_ODR_PRGS_26Hz:
818             if (val == LSM6DSRX_GY_ODR_OFF)
819             {
820               odr_gy = LSM6DSRX_GY_ODR_26Hz;
821             }
822 
823             else if (val == LSM6DSRX_GY_ODR_12Hz5)
824             {
825               odr_gy = LSM6DSRX_GY_ODR_26Hz;
826             }
827 
828             else
829             {
830               odr_gy = val;
831             }
832 
833             break;
834 
835           case LSM6DSRX_ODR_PRGS_52Hz:
836             if (val == LSM6DSRX_GY_ODR_OFF)
837             {
838               odr_gy = LSM6DSRX_GY_ODR_52Hz;
839             }
840 
841             else if (val == LSM6DSRX_GY_ODR_12Hz5)
842             {
843               odr_gy = LSM6DSRX_GY_ODR_52Hz;
844             }
845 
846             else if (val == LSM6DSRX_GY_ODR_26Hz)
847             {
848               odr_gy = LSM6DSRX_GY_ODR_52Hz;
849             }
850 
851             else
852             {
853               odr_gy = val;
854             }
855 
856             break;
857 
858           case LSM6DSRX_ODR_PRGS_104Hz:
859             if (val == LSM6DSRX_GY_ODR_OFF)
860             {
861               odr_gy = LSM6DSRX_GY_ODR_104Hz;
862             }
863 
864             else if (val == LSM6DSRX_GY_ODR_12Hz5)
865             {
866               odr_gy = LSM6DSRX_GY_ODR_104Hz;
867             }
868 
869             else if (val == LSM6DSRX_GY_ODR_26Hz)
870             {
871               odr_gy = LSM6DSRX_GY_ODR_104Hz;
872             }
873 
874             else if (val == LSM6DSRX_GY_ODR_52Hz)
875             {
876               odr_gy = LSM6DSRX_GY_ODR_104Hz;
877             }
878 
879             else
880             {
881               odr_gy = val;
882             }
883 
884             break;
885 
886           default:
887             odr_gy = val;
888             break;
889         }
890       }
891     }
892   }
893 
894   if (ret == 0)
895   {
896     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_G,
897                             (uint8_t *)&ctrl2_g, 1);
898   }
899 
900   if (ret == 0)
901   {
902     ctrl2_g.odr_g = (uint8_t)odr_gy;
903     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL2_G,
904                              (uint8_t *)&ctrl2_g, 1);
905   }
906 
907   return ret;
908 }
909 
910 /**
911   * @brief  Gyroscope data rate.[get]
912   *
913   * @param  ctx    Read / write interface definitions.(ptr)
914   * @param  val    Get the values of odr_g in reg CTRL2_G
915   * @retval        Interface status (MANDATORY: return 0 -> no Error).
916   *
917   */
lsm6dsrx_gy_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsrx_odr_g_t * val)918 int32_t lsm6dsrx_gy_data_rate_get(const stmdev_ctx_t *ctx,
919                                   lsm6dsrx_odr_g_t *val)
920 {
921   lsm6dsrx_ctrl2_g_t ctrl2_g;
922   int32_t ret;
923   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_G,
924                           (uint8_t *)&ctrl2_g, 1);
925 
926   switch (ctrl2_g.odr_g)
927   {
928     case LSM6DSRX_GY_ODR_OFF:
929       *val = LSM6DSRX_GY_ODR_OFF;
930       break;
931 
932     case LSM6DSRX_GY_ODR_12Hz5:
933       *val = LSM6DSRX_GY_ODR_12Hz5;
934       break;
935 
936     case LSM6DSRX_GY_ODR_26Hz:
937       *val = LSM6DSRX_GY_ODR_26Hz;
938       break;
939 
940     case LSM6DSRX_GY_ODR_52Hz:
941       *val = LSM6DSRX_GY_ODR_52Hz;
942       break;
943 
944     case LSM6DSRX_GY_ODR_104Hz:
945       *val = LSM6DSRX_GY_ODR_104Hz;
946       break;
947 
948     case LSM6DSRX_GY_ODR_208Hz:
949       *val = LSM6DSRX_GY_ODR_208Hz;
950       break;
951 
952     case LSM6DSRX_GY_ODR_416Hz:
953       *val = LSM6DSRX_GY_ODR_416Hz;
954       break;
955 
956     case LSM6DSRX_GY_ODR_833Hz:
957       *val = LSM6DSRX_GY_ODR_833Hz;
958       break;
959 
960     case LSM6DSRX_GY_ODR_1666Hz:
961       *val = LSM6DSRX_GY_ODR_1666Hz;
962       break;
963 
964     case LSM6DSRX_GY_ODR_3332Hz:
965       *val = LSM6DSRX_GY_ODR_3332Hz;
966       break;
967 
968     case LSM6DSRX_GY_ODR_6667Hz:
969       *val = LSM6DSRX_GY_ODR_6667Hz;
970       break;
971 
972     default:
973       *val = LSM6DSRX_GY_ODR_OFF;
974       break;
975   }
976 
977   return ret;
978 }
979 
980 /**
981   * @brief  Block data update.[set]
982   *
983   * @param  ctx    Read / write interface definitions.(ptr)
984   * @param  val    Change the values of bdu in reg CTRL3_C
985   * @retval        Interface status (MANDATORY: return 0 -> no Error).
986   *
987   */
lsm6dsrx_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)988 int32_t lsm6dsrx_block_data_update_set(const stmdev_ctx_t *ctx,
989                                        uint8_t val)
990 {
991   lsm6dsrx_ctrl3_c_t ctrl3_c;
992   int32_t ret;
993   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
994                           (uint8_t *)&ctrl3_c, 1);
995 
996   if (ret == 0)
997   {
998     ctrl3_c.bdu = (uint8_t)val;
999     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
1000                              (uint8_t *)&ctrl3_c, 1);
1001   }
1002 
1003   return ret;
1004 }
1005 
1006 /**
1007   * @brief  Block data update.[get]
1008   *
1009   * @param  ctx    Read / write interface definitions.(ptr)
1010   * @param  val    Change the values of bdu in reg CTRL3_C
1011   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1012   *
1013   */
lsm6dsrx_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)1014 int32_t lsm6dsrx_block_data_update_get(const stmdev_ctx_t *ctx,
1015                                        uint8_t *val)
1016 {
1017   lsm6dsrx_ctrl3_c_t ctrl3_c;
1018   int32_t ret;
1019   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
1020                           (uint8_t *)&ctrl3_c, 1);
1021   *val = ctrl3_c.bdu;
1022 
1023   return ret;
1024 }
1025 
1026 /**
1027   * @brief  Weight of XL user offset bits of registers X_OFS_USR (73h),
1028   *         Y_OFS_USR (74h), Z_OFS_USR (75h).[set]
1029   *
1030   * @param  ctx    Read / write interface definitions.(ptr)
1031   * @param  val    Change the values of usr_off_w in reg CTRL6_C
1032   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1033   *
1034   */
lsm6dsrx_xl_offset_weight_set(const stmdev_ctx_t * ctx,lsm6dsrx_usr_off_w_t val)1035 int32_t lsm6dsrx_xl_offset_weight_set(const stmdev_ctx_t *ctx,
1036                                       lsm6dsrx_usr_off_w_t val)
1037 {
1038   lsm6dsrx_ctrl6_c_t ctrl6_c;
1039   int32_t ret;
1040   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
1041                           (uint8_t *)&ctrl6_c, 1);
1042 
1043   if (ret == 0)
1044   {
1045     ctrl6_c.usr_off_w = (uint8_t)val;
1046     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL6_C,
1047                              (uint8_t *)&ctrl6_c, 1);
1048   }
1049 
1050   return ret;
1051 }
1052 
1053 /**
1054   * @brief  Weight of XL user offset bits of registers X_OFS_USR (73h),
1055   *         Y_OFS_USR (74h), Z_OFS_USR (75h).[get]
1056   *
1057   * @param  ctx    Read / write interface definitions.(ptr)
1058   * @param  val    Get the values of usr_off_w in reg CTRL6_C
1059   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1060   *
1061   */
lsm6dsrx_xl_offset_weight_get(const stmdev_ctx_t * ctx,lsm6dsrx_usr_off_w_t * val)1062 int32_t lsm6dsrx_xl_offset_weight_get(const stmdev_ctx_t *ctx,
1063                                       lsm6dsrx_usr_off_w_t *val)
1064 {
1065   lsm6dsrx_ctrl6_c_t ctrl6_c;
1066   int32_t ret;
1067   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
1068                           (uint8_t *)&ctrl6_c, 1);
1069 
1070   switch (ctrl6_c.usr_off_w)
1071   {
1072     case LSM6DSRX_LSb_1mg:
1073       *val = LSM6DSRX_LSb_1mg;
1074       break;
1075 
1076     case LSM6DSRX_LSb_16mg:
1077       *val = LSM6DSRX_LSb_16mg;
1078       break;
1079 
1080     default:
1081       *val = LSM6DSRX_LSb_1mg;
1082       break;
1083   }
1084 
1085   return ret;
1086 }
1087 
1088 /**
1089   * @brief  Accelerometer power mode.[set]
1090   *
1091   * @param  ctx    Read / write interface definitions.(ptr)
1092   * @param  val    Change the values of xl_hm_mode in reg CTRL6_C
1093   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1094   *
1095   */
lsm6dsrx_xl_power_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_xl_hm_mode_t val)1096 int32_t lsm6dsrx_xl_power_mode_set(const stmdev_ctx_t *ctx,
1097                                    lsm6dsrx_xl_hm_mode_t val)
1098 {
1099   lsm6dsrx_ctrl6_c_t ctrl6_c;
1100   int32_t ret;
1101   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
1102                           (uint8_t *)&ctrl6_c, 1);
1103 
1104   if (ret == 0)
1105   {
1106     ctrl6_c.xl_hm_mode = (uint8_t)val & 0x01U;
1107     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL6_C,
1108                              (uint8_t *)&ctrl6_c, 1);
1109   }
1110 
1111   return ret;
1112 }
1113 
1114 /**
1115   * @brief  Accelerometer power mode[get]
1116   *
1117   * @param  ctx    Read / write interface definitions.(ptr)
1118   * @param  val    Get the values of xl_hm_mode in reg CTRL6_C
1119   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1120   *
1121   */
lsm6dsrx_xl_power_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_xl_hm_mode_t * val)1122 int32_t lsm6dsrx_xl_power_mode_get(const stmdev_ctx_t *ctx,
1123                                    lsm6dsrx_xl_hm_mode_t *val)
1124 {
1125   lsm6dsrx_ctrl6_c_t ctrl6_c;
1126   int32_t ret;
1127   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
1128                           (uint8_t *)&ctrl6_c, 1);
1129 
1130   switch (ctrl6_c.xl_hm_mode)
1131   {
1132     case LSM6DSRX_HIGH_PERFORMANCE_MD:
1133       *val = LSM6DSRX_HIGH_PERFORMANCE_MD;
1134       break;
1135 
1136     case LSM6DSRX_LOW_NORMAL_POWER_MD:
1137       *val = LSM6DSRX_LOW_NORMAL_POWER_MD;
1138       break;
1139 
1140     default:
1141       *val = LSM6DSRX_HIGH_PERFORMANCE_MD;
1142       break;
1143   }
1144 
1145   return ret;
1146 }
1147 
1148 /**
1149   * @brief  Operating mode for gyroscope.[set]
1150   *
1151   * @param  ctx    Read / write interface definitions.(ptr)
1152   * @param  val    Change the values of g_hm_mode in reg CTRL7_G
1153   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1154   *
1155   */
lsm6dsrx_gy_power_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_g_hm_mode_t val)1156 int32_t lsm6dsrx_gy_power_mode_set(const stmdev_ctx_t *ctx,
1157                                    lsm6dsrx_g_hm_mode_t val)
1158 {
1159   lsm6dsrx_ctrl7_g_t ctrl7_g;
1160   int32_t ret;
1161   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
1162                           (uint8_t *)&ctrl7_g, 1);
1163 
1164   if (ret == 0)
1165   {
1166     ctrl7_g.g_hm_mode = (uint8_t)val;
1167     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL7_G,
1168                              (uint8_t *)&ctrl7_g, 1);
1169   }
1170 
1171   return ret;
1172 }
1173 
1174 /**
1175   * @brief  gy_power_mode: [get]  Operating mode for gyroscope.
1176   *
1177   * @param  ctx    Read / write interface definitions.(ptr)
1178   * @param  val    Get the values of g_hm_mode in reg CTRL7_G
1179   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1180   *
1181   */
lsm6dsrx_gy_power_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_g_hm_mode_t * val)1182 int32_t lsm6dsrx_gy_power_mode_get(const stmdev_ctx_t *ctx,
1183                                    lsm6dsrx_g_hm_mode_t *val)
1184 {
1185   lsm6dsrx_ctrl7_g_t ctrl7_g;
1186   int32_t ret;
1187   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
1188                           (uint8_t *)&ctrl7_g, 1);
1189 
1190   switch (ctrl7_g.g_hm_mode)
1191   {
1192     case LSM6DSRX_GY_HIGH_PERFORMANCE:
1193       *val = LSM6DSRX_GY_HIGH_PERFORMANCE;
1194       break;
1195 
1196     case LSM6DSRX_GY_NORMAL:
1197       *val = LSM6DSRX_GY_NORMAL;
1198       break;
1199 
1200     default:
1201       *val = LSM6DSRX_GY_HIGH_PERFORMANCE;
1202       break;
1203   }
1204 
1205   return ret;
1206 }
1207 
1208 /**
1209   * @brief  Read all the interrupt flag of the device.
1210   *[get]
1211   * @param  ctx    Read / write interface definitions.(ptr)
1212   * @param  val    Get registers ALL_INT_SRC; WAKE_UP_SRC;
1213   *                              TAP_SRC; D6D_SRC; STATUS_REG;
1214   *                              EMB_FUNC_STATUS; FSM_STATUS_A/B
1215   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1216   *
1217   */
lsm6dsrx_all_sources_get(const stmdev_ctx_t * ctx,lsm6dsrx_all_sources_t * val)1218 int32_t lsm6dsrx_all_sources_get(const stmdev_ctx_t *ctx,
1219                                  lsm6dsrx_all_sources_t *val)
1220 {
1221   int32_t ret;
1222 
1223   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_ALL_INT_SRC,
1224                           (uint8_t *)&val->all_int_src, 1);
1225 
1226   if (ret == 0)
1227   {
1228     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_SRC,
1229                             (uint8_t *)&val->wake_up_src, 1);
1230   }
1231 
1232   if (ret == 0)
1233   {
1234     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_SRC,
1235                             (uint8_t *)&val->tap_src, 1);
1236   }
1237 
1238   if (ret == 0)
1239   {
1240     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_D6D_SRC,
1241                             (uint8_t *)&val->d6d_src, 1);
1242   }
1243 
1244   if (ret == 0)
1245   {
1246     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_REG,
1247                             (uint8_t *)&val->status_reg, 1);
1248   }
1249 
1250   if (ret == 0)
1251   {
1252     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
1253   }
1254 
1255   if (ret == 0)
1256   {
1257     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_STATUS,
1258                             (uint8_t *)&val->emb_func_status, 1);
1259   }
1260 
1261   if (ret == 0)
1262   {
1263     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_STATUS_A,
1264                             (uint8_t *)&val->fsm_status_a, 1);
1265   }
1266 
1267   if (ret == 0)
1268   {
1269     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_STATUS_B,
1270                             (uint8_t *)&val->fsm_status_b, 1);
1271   }
1272 
1273   if (ret == 0)
1274   {
1275     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
1276   }
1277 
1278   return ret;
1279 }
1280 
1281 /**
1282   * @brief  The STATUS_REG register is read by the primary interface.[get]
1283   *
1284   * @param  ctx    Read / write interface definitions.(ptr)
1285   * @param  val    Get register STATUS_REG
1286   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1287   *
1288   */
lsm6dsrx_status_reg_get(const stmdev_ctx_t * ctx,lsm6dsrx_status_reg_t * val)1289 int32_t lsm6dsrx_status_reg_get(const stmdev_ctx_t *ctx,
1290                                 lsm6dsrx_status_reg_t *val)
1291 {
1292   int32_t ret;
1293 
1294   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_REG, (uint8_t *) val, 1);
1295 
1296   return ret;
1297 }
1298 
1299 /**
1300   * @brief  Accelerometer new data available.[get]
1301   *
1302   * @param  ctx    Read / write interface definitions.(ptr)
1303   * @param  val    Change the values of xlda in reg STATUS_REG
1304   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1305   *
1306   */
lsm6dsrx_xl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1307 int32_t lsm6dsrx_xl_flag_data_ready_get(const stmdev_ctx_t *ctx,
1308                                         uint8_t *val)
1309 {
1310   lsm6dsrx_status_reg_t status_reg;
1311   int32_t ret;
1312 
1313   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_REG,
1314                           (uint8_t *)&status_reg, 1);
1315   *val = status_reg.xlda;
1316 
1317   return ret;
1318 }
1319 
1320 /**
1321   * @brief  Gyroscope new data available.[get]
1322   *
1323   * @param  ctx    Read / write interface definitions.(ptr)
1324   * @param  val    Change the values of gda in reg STATUS_REG
1325   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1326   *
1327   */
lsm6dsrx_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1328 int32_t lsm6dsrx_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
1329                                         uint8_t *val)
1330 {
1331   lsm6dsrx_status_reg_t status_reg;
1332   int32_t ret;
1333 
1334   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_REG,
1335                           (uint8_t *)&status_reg, 1);
1336   *val = status_reg.gda;
1337 
1338   return ret;
1339 }
1340 
1341 /**
1342   * @brief  Temperature new data available.[get]
1343   *
1344   * @param  ctx    Read / write interface definitions.(ptr)
1345   * @param  val    Change the values of tda in reg STATUS_REG
1346   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1347   *
1348   */
lsm6dsrx_temp_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1349 int32_t lsm6dsrx_temp_flag_data_ready_get(const stmdev_ctx_t *ctx,
1350                                           uint8_t *val)
1351 {
1352   lsm6dsrx_status_reg_t status_reg;
1353   int32_t ret;
1354 
1355   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_REG,
1356                           (uint8_t *)&status_reg, 1);
1357   *val = status_reg.tda;
1358 
1359   return ret;
1360 }
1361 
1362 /**
1363   * @brief  Accelerometer X-axis user offset correction expressed in two's
1364   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1365   *         The value must be in the range [-127 127].[set]
1366   *
1367   * @param  ctx    Read / write interface definitions.(ptr)
1368   * @param  buff   Buffer that contains data to write
1369   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1370   *
1371   */
lsm6dsrx_xl_usr_offset_x_set(const stmdev_ctx_t * ctx,uint8_t * buff)1372 int32_t lsm6dsrx_xl_usr_offset_x_set(const stmdev_ctx_t *ctx,
1373                                      uint8_t *buff)
1374 {
1375   int32_t ret;
1376 
1377   ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_X_OFS_USR, buff, 1);
1378 
1379   return ret;
1380 }
1381 
1382 /**
1383   * @brief  Accelerometer X-axis user offset correction expressed in two's
1384   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1385   *         The value must be in the range [-127 127].[get]
1386   *
1387   * @param  ctx    Read / write interface definitions.(ptr)
1388   * @param  buff   Buffer that stores data read
1389   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1390   *
1391   */
lsm6dsrx_xl_usr_offset_x_get(const stmdev_ctx_t * ctx,uint8_t * buff)1392 int32_t lsm6dsrx_xl_usr_offset_x_get(const stmdev_ctx_t *ctx,
1393                                      uint8_t *buff)
1394 {
1395   int32_t ret;
1396 
1397   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_X_OFS_USR, buff, 1);
1398 
1399   return ret;
1400 }
1401 
1402 /**
1403   * @brief  Accelerometer Y-axis user offset correction expressed in two's
1404   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1405   *         The value must be in the range [-127 127].[set]
1406   *
1407   * @param  ctx    Read / write interface definitions.(ptr)
1408   * @param  buff   Buffer that contains data to write
1409   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1410   *
1411   */
lsm6dsrx_xl_usr_offset_y_set(const stmdev_ctx_t * ctx,uint8_t * buff)1412 int32_t lsm6dsrx_xl_usr_offset_y_set(const stmdev_ctx_t *ctx,
1413                                      uint8_t *buff)
1414 {
1415   int32_t ret;
1416 
1417   ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_Y_OFS_USR, buff, 1);
1418 
1419   return ret;
1420 }
1421 
1422 /**
1423   * @brief  Accelerometer Y-axis user offset correction expressed in two's
1424   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1425   *         The value must be in the range [-127 127].[get]
1426   *
1427   * @param  ctx    Read / write interface definitions.(ptr)
1428   * @param  buff   Buffer that stores data read
1429   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1430   *
1431   */
lsm6dsrx_xl_usr_offset_y_get(const stmdev_ctx_t * ctx,uint8_t * buff)1432 int32_t lsm6dsrx_xl_usr_offset_y_get(const stmdev_ctx_t *ctx,
1433                                      uint8_t *buff)
1434 {
1435   int32_t ret;
1436 
1437   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_Y_OFS_USR, buff, 1);
1438 
1439   return ret;
1440 }
1441 
1442 /**
1443   * @brief  Accelerometer Z-axis user offset correction expressed in two's
1444   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1445   *         The value must be in the range [-127 127].[set]
1446   *
1447   * @param  ctx    Read / write interface definitions.(ptr)
1448   * @param  buff   Buffer that contains data to write
1449   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1450   *
1451   */
lsm6dsrx_xl_usr_offset_z_set(const stmdev_ctx_t * ctx,uint8_t * buff)1452 int32_t lsm6dsrx_xl_usr_offset_z_set(const stmdev_ctx_t *ctx,
1453                                      uint8_t *buff)
1454 {
1455   int32_t ret;
1456 
1457   ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_Z_OFS_USR, buff, 1);
1458 
1459   return ret;
1460 }
1461 
1462 /**
1463   * @brief  Accelerometer X-axis user offset correction expressed in two's
1464   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
1465   *         The value must be in the range [-127 127].[get]
1466   *
1467   * @param  ctx    Read / write interface definitions.(ptr)
1468   * @param  buff   Buffer that stores data read
1469   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1470   *
1471   */
lsm6dsrx_xl_usr_offset_z_get(const stmdev_ctx_t * ctx,uint8_t * buff)1472 int32_t lsm6dsrx_xl_usr_offset_z_get(const stmdev_ctx_t *ctx,
1473                                      uint8_t *buff)
1474 {
1475   int32_t ret;
1476 
1477   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_Z_OFS_USR, buff, 1);
1478 
1479   return ret;
1480 }
1481 
1482 /**
1483   * @brief  Enables user offset on out.[set]
1484   *
1485   * @param  ctx    Read / write interface definitions.(ptr)
1486   * @param  val    Change the values of usr_off_on_out in reg CTRL7_G
1487   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1488   *
1489   */
lsm6dsrx_xl_usr_offset_set(const stmdev_ctx_t * ctx,uint8_t val)1490 int32_t lsm6dsrx_xl_usr_offset_set(const stmdev_ctx_t *ctx, uint8_t val)
1491 {
1492   lsm6dsrx_ctrl7_g_t ctrl7_g;
1493   int32_t ret;
1494 
1495   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
1496                           (uint8_t *)&ctrl7_g, 1);
1497 
1498   if (ret == 0)
1499   {
1500     ctrl7_g.usr_off_on_out = (uint8_t)val;
1501     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL7_G,
1502                              (uint8_t *)&ctrl7_g, 1);
1503   }
1504 
1505   return ret;
1506 }
1507 
1508 /**
1509   * @brief  Get user offset on out flag.[get]
1510   *
1511   * @param  ctx    Read / write interface definitions.(ptr)
1512   * @param  val    Get values of usr_off_on_out in reg CTRL7_G
1513   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1514   *
1515   */
lsm6dsrx_xl_usr_offset_get(const stmdev_ctx_t * ctx,uint8_t * val)1516 int32_t lsm6dsrx_xl_usr_offset_get(const stmdev_ctx_t *ctx, uint8_t *val)
1517 {
1518   lsm6dsrx_ctrl7_g_t ctrl7_g;
1519   int32_t ret;
1520 
1521   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
1522                           (uint8_t *)&ctrl7_g, 1);
1523   *val = ctrl7_g.usr_off_on_out;
1524 
1525   return ret;
1526 }
1527 
1528 /**
1529   * @}
1530   *
1531   */
1532 
1533 /**
1534   * @defgroup   LSM6DSRX_Timestamp
1535   * @brief      This section groups all the functions that manage the
1536   *             timestamp generation.
1537   * @{
1538   *
1539   */
1540 
1541 /**
1542   * @brief  Reset timestamp counter.[set]
1543   *
1544   * @param  ctx    Read / write interface definitions.(ptr)
1545   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1546   *
1547   */
lsm6dsrx_timestamp_rst(const stmdev_ctx_t * ctx)1548 int32_t lsm6dsrx_timestamp_rst(const stmdev_ctx_t *ctx)
1549 {
1550   uint8_t rst_val = 0xAA;
1551   return lsm6dsrx_write_reg(ctx, LSM6DSRX_TIMESTAMP2, &rst_val, 1);
1552 }
1553 
1554 /**
1555   * @brief  Enables timestamp counter.[set]
1556   *
1557   * @param  ctx    Read / write interface definitions.(ptr)
1558   * @param  val    Change the values of timestamp_en in reg CTRL10_C
1559   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1560   *
1561   */
lsm6dsrx_timestamp_set(const stmdev_ctx_t * ctx,uint8_t val)1562 int32_t lsm6dsrx_timestamp_set(const stmdev_ctx_t *ctx, uint8_t val)
1563 {
1564   lsm6dsrx_ctrl10_c_t ctrl10_c;
1565   int32_t ret;
1566 
1567   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL10_C,
1568                           (uint8_t *)&ctrl10_c, 1);
1569 
1570   if (ret == 0)
1571   {
1572     ctrl10_c.timestamp_en = (uint8_t)val;
1573     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL10_C,
1574                              (uint8_t *)&ctrl10_c, 1);
1575   }
1576 
1577   return ret;
1578 }
1579 
1580 /**
1581   * @brief  Enables timestamp counter.[get]
1582   *
1583   * @param  ctx    Read / write interface definitions.(ptr)
1584   * @param  val    Change the values of timestamp_en in reg CTRL10_C
1585   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1586   *
1587   */
lsm6dsrx_timestamp_get(const stmdev_ctx_t * ctx,uint8_t * val)1588 int32_t lsm6dsrx_timestamp_get(const stmdev_ctx_t *ctx, uint8_t *val)
1589 {
1590   lsm6dsrx_ctrl10_c_t ctrl10_c;
1591   int32_t ret;
1592 
1593   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL10_C,
1594                           (uint8_t *)&ctrl10_c, 1);
1595   *val = ctrl10_c.timestamp_en;
1596 
1597   return ret;
1598 }
1599 
1600 /**
1601   * @brief  Timestamp first data output register (r).
1602   *         The value is expressed as a 32-bit word and the bit resolution
1603   *         is 25 us.[get]
1604   *
1605   * @param  ctx    Read / write interface definitions.(ptr)
1606   * @param  buff   Buffer that stores data read
1607   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1608   *
1609   */
lsm6dsrx_timestamp_raw_get(const stmdev_ctx_t * ctx,uint32_t * val)1610 int32_t lsm6dsrx_timestamp_raw_get(const stmdev_ctx_t *ctx, uint32_t *val)
1611 {
1612   uint8_t buff[4];
1613   int32_t ret;
1614 
1615   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TIMESTAMP0, buff, 4);
1616   *val = buff[3];
1617   *val = (*val * 256U) +  buff[2];
1618   *val = (*val * 256U) +  buff[1];
1619   *val = (*val * 256U) +  buff[0];
1620 
1621   return ret;
1622 }
1623 
1624 /**
1625   * @}
1626   *
1627   */
1628 
1629 /**
1630   * @defgroup   LSM6DSRX_Data output
1631   * @brief      This section groups all the data output functions.
1632   * @{
1633   *
1634   */
1635 
1636 /**
1637   * @brief  Circular burst-mode (rounding) read of the output registers.[set]
1638   *
1639   * @param  ctx    Read / write interface definitions.(ptr)
1640   * @param  val    Change the values of rounding in reg CTRL5_C
1641   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1642   *
1643   */
lsm6dsrx_rounding_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_rounding_t val)1644 int32_t lsm6dsrx_rounding_mode_set(const stmdev_ctx_t *ctx,
1645                                    lsm6dsrx_rounding_t val)
1646 {
1647   lsm6dsrx_ctrl5_c_t ctrl5_c;
1648   int32_t ret;
1649 
1650   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
1651                           (uint8_t *)&ctrl5_c, 1);
1652 
1653   if (ret == 0)
1654   {
1655     ctrl5_c.rounding = (uint8_t)val;
1656     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL5_C,
1657                              (uint8_t *)&ctrl5_c, 1);
1658   }
1659 
1660   return ret;
1661 }
1662 
1663 /**
1664   * @brief  Gyroscope UI chain full-scale selection.[get]
1665   *
1666   * @param  ctx    Read / write interface definitions.(ptr)
1667   * @param  val    Get the values of rounding in reg CTRL5_C
1668   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1669   *
1670   */
lsm6dsrx_rounding_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_rounding_t * val)1671 int32_t lsm6dsrx_rounding_mode_get(const stmdev_ctx_t *ctx,
1672                                    lsm6dsrx_rounding_t *val)
1673 {
1674   lsm6dsrx_ctrl5_c_t ctrl5_c;
1675   int32_t ret;
1676 
1677   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
1678                           (uint8_t *)&ctrl5_c, 1);
1679 
1680   switch (ctrl5_c.rounding)
1681   {
1682     case LSM6DSRX_NO_ROUND:
1683       *val = LSM6DSRX_NO_ROUND;
1684       break;
1685 
1686     case LSM6DSRX_ROUND_XL:
1687       *val = LSM6DSRX_ROUND_XL;
1688       break;
1689 
1690     case LSM6DSRX_ROUND_GY:
1691       *val = LSM6DSRX_ROUND_GY;
1692       break;
1693 
1694     case LSM6DSRX_ROUND_GY_XL:
1695       *val = LSM6DSRX_ROUND_GY_XL;
1696       break;
1697 
1698     default:
1699       *val = LSM6DSRX_NO_ROUND;
1700       break;
1701   }
1702 
1703   return ret;
1704 }
1705 
1706 /**
1707   * @brief  Temperature data output register (r).
1708   *         L and H registers together express a 16-bit word in two's
1709   *         complement.[get]
1710   *
1711   * @param  ctx    Read / write interface definitions.(ptr)
1712   * @param  buff   Buffer that stores data read
1713   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1714   *
1715   */
lsm6dsrx_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1716 int32_t lsm6dsrx_temperature_raw_get(const stmdev_ctx_t *ctx,
1717                                      int16_t *val)
1718 {
1719   uint8_t buff[2];
1720   int32_t ret;
1721 
1722   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_OUT_TEMP_L, buff, 2);
1723   *val = (int16_t)buff[1];
1724   *val = (*val * 256) + (int16_t)buff[0];
1725 
1726   return ret;
1727 }
1728 
1729 /**
1730   * @brief  Angular rate sensor. The value is expressed as a 16-bit
1731   *         word in two's complement.[get]
1732   *
1733   * @param  ctx    Read / write interface definitions.(ptr)
1734   * @param  buff   Buffer that stores data read
1735   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1736   *
1737   */
lsm6dsrx_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1738 int32_t lsm6dsrx_angular_rate_raw_get(const stmdev_ctx_t *ctx,
1739                                       int16_t *val)
1740 {
1741   uint8_t buff[6];
1742   int32_t ret;
1743 
1744   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_OUTX_L_G, buff, 6);
1745   val[0] = (int16_t)buff[1];
1746   val[0] = (val[0] * 256) + (int16_t)buff[0];
1747   val[1] = (int16_t)buff[3];
1748   val[1] = (val[1] * 256) + (int16_t)buff[2];
1749   val[2] = (int16_t)buff[5];
1750   val[2] = (val[2] * 256) + (int16_t)buff[4];
1751 
1752   return ret;
1753 }
1754 
1755 /**
1756   * @brief  Linear acceleration output register. The value is expressed as a
1757   *         16-bit word in two's complement.[get]
1758   *
1759   * @param  ctx    Read / write interface definitions.(ptr)
1760   * @param  buff   Buffer that stores data read
1761   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1762   *
1763   */
lsm6dsrx_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1764 int32_t lsm6dsrx_acceleration_raw_get(const stmdev_ctx_t *ctx,
1765                                       int16_t *val)
1766 {
1767   uint8_t buff[6];
1768   int32_t ret;
1769 
1770   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_OUTX_L_A, buff, 6);
1771   val[0] = (int16_t)buff[1];
1772   val[0] = (val[0] * 256) + (int16_t)buff[0];
1773   val[1] = (int16_t)buff[3];
1774   val[1] = (val[1] * 256) + (int16_t)buff[2];
1775   val[2] = (int16_t)buff[5];
1776   val[2] = (val[2] * 256) + (int16_t)buff[4];
1777 
1778   return ret;
1779 }
1780 
1781 /**
1782   * @brief  FIFO data output.[get]
1783   *
1784   * @param  ctx    Read / write interface definitions.(ptr)
1785   * @param  buff   Buffer that stores data read
1786   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1787   *
1788   */
lsm6dsrx_fifo_out_raw_get(const stmdev_ctx_t * ctx,uint8_t * buff)1789 int32_t lsm6dsrx_fifo_out_raw_get(const stmdev_ctx_t *ctx, uint8_t *buff)
1790 {
1791   int32_t ret;
1792 
1793   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_DATA_OUT_X_L, buff, 6);
1794 
1795   return ret;
1796 }
1797 
1798 /**
1799   * @brief  Step counter output register.[get]
1800   *
1801   * @param  ctx    Read / write interface definitions.(ptr)
1802   * @param  buff   Buffer that stores data read
1803   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1804   *
1805   */
lsm6dsrx_number_of_steps_get(const stmdev_ctx_t * ctx,uint16_t * val)1806 int32_t lsm6dsrx_number_of_steps_get(const stmdev_ctx_t *ctx,
1807                                      uint16_t *val)
1808 {
1809   uint8_t buff[2];
1810   int32_t ret;
1811 
1812   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
1813 
1814   if (ret == 0)
1815   {
1816     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STEP_COUNTER_L, buff, 2);
1817     *val = buff[1];
1818     *val = (*val * 256U) +  buff[0];
1819   }
1820 
1821   if (ret == 0)
1822   {
1823     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
1824   }
1825 
1826   return ret;
1827 }
1828 
1829 /**
1830   * @brief  Reset step counter register.[get]
1831   *
1832   * @param  ctx    Read / write interface definitions.(ptr)
1833   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1834   *
1835   */
lsm6dsrx_steps_reset(const stmdev_ctx_t * ctx)1836 int32_t lsm6dsrx_steps_reset(const stmdev_ctx_t *ctx)
1837 {
1838   lsm6dsrx_emb_func_src_t emb_func_src;
1839   int32_t ret;
1840 
1841   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
1842 
1843   if (ret == 0)
1844   {
1845     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_SRC,
1846                             (uint8_t *)&emb_func_src, 1);
1847   }
1848 
1849   if (ret == 0)
1850   {
1851     emb_func_src.pedo_rst_step = PROPERTY_ENABLE;
1852     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_SRC,
1853                              (uint8_t *)&emb_func_src, 1);
1854   }
1855 
1856   if (ret == 0)
1857   {
1858     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
1859   }
1860 
1861   return ret;
1862 }
1863 
1864 /**
1865   * @}
1866   *
1867   */
1868 
1869 /**
1870   * @defgroup   LSM6DSRX_common
1871   * @brief      This section groups common useful functions.
1872   * @{
1873   *
1874   */
1875 
1876 /**
1877   * @brief  Difference in percentage of the effective ODR (and timestamp rate)
1878   *         with respect to the typical.[set]
1879   *         Step:  0.15%. 8-bit format, 2's complement.
1880   *
1881   * @param  ctx    Read / write interface definitions.(ptr)
1882   * @param  val    Change the values of freq_fine in reg INTERNAL_FREQ_FINE
1883   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1884   *
1885   */
lsm6dsrx_odr_cal_reg_set(const stmdev_ctx_t * ctx,uint8_t val)1886 int32_t lsm6dsrx_odr_cal_reg_set(const stmdev_ctx_t *ctx, uint8_t val)
1887 {
1888   lsm6dsrx_internal_freq_fine_t internal_freq_fine;
1889   int32_t ret;
1890 
1891   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INTERNAL_FREQ_FINE,
1892                           (uint8_t *)&internal_freq_fine, 1);
1893 
1894   if (ret == 0)
1895   {
1896     internal_freq_fine.freq_fine = (uint8_t)val;
1897     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INTERNAL_FREQ_FINE,
1898                              (uint8_t *)&internal_freq_fine, 1);
1899   }
1900 
1901   return ret;
1902 }
1903 
1904 /**
1905   * @brief  Difference in percentage of the effective ODR (and timestamp rate)
1906   *         with respect to the typical.[get]
1907   *         Step:  0.15%. 8-bit format, 2's complement.
1908   *
1909   * @param  ctx    Read / write interface definitions.(ptr)
1910   * @param  val    Change the values of freq_fine in reg INTERNAL_FREQ_FINE
1911   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1912   *
1913   */
lsm6dsrx_odr_cal_reg_get(const stmdev_ctx_t * ctx,uint8_t * val)1914 int32_t lsm6dsrx_odr_cal_reg_get(const stmdev_ctx_t *ctx, uint8_t *val)
1915 {
1916   lsm6dsrx_internal_freq_fine_t internal_freq_fine;
1917   int32_t ret;
1918 
1919   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INTERNAL_FREQ_FINE,
1920                           (uint8_t *)&internal_freq_fine, 1);
1921   *val = internal_freq_fine.freq_fine;
1922 
1923   return ret;
1924 }
1925 
1926 /**
1927   * @brief  Enable access to the embedded functions/sensor hub configuration
1928   *         registers.[set]
1929   *
1930   * @param  ctx    Read / write interface definitions.(ptr)
1931   * @param  val    Change the values of reg_access in reg FUNC_CFG_ACCESS
1932   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1933   *
1934   */
lsm6dsrx_mem_bank_set(const stmdev_ctx_t * ctx,lsm6dsrx_reg_access_t val)1935 int32_t lsm6dsrx_mem_bank_set(const stmdev_ctx_t *ctx,
1936                               lsm6dsrx_reg_access_t val)
1937 {
1938   lsm6dsrx_func_cfg_access_t func_cfg_access;
1939   int32_t ret;
1940 
1941   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FUNC_CFG_ACCESS,
1942                           (uint8_t *)&func_cfg_access, 1);
1943 
1944   if (ret == 0)
1945   {
1946     func_cfg_access.reg_access = (uint8_t)val;
1947     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FUNC_CFG_ACCESS,
1948                              (uint8_t *)&func_cfg_access, 1);
1949   }
1950 
1951   return ret;
1952 }
1953 
1954 /**
1955   * @brief  Enable access to the embedded functions/sensor hub configuration
1956   *         registers.[get]
1957   *
1958   * @param  ctx    Read / write interface definitions.(ptr)
1959   * @param  val    Get the values of reg_access in reg FUNC_CFG_ACCESS
1960   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1961   *
1962   */
lsm6dsrx_mem_bank_get(const stmdev_ctx_t * ctx,lsm6dsrx_reg_access_t * val)1963 int32_t lsm6dsrx_mem_bank_get(const stmdev_ctx_t *ctx,
1964                               lsm6dsrx_reg_access_t *val)
1965 {
1966   lsm6dsrx_func_cfg_access_t func_cfg_access;
1967   int32_t ret;
1968 
1969   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FUNC_CFG_ACCESS,
1970                           (uint8_t *)&func_cfg_access, 1);
1971 
1972   switch (func_cfg_access.reg_access)
1973   {
1974     case LSM6DSRX_USER_BANK:
1975       *val = LSM6DSRX_USER_BANK;
1976       break;
1977 
1978     case LSM6DSRX_SENSOR_HUB_BANK:
1979       *val = LSM6DSRX_SENSOR_HUB_BANK;
1980       break;
1981 
1982     case LSM6DSRX_EMBEDDED_FUNC_BANK:
1983       *val = LSM6DSRX_EMBEDDED_FUNC_BANK;
1984       break;
1985 
1986     default:
1987       *val = LSM6DSRX_USER_BANK;
1988       break;
1989   }
1990 
1991   return ret;
1992 }
1993 
1994 /**
1995   * @brief  Write a line(byte) in a page.[set]
1996   *
1997   * @param  ctx    Read / write interface definitions.(ptr)
1998   * @param  add    Page line address
1999   * @param  val    Value to write
2000   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2001   *
2002   */
lsm6dsrx_ln_pg_write_byte(const stmdev_ctx_t * ctx,uint16_t add,uint8_t * val)2003 int32_t lsm6dsrx_ln_pg_write_byte(const stmdev_ctx_t *ctx, uint16_t add,
2004                                   uint8_t *val)
2005 {
2006   lsm6dsrx_page_rw_t page_rw;
2007   lsm6dsrx_page_sel_t page_sel;
2008   lsm6dsrx_page_address_t page_address;
2009   int32_t ret;
2010 
2011   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
2012 
2013   if (ret == 0)
2014   {
2015     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2016                             (uint8_t *)&page_rw, 1);
2017   }
2018 
2019   if (ret == 0)
2020   {
2021     page_rw.page_rw = 0x02U; /* page_write enable */
2022     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2023                              (uint8_t *)&page_rw, 1);
2024   }
2025 
2026   if (ret == 0)
2027   {
2028     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_SEL,
2029                             (uint8_t *)&page_sel, 1);
2030   }
2031 
2032   if (ret == 0)
2033   {
2034     page_sel.page_sel = (uint8_t)((add / 256U) & 0x0FU);
2035     page_sel.not_used_01 = 1;
2036     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_SEL,
2037                              (uint8_t *)&page_sel, 1);
2038   }
2039 
2040   if (ret == 0)
2041   {
2042     page_address.page_addr = (uint8_t)(add - (page_sel.page_sel * 256U));
2043     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_ADDRESS,
2044                              (uint8_t *)&page_address, 1);
2045   }
2046 
2047   if (ret == 0)
2048   {
2049     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_VALUE, val, 1);
2050   }
2051 
2052   if (ret == 0)
2053   {
2054     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2055                             (uint8_t *)&page_rw, 1);
2056   }
2057 
2058   if (ret == 0)
2059   {
2060     page_rw.page_rw = 0x00; /* page_write disable */
2061     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2062                              (uint8_t *)&page_rw, 1);
2063   }
2064 
2065   if (ret == 0)
2066   {
2067     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
2068   }
2069 
2070   return ret;
2071 }
2072 
2073 /**
2074   * @brief  Write buffer in a page.[set]
2075   *
2076   * @param  ctx    Read / write interface definitions.(ptr)
2077   * @param  buf    Page line address.(ptr)
2078   * @param  val    Value to write.
2079   * @param  len    buffer length.
2080   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2081   *
2082   */
lsm6dsrx_ln_pg_write(const stmdev_ctx_t * ctx,uint16_t add,uint8_t * buf,uint8_t len)2083 int32_t lsm6dsrx_ln_pg_write(const stmdev_ctx_t *ctx, uint16_t add,
2084                              uint8_t *buf, uint8_t len)
2085 {
2086   lsm6dsrx_page_rw_t page_rw;
2087   lsm6dsrx_page_sel_t page_sel;
2088   lsm6dsrx_page_address_t page_address;
2089   uint8_t msb;
2090   uint8_t lsb;
2091   int32_t ret;
2092   uint8_t i ;
2093 
2094   msb = (uint8_t)((add / 256U) & 0x0FU);
2095   lsb = (uint8_t)(add - (msb * 256U));
2096   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
2097 
2098   if (ret == 0)
2099   {
2100     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2101                             (uint8_t *)&page_rw, 1);
2102   }
2103 
2104   if (ret == 0)
2105   {
2106     page_rw.page_rw = 0x02U; /* page_write enable*/
2107     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2108                              (uint8_t *)&page_rw, 1);
2109   }
2110 
2111   if (ret == 0)
2112   {
2113     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_SEL,
2114                             (uint8_t *)&page_sel, 1);
2115   }
2116 
2117   if (ret == 0)
2118   {
2119     page_sel.page_sel = msb;
2120     page_sel.not_used_01 = 1;
2121     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_SEL,
2122                              (uint8_t *)&page_sel, 1);
2123   }
2124 
2125   if (ret == 0)
2126   {
2127     page_address.page_addr = lsb;
2128     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_ADDRESS,
2129                              (uint8_t *)&page_address, 1);
2130   }
2131 
2132   for (i = 0; i < len; i++)
2133   {
2134     if (ret == 0)
2135     {
2136       ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_VALUE, &buf[i], 1);
2137 
2138       if (ret == 0)
2139       {
2140         /* Check if page wrap */
2141         if (lsb == 0x00U)
2142         {
2143           msb++;
2144           ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_SEL,
2145                                   (uint8_t *)&page_sel, 1);
2146         }
2147 
2148         lsb++;
2149       }
2150 
2151       if (ret == 0)
2152       {
2153         page_sel.page_sel = msb;
2154         page_sel.not_used_01 = 1;
2155         ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_SEL,
2156                                  (uint8_t *)&page_sel, 1);
2157       }
2158     }
2159   }
2160 
2161   if (ret == 0)
2162   {
2163     page_sel.page_sel = 0;
2164     page_sel.not_used_01 = 1;
2165     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_SEL,
2166                              (uint8_t *)&page_sel, 1);
2167   }
2168 
2169   if (ret == 0)
2170   {
2171     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2172                             (uint8_t *)&page_rw, 1);
2173   }
2174 
2175   if (ret == 0)
2176   {
2177     page_rw.page_rw = 0x00U; /* page_write disable */
2178     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2179                              (uint8_t *)&page_rw, 1);
2180   }
2181 
2182   if (ret == 0)
2183   {
2184     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
2185   }
2186 
2187   return ret;
2188 }
2189 
2190 /**
2191   * @brief  Read a line(byte) in a page.[get]
2192   *
2193   * @param  ctx    Read / write interface definitions.(ptr)
2194   * @param  add    Page line address.
2195   * @param  val    Read value.(ptr)
2196   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2197   *
2198   */
lsm6dsrx_ln_pg_read_byte(const stmdev_ctx_t * ctx,uint16_t add,uint8_t * val)2199 int32_t lsm6dsrx_ln_pg_read_byte(const stmdev_ctx_t *ctx, uint16_t add,
2200                                  uint8_t *val)
2201 {
2202   lsm6dsrx_page_rw_t page_rw;
2203   lsm6dsrx_page_sel_t page_sel;
2204   lsm6dsrx_page_address_t page_address;
2205   int32_t ret;
2206 
2207   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
2208 
2209   if (ret == 0)
2210   {
2211     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2212                             (uint8_t *)&page_rw, 1);
2213   }
2214 
2215   if (ret == 0)
2216   {
2217     page_rw.page_rw = 0x01U; /* page_read enable*/
2218     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2219                              (uint8_t *)&page_rw, 1);
2220   }
2221 
2222   if (ret == 0)
2223   {
2224     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_SEL,
2225                             (uint8_t *)&page_sel, 1);
2226   }
2227 
2228   if (ret == 0)
2229   {
2230     page_sel.page_sel = (uint8_t)((add / 256U) & 0x0FU);
2231     page_sel.not_used_01 = 1;
2232     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_SEL,
2233                              (uint8_t *)&page_sel, 1);
2234   }
2235 
2236   if (ret == 0)
2237   {
2238     page_address.page_addr = (uint8_t)(add - (page_sel.page_sel * 256U));
2239     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_ADDRESS,
2240                              (uint8_t *)&page_address, 1);
2241   }
2242 
2243   if (ret == 0)
2244   {
2245     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_VALUE, val, 2);
2246   }
2247 
2248   if (ret == 0)
2249   {
2250     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
2251                             (uint8_t *)&page_rw, 1);
2252   }
2253 
2254   if (ret == 0)
2255   {
2256     page_rw.page_rw = 0x00U; /* page_read disable */
2257     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
2258                              (uint8_t *)&page_rw, 1);
2259   }
2260 
2261   if (ret == 0)
2262   {
2263     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
2264   }
2265 
2266   return ret;
2267 }
2268 
2269 /**
2270   * @brief  Data-ready pulsed / letched mode.[set]
2271   *
2272   * @param  ctx    Read / write interface definitions.(ptr)
2273   * @param  val    Change the values of dataready_pulsed in
2274   *                reg COUNTER_BDR_REG1
2275   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2276   *
2277   */
lsm6dsrx_data_ready_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_dataready_pulsed_t val)2278 int32_t lsm6dsrx_data_ready_mode_set(const stmdev_ctx_t *ctx,
2279                                      lsm6dsrx_dataready_pulsed_t val)
2280 {
2281   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
2282   int32_t ret;
2283 
2284   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
2285                           (uint8_t *)&counter_bdr_reg1, 1);
2286 
2287   if (ret == 0)
2288   {
2289     counter_bdr_reg1.dataready_pulsed = (uint8_t)val;
2290     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
2291                              (uint8_t *)&counter_bdr_reg1, 1);
2292   }
2293 
2294   return ret;
2295 }
2296 
2297 /**
2298   * @brief  Data-ready pulsed / letched mode.[get]
2299   *
2300   * @param  ctx    Read / write interface definitions.(ptr)
2301   * @param  val    Get the values of dataready_pulsed in
2302   *                reg COUNTER_BDR_REG1
2303   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2304   *
2305   */
lsm6dsrx_data_ready_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_dataready_pulsed_t * val)2306 int32_t lsm6dsrx_data_ready_mode_get(const stmdev_ctx_t *ctx,
2307                                      lsm6dsrx_dataready_pulsed_t *val)
2308 {
2309   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
2310   int32_t ret;
2311 
2312   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
2313                           (uint8_t *)&counter_bdr_reg1, 1);
2314 
2315   switch (counter_bdr_reg1.dataready_pulsed)
2316   {
2317     case LSM6DSRX_DRDY_LATCHED:
2318       *val = LSM6DSRX_DRDY_LATCHED;
2319       break;
2320 
2321     case LSM6DSRX_DRDY_PULSED:
2322       *val = LSM6DSRX_DRDY_PULSED;
2323       break;
2324 
2325     default:
2326       *val = LSM6DSRX_DRDY_LATCHED;
2327       break;
2328   }
2329 
2330   return ret;
2331 }
2332 
2333 /**
2334   * @brief  Device Who am I.[get]
2335   *
2336   * @param  ctx    Read / write interface definitions.(ptr)
2337   * @param  buff   Buffer that stores data read
2338   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2339   *
2340   */
lsm6dsrx_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)2341 int32_t lsm6dsrx_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
2342 {
2343   int32_t ret;
2344 
2345   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WHO_AM_I, buff, 1);
2346 
2347   return ret;
2348 }
2349 
2350 /**
2351   * @brief  Software reset. Restore the default values in user registers.[set]
2352   *
2353   * @param  ctx    Read / write interface definitions.(ptr)
2354   * @param  val    Change the values of sw_reset in reg CTRL3_C
2355   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2356   *
2357   */
lsm6dsrx_reset_set(const stmdev_ctx_t * ctx,uint8_t val)2358 int32_t lsm6dsrx_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
2359 {
2360   lsm6dsrx_ctrl3_c_t ctrl3_c;
2361   int32_t ret;
2362 
2363   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2364                           (uint8_t *)&ctrl3_c, 1);
2365 
2366   if (ret == 0)
2367   {
2368     ctrl3_c.sw_reset = (uint8_t)val;
2369     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
2370                              (uint8_t *)&ctrl3_c, 1);
2371   }
2372 
2373   return ret;
2374 }
2375 
2376 /**
2377   * @brief  Software reset. Restore the default values in user registers.[get]
2378   *
2379   * @param  ctx    Read / write interface definitions.(ptr)
2380   * @param  val    Change the values of sw_reset in reg CTRL3_C
2381   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2382   *
2383   */
lsm6dsrx_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)2384 int32_t lsm6dsrx_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
2385 {
2386   lsm6dsrx_ctrl3_c_t ctrl3_c;
2387   int32_t ret;
2388 
2389   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2390                           (uint8_t *)&ctrl3_c, 1);
2391   *val = ctrl3_c.sw_reset;
2392 
2393   return ret;
2394 }
2395 
2396 /**
2397   * @brief  Register address automatically incremented during a multiple byte
2398   *         access with a serial interface.[set]
2399   *
2400   * @param  ctx    Read / write interface definitions.(ptr)
2401   * @param  val    Change the values of if_inc in reg CTRL3_C
2402   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2403   *
2404   */
lsm6dsrx_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)2405 int32_t lsm6dsrx_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
2406 {
2407   lsm6dsrx_ctrl3_c_t ctrl3_c;
2408   int32_t ret;
2409 
2410   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2411                           (uint8_t *)&ctrl3_c, 1);
2412 
2413   if (ret == 0)
2414   {
2415     ctrl3_c.if_inc = (uint8_t)val;
2416     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
2417                              (uint8_t *)&ctrl3_c, 1);
2418   }
2419 
2420   return ret;
2421 }
2422 
2423 /**
2424   * @brief  Register address automatically incremented during a multiple byte
2425   *         access with a serial interface.[get]
2426   *
2427   * @param  ctx    Read / write interface definitions.(ptr)
2428   * @param  val    Change the values of if_inc in reg CTRL3_C
2429   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2430   *
2431   */
lsm6dsrx_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)2432 int32_t lsm6dsrx_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
2433 {
2434   lsm6dsrx_ctrl3_c_t ctrl3_c;
2435   int32_t ret;
2436 
2437   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2438                           (uint8_t *)&ctrl3_c, 1);
2439   *val = ctrl3_c.if_inc;
2440 
2441   return ret;
2442 }
2443 
2444 /**
2445   * @brief  Reboot memory content. Reload the calibration parameters.[set]
2446   *
2447   * @param  ctx    Read / write interface definitions.(ptr)
2448   * @param  val    Change the values of boot in reg CTRL3_C
2449   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2450   *
2451   */
lsm6dsrx_boot_set(const stmdev_ctx_t * ctx,uint8_t val)2452 int32_t lsm6dsrx_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
2453 {
2454   lsm6dsrx_ctrl3_c_t ctrl3_c;
2455   int32_t ret;
2456 
2457   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2458                           (uint8_t *)&ctrl3_c, 1);
2459 
2460   if (ret == 0)
2461   {
2462     ctrl3_c.boot = (uint8_t)val;
2463     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
2464                              (uint8_t *)&ctrl3_c, 1);
2465   }
2466 
2467   return ret;
2468 }
2469 
2470 /**
2471   * @brief  Reboot memory content. Reload the calibration parameters.[get]
2472   *
2473   * @param  ctx    Read / write interface definitions.(ptr)
2474   * @param  val    Change the values of boot in reg CTRL3_C
2475   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2476   *
2477   */
lsm6dsrx_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)2478 int32_t lsm6dsrx_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
2479 {
2480   lsm6dsrx_ctrl3_c_t ctrl3_c;
2481   int32_t ret;
2482 
2483   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
2484                           (uint8_t *)&ctrl3_c, 1);
2485   *val = ctrl3_c.boot;
2486 
2487   return ret;
2488 }
2489 
2490 
2491 
2492 /**
2493   * @brief  Linear acceleration sensor self-test enable.[set]
2494   *
2495   * @param  ctx    Read / write interface definitions.(ptr)
2496   * @param  val    Change the values of st_xl in reg CTRL5_C
2497   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2498   *
2499   */
lsm6dsrx_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsrx_st_xl_t val)2500 int32_t lsm6dsrx_xl_self_test_set(const stmdev_ctx_t *ctx,
2501                                   lsm6dsrx_st_xl_t val)
2502 {
2503   lsm6dsrx_ctrl5_c_t ctrl5_c;
2504   int32_t ret;
2505 
2506   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
2507                           (uint8_t *)&ctrl5_c, 1);
2508 
2509   if (ret == 0)
2510   {
2511     ctrl5_c.st_xl = (uint8_t)val;
2512     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL5_C,
2513                              (uint8_t *)&ctrl5_c, 1);
2514   }
2515 
2516   return ret;
2517 }
2518 
2519 /**
2520   * @brief  Linear acceleration sensor self-test enable.[get]
2521   *
2522   * @param  ctx    Read / write interface definitions.(ptr)
2523   * @param  val    Get the values of st_xl in reg CTRL5_C
2524   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2525   *
2526   */
lsm6dsrx_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsrx_st_xl_t * val)2527 int32_t lsm6dsrx_xl_self_test_get(const stmdev_ctx_t *ctx,
2528                                   lsm6dsrx_st_xl_t *val)
2529 {
2530   lsm6dsrx_ctrl5_c_t ctrl5_c;
2531   int32_t ret;
2532 
2533   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
2534                           (uint8_t *)&ctrl5_c, 1);
2535 
2536   switch (ctrl5_c.st_xl)
2537   {
2538     case LSM6DSRX_XL_ST_DISABLE:
2539       *val = LSM6DSRX_XL_ST_DISABLE;
2540       break;
2541 
2542     case LSM6DSRX_XL_ST_POSITIVE:
2543       *val = LSM6DSRX_XL_ST_POSITIVE;
2544       break;
2545 
2546     case LSM6DSRX_XL_ST_NEGATIVE:
2547       *val = LSM6DSRX_XL_ST_NEGATIVE;
2548       break;
2549 
2550     default:
2551       *val = LSM6DSRX_XL_ST_DISABLE;
2552       break;
2553   }
2554 
2555   return ret;
2556 }
2557 
2558 /**
2559   * @brief  Angular rate sensor self-test enable.[set]
2560   *
2561   * @param  ctx    Read / write interface definitions.(ptr)
2562   * @param  val    Change the values of st_g in reg CTRL5_C
2563   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2564   *
2565   */
lsm6dsrx_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsrx_st_g_t val)2566 int32_t lsm6dsrx_gy_self_test_set(const stmdev_ctx_t *ctx,
2567                                   lsm6dsrx_st_g_t val)
2568 {
2569   lsm6dsrx_ctrl5_c_t ctrl5_c;
2570   int32_t ret;
2571 
2572   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
2573                           (uint8_t *)&ctrl5_c, 1);
2574 
2575   if (ret == 0)
2576   {
2577     ctrl5_c.st_g = (uint8_t)val;
2578     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL5_C,
2579                              (uint8_t *)&ctrl5_c, 1);
2580   }
2581 
2582   return ret;
2583 }
2584 
2585 /**
2586   * @brief  Angular rate sensor self-test enable.[get]
2587   *
2588   * @param  ctx    Read / write interface definitions.(ptr)
2589   * @param  val    Get the values of st_g in reg CTRL5_C
2590   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2591   *
2592   */
lsm6dsrx_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsrx_st_g_t * val)2593 int32_t lsm6dsrx_gy_self_test_get(const stmdev_ctx_t *ctx,
2594                                   lsm6dsrx_st_g_t *val)
2595 {
2596   lsm6dsrx_ctrl5_c_t ctrl5_c;
2597   int32_t ret;
2598 
2599   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL5_C,
2600                           (uint8_t *)&ctrl5_c, 1);
2601 
2602   switch (ctrl5_c.st_g)
2603   {
2604     case LSM6DSRX_GY_ST_DISABLE:
2605       *val = LSM6DSRX_GY_ST_DISABLE;
2606       break;
2607 
2608     case LSM6DSRX_GY_ST_POSITIVE:
2609       *val = LSM6DSRX_GY_ST_POSITIVE;
2610       break;
2611 
2612     case LSM6DSRX_GY_ST_NEGATIVE:
2613       *val = LSM6DSRX_GY_ST_NEGATIVE;
2614       break;
2615 
2616     default:
2617       *val = LSM6DSRX_GY_ST_DISABLE;
2618       break;
2619   }
2620 
2621   return ret;
2622 }
2623 
2624 /**
2625   * @}
2626   *
2627   */
2628 
2629 /**
2630   * @defgroup   LSM6DSRX_filters
2631   * @brief      This section group all the functions concerning the
2632   *             filters configuration
2633   * @{
2634   *
2635   */
2636 
2637 /**
2638   * @brief  Accelerometer output from LPF2 filtering stage selection.[set]
2639   *
2640   * @param  ctx    Read / write interface definitions.(ptr)
2641   * @param  val    Change the values of lpf2_xl_en in reg CTRL1_XL
2642   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2643   *
2644   */
lsm6dsrx_xl_filter_lp2_set(const stmdev_ctx_t * ctx,uint8_t val)2645 int32_t lsm6dsrx_xl_filter_lp2_set(const stmdev_ctx_t *ctx, uint8_t val)
2646 {
2647   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
2648   int32_t ret;
2649 
2650   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
2651                           (uint8_t *)&ctrl1_xl, 1);
2652 
2653   if (ret == 0)
2654   {
2655     ctrl1_xl.lpf2_xl_en = (uint8_t)val;
2656     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_XL,
2657                              (uint8_t *)&ctrl1_xl, 1);
2658   }
2659 
2660   return ret;
2661 }
2662 
2663 /**
2664   * @brief  Accelerometer output from LPF2 filtering stage selection.[get]
2665   *
2666   * @param  ctx    Read / write interface definitions.(ptr)
2667   * @param  val    Change the values of lpf2_xl_en in reg CTRL1_XL
2668   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2669   *
2670   */
lsm6dsrx_xl_filter_lp2_get(const stmdev_ctx_t * ctx,uint8_t * val)2671 int32_t lsm6dsrx_xl_filter_lp2_get(const stmdev_ctx_t *ctx, uint8_t *val)
2672 {
2673   lsm6dsrx_ctrl1_xl_t ctrl1_xl;
2674   int32_t ret;
2675 
2676   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_XL,
2677                           (uint8_t *)&ctrl1_xl, 1);
2678   *val = ctrl1_xl.lpf2_xl_en;
2679 
2680   return ret;
2681 }
2682 
2683 /**
2684   * @brief  Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
2685   *         the bandwidth can be selected through FTYPE [2:0] in CTRL6_C.[set]
2686   *
2687   * @param  ctx    Read / write interface definitions.(ptr)
2688   * @param  val    Change the values of lpf1_sel_g in reg CTRL4_C
2689   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2690   *
2691   */
lsm6dsrx_gy_filter_lp1_set(const stmdev_ctx_t * ctx,uint8_t val)2692 int32_t lsm6dsrx_gy_filter_lp1_set(const stmdev_ctx_t *ctx, uint8_t val)
2693 {
2694   lsm6dsrx_ctrl4_c_t ctrl4_c;
2695   int32_t ret;
2696 
2697   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
2698                           (uint8_t *)&ctrl4_c, 1);
2699 
2700   if (ret == 0)
2701   {
2702     ctrl4_c.lpf1_sel_g = (uint8_t)val;
2703     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL4_C,
2704                              (uint8_t *)&ctrl4_c, 1);
2705   }
2706 
2707   return ret;
2708 }
2709 
2710 /**
2711   * @brief  Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
2712   *         the bandwidth can be selected through FTYPE [2:0] in CTRL6_C.[get]
2713   *
2714   * @param  ctx    Read / write interface definitions.(ptr)
2715   * @param  val    Change the values of lpf1_sel_g in reg CTRL4_C
2716   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2717   *
2718   */
lsm6dsrx_gy_filter_lp1_get(const stmdev_ctx_t * ctx,uint8_t * val)2719 int32_t lsm6dsrx_gy_filter_lp1_get(const stmdev_ctx_t *ctx, uint8_t *val)
2720 {
2721   lsm6dsrx_ctrl4_c_t ctrl4_c;
2722   int32_t ret;
2723 
2724   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
2725                           (uint8_t *)&ctrl4_c, 1);
2726   *val = ctrl4_c.lpf1_sel_g;
2727 
2728   return ret;
2729 }
2730 
2731 /**
2732   * @brief  Mask DRDY on pin (both XL & Gyro) until filter settling ends
2733   *         (XL and Gyro independently masked).[set]
2734   *
2735   * @param  ctx    Read / write interface definitions.(ptr)
2736   * @param  val    Change the values of drdy_mask in reg CTRL4_C
2737   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2738   *
2739   */
lsm6dsrx_filter_settling_mask_set(const stmdev_ctx_t * ctx,uint8_t val)2740 int32_t lsm6dsrx_filter_settling_mask_set(const stmdev_ctx_t *ctx,
2741                                           uint8_t val)
2742 {
2743   lsm6dsrx_ctrl4_c_t ctrl4_c;
2744   int32_t ret;
2745 
2746   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
2747                           (uint8_t *)&ctrl4_c, 1);
2748 
2749   if (ret == 0)
2750   {
2751     ctrl4_c.drdy_mask = (uint8_t)val;
2752     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL4_C,
2753                              (uint8_t *)&ctrl4_c, 1);
2754   }
2755 
2756   return ret;
2757 }
2758 
2759 /**
2760   * @brief  Mask DRDY on pin (both XL & Gyro) until filter settling ends
2761   *         (XL and Gyro independently masked).[get]
2762   *
2763   * @param  ctx    Read / write interface definitions.(ptr)
2764   * @param  val    Change the values of drdy_mask in reg CTRL4_C
2765   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2766   *
2767   */
lsm6dsrx_filter_settling_mask_get(const stmdev_ctx_t * ctx,uint8_t * val)2768 int32_t lsm6dsrx_filter_settling_mask_get(const stmdev_ctx_t *ctx,
2769                                           uint8_t *val)
2770 {
2771   lsm6dsrx_ctrl4_c_t ctrl4_c;
2772   int32_t ret;
2773 
2774   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
2775                           (uint8_t *)&ctrl4_c, 1);
2776   *val = ctrl4_c.drdy_mask;
2777 
2778   return ret;
2779 }
2780 
2781 /**
2782   * @brief  Gyroscope low pass filter 1 bandwidth.[set]
2783   *
2784   * @param  ctx    Read / write interface definitions.(ptr)
2785   * @param  val    Change the values of ftype in reg CTRL6_C
2786   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2787   *
2788   */
lsm6dsrx_gy_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsrx_ftype_t val)2789 int32_t lsm6dsrx_gy_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
2790                                       lsm6dsrx_ftype_t val)
2791 {
2792   lsm6dsrx_ctrl6_c_t ctrl6_c;
2793   int32_t ret;
2794 
2795   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
2796                           (uint8_t *)&ctrl6_c, 1);
2797 
2798   if (ret == 0)
2799   {
2800     ctrl6_c.ftype = (uint8_t)val;
2801     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL6_C,
2802                              (uint8_t *)&ctrl6_c, 1);
2803   }
2804 
2805   return ret;
2806 }
2807 
2808 /**
2809   * @brief  Gyroscope low pass filter 1 bandwidth.[get]
2810   *
2811   * @param  ctx    Read / write interface definitions.(ptr)
2812   * @param  val    Get the values of ftype in reg CTRL6_C
2813   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2814   *
2815   */
lsm6dsrx_gy_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsrx_ftype_t * val)2816 int32_t lsm6dsrx_gy_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
2817                                       lsm6dsrx_ftype_t *val)
2818 {
2819   lsm6dsrx_ctrl6_c_t ctrl6_c;
2820   int32_t ret;
2821 
2822   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
2823                           (uint8_t *)&ctrl6_c, 1);
2824 
2825   switch (ctrl6_c.ftype)
2826   {
2827     case LSM6DSRX_ULTRA_LIGHT:
2828       *val = LSM6DSRX_ULTRA_LIGHT;
2829       break;
2830 
2831     case LSM6DSRX_VERY_LIGHT:
2832       *val = LSM6DSRX_VERY_LIGHT;
2833       break;
2834 
2835     case LSM6DSRX_LIGHT:
2836       *val = LSM6DSRX_LIGHT;
2837       break;
2838 
2839     case LSM6DSRX_MEDIUM:
2840       *val = LSM6DSRX_MEDIUM;
2841       break;
2842 
2843     case LSM6DSRX_STRONG:
2844       *val = LSM6DSRX_STRONG;
2845       break;
2846 
2847     case LSM6DSRX_VERY_STRONG:
2848       *val = LSM6DSRX_VERY_STRONG;
2849       break;
2850 
2851     case LSM6DSRX_AGGRESSIVE:
2852       *val = LSM6DSRX_AGGRESSIVE;
2853       break;
2854 
2855     case LSM6DSRX_XTREME:
2856       *val = LSM6DSRX_XTREME;
2857       break;
2858 
2859     default:
2860       *val = LSM6DSRX_ULTRA_LIGHT;
2861       break;
2862   }
2863 
2864   return ret;
2865 }
2866 
2867 /**
2868   * @brief  Low pass filter 2 on 6D function selection.[set]
2869   *
2870   * @param  ctx    Read / write interface definitions.(ptr)
2871   * @param  val    Change the values of low_pass_on_6d in reg CTRL8_XL
2872   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2873   *
2874   */
lsm6dsrx_xl_lp2_on_6d_set(const stmdev_ctx_t * ctx,uint8_t val)2875 int32_t lsm6dsrx_xl_lp2_on_6d_set(const stmdev_ctx_t *ctx, uint8_t val)
2876 {
2877   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
2878   int32_t ret;
2879 
2880   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
2881                           (uint8_t *)&ctrl8_xl, 1);
2882 
2883   if (ret == 0)
2884   {
2885     ctrl8_xl.low_pass_on_6d = (uint8_t)val;
2886     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL8_XL,
2887                              (uint8_t *)&ctrl8_xl, 1);
2888   }
2889 
2890   return ret;
2891 }
2892 
2893 /**
2894   * @brief  Low pass filter 2 on 6D function selection.[get]
2895   *
2896   * @param  ctx    Read / write interface definitions.(ptr)
2897   * @param  val    Change the values of low_pass_on_6d in reg CTRL8_XL
2898   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2899   *
2900   */
lsm6dsrx_xl_lp2_on_6d_get(const stmdev_ctx_t * ctx,uint8_t * val)2901 int32_t lsm6dsrx_xl_lp2_on_6d_get(const stmdev_ctx_t *ctx, uint8_t *val)
2902 {
2903   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
2904   int32_t ret;
2905 
2906   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
2907                           (uint8_t *)&ctrl8_xl, 1);
2908   *val = ctrl8_xl.low_pass_on_6d;
2909 
2910   return ret;
2911 }
2912 
2913 /**
2914   * @brief  Accelerometer slope filter / high-pass filter selection
2915   *         on output.[set]
2916   *
2917   * @param  ctx    Read / write interface definitions.(ptr)
2918   * @param  val    Change the values of hp_slope_xl_en in reg CTRL8_XL
2919   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2920   *
2921   */
lsm6dsrx_xl_hp_path_on_out_set(const stmdev_ctx_t * ctx,lsm6dsrx_hp_slope_xl_en_t val)2922 int32_t lsm6dsrx_xl_hp_path_on_out_set(const stmdev_ctx_t *ctx,
2923                                        lsm6dsrx_hp_slope_xl_en_t val)
2924 {
2925   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
2926   int32_t ret;
2927 
2928   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
2929                           (uint8_t *)&ctrl8_xl, 1);
2930 
2931   if (ret == 0)
2932   {
2933     ctrl8_xl.hp_slope_xl_en = (((uint8_t)val & 0x10U) >> 4);
2934     ctrl8_xl.hp_ref_mode_xl = (((uint8_t)val & 0x20U) >> 5);
2935     ctrl8_xl.hpcf_xl = (uint8_t)val & 0x07U;
2936     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL8_XL,
2937                              (uint8_t *)&ctrl8_xl, 1);
2938   }
2939 
2940   return ret;
2941 }
2942 
2943 /**
2944   * @brief  Accelerometer slope filter / high-pass filter selection on
2945   *         output.[get]
2946   *
2947   * @param  ctx    Read / write interface definitions.(ptr)
2948   * @param  val    Get the values of hp_slope_xl_en in reg CTRL8_XL
2949   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2950   *
2951   */
lsm6dsrx_xl_hp_path_on_out_get(const stmdev_ctx_t * ctx,lsm6dsrx_hp_slope_xl_en_t * val)2952 int32_t lsm6dsrx_xl_hp_path_on_out_get(const stmdev_ctx_t *ctx,
2953                                        lsm6dsrx_hp_slope_xl_en_t *val)
2954 {
2955   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
2956   int32_t ret;
2957 
2958   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
2959                           (uint8_t *)&ctrl8_xl, 1);
2960 
2961   switch (((ctrl8_xl.hp_ref_mode_xl << 5) + (ctrl8_xl.hp_slope_xl_en <<
2962                                              4) +
2963            ctrl8_xl.hpcf_xl))
2964   {
2965     case LSM6DSRX_HP_PATH_DISABLE_ON_OUT:
2966       *val = LSM6DSRX_HP_PATH_DISABLE_ON_OUT;
2967       break;
2968 
2969     case LSM6DSRX_SLOPE_ODR_DIV_4:
2970       *val = LSM6DSRX_SLOPE_ODR_DIV_4;
2971       break;
2972 
2973     case LSM6DSRX_HP_ODR_DIV_10:
2974       *val = LSM6DSRX_HP_ODR_DIV_10;
2975       break;
2976 
2977     case LSM6DSRX_HP_ODR_DIV_20:
2978       *val = LSM6DSRX_HP_ODR_DIV_20;
2979       break;
2980 
2981     case LSM6DSRX_HP_ODR_DIV_45:
2982       *val = LSM6DSRX_HP_ODR_DIV_45;
2983       break;
2984 
2985     case LSM6DSRX_HP_ODR_DIV_100:
2986       *val = LSM6DSRX_HP_ODR_DIV_100;
2987       break;
2988 
2989     case LSM6DSRX_HP_ODR_DIV_200:
2990       *val = LSM6DSRX_HP_ODR_DIV_200;
2991       break;
2992 
2993     case LSM6DSRX_HP_ODR_DIV_400:
2994       *val = LSM6DSRX_HP_ODR_DIV_400;
2995       break;
2996 
2997     case LSM6DSRX_HP_ODR_DIV_800:
2998       *val = LSM6DSRX_HP_ODR_DIV_800;
2999       break;
3000 
3001     case LSM6DSRX_HP_REF_MD_ODR_DIV_10:
3002       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_10;
3003       break;
3004 
3005     case LSM6DSRX_HP_REF_MD_ODR_DIV_20:
3006       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_20;
3007       break;
3008 
3009     case LSM6DSRX_HP_REF_MD_ODR_DIV_45:
3010       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_45;
3011       break;
3012 
3013     case LSM6DSRX_HP_REF_MD_ODR_DIV_100:
3014       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_100;
3015       break;
3016 
3017     case LSM6DSRX_HP_REF_MD_ODR_DIV_200:
3018       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_200;
3019       break;
3020 
3021     case LSM6DSRX_HP_REF_MD_ODR_DIV_400:
3022       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_400;
3023       break;
3024 
3025     case LSM6DSRX_HP_REF_MD_ODR_DIV_800:
3026       *val = LSM6DSRX_HP_REF_MD_ODR_DIV_800;
3027       break;
3028 
3029     case LSM6DSRX_LP_ODR_DIV_10:
3030       *val = LSM6DSRX_LP_ODR_DIV_10;
3031       break;
3032 
3033     case LSM6DSRX_LP_ODR_DIV_20:
3034       *val = LSM6DSRX_LP_ODR_DIV_20;
3035       break;
3036 
3037     case LSM6DSRX_LP_ODR_DIV_45:
3038       *val = LSM6DSRX_LP_ODR_DIV_45;
3039       break;
3040 
3041     case LSM6DSRX_LP_ODR_DIV_100:
3042       *val = LSM6DSRX_LP_ODR_DIV_100;
3043       break;
3044 
3045     case LSM6DSRX_LP_ODR_DIV_200:
3046       *val = LSM6DSRX_LP_ODR_DIV_200;
3047       break;
3048 
3049     case LSM6DSRX_LP_ODR_DIV_400:
3050       *val = LSM6DSRX_LP_ODR_DIV_400;
3051       break;
3052 
3053     case LSM6DSRX_LP_ODR_DIV_800:
3054       *val = LSM6DSRX_LP_ODR_DIV_800;
3055       break;
3056 
3057     default:
3058       *val = LSM6DSRX_HP_PATH_DISABLE_ON_OUT;
3059       break;
3060   }
3061 
3062   return ret;
3063 }
3064 
3065 /**
3066   * @brief  Enables accelerometer LPF2 and HPF fast-settling mode.
3067   *         The filter sets the second samples after writing this bit.
3068   *         Active only during device exit from powerdown mode.[set]
3069   *
3070   * @param  ctx    Read / write interface definitions.(ptr)
3071   * @param  val    Change the values of fastsettl_mode_xl in reg CTRL8_XL
3072   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3073   *
3074   */
lsm6dsrx_xl_fast_settling_set(const stmdev_ctx_t * ctx,uint8_t val)3075 int32_t lsm6dsrx_xl_fast_settling_set(const stmdev_ctx_t *ctx,
3076                                       uint8_t val)
3077 {
3078   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
3079   int32_t ret;
3080 
3081   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
3082                           (uint8_t *)&ctrl8_xl, 1);
3083 
3084   if (ret == 0)
3085   {
3086     ctrl8_xl.fastsettl_mode_xl = (uint8_t)val;
3087     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL8_XL,
3088                              (uint8_t *)&ctrl8_xl, 1);
3089   }
3090 
3091   return ret;
3092 }
3093 
3094 /**
3095   * @brief  Enables accelerometer LPF2 and HPF fast-settling mode.
3096   *         The filter sets the second samples after writing
3097   *         this bit. Active only during device exit from powerdown mode.[get]
3098   *
3099   * @param  ctx    Read / write interface definitions.(ptr)
3100   * @param  val    Change the values of fastsettl_mode_xl in reg CTRL8_XL
3101   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3102   *
3103   */
lsm6dsrx_xl_fast_settling_get(const stmdev_ctx_t * ctx,uint8_t * val)3104 int32_t lsm6dsrx_xl_fast_settling_get(const stmdev_ctx_t *ctx,
3105                                       uint8_t *val)
3106 {
3107   lsm6dsrx_ctrl8_xl_t ctrl8_xl;
3108   int32_t ret;
3109 
3110   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL8_XL,
3111                           (uint8_t *)&ctrl8_xl, 1);
3112   *val = ctrl8_xl.fastsettl_mode_xl;
3113 
3114   return ret;
3115 }
3116 
3117 /**
3118   * @brief  HPF or SLOPE filter selection on wake-up and Activity/Inactivity
3119   *         functions.[set]
3120   *
3121   * @param  ctx    Read / write interface definitions.(ptr)
3122   * @param  val    Change the values of slope_fds in reg TAP_CFG0
3123   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3124   *
3125   */
lsm6dsrx_xl_hp_path_internal_set(const stmdev_ctx_t * ctx,lsm6dsrx_slope_fds_t val)3126 int32_t lsm6dsrx_xl_hp_path_internal_set(const stmdev_ctx_t *ctx,
3127                                          lsm6dsrx_slope_fds_t val)
3128 {
3129   lsm6dsrx_tap_cfg0_t tap_cfg0;
3130   int32_t ret;
3131 
3132   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
3133                           (uint8_t *)&tap_cfg0, 1);
3134 
3135   if (ret == 0)
3136   {
3137     tap_cfg0.slope_fds = (uint8_t)val;
3138     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
3139                              (uint8_t *)&tap_cfg0, 1);
3140   }
3141 
3142   return ret;
3143 }
3144 
3145 /**
3146   * @brief  HPF or SLOPE filter selection on wake-up and Activity/Inactivity
3147   *         functions.[get]
3148   *
3149   * @param  ctx    Read / write interface definitions.(ptr)
3150   * @param  val    Get the values of slope_fds in reg TAP_CFG0
3151   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3152   *
3153   */
lsm6dsrx_xl_hp_path_internal_get(const stmdev_ctx_t * ctx,lsm6dsrx_slope_fds_t * val)3154 int32_t lsm6dsrx_xl_hp_path_internal_get(const stmdev_ctx_t *ctx,
3155                                          lsm6dsrx_slope_fds_t *val)
3156 {
3157   lsm6dsrx_tap_cfg0_t tap_cfg0;
3158   int32_t ret;
3159 
3160   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
3161                           (uint8_t *)&tap_cfg0, 1);
3162 
3163   switch (tap_cfg0.slope_fds)
3164   {
3165     case LSM6DSRX_USE_SLOPE:
3166       *val = LSM6DSRX_USE_SLOPE;
3167       break;
3168 
3169     case LSM6DSRX_USE_HPF:
3170       *val = LSM6DSRX_USE_HPF;
3171       break;
3172 
3173     default:
3174       *val = LSM6DSRX_USE_SLOPE;
3175       break;
3176   }
3177 
3178   return ret;
3179 }
3180 
3181 /**
3182   * @brief  Enables gyroscope digital high-pass filter. The filter is enabled
3183   *         only if the gyro is in HP mode.[set]
3184   *
3185   * @param  ctx    Read / write interface definitions.(ptr)
3186   * @param  val    Get the values of hp_en_g and hp_en_g in reg CTRL7_G
3187   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3188   *
3189   */
lsm6dsrx_gy_hp_path_internal_set(const stmdev_ctx_t * ctx,lsm6dsrx_hpm_g_t val)3190 int32_t lsm6dsrx_gy_hp_path_internal_set(const stmdev_ctx_t *ctx,
3191                                          lsm6dsrx_hpm_g_t val)
3192 {
3193   lsm6dsrx_ctrl7_g_t ctrl7_g;
3194   int32_t ret;
3195 
3196   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
3197                           (uint8_t *)&ctrl7_g, 1);
3198 
3199   if (ret == 0)
3200   {
3201     ctrl7_g.hp_en_g = (((uint8_t)val & 0x80U) >> 7);
3202     ctrl7_g.hpm_g = (uint8_t)val & 0x03U;
3203     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL7_G,
3204                              (uint8_t *)&ctrl7_g, 1);
3205   }
3206 
3207   return ret;
3208 }
3209 
3210 /**
3211   * @brief    Enables gyroscope digital high-pass filter. The filter is
3212   *           enabled only if the gyro is in HP mode.[get]
3213   *
3214   * @param  ctx    Read / write interface definitions.(ptr)
3215   * @param  val    Get the values of hp_en_g and hp_en_g in reg CTRL7_G
3216   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3217   *
3218   */
lsm6dsrx_gy_hp_path_internal_get(const stmdev_ctx_t * ctx,lsm6dsrx_hpm_g_t * val)3219 int32_t lsm6dsrx_gy_hp_path_internal_get(const stmdev_ctx_t *ctx,
3220                                          lsm6dsrx_hpm_g_t *val)
3221 {
3222   lsm6dsrx_ctrl7_g_t ctrl7_g;
3223   int32_t ret;
3224 
3225   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
3226                           (uint8_t *)&ctrl7_g, 1);
3227 
3228   switch ((ctrl7_g.hp_en_g << 7) + ctrl7_g.hpm_g)
3229   {
3230     case LSM6DSRX_HP_FILTER_NONE:
3231       *val = LSM6DSRX_HP_FILTER_NONE;
3232       break;
3233 
3234     case LSM6DSRX_HP_FILTER_16mHz:
3235       *val = LSM6DSRX_HP_FILTER_16mHz;
3236       break;
3237 
3238     case LSM6DSRX_HP_FILTER_65mHz:
3239       *val = LSM6DSRX_HP_FILTER_65mHz;
3240       break;
3241 
3242     case LSM6DSRX_HP_FILTER_260mHz:
3243       *val = LSM6DSRX_HP_FILTER_260mHz;
3244       break;
3245 
3246     case LSM6DSRX_HP_FILTER_1Hz04:
3247       *val = LSM6DSRX_HP_FILTER_1Hz04;
3248       break;
3249 
3250     default:
3251       *val = LSM6DSRX_HP_FILTER_NONE;
3252       break;
3253   }
3254 
3255   return ret;
3256 }
3257 
3258 /**
3259   * @}
3260   *
3261   */
3262 
3263 /**
3264   * @defgroup   LSM6DSRX_ Auxiliary_interface
3265   * @brief      This section groups all the functions concerning
3266   *             auxiliary interface.
3267   * @{
3268   *
3269   */
3270 
3271 /**
3272   * @brief  On auxiliary interface connect/disconnect SDO and OCS
3273   *         internal pull-up.[set]
3274   *
3275   * @param  ctx    Read / write interface definitions.(ptr)
3276   * @param  val    Change the values of ois_pu_dis in reg PIN_CTRL
3277   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3278   *
3279   */
lsm6dsrx_aux_sdo_ocs_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_ois_pu_dis_t val)3280 int32_t lsm6dsrx_aux_sdo_ocs_mode_set(const stmdev_ctx_t *ctx,
3281                                       lsm6dsrx_ois_pu_dis_t val)
3282 {
3283   lsm6dsrx_pin_ctrl_t pin_ctrl;
3284   int32_t ret;
3285 
3286   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PIN_CTRL,
3287                           (uint8_t *)&pin_ctrl, 1);
3288 
3289   if (ret == 0)
3290   {
3291     pin_ctrl.ois_pu_dis = (uint8_t)val;
3292     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PIN_CTRL,
3293                              (uint8_t *)&pin_ctrl, 1);
3294   }
3295 
3296   return ret;
3297 }
3298 
3299 /**
3300   * @brief  On auxiliary interface connect/disconnect SDO and OCS
3301   *         internal pull-up.[get]
3302   *
3303   * @param  ctx    Read / write interface definitions.(ptr)
3304   * @param  val    Get the values of ois_pu_dis in reg PIN_CTRL
3305   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3306   *
3307   */
lsm6dsrx_aux_sdo_ocs_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_ois_pu_dis_t * val)3308 int32_t lsm6dsrx_aux_sdo_ocs_mode_get(const stmdev_ctx_t *ctx,
3309                                       lsm6dsrx_ois_pu_dis_t *val)
3310 {
3311   lsm6dsrx_pin_ctrl_t pin_ctrl;
3312   int32_t ret;
3313 
3314   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PIN_CTRL,
3315                           (uint8_t *)&pin_ctrl, 1);
3316 
3317   switch (pin_ctrl.ois_pu_dis)
3318   {
3319     case LSM6DSRX_AUX_PULL_UP_DISC:
3320       *val = LSM6DSRX_AUX_PULL_UP_DISC;
3321       break;
3322 
3323     case LSM6DSRX_AUX_PULL_UP_CONNECT:
3324       *val = LSM6DSRX_AUX_PULL_UP_CONNECT;
3325       break;
3326 
3327     default:
3328       *val = LSM6DSRX_AUX_PULL_UP_DISC;
3329       break;
3330   }
3331 
3332   return ret;
3333 }
3334 
3335 /**
3336   * @brief  OIS chain on aux interface power on mode.[set]
3337   *
3338   * @param  ctx    Read / write interface definitions.(ptr)
3339   * @param  val    Change the values of ois_on in reg CTRL7_G
3340   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3341   *
3342   */
lsm6dsrx_aux_pw_on_ctrl_set(const stmdev_ctx_t * ctx,lsm6dsrx_ois_on_t val)3343 int32_t lsm6dsrx_aux_pw_on_ctrl_set(const stmdev_ctx_t *ctx,
3344                                     lsm6dsrx_ois_on_t val)
3345 {
3346   lsm6dsrx_ctrl7_g_t ctrl7_g;
3347   int32_t ret;
3348 
3349   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
3350                           (uint8_t *)&ctrl7_g, 1);
3351 
3352   if (ret == 0)
3353   {
3354     ctrl7_g.ois_on_en = (uint8_t)val & 0x01U;
3355     ctrl7_g.ois_on = (uint8_t)val & 0x01U;
3356     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL7_G,
3357                              (uint8_t *)&ctrl7_g, 1);
3358   }
3359 
3360   return ret;
3361 }
3362 
3363 /**
3364   * @brief  OIS chain on aux interface power on mode[get]
3365   *
3366   * @param  ctx    Read / write interface definitions.(ptr)
3367   * @param  val    Get the values of ois_on in reg CTRL7_G
3368   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3369   *
3370   */
lsm6dsrx_aux_pw_on_ctrl_get(const stmdev_ctx_t * ctx,lsm6dsrx_ois_on_t * val)3371 int32_t lsm6dsrx_aux_pw_on_ctrl_get(const stmdev_ctx_t *ctx,
3372                                     lsm6dsrx_ois_on_t *val)
3373 {
3374   lsm6dsrx_ctrl7_g_t ctrl7_g;
3375   int32_t ret;
3376 
3377   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL7_G,
3378                           (uint8_t *)&ctrl7_g, 1);
3379 
3380   switch (ctrl7_g.ois_on)
3381   {
3382     case LSM6DSRX_AUX_ON:
3383       *val = LSM6DSRX_AUX_ON;
3384       break;
3385 
3386     case LSM6DSRX_AUX_ON_BY_AUX_INTERFACE:
3387       *val = LSM6DSRX_AUX_ON_BY_AUX_INTERFACE;
3388       break;
3389 
3390     default:
3391       *val = LSM6DSRX_AUX_ON;
3392       break;
3393   }
3394 
3395   return ret;
3396 }
3397 
3398 /**
3399   * @brief  The STATUS_SPIAux register is read by the auxiliary SPI.[get]
3400   *
3401   * @param  ctx    Read / write interface definitions.(ptr)
3402   * @param  lsm6dsrx_status_spiaux_t: registers STATUS_SPIAUX
3403   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3404   *
3405   */
lsm6dsrx_aux_status_reg_get(const stmdev_ctx_t * ctx,lsm6dsrx_status_spiaux_t * val)3406 int32_t lsm6dsrx_aux_status_reg_get(const stmdev_ctx_t *ctx,
3407                                     lsm6dsrx_status_spiaux_t *val)
3408 {
3409   int32_t ret;
3410 
3411   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_SPIAUX,
3412                           (uint8_t *)val, 1);
3413 
3414   return ret;
3415 }
3416 
3417 /**
3418   * @brief  AUX accelerometer data available.[get]
3419   *
3420   * @param  ctx    Read / write interface definitions.(ptr)
3421   * @param  val    Change the values of xlda in reg STATUS_SPIAUX
3422   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3423   *
3424   */
lsm6dsrx_aux_xl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)3425 int32_t lsm6dsrx_aux_xl_flag_data_ready_get(const stmdev_ctx_t *ctx,
3426                                             uint8_t *val)
3427 {
3428   lsm6dsrx_status_spiaux_t status_spiaux;
3429   int32_t ret;
3430 
3431   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_SPIAUX,
3432                           (uint8_t *)&status_spiaux, 1);
3433   *val = status_spiaux.xlda;
3434 
3435   return ret;
3436 }
3437 
3438 /**
3439   * @brief  AUX gyroscope data available.[get]
3440   *
3441   * @param  ctx    Read / write interface definitions.(ptr)
3442   * @param  val    Change the values of gda in reg STATUS_SPIAUX
3443   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3444   *
3445   */
lsm6dsrx_aux_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)3446 int32_t lsm6dsrx_aux_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
3447                                             uint8_t *val)
3448 {
3449   lsm6dsrx_status_spiaux_t status_spiaux;
3450   int32_t ret;
3451 
3452   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_SPIAUX,
3453                           (uint8_t *)&status_spiaux, 1);
3454   *val = status_spiaux.gda;
3455 
3456   return ret;
3457 }
3458 
3459 /**
3460   * @brief  High when the gyroscope output is in the settling phase.[get]
3461   *
3462   * @param  ctx    Read / write interface definitions.(ptr)
3463   * @param  val    Change the values of gyro_settling in reg STATUS_SPIAUX
3464   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3465   *
3466   */
lsm6dsrx_aux_gy_flag_settling_get(const stmdev_ctx_t * ctx,uint8_t * val)3467 int32_t lsm6dsrx_aux_gy_flag_settling_get(const stmdev_ctx_t *ctx,
3468                                           uint8_t *val)
3469 {
3470   lsm6dsrx_status_spiaux_t status_spiaux;
3471   int32_t ret;
3472 
3473   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_SPIAUX,
3474                           (uint8_t *)&status_spiaux, 1);
3475   *val = status_spiaux.gyro_settling;
3476 
3477   return ret;
3478 }
3479 
3480 /**
3481   * @brief  Selects accelerometer self-test. Effective only if XL OIS chain is
3482   *         enabled.[set]
3483   *
3484   * @param  ctx    Read / write interface definitions.(ptr)
3485   * @param  val    Change the values of st_xl_ois in reg INT_OIS
3486   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3487   *
3488   */
lsm6dsrx_aux_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsrx_st_xl_ois_t val)3489 int32_t lsm6dsrx_aux_xl_self_test_set(const stmdev_ctx_t *ctx,
3490                                       lsm6dsrx_st_xl_ois_t val)
3491 {
3492   lsm6dsrx_int_ois_t int_ois;
3493   int32_t ret;
3494 
3495   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3496                           (uint8_t *)&int_ois, 1);
3497 
3498   if (ret == 0)
3499   {
3500     int_ois.st_xl_ois = (uint8_t)val;
3501     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_OIS,
3502                              (uint8_t *)&int_ois, 1);
3503   }
3504 
3505   return ret;
3506 }
3507 
3508 /**
3509   * @brief  Selects accelerometer self-test. Effective only if XL OIS chain
3510   *         is enabled.[get]
3511   *
3512   * @param  ctx    Read / write interface definitions.(ptr)
3513   * @param  val    Get the values of st_xl_ois in reg INT_OIS
3514   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3515   *
3516   */
lsm6dsrx_aux_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsrx_st_xl_ois_t * val)3517 int32_t lsm6dsrx_aux_xl_self_test_get(const stmdev_ctx_t *ctx,
3518                                       lsm6dsrx_st_xl_ois_t *val)
3519 {
3520   lsm6dsrx_int_ois_t int_ois;
3521   int32_t ret;
3522 
3523   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3524                           (uint8_t *)&int_ois, 1);
3525 
3526   switch (int_ois.st_xl_ois)
3527   {
3528     case LSM6DSRX_AUX_XL_DISABLE:
3529       *val = LSM6DSRX_AUX_XL_DISABLE;
3530       break;
3531 
3532     case LSM6DSRX_AUX_XL_POS:
3533       *val = LSM6DSRX_AUX_XL_POS;
3534       break;
3535 
3536     case LSM6DSRX_AUX_XL_NEG:
3537       *val = LSM6DSRX_AUX_XL_NEG;
3538       break;
3539 
3540     default:
3541       *val = LSM6DSRX_AUX_XL_DISABLE;
3542       break;
3543   }
3544 
3545   return ret;
3546 }
3547 
3548 /**
3549   * @brief  Indicates polarity of DEN signal on OIS chain.[set]
3550   *
3551   * @param  ctx    Read / write interface definitions.(ptr)
3552   * @param  val    Change the values of den_lh_ois in reg INT_OIS
3553   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3554   *
3555   */
lsm6dsrx_aux_den_polarity_set(const stmdev_ctx_t * ctx,lsm6dsrx_den_lh_ois_t val)3556 int32_t lsm6dsrx_aux_den_polarity_set(const stmdev_ctx_t *ctx,
3557                                       lsm6dsrx_den_lh_ois_t val)
3558 {
3559   lsm6dsrx_int_ois_t int_ois;
3560   int32_t ret;
3561 
3562   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3563                           (uint8_t *)&int_ois, 1);
3564 
3565   if (ret == 0)
3566   {
3567     int_ois.den_lh_ois = (uint8_t)val;
3568     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_OIS,
3569                              (uint8_t *)&int_ois, 1);
3570   }
3571 
3572   return ret;
3573 }
3574 
3575 /**
3576   * @brief  Indicates polarity of DEN signal on OIS chain.[get]
3577   *
3578   * @param  ctx    Read / write interface definitions.(ptr)
3579   * @param  val    Get the values of den_lh_ois in reg INT_OIS
3580   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3581   *
3582   */
lsm6dsrx_aux_den_polarity_get(const stmdev_ctx_t * ctx,lsm6dsrx_den_lh_ois_t * val)3583 int32_t lsm6dsrx_aux_den_polarity_get(const stmdev_ctx_t *ctx,
3584                                       lsm6dsrx_den_lh_ois_t *val)
3585 {
3586   lsm6dsrx_int_ois_t int_ois;
3587   int32_t ret;
3588 
3589   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3590                           (uint8_t *)&int_ois, 1);
3591 
3592   switch (int_ois.den_lh_ois)
3593   {
3594     case LSM6DSRX_AUX_DEN_ACTIVE_LOW:
3595       *val = LSM6DSRX_AUX_DEN_ACTIVE_LOW;
3596       break;
3597 
3598     case LSM6DSRX_AUX_DEN_ACTIVE_HIGH:
3599       *val = LSM6DSRX_AUX_DEN_ACTIVE_HIGH;
3600       break;
3601 
3602     default:
3603       *val = LSM6DSRX_AUX_DEN_ACTIVE_LOW;
3604       break;
3605   }
3606 
3607   return ret;
3608 }
3609 
3610 /**
3611   * @brief  Configure DEN mode on the OIS chain.[set]
3612   *
3613   * @param  ctx    Read / write interface definitions.(ptr)
3614   * @param  val    Change the values of lvl2_ois in reg INT_OIS
3615   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3616   *
3617   */
lsm6dsrx_aux_den_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_lvl2_ois_t val)3618 int32_t lsm6dsrx_aux_den_mode_set(const stmdev_ctx_t *ctx,
3619                                   lsm6dsrx_lvl2_ois_t val)
3620 {
3621   lsm6dsrx_int_ois_t int_ois;
3622   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3623   int32_t ret;
3624 
3625   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3626                           (uint8_t *)&int_ois, 1);
3627 
3628   if (ret == 0)
3629   {
3630     int_ois.lvl2_ois = (uint8_t)val & 0x01U;
3631     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_OIS,
3632                              (uint8_t *)&int_ois, 1);
3633   }
3634 
3635   if (ret == 0)
3636   {
3637     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3638                             (uint8_t *)&ctrl1_ois, 1);
3639   }
3640 
3641   if (ret == 0)
3642   {
3643     ctrl1_ois.lvl1_ois = ((uint8_t)val & 0x02U) >> 1;
3644     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_OIS,
3645                              (uint8_t *)&ctrl1_ois, 1);
3646   }
3647 
3648   return ret;
3649 }
3650 
3651 /**
3652   * @brief  Configure DEN mode on the OIS chain.[get]
3653   *
3654   * @param  ctx    Read / write interface definitions.(ptr)
3655   * @param  val    Get the values of lvl2_ois in reg INT_OIS
3656   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3657   *
3658   */
lsm6dsrx_aux_den_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_lvl2_ois_t * val)3659 int32_t lsm6dsrx_aux_den_mode_get(const stmdev_ctx_t *ctx,
3660                                   lsm6dsrx_lvl2_ois_t *val)
3661 {
3662   lsm6dsrx_int_ois_t int_ois;
3663   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3664   int32_t ret;
3665 
3666   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3667                           (uint8_t *)&int_ois, 1);
3668 
3669   if (ret == 0)
3670   {
3671     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3672                             (uint8_t *)&ctrl1_ois, 1);
3673   }
3674 
3675   switch ((ctrl1_ois.lvl1_ois << 1) + int_ois.lvl2_ois)
3676   {
3677     case LSM6DSRX_AUX_DEN_DISABLE:
3678       *val = LSM6DSRX_AUX_DEN_DISABLE;
3679       break;
3680 
3681     case LSM6DSRX_AUX_DEN_LEVEL_LATCH:
3682       *val = LSM6DSRX_AUX_DEN_LEVEL_LATCH;
3683       break;
3684 
3685     case LSM6DSRX_AUX_DEN_LEVEL_TRIG:
3686       *val = LSM6DSRX_AUX_DEN_LEVEL_TRIG;
3687       break;
3688 
3689     default:
3690       *val = LSM6DSRX_AUX_DEN_DISABLE;
3691       break;
3692   }
3693 
3694   return ret;
3695 }
3696 
3697 /**
3698   * @brief  Enables/Disable OIS chain DRDY on INT2 pin. This setting has
3699   *         priority over all other INT2 settings.[set]
3700   *
3701   * @param  ctx    Read / write interface definitions.(ptr)
3702   * @param  val    Change the values of int2_drdy_ois in reg INT_OIS
3703   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3704   *
3705   */
lsm6dsrx_aux_drdy_on_int2_set(const stmdev_ctx_t * ctx,uint8_t val)3706 int32_t lsm6dsrx_aux_drdy_on_int2_set(const stmdev_ctx_t *ctx,
3707                                       uint8_t val)
3708 {
3709   lsm6dsrx_int_ois_t int_ois;
3710   int32_t ret;
3711 
3712   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3713                           (uint8_t *)&int_ois, 1);
3714 
3715   if (ret == 0)
3716   {
3717     int_ois.int2_drdy_ois = (uint8_t)val;
3718     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_OIS,
3719                              (uint8_t *)&int_ois, 1);
3720   }
3721 
3722   return ret;
3723 }
3724 
3725 /**
3726   * @brief  Enables/Disable OIS chain DRDY on INT2 pin. This setting has
3727   *         priority over all other INT2 settings.[get]
3728   *
3729   * @param  ctx    Read / write interface definitions.(ptr)
3730   * @param  val    Change the values of int2_drdy_ois in reg INT_OIS
3731   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3732   *
3733   */
lsm6dsrx_aux_drdy_on_int2_get(const stmdev_ctx_t * ctx,uint8_t * val)3734 int32_t lsm6dsrx_aux_drdy_on_int2_get(const stmdev_ctx_t *ctx,
3735                                       uint8_t *val)
3736 {
3737   lsm6dsrx_int_ois_t int_ois;
3738   int32_t ret;
3739 
3740   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_OIS,
3741                           (uint8_t *)&int_ois, 1);
3742   *val = int_ois.int2_drdy_ois;
3743 
3744   return ret;
3745 }
3746 
3747 /**
3748   * @brief  Enables OIS chain data processing for gyro in Mode 3 and Mode 4
3749   *         (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
3750   *         When the OIS chain is enabled, the OIS outputs are available
3751   *         through the SPI2 in registers OUTX_L_G (22h) through OUTZ_H_G(27h)
3752   *         and STATUS_REG (1Eh) / STATUS_SPIAux, and LPF1 is dedicated to
3753   *         this chain.[set]
3754   *
3755   * @param  ctx    Read / write interface definitions.(ptr)
3756   * @param  val    Change the values of ois_en_spi2 in reg CTRL1_OIS
3757   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3758   *
3759   */
lsm6dsrx_aux_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_ois_en_spi2_t val)3760 int32_t lsm6dsrx_aux_mode_set(const stmdev_ctx_t *ctx,
3761                               lsm6dsrx_ois_en_spi2_t val)
3762 {
3763   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3764   int32_t ret;
3765 
3766   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3767                           (uint8_t *)&ctrl1_ois, 1);
3768 
3769   if (ret == 0)
3770   {
3771     ctrl1_ois.ois_en_spi2 = (uint8_t)val & 0x01U;
3772     ctrl1_ois.mode4_en = ((uint8_t)val & 0x02U) >> 1;
3773     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_OIS,
3774                              (uint8_t *)&ctrl1_ois, 1);
3775   }
3776 
3777   return ret;
3778 }
3779 
3780 /**
3781   * @brief  Enables OIS chain data processing for gyro in Mode 3 and Mode 4
3782   *         (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
3783   *         When the OIS chain is enabled, the OIS outputs are available
3784   *         through the SPI2 in registers OUTX_L_G (22h) through OUTZ_H_G(27h)
3785   *         and STATUS_REG (1Eh) / STATUS_SPIAux, and LPF1 is dedicated to
3786   *         this chain.[get]
3787   *
3788   * @param  ctx    Read / write interface definitions.(ptr)
3789   * @param  val    Get the values of ois_en_spi2 in
3790   *                                reg CTRL1_OIS
3791   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3792   *
3793   */
lsm6dsrx_aux_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_ois_en_spi2_t * val)3794 int32_t lsm6dsrx_aux_mode_get(const stmdev_ctx_t *ctx,
3795                               lsm6dsrx_ois_en_spi2_t *val)
3796 {
3797   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3798   int32_t ret;
3799 
3800   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3801                           (uint8_t *)&ctrl1_ois, 1);
3802 
3803   switch (((ctrl1_ois.mode4_en << 1) + ctrl1_ois.ois_en_spi2))
3804   {
3805     case LSM6DSRX_AUX_DISABLE:
3806       *val = LSM6DSRX_AUX_DISABLE;
3807       break;
3808 
3809     case LSM6DSRX_MODE_3_GY:
3810       *val = LSM6DSRX_MODE_3_GY;
3811       break;
3812 
3813     case LSM6DSRX_MODE_4_GY_XL:
3814       *val = LSM6DSRX_MODE_4_GY_XL;
3815       break;
3816 
3817     default:
3818       *val = LSM6DSRX_AUX_DISABLE;
3819       break;
3820   }
3821 
3822   return ret;
3823 }
3824 
3825 /**
3826   * @brief  Selects gyroscope OIS chain full-scale.[set]
3827   *
3828   * @param  ctx    Read / write interface definitions.(ptr)
3829   * @param  val    Change the values of fs_g_ois in reg CTRL1_OIS
3830   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3831   *
3832   */
lsm6dsrx_aux_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsrx_fs_g_ois_t val)3833 int32_t lsm6dsrx_aux_gy_full_scale_set(const stmdev_ctx_t *ctx,
3834                                        lsm6dsrx_fs_g_ois_t val)
3835 {
3836   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3837   int32_t ret;
3838 
3839   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3840                           (uint8_t *)&ctrl1_ois, 1);
3841 
3842   if (ret == 0)
3843   {
3844     ctrl1_ois.fs_g_ois = (uint8_t)val & 0x03U;
3845     ctrl1_ois.fs_125_ois = ((uint8_t)val & 0x04U) >> 2;
3846     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_OIS,
3847                              (uint8_t *)&ctrl1_ois, 1);
3848   }
3849 
3850   return ret;
3851 }
3852 
3853 /**
3854   * @brief  Selects gyroscope OIS chain full-scale.[get]
3855   *
3856   * @param  ctx    Read / write interface definitions.(ptr)
3857   * @param  val    Get the values of fs_g_ois in reg CTRL1_OIS
3858   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3859   *
3860   */
lsm6dsrx_aux_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsrx_fs_g_ois_t * val)3861 int32_t lsm6dsrx_aux_gy_full_scale_get(const stmdev_ctx_t *ctx,
3862                                        lsm6dsrx_fs_g_ois_t *val)
3863 {
3864   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3865   int32_t ret;
3866 
3867   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3868                           (uint8_t *)&ctrl1_ois, 1);
3869 
3870   switch ((ctrl1_ois.fs_125_ois << 2) + ctrl1_ois.fs_g_ois)
3871   {
3872     case LSM6DSRX_250dps_AUX:
3873       *val = LSM6DSRX_250dps_AUX;
3874       break;
3875 
3876     case LSM6DSRX_125dps_AUX:
3877       *val = LSM6DSRX_125dps_AUX;
3878       break;
3879 
3880     case LSM6DSRX_500dps_AUX:
3881       *val = LSM6DSRX_500dps_AUX;
3882       break;
3883 
3884     case LSM6DSRX_1000dps_AUX:
3885       *val = LSM6DSRX_1000dps_AUX;
3886       break;
3887 
3888     case LSM6DSRX_2000dps_AUX:
3889       *val = LSM6DSRX_2000dps_AUX;
3890       break;
3891 
3892     default:
3893       *val = LSM6DSRX_250dps_AUX;
3894       break;
3895   }
3896 
3897   return ret;
3898 }
3899 
3900 /**
3901   * @brief  SPI2 3- or 4-wire interface.[set]
3902   *
3903   * @param  ctx    Read / write interface definitions.(ptr)
3904   * @param  val    Change the values of sim_ois in reg CTRL1_OIS
3905   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3906   *
3907   */
lsm6dsrx_aux_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_sim_ois_t val)3908 int32_t lsm6dsrx_aux_spi_mode_set(const stmdev_ctx_t *ctx,
3909                                   lsm6dsrx_sim_ois_t val)
3910 {
3911   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3912   int32_t ret;
3913 
3914   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3915                           (uint8_t *)&ctrl1_ois, 1);
3916 
3917   if (ret == 0)
3918   {
3919     ctrl1_ois.sim_ois = (uint8_t)val;
3920     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL1_OIS,
3921                              (uint8_t *)&ctrl1_ois, 1);
3922   }
3923 
3924   return ret;
3925 }
3926 
3927 /**
3928   * @brief  SPI2 3- or 4-wire interface.[get]
3929   *
3930   * @param  ctx    Read / write interface definitions.(ptr)
3931   * @param  val    Get the values of sim_ois in reg CTRL1_OIS
3932   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3933   *
3934   */
lsm6dsrx_aux_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_sim_ois_t * val)3935 int32_t lsm6dsrx_aux_spi_mode_get(const stmdev_ctx_t *ctx,
3936                                   lsm6dsrx_sim_ois_t *val)
3937 {
3938   lsm6dsrx_ctrl1_ois_t ctrl1_ois;
3939   int32_t ret;
3940 
3941   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL1_OIS,
3942                           (uint8_t *)&ctrl1_ois, 1);
3943 
3944   switch (ctrl1_ois.sim_ois)
3945   {
3946     case LSM6DSRX_AUX_SPI_4_WIRE:
3947       *val = LSM6DSRX_AUX_SPI_4_WIRE;
3948       break;
3949 
3950     case LSM6DSRX_AUX_SPI_3_WIRE:
3951       *val = LSM6DSRX_AUX_SPI_3_WIRE;
3952       break;
3953 
3954     default:
3955       *val = LSM6DSRX_AUX_SPI_4_WIRE;
3956       break;
3957   }
3958 
3959   return ret;
3960 }
3961 
3962 /**
3963   * @brief  Selects gyroscope digital LPF1 filter bandwidth.[set]
3964   *
3965   * @param  ctx    Read / write interface definitions.(ptr)
3966   * @param  val    Change the values of ftype_ois in reg CTRL2_OIS
3967   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3968   *
3969   */
lsm6dsrx_aux_gy_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsrx_ftype_ois_t val)3970 int32_t lsm6dsrx_aux_gy_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
3971                                           lsm6dsrx_ftype_ois_t val)
3972 {
3973   lsm6dsrx_ctrl2_ois_t ctrl2_ois;
3974   int32_t ret;
3975 
3976   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_OIS,
3977                           (uint8_t *)&ctrl2_ois, 1);
3978 
3979   if (ret == 0)
3980   {
3981     ctrl2_ois.ftype_ois = (uint8_t)val;
3982     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL2_OIS,
3983                              (uint8_t *)&ctrl2_ois, 1);
3984   }
3985 
3986   return ret;
3987 }
3988 
3989 /**
3990   * @brief  Selects gyroscope digital LPF1 filter bandwidth.[get]
3991   *
3992   * @param  ctx    Read / write interface definitions.(ptr)
3993   * @param  val    Get the values of ftype_ois in reg CTRL2_OIS
3994   * @retval        Interface status (MANDATORY: return 0 -> no Error).
3995   *
3996   */
lsm6dsrx_aux_gy_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsrx_ftype_ois_t * val)3997 int32_t lsm6dsrx_aux_gy_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
3998                                           lsm6dsrx_ftype_ois_t *val)
3999 {
4000   lsm6dsrx_ctrl2_ois_t ctrl2_ois;
4001   int32_t ret;
4002 
4003   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_OIS,
4004                           (uint8_t *)&ctrl2_ois, 1);
4005 
4006   switch (ctrl2_ois.ftype_ois)
4007   {
4008     case LSM6DSRX_351Hz39:
4009       *val = LSM6DSRX_351Hz39;
4010       break;
4011 
4012     case LSM6DSRX_236Hz63:
4013       *val = LSM6DSRX_236Hz63;
4014       break;
4015 
4016     case LSM6DSRX_172Hz70:
4017       *val = LSM6DSRX_172Hz70;
4018       break;
4019 
4020     case LSM6DSRX_937Hz91:
4021       *val = LSM6DSRX_937Hz91;
4022       break;
4023 
4024     default:
4025       *val = LSM6DSRX_351Hz39;
4026       break;
4027   }
4028 
4029   return ret;
4030 }
4031 
4032 /**
4033   * @brief  Selects gyroscope OIS chain digital high-pass filter cutoff.[set]
4034   *
4035   * @param  ctx    Read / write interface definitions.(ptr)
4036   * @param  val    Change the values of hpm_ois in reg CTRL2_OIS
4037   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4038   *
4039   */
lsm6dsrx_aux_gy_hp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsrx_hpm_ois_t val)4040 int32_t lsm6dsrx_aux_gy_hp_bandwidth_set(const stmdev_ctx_t *ctx,
4041                                          lsm6dsrx_hpm_ois_t val)
4042 {
4043   lsm6dsrx_ctrl2_ois_t ctrl2_ois;
4044   int32_t ret;
4045 
4046   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_OIS,
4047                           (uint8_t *)&ctrl2_ois, 1);
4048 
4049   if (ret == 0)
4050   {
4051     ctrl2_ois.hpm_ois = (uint8_t)val & 0x03U;
4052     ctrl2_ois.hp_en_ois = ((uint8_t)val & 0x10U) >> 4;
4053     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL2_OIS,
4054                              (uint8_t *)&ctrl2_ois, 1);
4055   }
4056 
4057   return ret;
4058 }
4059 
4060 /**
4061   * @brief  Selects gyroscope OIS chain digital high-pass filter cutoff.[get]
4062   *
4063   * @param  ctx    Read / write interface definitions.(ptr)
4064   * @param  val    Get the values of hpm_ois in reg CTRL2_OIS
4065   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4066   *
4067   */
lsm6dsrx_aux_gy_hp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsrx_hpm_ois_t * val)4068 int32_t lsm6dsrx_aux_gy_hp_bandwidth_get(const stmdev_ctx_t *ctx,
4069                                          lsm6dsrx_hpm_ois_t *val)
4070 {
4071   lsm6dsrx_ctrl2_ois_t ctrl2_ois;
4072   int32_t ret;
4073 
4074   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL2_OIS,
4075                           (uint8_t *)&ctrl2_ois, 1);
4076 
4077   switch ((ctrl2_ois.hp_en_ois << 4) + ctrl2_ois.hpm_ois)
4078   {
4079     case LSM6DSRX_AUX_HP_DISABLE:
4080       *val = LSM6DSRX_AUX_HP_DISABLE;
4081       break;
4082 
4083     case LSM6DSRX_AUX_HP_Hz016:
4084       *val = LSM6DSRX_AUX_HP_Hz016;
4085       break;
4086 
4087     case LSM6DSRX_AUX_HP_Hz065:
4088       *val = LSM6DSRX_AUX_HP_Hz065;
4089       break;
4090 
4091     case LSM6DSRX_AUX_HP_Hz260:
4092       *val = LSM6DSRX_AUX_HP_Hz260;
4093       break;
4094 
4095     case LSM6DSRX_AUX_HP_1Hz040:
4096       *val = LSM6DSRX_AUX_HP_1Hz040;
4097       break;
4098 
4099     default:
4100       *val = LSM6DSRX_AUX_HP_DISABLE;
4101       break;
4102   }
4103 
4104   return ret;
4105 }
4106 
4107 /**
4108   * @brief  Enable / Disables OIS chain clamp. Enable: All OIS chain
4109   *         outputs = 8000h during self-test; Disable: OIS chain self-test
4110   *         outputs dependent from the aux gyro full scale selected.[set]
4111   *
4112   * @param  ctx    Read / write interface definitions.(ptr)
4113   * @param  val    Change the values of st_ois_clampdis in reg CTRL3_OIS
4114   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4115   *
4116   */
lsm6dsrx_aux_gy_clamp_set(const stmdev_ctx_t * ctx,lsm6dsrx_st_ois_clampdis_t val)4117 int32_t lsm6dsrx_aux_gy_clamp_set(const stmdev_ctx_t *ctx,
4118                                   lsm6dsrx_st_ois_clampdis_t val)
4119 {
4120   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4121   int32_t ret;
4122 
4123   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4124                           (uint8_t *)&ctrl3_ois, 1);
4125 
4126   if (ret == 0)
4127   {
4128     ctrl3_ois.st_ois_clampdis = (uint8_t)val;
4129     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_OIS,
4130                              (uint8_t *)&ctrl3_ois, 1);
4131   }
4132 
4133   return ret;
4134 }
4135 
4136 /**
4137   * @brief  Enable / Disables OIS chain clamp. Enable: All OIS chain
4138   *         outputs = 8000h during self-test; Disable: OIS chain self-test
4139   *         outputs dependent from the aux gyro full scale selected.[get]
4140   *
4141   * @param  ctx    Read / write interface definitions.(ptr)
4142   * @param  val    Get the values of st_ois_clampdis in reg CTRL3_OIS
4143   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4144   *
4145   */
lsm6dsrx_aux_gy_clamp_get(const stmdev_ctx_t * ctx,lsm6dsrx_st_ois_clampdis_t * val)4146 int32_t lsm6dsrx_aux_gy_clamp_get(const stmdev_ctx_t *ctx,
4147                                   lsm6dsrx_st_ois_clampdis_t *val)
4148 {
4149   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4150   int32_t ret;
4151 
4152   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4153                           (uint8_t *)&ctrl3_ois, 1);
4154 
4155   switch (ctrl3_ois.st_ois_clampdis)
4156   {
4157     case LSM6DSRX_ENABLE_CLAMP:
4158       *val = LSM6DSRX_ENABLE_CLAMP;
4159       break;
4160 
4161     case LSM6DSRX_DISABLE_CLAMP:
4162       *val = LSM6DSRX_DISABLE_CLAMP;
4163       break;
4164 
4165     default:
4166       *val = LSM6DSRX_ENABLE_CLAMP;
4167       break;
4168   }
4169 
4170   return ret;
4171 }
4172 
4173 /**
4174   * @brief  Selects gyroscope OIS chain self-test.[set]
4175   *
4176   * @param  ctx    Read / write interface definitions.(ptr)
4177   * @param  val    Change the values of st_ois in reg CTRL3_OIS
4178   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4179   *
4180   */
lsm6dsrx_aux_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsrx_st_ois_t val)4181 int32_t lsm6dsrx_aux_gy_self_test_set(const stmdev_ctx_t *ctx,
4182                                       lsm6dsrx_st_ois_t val)
4183 {
4184   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4185   int32_t ret;
4186 
4187   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4188                           (uint8_t *)&ctrl3_ois, 1);
4189 
4190   if (ret == 0)
4191   {
4192     ctrl3_ois.st_ois = (uint8_t)val;
4193     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_OIS,
4194                              (uint8_t *)&ctrl3_ois, 1);
4195   }
4196 
4197   return ret;
4198 }
4199 
4200 /**
4201   * @brief  Selects gyroscope OIS chain self-test.[get]
4202   *
4203   * @param  ctx    Read / write interface definitions.(ptr)
4204   * @param  val    Get the values of st_ois in reg CTRL3_OIS
4205   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4206   *
4207   */
lsm6dsrx_aux_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsrx_st_ois_t * val)4208 int32_t lsm6dsrx_aux_gy_self_test_get(const stmdev_ctx_t *ctx,
4209                                       lsm6dsrx_st_ois_t *val)
4210 {
4211   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4212   int32_t ret;
4213 
4214   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4215                           (uint8_t *)&ctrl3_ois, 1);
4216 
4217   switch (ctrl3_ois.st_ois)
4218   {
4219     case LSM6DSRX_AUX_GY_DISABLE:
4220       *val = LSM6DSRX_AUX_GY_DISABLE;
4221       break;
4222 
4223     case LSM6DSRX_AUX_GY_POS:
4224       *val = LSM6DSRX_AUX_GY_POS;
4225       break;
4226 
4227     case LSM6DSRX_AUX_GY_NEG:
4228       *val = LSM6DSRX_AUX_GY_NEG;
4229       break;
4230 
4231     default:
4232       *val = LSM6DSRX_AUX_GY_DISABLE;
4233       break;
4234   }
4235 
4236   return ret;
4237 }
4238 
4239 /**
4240   * @brief  Selects accelerometer OIS channel bandwidth.[set]
4241   *
4242   * @param  ctx    Read / write interface definitions.(ptr)
4243   * @param  val    Change the values of filter_xl_conf_ois in reg CTRL3_OIS
4244   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4245   *
4246   */
lsm6dsrx_aux_xl_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsrx_filter_xl_conf_ois_t val)4247 int32_t lsm6dsrx_aux_xl_bandwidth_set(const stmdev_ctx_t *ctx,
4248                                       lsm6dsrx_filter_xl_conf_ois_t val)
4249 {
4250   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4251   int32_t ret;
4252 
4253   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4254                           (uint8_t *)&ctrl3_ois, 1);
4255 
4256   if (ret == 0)
4257   {
4258     ctrl3_ois.filter_xl_conf_ois = (uint8_t)val;
4259     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_OIS,
4260                              (uint8_t *)&ctrl3_ois, 1);
4261   }
4262 
4263   return ret;
4264 }
4265 
4266 /**
4267   * @brief  Selects accelerometer OIS channel bandwidth.[get]
4268   *
4269   * @param  ctx    Read / write interface definitions.(ptr)
4270   * @param  val    Get the values of filter_xl_conf_ois in reg CTRL3_OIS
4271   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4272   *
4273   */
lsm6dsrx_aux_xl_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsrx_filter_xl_conf_ois_t * val)4274 int32_t lsm6dsrx_aux_xl_bandwidth_get(const stmdev_ctx_t *ctx,
4275                                       lsm6dsrx_filter_xl_conf_ois_t *val)
4276 {
4277   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4278   int32_t ret;
4279 
4280   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4281                           (uint8_t *)&ctrl3_ois, 1);
4282 
4283   switch (ctrl3_ois.filter_xl_conf_ois)
4284   {
4285     case LSM6DSRX_631Hz:
4286       *val = LSM6DSRX_631Hz;
4287       break;
4288 
4289     case LSM6DSRX_295Hz:
4290       *val = LSM6DSRX_295Hz;
4291       break;
4292 
4293     case LSM6DSRX_140Hz:
4294       *val = LSM6DSRX_140Hz;
4295       break;
4296 
4297     case LSM6DSRX_68Hz2:
4298       *val = LSM6DSRX_68Hz2;
4299       break;
4300 
4301     case LSM6DSRX_33Hz6:
4302       *val = LSM6DSRX_33Hz6;
4303       break;
4304 
4305     case LSM6DSRX_16Hz7:
4306       *val = LSM6DSRX_16Hz7;
4307       break;
4308 
4309     case LSM6DSRX_8Hz3:
4310       *val = LSM6DSRX_8Hz3;
4311       break;
4312 
4313     case LSM6DSRX_4Hz11:
4314       *val = LSM6DSRX_4Hz11;
4315       break;
4316 
4317     default:
4318       *val = LSM6DSRX_631Hz;
4319       break;
4320   }
4321 
4322   return ret;
4323 }
4324 
4325 /**
4326   * @brief  Selects accelerometer OIS channel full-scale.[set]
4327   *
4328   * @param  ctx    Read / write interface definitions.(ptr)
4329   * @param  val    Change the values of fs_xl_ois in reg CTRL3_OIS
4330   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4331   *
4332   */
lsm6dsrx_aux_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsrx_fs_xl_ois_t val)4333 int32_t lsm6dsrx_aux_xl_full_scale_set(const stmdev_ctx_t *ctx,
4334                                        lsm6dsrx_fs_xl_ois_t val)
4335 {
4336   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4337   int32_t ret;
4338 
4339   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4340                           (uint8_t *)&ctrl3_ois, 1);
4341 
4342   if (ret == 0)
4343   {
4344     ctrl3_ois.fs_xl_ois = (uint8_t)val;
4345     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_OIS,
4346                              (uint8_t *)&ctrl3_ois, 1);
4347   }
4348 
4349   return ret;
4350 }
4351 
4352 /**
4353   * @brief  Selects accelerometer OIS channel full-scale.[get]
4354   *
4355   * @param  ctx    Read / write interface definitions.(ptr)
4356   * @param  val    Get the values of fs_xl_ois in reg CTRL3_OIS
4357   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4358   *
4359   */
lsm6dsrx_aux_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsrx_fs_xl_ois_t * val)4360 int32_t lsm6dsrx_aux_xl_full_scale_get(const stmdev_ctx_t *ctx,
4361                                        lsm6dsrx_fs_xl_ois_t *val)
4362 {
4363   lsm6dsrx_ctrl3_ois_t ctrl3_ois;
4364   int32_t ret;
4365 
4366   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_OIS,
4367                           (uint8_t *)&ctrl3_ois, 1);
4368 
4369   switch (ctrl3_ois.fs_xl_ois)
4370   {
4371     case LSM6DSRX_AUX_2g:
4372       *val = LSM6DSRX_AUX_2g;
4373       break;
4374 
4375     case LSM6DSRX_AUX_16g:
4376       *val = LSM6DSRX_AUX_16g;
4377       break;
4378 
4379     case LSM6DSRX_AUX_4g:
4380       *val = LSM6DSRX_AUX_4g;
4381       break;
4382 
4383     case LSM6DSRX_AUX_8g:
4384       *val = LSM6DSRX_AUX_8g;
4385       break;
4386 
4387     default:
4388       *val = LSM6DSRX_AUX_2g;
4389       break;
4390   }
4391 
4392   return ret;
4393 }
4394 
4395 /**
4396   * @}
4397   *
4398   */
4399 
4400 /**
4401   * @defgroup   LSM6DSRX_ main_serial_interface
4402   * @brief      This section groups all the functions concerning main
4403   *             serial interface management (not auxiliary)
4404   * @{
4405   *
4406   */
4407 
4408 /**
4409   * @brief  Connect/Disconnect SDO/SA0 internal pull-up.[set]
4410   *
4411   * @param  ctx    Read / write interface definitions.(ptr)
4412   * @param  val    Change the values of sdo_pu_en in reg PIN_CTRL
4413   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4414   *
4415   */
lsm6dsrx_sdo_sa0_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_sdo_pu_en_t val)4416 int32_t lsm6dsrx_sdo_sa0_mode_set(const stmdev_ctx_t *ctx,
4417                                   lsm6dsrx_sdo_pu_en_t val)
4418 {
4419   lsm6dsrx_pin_ctrl_t pin_ctrl;
4420   int32_t ret;
4421 
4422   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PIN_CTRL,
4423                           (uint8_t *)&pin_ctrl, 1);
4424 
4425   if (ret == 0)
4426   {
4427     pin_ctrl.sdo_pu_en = (uint8_t)val;
4428     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PIN_CTRL,
4429                              (uint8_t *)&pin_ctrl, 1);
4430   }
4431 
4432   return ret;
4433 }
4434 
4435 /**
4436   * @brief  Connect/Disconnect SDO/SA0 internal pull-up.[get]
4437   *
4438   * @param  ctx    Read / write interface definitions.(ptr)
4439   * @param  val    Get the values of sdo_pu_en in reg PIN_CTRL
4440   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4441   *
4442   */
lsm6dsrx_sdo_sa0_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_sdo_pu_en_t * val)4443 int32_t lsm6dsrx_sdo_sa0_mode_get(const stmdev_ctx_t *ctx,
4444                                   lsm6dsrx_sdo_pu_en_t *val)
4445 {
4446   lsm6dsrx_pin_ctrl_t pin_ctrl;
4447   int32_t ret;
4448 
4449   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PIN_CTRL,
4450                           (uint8_t *)&pin_ctrl, 1);
4451 
4452   switch (pin_ctrl.sdo_pu_en)
4453   {
4454     case LSM6DSRX_PULL_UP_DISC:
4455       *val = LSM6DSRX_PULL_UP_DISC;
4456       break;
4457 
4458     case LSM6DSRX_PULL_UP_CONNECT:
4459       *val = LSM6DSRX_PULL_UP_CONNECT;
4460       break;
4461 
4462     default:
4463       *val = LSM6DSRX_PULL_UP_DISC;
4464       break;
4465   }
4466 
4467   return ret;
4468 }
4469 
4470 /**
4471   * @brief  Connect/Disconnect INT1 pull-down.[set]
4472   *
4473   * @param  ctx    Read / write interface definitions.(ptr)
4474   * @param  val    Change the values of pd_dis_int1 in reg I3C_BUS_AVB
4475   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4476   *
4477   */
lsm6dsrx_int1_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_pd_dis_int1_t val)4478 int32_t lsm6dsrx_int1_mode_set(const stmdev_ctx_t *ctx,
4479                                lsm6dsrx_pd_dis_int1_t val)
4480 {
4481   lsm6dsrx_i3c_bus_avb_t i3c_bus_avb;
4482   int32_t ret;
4483 
4484   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4485                           (uint8_t *)&i3c_bus_avb, 1);
4486 
4487   if (ret == 0)
4488   {
4489     i3c_bus_avb.pd_dis_int1 = (uint8_t)val;
4490     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4491                              (uint8_t *)&i3c_bus_avb, 1);
4492   }
4493 
4494   return ret;
4495 }
4496 
4497 /**
4498   * @brief  Connect/Disconnect INT1 pull-down.[get]
4499   *
4500   * @param  ctx    Read / write interface definitions.(ptr)
4501   * @param  val    Get the values of pd_dis_int1 in reg I3C_BUS_AVB
4502   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4503   *
4504   */
lsm6dsrx_int1_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_pd_dis_int1_t * val)4505 int32_t lsm6dsrx_int1_mode_get(const stmdev_ctx_t *ctx,
4506                                lsm6dsrx_pd_dis_int1_t *val)
4507 {
4508   lsm6dsrx_i3c_bus_avb_t i3c_bus_avb;
4509   int32_t ret;
4510 
4511   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4512                           (uint8_t *)&i3c_bus_avb, 1);
4513 
4514   switch (i3c_bus_avb.pd_dis_int1)
4515   {
4516     case LSM6DSRX_PULL_DOWN_CONNECT:
4517       *val = LSM6DSRX_PULL_DOWN_CONNECT;
4518       break;
4519 
4520     case LSM6DSRX_PULL_DOWN_DISC:
4521       *val = LSM6DSRX_PULL_DOWN_DISC;
4522       break;
4523 
4524     default:
4525       *val = LSM6DSRX_PULL_DOWN_CONNECT;
4526       break;
4527   }
4528 
4529   return ret;
4530 }
4531 
4532 /**
4533   * @brief  SPI Serial Interface Mode selection.[set]
4534   *
4535   * @param  ctx    Read / write interface definitions.(ptr)
4536   * @param  val    Change the values of sim in reg CTRL3_C
4537   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4538   *
4539   */
lsm6dsrx_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_sim_t val)4540 int32_t lsm6dsrx_spi_mode_set(const stmdev_ctx_t *ctx,
4541                               lsm6dsrx_sim_t val)
4542 {
4543   lsm6dsrx_ctrl3_c_t ctrl3_c;
4544   int32_t ret;
4545 
4546   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
4547                           (uint8_t *)&ctrl3_c, 1);
4548 
4549   if (ret == 0)
4550   {
4551     ctrl3_c.sim = (uint8_t)val;
4552     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
4553                              (uint8_t *)&ctrl3_c, 1);
4554   }
4555 
4556   return ret;
4557 }
4558 
4559 /**
4560   * @brief  SPI Serial Interface Mode selection.[get]
4561   *
4562   * @param  ctx    Read / write interface definitions.(ptr)
4563   * @param  val    Get the values of sim in reg CTRL3_C
4564   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4565   *
4566   */
lsm6dsrx_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_sim_t * val)4567 int32_t lsm6dsrx_spi_mode_get(const stmdev_ctx_t *ctx,
4568                               lsm6dsrx_sim_t *val)
4569 {
4570   lsm6dsrx_ctrl3_c_t ctrl3_c;
4571   int32_t ret;
4572 
4573   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
4574                           (uint8_t *)&ctrl3_c, 1);
4575 
4576   switch (ctrl3_c.sim)
4577   {
4578     case LSM6DSRX_SPI_4_WIRE:
4579       *val = LSM6DSRX_SPI_4_WIRE;
4580       break;
4581 
4582     case LSM6DSRX_SPI_3_WIRE:
4583       *val = LSM6DSRX_SPI_3_WIRE;
4584       break;
4585 
4586     default:
4587       *val = LSM6DSRX_SPI_4_WIRE;
4588       break;
4589   }
4590 
4591   return ret;
4592 }
4593 
4594 /**
4595   * @brief  Disable / Enable I2C interface.[set]
4596   *
4597   * @param  ctx    Read / write interface definitions.(ptr)
4598   * @param  val    Change the values of i2c_disable in reg CTRL4_C
4599   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4600   *
4601   */
lsm6dsrx_i2c_interface_set(const stmdev_ctx_t * ctx,lsm6dsrx_i2c_disable_t val)4602 int32_t lsm6dsrx_i2c_interface_set(const stmdev_ctx_t *ctx,
4603                                    lsm6dsrx_i2c_disable_t val)
4604 {
4605   lsm6dsrx_ctrl4_c_t ctrl4_c;
4606   int32_t ret;
4607 
4608   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
4609                           (uint8_t *)&ctrl4_c, 1);
4610 
4611   if (ret == 0)
4612   {
4613     ctrl4_c.i2c_disable = (uint8_t)val;
4614     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL4_C,
4615                              (uint8_t *)&ctrl4_c, 1);
4616   }
4617 
4618   return ret;
4619 }
4620 
4621 /**
4622   * @brief  Disable / Enable I2C interface.[get]
4623   *
4624   * @param  ctx    Read / write interface definitions.(ptr)
4625   * @param  val    Get the values of i2c reg CTRL4_C
4626   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4627   *
4628   */
lsm6dsrx_i2c_interface_get(const stmdev_ctx_t * ctx,lsm6dsrx_i2c_disable_t * val)4629 int32_t lsm6dsrx_i2c_interface_get(const stmdev_ctx_t *ctx,
4630                                    lsm6dsrx_i2c_disable_t *val)
4631 {
4632   lsm6dsrx_ctrl4_c_t ctrl4_c;
4633   int32_t ret;
4634 
4635   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
4636                           (uint8_t *)&ctrl4_c, 1);
4637 
4638   switch (ctrl4_c.i2c_disable)
4639   {
4640     case LSM6DSRX_I2C_ENABLE:
4641       *val = LSM6DSRX_I2C_ENABLE;
4642       break;
4643 
4644     case LSM6DSRX_I2C_DISABLE:
4645       *val = LSM6DSRX_I2C_DISABLE;
4646       break;
4647 
4648     default:
4649       *val = LSM6DSRX_I2C_ENABLE;
4650       break;
4651   }
4652 
4653   return ret;
4654 }
4655 
4656 /**
4657   * @brief  I3C Enable/Disable communication protocol.[set]
4658   *
4659   * @param  ctx    Read / write interface definitions.(ptr)
4660   * @param  val    Change the values of i3c_disable in reg CTRL9_XL
4661   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4662   *
4663   */
lsm6dsrx_i3c_disable_set(const stmdev_ctx_t * ctx,lsm6dsrx_i3c_disable_t val)4664 int32_t lsm6dsrx_i3c_disable_set(const stmdev_ctx_t *ctx,
4665                                  lsm6dsrx_i3c_disable_t val)
4666 {
4667   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
4668   lsm6dsrx_i3c_bus_avb_t i3c_bus_avb;
4669   int32_t ret;
4670 
4671   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
4672 
4673   if (ret == 0)
4674   {
4675     ctrl9_xl.i3c_disable = ((uint8_t)val & 0x80U) >> 7;
4676     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
4677                              (uint8_t *)&ctrl9_xl, 1);
4678   }
4679 
4680   if (ret == 0)
4681   {
4682     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4683                             (uint8_t *)&i3c_bus_avb, 1);
4684   }
4685 
4686   if (ret == 0)
4687   {
4688     i3c_bus_avb.i3c_bus_avb_sel = (uint8_t)val & 0x03U;
4689     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4690                              (uint8_t *)&i3c_bus_avb, 1);
4691   }
4692 
4693   return ret;
4694 }
4695 
4696 /**
4697   * @brief  I3C Enable/Disable communication protocol.[get]
4698   *
4699   * @param  ctx    Read / write interface definitions.(ptr)
4700   * @param  val    Change the values of i3c_disable in reg CTRL9_XL
4701   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4702   *
4703   */
lsm6dsrx_i3c_disable_get(const stmdev_ctx_t * ctx,lsm6dsrx_i3c_disable_t * val)4704 int32_t lsm6dsrx_i3c_disable_get(const stmdev_ctx_t *ctx,
4705                                  lsm6dsrx_i3c_disable_t *val)
4706 {
4707   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
4708   lsm6dsrx_i3c_bus_avb_t i3c_bus_avb;
4709   int32_t ret;
4710 
4711   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
4712 
4713   if (ret == 0)
4714   {
4715     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_I3C_BUS_AVB,
4716                             (uint8_t *)&i3c_bus_avb, 1);
4717   }
4718 
4719   switch ((ctrl9_xl.i3c_disable << 7) + i3c_bus_avb.i3c_bus_avb_sel)
4720   {
4721     case LSM6DSRX_I3C_DISABLE:
4722       *val = LSM6DSRX_I3C_DISABLE;
4723       break;
4724 
4725     case LSM6DSRX_I3C_ENABLE_T_50us:
4726       *val = LSM6DSRX_I3C_ENABLE_T_50us;
4727       break;
4728 
4729     case LSM6DSRX_I3C_ENABLE_T_2us:
4730       *val = LSM6DSRX_I3C_ENABLE_T_2us;
4731       break;
4732 
4733     case LSM6DSRX_I3C_ENABLE_T_1ms:
4734       *val = LSM6DSRX_I3C_ENABLE_T_1ms;
4735       break;
4736 
4737     case LSM6DSRX_I3C_ENABLE_T_25ms:
4738       *val = LSM6DSRX_I3C_ENABLE_T_25ms;
4739       break;
4740 
4741     default:
4742       *val = LSM6DSRX_I3C_DISABLE;
4743       break;
4744   }
4745 
4746   return ret;
4747 }
4748 
4749 /**
4750   * @}
4751   *
4752   */
4753 
4754 /**
4755   * @defgroup   LSM6DSRX_interrupt_pins
4756   * @brief      This section groups all the functions that manage
4757   *             interrupt pins
4758   * @{
4759   *
4760   */
4761 
4762 /**
4763   * @brief   Select the signal that need to route on int1 pad[set]
4764   *
4765   * @param  ctx    Read / write interface definitions.(ptr)
4766   * @param  val    Structure of registers: INT1_CTRL,MD1_CFG,
4767   *                EMB_FUNC_INT1, FSM_INT1_A, FSM_INT1_B
4768   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4769   *
4770   */
lsm6dsrx_pin_int1_route_set(const stmdev_ctx_t * ctx,lsm6dsrx_pin_int1_route_t * val)4771 int32_t lsm6dsrx_pin_int1_route_set(const stmdev_ctx_t *ctx,
4772                                     lsm6dsrx_pin_int1_route_t *val)
4773 {
4774   lsm6dsrx_tap_cfg2_t tap_cfg2;
4775   int32_t ret;
4776 
4777   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
4778 
4779   if (ret == 0)
4780   {
4781     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MLC_INT1,
4782                              (uint8_t *)&val->mlc_int1, 1);
4783   }
4784 
4785   if (ret == 0)
4786   {
4787     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_INT1,
4788                              (uint8_t *)&val->emb_func_int1, 1);
4789   }
4790 
4791   if (ret == 0)
4792   {
4793     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_INT1_A,
4794                              (uint8_t *)&val->fsm_int1_a, 1);
4795   }
4796 
4797   if (ret == 0)
4798   {
4799     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_INT1_B,
4800                              (uint8_t *)&val->fsm_int1_b, 1);
4801   }
4802 
4803   if (ret == 0)
4804   {
4805     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
4806   }
4807 
4808   if (ret == 0)
4809   {
4810     if ((val->emb_func_int1.int1_fsm_lc |
4811          val->emb_func_int1.int1_sig_mot |
4812          val->emb_func_int1.int1_step_detector |
4813          val->emb_func_int1.int1_tilt |
4814          val->fsm_int1_a.int1_fsm1 |
4815          val->fsm_int1_a.int1_fsm2 |
4816          val->fsm_int1_a.int1_fsm3 |
4817          val->fsm_int1_a.int1_fsm4 |
4818          val->fsm_int1_a.int1_fsm5 |
4819          val->fsm_int1_a.int1_fsm6 |
4820          val->fsm_int1_a.int1_fsm7 |
4821          val->fsm_int1_a.int1_fsm8 |
4822          val->fsm_int1_b.int1_fsm9 |
4823          val->fsm_int1_b.int1_fsm10 |
4824          val->fsm_int1_b.int1_fsm11 |
4825          val->fsm_int1_b.int1_fsm12 |
4826          val->fsm_int1_b.int1_fsm13 |
4827          val->fsm_int1_b.int1_fsm14 |
4828          val->fsm_int1_b.int1_fsm15 |
4829          val->fsm_int1_b.int1_fsm16 |
4830          val->mlc_int1.int1_mlc1 |
4831          val->mlc_int1.int1_mlc2 |
4832          val->mlc_int1.int1_mlc3 |
4833          val->mlc_int1.int1_mlc4 |
4834          val->mlc_int1.int1_mlc5 |
4835          val->mlc_int1.int1_mlc6 |
4836          val->mlc_int1.int1_mlc7 |
4837          val->mlc_int1.int1_mlc8) != PROPERTY_DISABLE)
4838     {
4839       val->md1_cfg.int1_emb_func = PROPERTY_ENABLE;
4840     }
4841     else
4842     {
4843       val->md1_cfg.int1_emb_func = PROPERTY_DISABLE;
4844     }
4845 
4846     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT1_CTRL,
4847                              (uint8_t *)&val->int1_ctrl, 1);
4848   }
4849 
4850   if (ret == 0)
4851   {
4852     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MD1_CFG,
4853                              (uint8_t *)&val->md1_cfg, 1);
4854   }
4855 
4856   if (ret == 0)
4857   {
4858     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
4859                             (uint8_t *)&tap_cfg2, 1);
4860 
4861     if ((val->int1_ctrl.den_drdy_flag |
4862          val->int1_ctrl.int1_boot |
4863          val->int1_ctrl.int1_cnt_bdr |
4864          val->int1_ctrl.int1_drdy_g |
4865          val->int1_ctrl.int1_drdy_xl |
4866          val->int1_ctrl.int1_fifo_full |
4867          val->int1_ctrl.int1_fifo_ovr |
4868          val->int1_ctrl.int1_fifo_th |
4869          val->md1_cfg.int1_shub |
4870          val->md1_cfg.int1_6d |
4871          val->md1_cfg.int1_double_tap |
4872          val->md1_cfg.int1_ff |
4873          val->md1_cfg.int1_wu |
4874          val->md1_cfg.int1_single_tap |
4875          val->md1_cfg.int1_sleep_change) != PROPERTY_DISABLE)
4876     {
4877       tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
4878     }
4879 
4880     else
4881     {
4882       tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
4883     }
4884   }
4885 
4886   if (ret == 0)
4887   {
4888     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG2,
4889                              (uint8_t *)&tap_cfg2, 1);
4890   }
4891 
4892   return ret;
4893 }
4894 
4895 /**
4896   * @brief  Select the signal that need to route on int1 pad.[get]
4897   *
4898   * @param  ctx    Read / write interface definitions.(ptr)
4899   * @param  val    Structure of registers: INT1_CTRL, MD1_CFG,
4900   *                EMB_FUNC_INT1, FSM_INT1_A, FSM_INT1_B.(ptr)
4901   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4902   *
4903   */
lsm6dsrx_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dsrx_pin_int1_route_t * val)4904 int32_t lsm6dsrx_pin_int1_route_get(const stmdev_ctx_t *ctx,
4905                                     lsm6dsrx_pin_int1_route_t *val)
4906 {
4907   int32_t ret;
4908 
4909   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
4910 
4911   if (ret == 0)
4912   {
4913     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MLC_INT1,
4914                             (uint8_t *)&val->mlc_int1, 1);
4915   }
4916 
4917   if (ret == 0)
4918   {
4919     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INT1,
4920                             (uint8_t *)&val->emb_func_int1, 1);
4921   }
4922 
4923   if (ret == 0)
4924   {
4925     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_INT1_A,
4926                             (uint8_t *)&val->fsm_int1_a, 1);
4927   }
4928 
4929   if (ret == 0)
4930   {
4931     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_INT1_B,
4932                             (uint8_t *)&val->fsm_int1_b, 1);
4933   }
4934 
4935   if (ret == 0)
4936   {
4937     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
4938   }
4939 
4940   if (ret == 0)
4941   {
4942     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT1_CTRL,
4943                             (uint8_t *)&val->int1_ctrl, 1);
4944   }
4945 
4946   if (ret == 0)
4947   {
4948     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MD1_CFG,
4949                             (uint8_t *)&val->md1_cfg, 1);
4950   }
4951 
4952   return ret;
4953 }
4954 
4955 /**
4956   * @brief  Select the signal that need to route on int2 pad[set]
4957   *
4958   * @param  ctx    Read / write interface definitions.(ptr)
4959   * @param  val    Structure of registers INT2_CTRL,  MD2_CFG,
4960   *                EMB_FUNC_INT2, FSM_INT2_A, FSM_INT2_B
4961   * @retval        Interface status (MANDATORY: return 0 -> no Error).
4962   *
4963   */
lsm6dsrx_pin_int2_route_set(const stmdev_ctx_t * ctx,lsm6dsrx_pin_int2_route_t * val)4964 int32_t lsm6dsrx_pin_int2_route_set(const stmdev_ctx_t *ctx,
4965                                     lsm6dsrx_pin_int2_route_t *val)
4966 {
4967   lsm6dsrx_tap_cfg2_t tap_cfg2;
4968   int32_t ret;
4969 
4970   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
4971 
4972   if (ret == 0)
4973   {
4974     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MLC_INT2,
4975                              (uint8_t *)&val->mlc_int2, 1);
4976   }
4977 
4978   if (ret == 0)
4979   {
4980     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_INT2,
4981                              (uint8_t *)&val->emb_func_int2, 1);
4982   }
4983 
4984   if (ret == 0)
4985   {
4986     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_INT2_A,
4987                              (uint8_t *)&val->fsm_int2_a, 1);
4988   }
4989 
4990   if (ret == 0)
4991   {
4992     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_INT2_B,
4993                              (uint8_t *)&val->fsm_int2_b, 1);
4994   }
4995 
4996   if (ret == 0)
4997   {
4998     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
4999   }
5000 
5001   if (ret == 0)
5002   {
5003     if ((val->emb_func_int2.int2_step_detector |
5004          val->emb_func_int2.int2_tilt |
5005          val->emb_func_int2.int2_sig_mot |
5006          val->emb_func_int2.int2_fsm_lc |
5007          val->fsm_int2_a.int2_fsm1 |
5008          val->fsm_int2_a.int2_fsm2 |
5009          val->fsm_int2_a.int2_fsm3 |
5010          val->fsm_int2_a.int2_fsm4 |
5011          val->fsm_int2_a.int2_fsm5 |
5012          val->fsm_int2_a.int2_fsm6 |
5013          val->fsm_int2_a.int2_fsm7 |
5014          val->fsm_int2_a.int2_fsm8 |
5015          val->fsm_int2_b.int2_fsm9 |
5016          val->fsm_int2_b.int2_fsm10 |
5017          val->fsm_int2_b.int2_fsm11 |
5018          val->fsm_int2_b.int2_fsm12 |
5019          val->fsm_int2_b.int2_fsm13 |
5020          val->fsm_int2_b.int2_fsm14 |
5021          val->fsm_int2_b.int2_fsm15 |
5022          val->fsm_int2_b.int2_fsm16 |
5023          val->mlc_int2.int2_mlc1 |
5024          val->mlc_int2.int2_mlc2 |
5025          val->mlc_int2.int2_mlc3 |
5026          val->mlc_int2.int2_mlc4 |
5027          val->mlc_int2.int2_mlc5 |
5028          val->mlc_int2.int2_mlc6 |
5029          val->mlc_int2.int2_mlc7 |
5030          val->mlc_int2.int2_mlc8) != PROPERTY_DISABLE)
5031     {
5032       val->md2_cfg.int2_emb_func = PROPERTY_ENABLE;
5033     }
5034     else
5035     {
5036       val->md2_cfg.int2_emb_func = PROPERTY_DISABLE;
5037     }
5038 
5039     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT2_CTRL,
5040                              (uint8_t *)&val->int2_ctrl, 1);
5041   }
5042 
5043   if (ret == 0)
5044   {
5045     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MD2_CFG,
5046                              (uint8_t *)&val->md2_cfg, 1);
5047   }
5048 
5049   if (ret == 0)
5050   {
5051     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
5052                             (uint8_t *)&tap_cfg2, 1);
5053   }
5054 
5055   if (ret == 0)
5056   {
5057     if ((val->int2_ctrl.int2_drdy_xl |
5058          val->int2_ctrl.int2_drdy_g |
5059          val->int2_ctrl.int2_drdy_temp |
5060          val->int2_ctrl.int2_fifo_th |
5061          val->int2_ctrl.int2_fifo_ovr |
5062          val->int2_ctrl.int2_fifo_full |
5063          val->int2_ctrl.int2_cnt_bdr |
5064          val->md2_cfg.int2_6d |
5065          val->md2_cfg.int2_double_tap |
5066          val->md2_cfg.int2_ff |
5067          val->md2_cfg.int2_wu |
5068          val->md2_cfg.int2_single_tap |
5069          val->md2_cfg.int2_sleep_change) != PROPERTY_DISABLE)
5070     {
5071       tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
5072     }
5073 
5074     else
5075     {
5076       tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
5077     }
5078 
5079     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG2,
5080                              (uint8_t *)&tap_cfg2, 1);
5081   }
5082 
5083   return ret;
5084 }
5085 
5086 /**
5087   * @brief  Select the signal that need to route on int2 pad.[get]
5088   *
5089   * @param  ctx    Read / write interface definitions.(ptr)
5090   * @param  val    Structure of registers INT2_CTRL,  MD2_CFG,
5091   *                EMB_FUNC_INT2, FSM_INT2_A, FSM_INT2_B.[get]
5092   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5093   *
5094   */
lsm6dsrx_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dsrx_pin_int2_route_t * val)5095 int32_t lsm6dsrx_pin_int2_route_get(const stmdev_ctx_t *ctx,
5096                                     lsm6dsrx_pin_int2_route_t *val)
5097 {
5098   int32_t ret;
5099 
5100   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
5101 
5102   if (ret == 0)
5103   {
5104     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MLC_INT2,
5105                             (uint8_t *)&val->mlc_int2, 1);
5106   }
5107 
5108   if (ret == 0)
5109   {
5110     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INT2,
5111                             (uint8_t *)&val->emb_func_int2, 1);
5112   }
5113 
5114   if (ret == 0)
5115   {
5116     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_INT2_A,
5117                             (uint8_t *)&val->fsm_int2_a, 1);
5118   }
5119 
5120   if (ret == 0)
5121   {
5122     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_INT2_B,
5123                             (uint8_t *)&val->fsm_int2_b, 1);
5124   }
5125 
5126   if (ret == 0)
5127   {
5128     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
5129   }
5130 
5131   if (ret == 0)
5132   {
5133     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT2_CTRL,
5134                             (uint8_t *)&val->int2_ctrl, 1);
5135   }
5136 
5137   if (ret == 0)
5138   {
5139     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MD2_CFG,
5140                             (uint8_t *)&val->md2_cfg, 1);
5141   }
5142 
5143   return ret;
5144 }
5145 
5146 /**
5147   * @brief  Push-pull/open drain selection on interrupt pads.[set]
5148   *
5149   * @param  ctx    Read / write interface definitions.(ptr)
5150   * @param  val    Change the values of pp_od in reg CTRL3_C
5151   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5152   *
5153   */
lsm6dsrx_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_pp_od_t val)5154 int32_t lsm6dsrx_pin_mode_set(const stmdev_ctx_t *ctx,
5155                               lsm6dsrx_pp_od_t val)
5156 {
5157   lsm6dsrx_ctrl3_c_t ctrl3_c;
5158   int32_t ret;
5159 
5160   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
5161                           (uint8_t *)&ctrl3_c, 1);
5162 
5163   if (ret == 0)
5164   {
5165     ctrl3_c.pp_od = (uint8_t)val;
5166     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
5167                              (uint8_t *)&ctrl3_c, 1);
5168   }
5169 
5170   return ret;
5171 }
5172 
5173 /**
5174   * @brief  Push-pull/open drain selection on interrupt pads.[get]
5175   *
5176   * @param  ctx    Read / write interface definitions.(ptr)
5177   * @param  val    Get the values of pp_od in reg CTRL3_C
5178   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5179   *
5180   */
lsm6dsrx_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_pp_od_t * val)5181 int32_t lsm6dsrx_pin_mode_get(const stmdev_ctx_t *ctx,
5182                               lsm6dsrx_pp_od_t *val)
5183 {
5184   lsm6dsrx_ctrl3_c_t ctrl3_c;
5185   int32_t ret;
5186 
5187   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
5188                           (uint8_t *)&ctrl3_c, 1);
5189 
5190   switch (ctrl3_c.pp_od)
5191   {
5192     case LSM6DSRX_PUSH_PULL:
5193       *val = LSM6DSRX_PUSH_PULL;
5194       break;
5195 
5196     case LSM6DSRX_OPEN_DRAIN:
5197       *val = LSM6DSRX_OPEN_DRAIN;
5198       break;
5199 
5200     default:
5201       *val = LSM6DSRX_PUSH_PULL;
5202       break;
5203   }
5204 
5205   return ret;
5206 }
5207 
5208 /**
5209   * @brief  Interrupt active-high/low.[set]
5210   *
5211   * @param  ctx    Read / write interface definitions.(ptr)
5212   * @param  val    Change the values of h_lactive in reg CTRL3_C
5213   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5214   *
5215   */
lsm6dsrx_pin_polarity_set(const stmdev_ctx_t * ctx,lsm6dsrx_h_lactive_t val)5216 int32_t lsm6dsrx_pin_polarity_set(const stmdev_ctx_t *ctx,
5217                                   lsm6dsrx_h_lactive_t val)
5218 {
5219   lsm6dsrx_ctrl3_c_t ctrl3_c;
5220   int32_t ret;
5221 
5222   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
5223                           (uint8_t *)&ctrl3_c, 1);
5224 
5225   if (ret == 0)
5226   {
5227     ctrl3_c.h_lactive = (uint8_t)val;
5228     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL3_C,
5229                              (uint8_t *)&ctrl3_c, 1);
5230   }
5231 
5232   return ret;
5233 }
5234 
5235 /**
5236   * @brief  Interrupt active-high/low.[get]
5237   *
5238   * @param  ctx    Read / write interface definitions.(ptr)
5239   * @param  val    Get the values of h_lactive in reg CTRL3_C
5240   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5241   *
5242   */
lsm6dsrx_pin_polarity_get(const stmdev_ctx_t * ctx,lsm6dsrx_h_lactive_t * val)5243 int32_t lsm6dsrx_pin_polarity_get(const stmdev_ctx_t *ctx,
5244                                   lsm6dsrx_h_lactive_t *val)
5245 {
5246   lsm6dsrx_ctrl3_c_t ctrl3_c;
5247   int32_t ret;
5248 
5249   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL3_C,
5250                           (uint8_t *)&ctrl3_c, 1);
5251 
5252   switch (ctrl3_c.h_lactive)
5253   {
5254     case LSM6DSRX_ACTIVE_HIGH:
5255       *val = LSM6DSRX_ACTIVE_HIGH;
5256       break;
5257 
5258     case LSM6DSRX_ACTIVE_LOW:
5259       *val = LSM6DSRX_ACTIVE_LOW;
5260       break;
5261 
5262     default:
5263       *val = LSM6DSRX_ACTIVE_HIGH;
5264       break;
5265   }
5266 
5267   return ret;
5268 }
5269 
5270 /**
5271   * @brief  All interrupt signals become available on INT1 pin.[set]
5272   *
5273   * @param  ctx    Read / write interface definitions.(ptr)
5274   * @param  val    Change the values of int2_on_int1 in reg CTRL4_C
5275   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5276   *
5277   */
lsm6dsrx_all_on_int1_set(const stmdev_ctx_t * ctx,uint8_t val)5278 int32_t lsm6dsrx_all_on_int1_set(const stmdev_ctx_t *ctx, uint8_t val)
5279 {
5280   lsm6dsrx_ctrl4_c_t ctrl4_c;
5281   int32_t ret;
5282 
5283   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
5284                           (uint8_t *)&ctrl4_c, 1);
5285 
5286   if (ret == 0)
5287   {
5288     ctrl4_c.int2_on_int1 = (uint8_t)val;
5289     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL4_C,
5290                              (uint8_t *)&ctrl4_c, 1);
5291   }
5292 
5293   return ret;
5294 }
5295 
5296 /**
5297   * @brief  All interrupt signals become available on INT1 pin.[get]
5298   *
5299   * @param  ctx    Read / write interface definitions.(ptr)
5300   * @param  val    Change the values of int2_on_int1 in reg CTRL4_C
5301   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5302   *
5303   */
lsm6dsrx_all_on_int1_get(const stmdev_ctx_t * ctx,uint8_t * val)5304 int32_t lsm6dsrx_all_on_int1_get(const stmdev_ctx_t *ctx, uint8_t *val)
5305 {
5306   lsm6dsrx_ctrl4_c_t ctrl4_c;
5307   int32_t ret;
5308 
5309   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
5310                           (uint8_t *)&ctrl4_c, 1);
5311   *val = ctrl4_c.int2_on_int1;
5312 
5313   return ret;
5314 }
5315 
5316 /**
5317   * @brief  All interrupt signals notification mode.[set]
5318   *
5319   * @param  ctx    Read / write interface definitions.(ptr)
5320   * @param  val    Change the values of lir in reg TAP_CFG0
5321   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5322   *
5323   */
lsm6dsrx_int_notification_set(const stmdev_ctx_t * ctx,lsm6dsrx_lir_t val)5324 int32_t lsm6dsrx_int_notification_set(const stmdev_ctx_t *ctx,
5325                                       lsm6dsrx_lir_t val)
5326 {
5327   lsm6dsrx_tap_cfg0_t tap_cfg0;
5328   lsm6dsrx_page_rw_t page_rw;
5329   int32_t ret;
5330 
5331   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5332                           (uint8_t *)&tap_cfg0, 1);
5333 
5334   if (ret == 0)
5335   {
5336     tap_cfg0.lir = (uint8_t)val & 0x01U;
5337     tap_cfg0.int_clr_on_read = (uint8_t)val & 0x01U;
5338     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
5339                              (uint8_t *)&tap_cfg0, 1);
5340   }
5341 
5342   if (ret == 0)
5343   {
5344     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
5345   }
5346 
5347   if (ret == 0)
5348   {
5349     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
5350                             (uint8_t *)&page_rw, 1);
5351   }
5352 
5353   if (ret == 0)
5354   {
5355     page_rw.emb_func_lir = ((uint8_t)val & 0x02U) >> 1;
5356     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_PAGE_RW,
5357                              (uint8_t *)&page_rw, 1);
5358   }
5359 
5360   if (ret == 0)
5361   {
5362     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
5363   }
5364 
5365   return ret;
5366 }
5367 
5368 /**
5369   * @brief  All interrupt signals notification mode.[get]
5370   *
5371   * @param  ctx    Read / write interface definitions.(ptr)
5372   * @param  val    Get the values of lir in reg TAP_CFG0
5373   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5374   *
5375   */
lsm6dsrx_int_notification_get(const stmdev_ctx_t * ctx,lsm6dsrx_lir_t * val)5376 int32_t lsm6dsrx_int_notification_get(const stmdev_ctx_t *ctx,
5377                                       lsm6dsrx_lir_t *val)
5378 {
5379   lsm6dsrx_tap_cfg0_t tap_cfg0;
5380   lsm6dsrx_page_rw_t page_rw;
5381   int32_t ret;
5382 
5383   *val = LSM6DSRX_ALL_INT_PULSED;
5384   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5385                           (uint8_t *)&tap_cfg0, 1);
5386 
5387   if (ret == 0)
5388   {
5389     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
5390   }
5391 
5392   if (ret == 0)
5393   {
5394     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_PAGE_RW,
5395                             (uint8_t *)&page_rw, 1);
5396   }
5397 
5398   if (ret == 0)
5399   {
5400     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
5401   }
5402 
5403   switch ((page_rw.emb_func_lir << 1) + tap_cfg0.lir)
5404   {
5405     case LSM6DSRX_ALL_INT_PULSED:
5406       *val = LSM6DSRX_ALL_INT_PULSED;
5407       break;
5408 
5409     case LSM6DSRX_BASE_LATCHED_EMB_PULSED:
5410       *val = LSM6DSRX_BASE_LATCHED_EMB_PULSED;
5411       break;
5412 
5413     case LSM6DSRX_BASE_PULSED_EMB_LATCHED:
5414       *val = LSM6DSRX_BASE_PULSED_EMB_LATCHED;
5415       break;
5416 
5417     case LSM6DSRX_ALL_INT_LATCHED:
5418       *val = LSM6DSRX_ALL_INT_LATCHED;
5419       break;
5420 
5421     default:
5422       *val = LSM6DSRX_ALL_INT_PULSED;
5423       break;
5424   }
5425 
5426   return ret;
5427 }
5428 
5429 /**
5430   * @}
5431   *
5432   */
5433 
5434 /**
5435   * @defgroup   LSM6DSRX_Wake_Up_event
5436   * @brief      This section groups all the functions that manage the
5437   *             Wake Up event generation.
5438   * @{
5439   *
5440   */
5441 
5442 /**
5443   * @brief  Weight of 1 LSB of wakeup threshold.[set]
5444   *         0: 1 LSB =FS_XL  /  64
5445   *         1: 1 LSB = FS_XL / 256
5446   *
5447   * @param  ctx    Read / write interface definitions.(ptr)
5448   * @param  val    Change the values of wake_ths_w in reg WAKE_UP_DUR
5449   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5450   *
5451   */
lsm6dsrx_wkup_ths_weight_set(const stmdev_ctx_t * ctx,lsm6dsrx_wake_ths_w_t val)5452 int32_t lsm6dsrx_wkup_ths_weight_set(const stmdev_ctx_t *ctx,
5453                                      lsm6dsrx_wake_ths_w_t val)
5454 {
5455   lsm6dsrx_wake_up_dur_t wake_up_dur;
5456   int32_t ret;
5457 
5458   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5459                           (uint8_t *)&wake_up_dur, 1);
5460 
5461   if (ret == 0)
5462   {
5463     wake_up_dur.wake_ths_w = (uint8_t)val;
5464     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5465                              (uint8_t *)&wake_up_dur, 1);
5466   }
5467 
5468   return ret;
5469 }
5470 
5471 /**
5472   * @brief  Weight of 1 LSB of wakeup threshold.[get]
5473   *         0: 1 LSB =FS_XL  /  64
5474   *         1: 1 LSB = FS_XL / 256
5475   *
5476   * @param  ctx    Read / write interface definitions.(ptr)
5477   * @param  val    Get the values of wake_ths_w in reg WAKE_UP_DUR
5478   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5479   *
5480   */
lsm6dsrx_wkup_ths_weight_get(const stmdev_ctx_t * ctx,lsm6dsrx_wake_ths_w_t * val)5481 int32_t lsm6dsrx_wkup_ths_weight_get(const stmdev_ctx_t *ctx,
5482                                      lsm6dsrx_wake_ths_w_t *val)
5483 {
5484   lsm6dsrx_wake_up_dur_t wake_up_dur;
5485   int32_t ret;
5486 
5487   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5488                           (uint8_t *)&wake_up_dur, 1);
5489 
5490   switch (wake_up_dur.wake_ths_w)
5491   {
5492     case LSM6DSRX_LSb_FS_DIV_64:
5493       *val = LSM6DSRX_LSb_FS_DIV_64;
5494       break;
5495 
5496     case LSM6DSRX_LSb_FS_DIV_256:
5497       *val = LSM6DSRX_LSb_FS_DIV_256;
5498       break;
5499 
5500     default:
5501       *val = LSM6DSRX_LSb_FS_DIV_64;
5502       break;
5503   }
5504 
5505   return ret;
5506 }
5507 
5508 /**
5509   * @brief  Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
5510   *         WAKE_UP_DUR.[set]
5511   *
5512   * @param  ctx    Read / write interface definitions.(ptr)
5513   * @param  val    Change the values of wk_ths in reg WAKE_UP_THS
5514   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5515   *
5516   */
lsm6dsrx_wkup_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)5517 int32_t lsm6dsrx_wkup_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
5518 {
5519   lsm6dsrx_wake_up_ths_t wake_up_ths;
5520   int32_t ret;
5521 
5522   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5523                           (uint8_t *)&wake_up_ths, 1);
5524 
5525   if (ret == 0)
5526   {
5527     wake_up_ths.wk_ths = (uint8_t)val;
5528     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5529                              (uint8_t *)&wake_up_ths, 1);
5530   }
5531 
5532   return ret;
5533 }
5534 
5535 /**
5536   * @brief  Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
5537   *         WAKE_UP_DUR.[get]
5538   *
5539   * @param  ctx    Read / write interface definitions.(ptr)
5540   * @param  val    Change the values of wk_ths in reg WAKE_UP_THS
5541   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5542   *
5543   */
lsm6dsrx_wkup_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)5544 int32_t lsm6dsrx_wkup_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
5545 {
5546   lsm6dsrx_wake_up_ths_t wake_up_ths;
5547   int32_t ret;
5548 
5549   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5550                           (uint8_t *)&wake_up_ths, 1);
5551   *val = wake_up_ths.wk_ths;
5552 
5553   return ret;
5554 }
5555 
5556 /**
5557   * @brief  Wake up duration event( 1LSb = 1 / ODR ).[set]
5558   *
5559   * @param  ctx    Read / write interface definitions.(ptr)
5560   * @param  val    Change the values of usr_off_on_wu in reg WAKE_UP_THS
5561   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5562   *
5563   */
lsm6dsrx_xl_usr_offset_on_wkup_set(const stmdev_ctx_t * ctx,uint8_t val)5564 int32_t lsm6dsrx_xl_usr_offset_on_wkup_set(const stmdev_ctx_t *ctx,
5565                                            uint8_t val)
5566 {
5567   lsm6dsrx_wake_up_ths_t wake_up_ths;
5568   int32_t ret;
5569 
5570   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5571                           (uint8_t *)&wake_up_ths, 1);
5572 
5573   if (ret == 0)
5574   {
5575     wake_up_ths.usr_off_on_wu = (uint8_t)val;
5576     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5577                              (uint8_t *)&wake_up_ths, 1);
5578   }
5579 
5580   return ret;
5581 }
5582 
5583 /**
5584   * @brief  Wake up duration event( 1LSb = 1 / ODR ).[get]
5585   *
5586   * @param  ctx    Read / write interface definitions.(ptr)
5587   * @param  val    Change the values of usr_off_on_wu in reg WAKE_UP_THS
5588   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5589   *
5590   */
lsm6dsrx_xl_usr_offset_on_wkup_get(const stmdev_ctx_t * ctx,uint8_t * val)5591 int32_t lsm6dsrx_xl_usr_offset_on_wkup_get(const stmdev_ctx_t *ctx,
5592                                            uint8_t *val)
5593 {
5594   lsm6dsrx_wake_up_ths_t wake_up_ths;
5595   int32_t ret;
5596 
5597   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
5598                           (uint8_t *)&wake_up_ths, 1);
5599   *val = wake_up_ths.usr_off_on_wu;
5600 
5601   return ret;
5602 }
5603 
5604 /**
5605   * @brief  Wake up duration event(1LSb = 1 / ODR).[set]
5606   *
5607   * @param  ctx    Read / write interface definitions.(ptr)
5608   * @param  val    Change the values of wake_dur in reg WAKE_UP_DUR
5609   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5610   *
5611   */
lsm6dsrx_wkup_dur_set(const stmdev_ctx_t * ctx,uint8_t val)5612 int32_t lsm6dsrx_wkup_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
5613 {
5614   lsm6dsrx_wake_up_dur_t wake_up_dur;
5615   int32_t ret;
5616 
5617   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5618                           (uint8_t *)&wake_up_dur, 1);
5619 
5620   if (ret == 0)
5621   {
5622     wake_up_dur.wake_dur = (uint8_t)val;
5623     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5624                              (uint8_t *)&wake_up_dur, 1);
5625   }
5626 
5627   return ret;
5628 }
5629 
5630 /**
5631   * @brief  Wake up duration event(1LSb = 1 / ODR).[get]
5632   *
5633   * @param  ctx    Read / write interface definitions.(ptr)
5634   * @param  val    Change the values of wake_dur in reg WAKE_UP_DUR
5635   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5636   *
5637   */
lsm6dsrx_wkup_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)5638 int32_t lsm6dsrx_wkup_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
5639 {
5640   lsm6dsrx_wake_up_dur_t wake_up_dur;
5641   int32_t ret;
5642 
5643   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5644                           (uint8_t *)&wake_up_dur, 1);
5645   *val = wake_up_dur.wake_dur;
5646 
5647   return ret;
5648 }
5649 
5650 /**
5651   * @}
5652   *
5653   */
5654 
5655 /**
5656   * @defgroup   LSM6DSRX_ Activity/Inactivity_detection
5657   * @brief      This section groups all the functions concerning
5658   *             activity/inactivity detection.
5659   * @{
5660   *
5661   */
5662 
5663 /**
5664   * @brief  Enables gyroscope Sleep mode.[set]
5665   *
5666   * @param  ctx    Read / write interface definitions.(ptr)
5667   * @param  val    Change the values of sleep_g in reg CTRL4_C
5668   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5669   *
5670   */
lsm6dsrx_gy_sleep_mode_set(const stmdev_ctx_t * ctx,uint8_t val)5671 int32_t lsm6dsrx_gy_sleep_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
5672 {
5673   lsm6dsrx_ctrl4_c_t ctrl4_c;
5674   int32_t ret;
5675 
5676   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
5677                           (uint8_t *)&ctrl4_c, 1);
5678 
5679   if (ret == 0)
5680   {
5681     ctrl4_c.sleep_g = (uint8_t)val;
5682     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL4_C,
5683                              (uint8_t *)&ctrl4_c, 1);
5684   }
5685 
5686   return ret;
5687 }
5688 
5689 /**
5690   * @brief  Enables gyroscope Sleep mode.[get]
5691   *
5692   * @param  ctx    Read / write interface definitions.(ptr)
5693   * @param  val    Change the values of sleep_g in reg CTRL4_C
5694   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5695   *
5696   */
lsm6dsrx_gy_sleep_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)5697 int32_t lsm6dsrx_gy_sleep_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
5698 {
5699   lsm6dsrx_ctrl4_c_t ctrl4_c;
5700   int32_t ret;
5701 
5702   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL4_C,
5703                           (uint8_t *)&ctrl4_c, 1);
5704   *val = ctrl4_c.sleep_g;
5705 
5706   return ret;
5707 }
5708 
5709 /**
5710   * @brief  Drives the sleep status instead of sleep change on INT pins
5711   *         (only if INT1_SLEEP_CHANGE or INT2_SLEEP_CHANGE bits
5712   *         are enabled).[set]
5713   *
5714   * @param  ctx    Read / write interface definitions.(ptr)
5715   * @param  val    Change the values of sleep_status_on_int in reg TAP_CFG0
5716   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5717   *
5718   */
lsm6dsrx_act_pin_notification_set(const stmdev_ctx_t * ctx,lsm6dsrx_sleep_status_on_int_t val)5719 int32_t lsm6dsrx_act_pin_notification_set(const stmdev_ctx_t *ctx,
5720                                           lsm6dsrx_sleep_status_on_int_t val)
5721 {
5722   lsm6dsrx_tap_cfg0_t tap_cfg0;
5723   int32_t ret;
5724 
5725   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5726                           (uint8_t *)&tap_cfg0, 1);
5727 
5728   if (ret == 0)
5729   {
5730     tap_cfg0. sleep_status_on_int = (uint8_t)val;
5731     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
5732                              (uint8_t *)&tap_cfg0, 1);
5733   }
5734 
5735   return ret;
5736 }
5737 
5738 /**
5739   * @brief  Drives the sleep status instead of sleep change on INT pins
5740   *         (only if INT1_SLEEP_CHANGE or INT2_SLEEP_CHANGE bits
5741   *         are enabled).[get]
5742   *
5743   * @param  ctx    Read / write interface definitions.(ptr)
5744   * @param  val    Get the values of sleep_status_on_int in reg TAP_CFG0
5745   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5746   *
5747   */
lsm6dsrx_act_pin_notification_get(const stmdev_ctx_t * ctx,lsm6dsrx_sleep_status_on_int_t * val)5748 int32_t lsm6dsrx_act_pin_notification_get(const stmdev_ctx_t *ctx,
5749                                           lsm6dsrx_sleep_status_on_int_t *val)
5750 {
5751   lsm6dsrx_tap_cfg0_t tap_cfg0;
5752   int32_t ret;
5753 
5754   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5755                           (uint8_t *)&tap_cfg0, 1);
5756 
5757   switch (tap_cfg0. sleep_status_on_int)
5758   {
5759     case LSM6DSRX_DRIVE_SLEEP_CHG_EVENT:
5760       *val = LSM6DSRX_DRIVE_SLEEP_CHG_EVENT;
5761       break;
5762 
5763     case LSM6DSRX_DRIVE_SLEEP_STATUS:
5764       *val = LSM6DSRX_DRIVE_SLEEP_STATUS;
5765       break;
5766 
5767     default:
5768       *val = LSM6DSRX_DRIVE_SLEEP_CHG_EVENT;
5769       break;
5770   }
5771 
5772   return ret;
5773 }
5774 
5775 /**
5776   * @brief  Enable inactivity function.[set]
5777   *
5778   * @param  ctx    Read / write interface definitions.(ptr)
5779   * @param  val    Change the values of inact_en in reg TAP_CFG2
5780   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5781   *
5782   */
lsm6dsrx_act_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_inact_en_t val)5783 int32_t lsm6dsrx_act_mode_set(const stmdev_ctx_t *ctx,
5784                               lsm6dsrx_inact_en_t val)
5785 {
5786   lsm6dsrx_tap_cfg2_t tap_cfg2;
5787   int32_t ret;
5788 
5789   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
5790                           (uint8_t *)&tap_cfg2, 1);
5791 
5792   if (ret == 0)
5793   {
5794     tap_cfg2.inact_en = (uint8_t)val;
5795     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG2,
5796                              (uint8_t *)&tap_cfg2, 1);
5797   }
5798 
5799   return ret;
5800 }
5801 
5802 /**
5803   * @brief  Enable inactivity function.[get]
5804   *
5805   * @param  ctx    Read / write interface definitions.(ptr)
5806   * @param  val    Get the values of inact_en in reg TAP_CFG2
5807   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5808   *
5809   */
lsm6dsrx_act_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_inact_en_t * val)5810 int32_t lsm6dsrx_act_mode_get(const stmdev_ctx_t *ctx,
5811                               lsm6dsrx_inact_en_t *val)
5812 {
5813   lsm6dsrx_tap_cfg2_t tap_cfg2;
5814   int32_t ret;
5815 
5816   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
5817                           (uint8_t *)&tap_cfg2, 1);
5818 
5819   switch (tap_cfg2.inact_en)
5820   {
5821     case LSM6DSRX_XL_AND_GY_NOT_AFFECTED:
5822       *val = LSM6DSRX_XL_AND_GY_NOT_AFFECTED;
5823       break;
5824 
5825     case LSM6DSRX_XL_12Hz5_GY_NOT_AFFECTED:
5826       *val = LSM6DSRX_XL_12Hz5_GY_NOT_AFFECTED;
5827       break;
5828 
5829     case LSM6DSRX_XL_12Hz5_GY_SLEEP:
5830       *val = LSM6DSRX_XL_12Hz5_GY_SLEEP;
5831       break;
5832 
5833     case LSM6DSRX_XL_12Hz5_GY_PD:
5834       *val = LSM6DSRX_XL_12Hz5_GY_PD;
5835       break;
5836 
5837     default:
5838       *val = LSM6DSRX_XL_AND_GY_NOT_AFFECTED;
5839       break;
5840   }
5841 
5842   return ret;
5843 }
5844 
5845 /**
5846   * @brief  Duration to go in sleep mode (1 LSb = 512 / ODR).[set]
5847   *
5848   * @param  ctx    Read / write interface definitions.(ptr)
5849   * @param  val    Change the values of sleep_dur in reg WAKE_UP_DUR
5850   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5851   *
5852   */
lsm6dsrx_act_sleep_dur_set(const stmdev_ctx_t * ctx,uint8_t val)5853 int32_t lsm6dsrx_act_sleep_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
5854 {
5855   lsm6dsrx_wake_up_dur_t wake_up_dur;
5856   int32_t ret;
5857 
5858   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5859                           (uint8_t *)&wake_up_dur, 1);
5860 
5861   if (ret == 0)
5862   {
5863     wake_up_dur.sleep_dur = (uint8_t)val;
5864     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5865                              (uint8_t *)&wake_up_dur, 1);
5866   }
5867 
5868   return ret;
5869 }
5870 
5871 /**
5872   * @brief  Duration to go in sleep mode.(1 LSb = 512 / ODR).[get]
5873   *
5874   * @param  ctx    Read / write interface definitions.(ptr)
5875   * @param  val    Change the values of sleep_dur in reg WAKE_UP_DUR
5876   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5877   *
5878   */
lsm6dsrx_act_sleep_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)5879 int32_t lsm6dsrx_act_sleep_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
5880 {
5881   lsm6dsrx_wake_up_dur_t wake_up_dur;
5882   int32_t ret;
5883 
5884   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
5885                           (uint8_t *)&wake_up_dur, 1);
5886   *val = wake_up_dur.sleep_dur;
5887 
5888   return ret;
5889 }
5890 
5891 /**
5892   * @}
5893   *
5894   */
5895 
5896 /**
5897   * @defgroup   LSM6DSRX_tap_generator
5898   * @brief      This section groups all the functions that manage the
5899   *             tap and double tap event generation.
5900   * @{
5901   *
5902   */
5903 
5904 /**
5905   * @brief  Enable Z direction in tap recognition.[set]
5906   *
5907   * @param  ctx    Read / write interface definitions.(ptr)
5908   * @param  val    Change the values of tap_z_en in reg TAP_CFG0
5909   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5910   *
5911   */
lsm6dsrx_tap_detection_on_z_set(const stmdev_ctx_t * ctx,uint8_t val)5912 int32_t lsm6dsrx_tap_detection_on_z_set(const stmdev_ctx_t *ctx,
5913                                         uint8_t val)
5914 {
5915   lsm6dsrx_tap_cfg0_t tap_cfg0;
5916   int32_t ret;
5917 
5918   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5919                           (uint8_t *)&tap_cfg0, 1);
5920 
5921   if (ret == 0)
5922   {
5923     tap_cfg0.tap_z_en = (uint8_t)val;
5924     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
5925                              (uint8_t *)&tap_cfg0, 1);
5926   }
5927 
5928   return ret;
5929 }
5930 
5931 /**
5932   * @brief  Enable Z direction in tap recognition.[get]
5933   *
5934   * @param  ctx    Read / write interface definitions.(ptr)
5935   * @param  val    Change the values of tap_z_en in reg TAP_CFG0
5936   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5937   *
5938   */
lsm6dsrx_tap_detection_on_z_get(const stmdev_ctx_t * ctx,uint8_t * val)5939 int32_t lsm6dsrx_tap_detection_on_z_get(const stmdev_ctx_t *ctx,
5940                                         uint8_t *val)
5941 {
5942   lsm6dsrx_tap_cfg0_t tap_cfg0;
5943   int32_t ret;
5944 
5945   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5946                           (uint8_t *)&tap_cfg0, 1);
5947   *val = tap_cfg0.tap_z_en;
5948 
5949   return ret;
5950 }
5951 
5952 /**
5953   * @brief  Enable Y direction in tap recognition.[set]
5954   *
5955   * @param  ctx    Read / write interface definitions.(ptr)
5956   * @param  val    Change the values of tap_y_en in reg TAP_CFG0
5957   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5958   *
5959   */
lsm6dsrx_tap_detection_on_y_set(const stmdev_ctx_t * ctx,uint8_t val)5960 int32_t lsm6dsrx_tap_detection_on_y_set(const stmdev_ctx_t *ctx,
5961                                         uint8_t val)
5962 {
5963   lsm6dsrx_tap_cfg0_t tap_cfg0;
5964   int32_t ret;
5965 
5966   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5967                           (uint8_t *)&tap_cfg0, 1);
5968 
5969   if (ret == 0)
5970   {
5971     tap_cfg0.tap_y_en = (uint8_t)val;
5972     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
5973                              (uint8_t *)&tap_cfg0, 1);
5974   }
5975 
5976   return ret;
5977 }
5978 
5979 /**
5980   * @brief  Enable Y direction in tap recognition.[get]
5981   *
5982   * @param  ctx    Read / write interface definitions.(ptr)
5983   * @param  val    Change the values of tap_y_en in reg TAP_CFG0
5984   * @retval        Interface status (MANDATORY: return 0 -> no Error).
5985   *
5986   */
lsm6dsrx_tap_detection_on_y_get(const stmdev_ctx_t * ctx,uint8_t * val)5987 int32_t lsm6dsrx_tap_detection_on_y_get(const stmdev_ctx_t *ctx,
5988                                         uint8_t *val)
5989 {
5990   lsm6dsrx_tap_cfg0_t tap_cfg0;
5991   int32_t ret;
5992 
5993   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
5994                           (uint8_t *)&tap_cfg0, 1);
5995   *val = tap_cfg0.tap_y_en;
5996 
5997   return ret;
5998 }
5999 
6000 /**
6001   * @brief  Enable X direction in tap recognition.[set]
6002   *
6003   * @param  ctx    Read / write interface definitions.(ptr)
6004   * @param  val    Change the values of tap_x_en in reg TAP_CFG0
6005   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6006   *
6007   */
lsm6dsrx_tap_detection_on_x_set(const stmdev_ctx_t * ctx,uint8_t val)6008 int32_t lsm6dsrx_tap_detection_on_x_set(const stmdev_ctx_t *ctx,
6009                                         uint8_t val)
6010 {
6011   lsm6dsrx_tap_cfg0_t tap_cfg0;
6012   int32_t ret;
6013 
6014   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
6015                           (uint8_t *)&tap_cfg0, 1);
6016 
6017   if (ret == 0)
6018   {
6019     tap_cfg0.tap_x_en = (uint8_t)val;
6020     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG0,
6021                              (uint8_t *)&tap_cfg0, 1);
6022   }
6023 
6024   return ret;
6025 }
6026 
6027 /**
6028   * @brief  Enable X direction in tap recognition.[get]
6029   *
6030   * @param  ctx    Read / write interface definitions.(ptr)
6031   * @param  val    Change the values of tap_x_en in reg TAP_CFG0
6032   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6033   *
6034   */
lsm6dsrx_tap_detection_on_x_get(const stmdev_ctx_t * ctx,uint8_t * val)6035 int32_t lsm6dsrx_tap_detection_on_x_get(const stmdev_ctx_t *ctx,
6036                                         uint8_t *val)
6037 {
6038   lsm6dsrx_tap_cfg0_t tap_cfg0;
6039   int32_t ret;
6040 
6041   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG0,
6042                           (uint8_t *)&tap_cfg0, 1);
6043   *val = tap_cfg0.tap_x_en;
6044 
6045   return ret;
6046 }
6047 
6048 /**
6049   * @brief  X-axis tap recognition threshold.[set]
6050   *
6051   * @param  ctx    Read / write interface definitions.(ptr)
6052   * @param  val    Change the values of tap_ths_x in reg TAP_CFG1
6053   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6054   *
6055   */
lsm6dsrx_tap_threshold_x_set(const stmdev_ctx_t * ctx,uint8_t val)6056 int32_t lsm6dsrx_tap_threshold_x_set(const stmdev_ctx_t *ctx, uint8_t val)
6057 {
6058   lsm6dsrx_tap_cfg1_t tap_cfg1;
6059   int32_t ret;
6060 
6061   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG1,
6062                           (uint8_t *)&tap_cfg1, 1);
6063 
6064   if (ret == 0)
6065   {
6066     tap_cfg1.tap_ths_x = (uint8_t)val;
6067     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG1,
6068                              (uint8_t *)&tap_cfg1, 1);
6069   }
6070 
6071   return ret;
6072 }
6073 
6074 /**
6075   * @brief  X-axis tap recognition threshold.[get]
6076   *
6077   * @param  ctx    Read / write interface definitions.(ptr)
6078   * @param  val    Change the values of tap_ths_x in reg TAP_CFG1
6079   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6080   *
6081   */
lsm6dsrx_tap_threshold_x_get(const stmdev_ctx_t * ctx,uint8_t * val)6082 int32_t lsm6dsrx_tap_threshold_x_get(const stmdev_ctx_t *ctx,
6083                                      uint8_t *val)
6084 {
6085   lsm6dsrx_tap_cfg1_t tap_cfg1;
6086   int32_t ret;
6087 
6088   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG1,
6089                           (uint8_t *)&tap_cfg1, 1);
6090   *val = tap_cfg1.tap_ths_x;
6091 
6092   return ret;
6093 }
6094 
6095 /**
6096   * @brief  Selection of axis priority for TAP detection.[set]
6097   *
6098   * @param  ctx    Read / write interface definitions.(ptr)
6099   * @param  val    Change the values of tap_priority in reg TAP_CFG1
6100   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6101   *
6102   */
lsm6dsrx_tap_axis_priority_set(const stmdev_ctx_t * ctx,lsm6dsrx_tap_priority_t val)6103 int32_t lsm6dsrx_tap_axis_priority_set(const stmdev_ctx_t *ctx,
6104                                        lsm6dsrx_tap_priority_t val)
6105 {
6106   lsm6dsrx_tap_cfg1_t tap_cfg1;
6107   int32_t ret;
6108 
6109   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG1,
6110                           (uint8_t *)&tap_cfg1, 1);
6111 
6112   if (ret == 0)
6113   {
6114     tap_cfg1.tap_priority = (uint8_t)val;
6115     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG1,
6116                              (uint8_t *)&tap_cfg1, 1);
6117   }
6118 
6119   return ret;
6120 }
6121 
6122 /**
6123   * @brief  Selection of axis priority for TAP detection[get]
6124   *
6125   * @param  ctx    Read / write interface definitions.(ptr)
6126   * @param  val    Get the values of tap_priority in reg TAP_CFG1
6127   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6128   *
6129   */
lsm6dsrx_tap_axis_priority_get(const stmdev_ctx_t * ctx,lsm6dsrx_tap_priority_t * val)6130 int32_t lsm6dsrx_tap_axis_priority_get(const stmdev_ctx_t *ctx,
6131                                        lsm6dsrx_tap_priority_t *val)
6132 {
6133   lsm6dsrx_tap_cfg1_t tap_cfg1;
6134   int32_t ret;
6135 
6136   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG1,
6137                           (uint8_t *)&tap_cfg1, 1);
6138 
6139   switch (tap_cfg1.tap_priority)
6140   {
6141     case LSM6DSRX_XYZ:
6142       *val = LSM6DSRX_XYZ;
6143       break;
6144 
6145     case LSM6DSRX_YXZ:
6146       *val = LSM6DSRX_YXZ;
6147       break;
6148 
6149     case LSM6DSRX_XZY:
6150       *val = LSM6DSRX_XZY;
6151       break;
6152 
6153     case LSM6DSRX_ZYX:
6154       *val = LSM6DSRX_ZYX;
6155       break;
6156 
6157     case LSM6DSRX_YZX:
6158       *val = LSM6DSRX_YZX;
6159       break;
6160 
6161     case LSM6DSRX_ZXY:
6162       *val = LSM6DSRX_ZXY;
6163       break;
6164 
6165     default:
6166       *val = LSM6DSRX_XYZ;
6167       break;
6168   }
6169 
6170   return ret;
6171 }
6172 
6173 /**
6174   * @brief  Y-axis tap recognition threshold.[set]
6175   *
6176   * @param  ctx    Read / write interface definitions.(ptr)
6177   * @param  val    Change the values of tap_ths_y in reg TAP_CFG2
6178   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6179   *
6180   */
lsm6dsrx_tap_threshold_y_set(const stmdev_ctx_t * ctx,uint8_t val)6181 int32_t lsm6dsrx_tap_threshold_y_set(const stmdev_ctx_t *ctx, uint8_t val)
6182 {
6183   lsm6dsrx_tap_cfg2_t tap_cfg2;
6184   int32_t ret;
6185 
6186   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
6187                           (uint8_t *)&tap_cfg2, 1);
6188 
6189   if (ret == 0)
6190   {
6191     tap_cfg2.tap_ths_y = (uint8_t)val;
6192     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_CFG2,
6193                              (uint8_t *)&tap_cfg2, 1);
6194   }
6195 
6196   return ret;
6197 }
6198 
6199 /**
6200   * @brief  Y-axis tap recognition threshold.[get]
6201   *
6202   * @param  ctx    Read / write interface definitions.(ptr)
6203   * @param  val    Change the values of tap_ths_y in reg TAP_CFG2
6204   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6205   *
6206   */
lsm6dsrx_tap_threshold_y_get(const stmdev_ctx_t * ctx,uint8_t * val)6207 int32_t lsm6dsrx_tap_threshold_y_get(const stmdev_ctx_t *ctx,
6208                                      uint8_t *val)
6209 {
6210   lsm6dsrx_tap_cfg2_t tap_cfg2;
6211   int32_t ret;
6212 
6213   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_CFG2,
6214                           (uint8_t *)&tap_cfg2, 1);
6215   *val = tap_cfg2.tap_ths_y;
6216 
6217   return ret;
6218 }
6219 
6220 /**
6221   * @brief  Z-axis recognition threshold.[set]
6222   *
6223   * @param  ctx    Read / write interface definitions.(ptr)
6224   * @param  val    Change the values of tap_ths_z in reg TAP_THS_6D
6225   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6226   *
6227   */
lsm6dsrx_tap_threshold_z_set(const stmdev_ctx_t * ctx,uint8_t val)6228 int32_t lsm6dsrx_tap_threshold_z_set(const stmdev_ctx_t *ctx, uint8_t val)
6229 {
6230   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6231   int32_t ret;
6232 
6233   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6234                           (uint8_t *)&tap_ths_6d, 1);
6235 
6236   if (ret == 0)
6237   {
6238     tap_ths_6d.tap_ths_z = (uint8_t)val;
6239     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_THS_6D,
6240                              (uint8_t *)&tap_ths_6d, 1);
6241   }
6242 
6243   return ret;
6244 }
6245 
6246 /**
6247   * @brief  Z-axis recognition threshold.[get]
6248   *
6249   * @param  ctx    Read / write interface definitions.(ptr)
6250   * @param  val    Change the values of tap_ths_z in reg TAP_THS_6D
6251   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6252   *
6253   */
lsm6dsrx_tap_threshold_z_get(const stmdev_ctx_t * ctx,uint8_t * val)6254 int32_t lsm6dsrx_tap_threshold_z_get(const stmdev_ctx_t *ctx,
6255                                      uint8_t *val)
6256 {
6257   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6258   int32_t ret;
6259 
6260   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6261                           (uint8_t *)&tap_ths_6d, 1);
6262   *val = tap_ths_6d.tap_ths_z;
6263 
6264   return ret;
6265 }
6266 
6267 /**
6268   * @brief  Maximum duration is the maximum time of an overthreshold signal
6269   *         detection to be recognized as a tap event. The default value of
6270   *         these bits is 00b which corresponds to 4*ODR_XL time.
6271   *         If the SHOCK[1:0] bits are set to a different value, 1LSB
6272   *         corresponds to 8*ODR_XL time.[set]
6273   *
6274   * @param  ctx    Read / write interface definitions.(ptr)
6275   * @param  val    Change the values of shock in reg INT_DUR2
6276   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6277   *
6278   */
lsm6dsrx_tap_shock_set(const stmdev_ctx_t * ctx,uint8_t val)6279 int32_t lsm6dsrx_tap_shock_set(const stmdev_ctx_t *ctx, uint8_t val)
6280 {
6281   lsm6dsrx_int_dur2_t int_dur2;
6282   int32_t ret;
6283 
6284   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6285                           (uint8_t *)&int_dur2, 1);
6286 
6287   if (ret == 0)
6288   {
6289     int_dur2.shock = (uint8_t)val;
6290     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_DUR2,
6291                              (uint8_t *)&int_dur2, 1);
6292   }
6293 
6294   return ret;
6295 }
6296 
6297 /**
6298   * @brief  Maximum duration is the maximum time of an overthreshold signal
6299   *         detection to be recognized as a tap event. The default value of
6300   *         these bits is 00b which corresponds to 4*ODR_XL time.
6301   *         If the SHOCK[1:0] bits are set to a different value, 1LSB
6302   *         corresponds to 8*ODR_XL time.[get]
6303   *
6304   * @param  ctx    Read / write interface definitions.(ptr)
6305   * @param  val    Change the values of shock in reg INT_DUR2
6306   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6307   *
6308   */
lsm6dsrx_tap_shock_get(const stmdev_ctx_t * ctx,uint8_t * val)6309 int32_t lsm6dsrx_tap_shock_get(const stmdev_ctx_t *ctx, uint8_t *val)
6310 {
6311   lsm6dsrx_int_dur2_t int_dur2;
6312   int32_t ret;
6313 
6314   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6315                           (uint8_t *)&int_dur2, 1);
6316   *val = int_dur2.shock;
6317 
6318   return ret;
6319 }
6320 
6321 /**
6322   * @brief  Quiet time is the time after the first detected tap in which
6323   *         there must not be any overthreshold event.
6324   *         The default value of these bits is 00b which corresponds to
6325   *         2*ODR_XL time. If the QUIET[1:0] bits are set to a different
6326   *         value, 1LSB corresponds to 4*ODR_XL time.[set]
6327   *
6328   * @param  ctx    Read / write interface definitions.(ptr)
6329   * @param  val    Change the values of quiet in reg INT_DUR2
6330   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6331   *
6332   */
lsm6dsrx_tap_quiet_set(const stmdev_ctx_t * ctx,uint8_t val)6333 int32_t lsm6dsrx_tap_quiet_set(const stmdev_ctx_t *ctx, uint8_t val)
6334 {
6335   lsm6dsrx_int_dur2_t int_dur2;
6336   int32_t ret;
6337 
6338   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6339                           (uint8_t *)&int_dur2, 1);
6340 
6341   if (ret == 0)
6342   {
6343     int_dur2.quiet = (uint8_t)val;
6344     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_DUR2,
6345                              (uint8_t *)&int_dur2, 1);
6346   }
6347 
6348   return ret;
6349 }
6350 
6351 /**
6352   * @brief  Quiet time is the time after the first detected tap in which
6353   *         there must not be any overthreshold event.
6354   *         The default value of these bits is 00b which corresponds to
6355   *         2*ODR_XL time. If the QUIET[1:0] bits are set to a different
6356   *         value, 1LSB corresponds to 4*ODR_XL time.[get]
6357   *
6358   * @param  ctx    Read / write interface definitions.(ptr)
6359   * @param  val    Change the values of quiet in reg INT_DUR2
6360   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6361   *
6362   */
lsm6dsrx_tap_quiet_get(const stmdev_ctx_t * ctx,uint8_t * val)6363 int32_t lsm6dsrx_tap_quiet_get(const stmdev_ctx_t *ctx, uint8_t *val)
6364 {
6365   lsm6dsrx_int_dur2_t int_dur2;
6366   int32_t ret;
6367 
6368   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6369                           (uint8_t *)&int_dur2, 1);
6370   *val = int_dur2.quiet;
6371 
6372   return ret;
6373 }
6374 
6375 /**
6376   * @brief  When double tap recognition is enabled, this register expresses
6377   *         the maximum time between two consecutive detected taps to
6378   *         determine a double tap event.
6379   *         The default value of these bits is 0000b which corresponds to
6380   *         16*ODR_XL time.
6381   *         If the DUR[3:0] bits are set to a different value, 1LSB
6382   *         corresponds to 32*ODR_XL time.[set]
6383   *
6384   * @param  ctx    Read / write interface definitions.(ptr)
6385   * @param  val    Change the values of dur in reg INT_DUR2
6386   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6387   *
6388   */
lsm6dsrx_tap_dur_set(const stmdev_ctx_t * ctx,uint8_t val)6389 int32_t lsm6dsrx_tap_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
6390 {
6391   lsm6dsrx_int_dur2_t int_dur2;
6392   int32_t ret;
6393 
6394   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6395                           (uint8_t *)&int_dur2, 1);
6396 
6397   if (ret == 0)
6398   {
6399     int_dur2.dur = (uint8_t)val;
6400     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_INT_DUR2,
6401                              (uint8_t *)&int_dur2, 1);
6402   }
6403 
6404   return ret;
6405 }
6406 
6407 /**
6408   * @brief  When double tap recognition is enabled, this register expresses the
6409   *         maximum time between two consecutive detected taps to determine
6410   *         a double tap event. The default value of these bits is 0000b which
6411   *         corresponds to 16*ODR_XL time. If the DUR[3:0] bits are set to
6412   *         a different value, 1LSB corresponds to 32*ODR_XL time.[get]
6413   *
6414   * @param  ctx    Read / write interface definitions.(ptr)
6415   * @param  val    Change the values of dur in reg INT_DUR2
6416   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6417   *
6418   */
lsm6dsrx_tap_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)6419 int32_t lsm6dsrx_tap_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
6420 {
6421   lsm6dsrx_int_dur2_t int_dur2;
6422   int32_t ret;
6423 
6424   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_INT_DUR2,
6425                           (uint8_t *)&int_dur2, 1);
6426   *val = int_dur2.dur;
6427 
6428   return ret;
6429 }
6430 
6431 /**
6432   * @brief  Single/double-tap event enable.[set]
6433   *
6434   * @param  ctx    Read / write interface definitions.(ptr)
6435   * @param  val    Change the values of single_double_tap in reg WAKE_UP_THS
6436   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6437   *
6438   */
lsm6dsrx_tap_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_single_double_tap_t val)6439 int32_t lsm6dsrx_tap_mode_set(const stmdev_ctx_t *ctx,
6440                               lsm6dsrx_single_double_tap_t val)
6441 {
6442   lsm6dsrx_wake_up_ths_t wake_up_ths;
6443   int32_t ret;
6444 
6445   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
6446                           (uint8_t *)&wake_up_ths, 1);
6447 
6448   if (ret == 0)
6449   {
6450     wake_up_ths.single_double_tap = (uint8_t)val;
6451     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_THS,
6452                              (uint8_t *)&wake_up_ths, 1);
6453   }
6454 
6455   return ret;
6456 }
6457 
6458 /**
6459   * @brief  Single/double-tap event enable.[get]
6460   *
6461   * @param  ctx    Read / write interface definitions.(ptr)
6462   * @param  val    Get the values of single_double_tap in reg WAKE_UP_THS
6463   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6464   *
6465   */
lsm6dsrx_tap_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_single_double_tap_t * val)6466 int32_t lsm6dsrx_tap_mode_get(const stmdev_ctx_t *ctx,
6467                               lsm6dsrx_single_double_tap_t *val)
6468 {
6469   lsm6dsrx_wake_up_ths_t wake_up_ths;
6470   int32_t ret;
6471 
6472   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_THS,
6473                           (uint8_t *)&wake_up_ths, 1);
6474 
6475   switch (wake_up_ths.single_double_tap)
6476   {
6477     case LSM6DSRX_ONLY_SINGLE:
6478       *val = LSM6DSRX_ONLY_SINGLE;
6479       break;
6480 
6481     case LSM6DSRX_BOTH_SINGLE_DOUBLE:
6482       *val = LSM6DSRX_BOTH_SINGLE_DOUBLE;
6483       break;
6484 
6485     default:
6486       *val = LSM6DSRX_ONLY_SINGLE;
6487       break;
6488   }
6489 
6490   return ret;
6491 }
6492 
6493 /**
6494   * @}
6495   *
6496   */
6497 
6498 /**
6499   * @defgroup   LSM6DSRX_ Six_position_detection(6D/4D)
6500   * @brief      This section groups all the functions concerning six
6501   *             position detection (6D).
6502   * @{
6503   *
6504   */
6505 
6506 /**
6507   * @brief  Threshold for 4D/6D function.[set]
6508   *
6509   * @param  ctx    Read / write interface definitions.(ptr)
6510   * @param  val    Change the values of sixd_ths in reg TAP_THS_6D
6511   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6512   *
6513   */
lsm6dsrx_6d_threshold_set(const stmdev_ctx_t * ctx,lsm6dsrx_sixd_ths_t val)6514 int32_t lsm6dsrx_6d_threshold_set(const stmdev_ctx_t *ctx,
6515                                   lsm6dsrx_sixd_ths_t val)
6516 {
6517   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6518   int32_t ret;
6519 
6520   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6521                           (uint8_t *)&tap_ths_6d, 1);
6522 
6523   if (ret == 0)
6524   {
6525     tap_ths_6d.sixd_ths = (uint8_t)val;
6526     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_THS_6D,
6527                              (uint8_t *)&tap_ths_6d, 1);
6528   }
6529 
6530   return ret;
6531 }
6532 
6533 /**
6534   * @brief  Threshold for 4D/6D function.[get]
6535   *
6536   * @param  ctx    Read / write interface definitions.(ptr)
6537   * @param  val    Get the values of sixd_ths in reg TAP_THS_6D
6538   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6539   *
6540   */
lsm6dsrx_6d_threshold_get(const stmdev_ctx_t * ctx,lsm6dsrx_sixd_ths_t * val)6541 int32_t lsm6dsrx_6d_threshold_get(const stmdev_ctx_t *ctx,
6542                                   lsm6dsrx_sixd_ths_t *val)
6543 {
6544   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6545   int32_t ret;
6546 
6547   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6548                           (uint8_t *)&tap_ths_6d, 1);
6549 
6550   switch (tap_ths_6d.sixd_ths)
6551   {
6552     case LSM6DSRX_DEG_80:
6553       *val = LSM6DSRX_DEG_80;
6554       break;
6555 
6556     case LSM6DSRX_DEG_70:
6557       *val = LSM6DSRX_DEG_70;
6558       break;
6559 
6560     case LSM6DSRX_DEG_60:
6561       *val = LSM6DSRX_DEG_60;
6562       break;
6563 
6564     case LSM6DSRX_DEG_50:
6565       *val = LSM6DSRX_DEG_50;
6566       break;
6567 
6568     default:
6569       *val = LSM6DSRX_DEG_80;
6570       break;
6571   }
6572 
6573   return ret;
6574 }
6575 
6576 /**
6577   * @brief  4D orientation detection enable.[set]
6578   *
6579   * @param  ctx    Read / write interface definitions.(ptr)
6580   * @param  val    Change the values of d4d_en in reg TAP_THS_6D
6581   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6582   *
6583   */
lsm6dsrx_4d_mode_set(const stmdev_ctx_t * ctx,uint8_t val)6584 int32_t lsm6dsrx_4d_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
6585 {
6586   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6587   int32_t ret;
6588 
6589   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6590                           (uint8_t *)&tap_ths_6d, 1);
6591 
6592   if (ret == 0)
6593   {
6594     tap_ths_6d.d4d_en = (uint8_t)val;
6595     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_TAP_THS_6D,
6596                              (uint8_t *)&tap_ths_6d, 1);
6597   }
6598 
6599   return ret;
6600 }
6601 
6602 /**
6603   * @brief  4D orientation detection enable.[get]
6604   *
6605   * @param  ctx    Read / write interface definitions.(ptr)
6606   * @param  val    Change the values of d4d_en in reg TAP_THS_6D
6607   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6608   *
6609   */
lsm6dsrx_4d_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)6610 int32_t lsm6dsrx_4d_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
6611 {
6612   lsm6dsrx_tap_ths_6d_t tap_ths_6d;
6613   int32_t ret;
6614 
6615   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_TAP_THS_6D,
6616                           (uint8_t *)&tap_ths_6d, 1);
6617   *val = tap_ths_6d.d4d_en;
6618 
6619   return ret;
6620 }
6621 
6622 /**
6623   * @}
6624   *
6625   */
6626 
6627 /**
6628   * @defgroup   LSM6DSRX_free_fall
6629   * @brief      This section group all the functions concerning the free
6630   *             fall detection.
6631   * @{
6632   *
6633   */
6634 
6635 /**
6636   * @brief  Free fall threshold setting.[set]
6637   *
6638   * @param  ctx    Read / write interface definitions.(ptr)
6639   * @param  val    Change the values of ff_ths in reg FREE_FALL
6640   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6641   *
6642   */
lsm6dsrx_ff_threshold_set(const stmdev_ctx_t * ctx,lsm6dsrx_ff_ths_t val)6643 int32_t lsm6dsrx_ff_threshold_set(const stmdev_ctx_t *ctx,
6644                                   lsm6dsrx_ff_ths_t val)
6645 {
6646   lsm6dsrx_free_fall_t free_fall;
6647   int32_t ret;
6648 
6649   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FREE_FALL,
6650                           (uint8_t *)&free_fall, 1);
6651 
6652   if (ret == 0)
6653   {
6654     free_fall.ff_ths = (uint8_t)val;
6655     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FREE_FALL,
6656                              (uint8_t *)&free_fall, 1);
6657   }
6658 
6659   return ret;
6660 }
6661 
6662 /**
6663   * @brief  Free fall threshold setting.[get]
6664   *
6665   * @param  ctx    Read / write interface definitions.(ptr)
6666   * @param  val    Get the values of ff_ths in reg FREE_FALL
6667   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6668   *
6669   */
lsm6dsrx_ff_threshold_get(const stmdev_ctx_t * ctx,lsm6dsrx_ff_ths_t * val)6670 int32_t lsm6dsrx_ff_threshold_get(const stmdev_ctx_t *ctx,
6671                                   lsm6dsrx_ff_ths_t *val)
6672 {
6673   lsm6dsrx_free_fall_t free_fall;
6674   int32_t ret;
6675 
6676   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FREE_FALL,
6677                           (uint8_t *)&free_fall, 1);
6678 
6679   switch (free_fall.ff_ths)
6680   {
6681     case LSM6DSRX_FF_TSH_156mg:
6682       *val = LSM6DSRX_FF_TSH_156mg;
6683       break;
6684 
6685     case LSM6DSRX_FF_TSH_219mg:
6686       *val = LSM6DSRX_FF_TSH_219mg;
6687       break;
6688 
6689     case LSM6DSRX_FF_TSH_250mg:
6690       *val = LSM6DSRX_FF_TSH_250mg;
6691       break;
6692 
6693     case LSM6DSRX_FF_TSH_312mg:
6694       *val = LSM6DSRX_FF_TSH_312mg;
6695       break;
6696 
6697     case LSM6DSRX_FF_TSH_344mg:
6698       *val = LSM6DSRX_FF_TSH_344mg;
6699       break;
6700 
6701     case LSM6DSRX_FF_TSH_406mg:
6702       *val = LSM6DSRX_FF_TSH_406mg;
6703       break;
6704 
6705     case LSM6DSRX_FF_TSH_469mg:
6706       *val = LSM6DSRX_FF_TSH_469mg;
6707       break;
6708 
6709     case LSM6DSRX_FF_TSH_500mg:
6710       *val = LSM6DSRX_FF_TSH_500mg;
6711       break;
6712 
6713     default:
6714       *val = LSM6DSRX_FF_TSH_156mg;
6715       break;
6716   }
6717 
6718   return ret;
6719 }
6720 
6721 /**
6722   * @brief  Free-fall duration event(1LSb = 1 / ODR).[set]
6723   *
6724   * @param  ctx    Read / write interface definitions.(ptr)
6725   * @param  val    Change the values of ff_dur in reg FREE_FALL
6726   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6727   *
6728   */
lsm6dsrx_ff_dur_set(const stmdev_ctx_t * ctx,uint8_t val)6729 int32_t lsm6dsrx_ff_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
6730 {
6731   lsm6dsrx_wake_up_dur_t wake_up_dur;
6732   lsm6dsrx_free_fall_t free_fall;
6733   int32_t ret;
6734 
6735   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
6736                           (uint8_t *)&wake_up_dur, 1);
6737 
6738   if (ret == 0)
6739   {
6740     wake_up_dur.ff_dur = (val & 0x20U) >> 5;
6741     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
6742                              (uint8_t *)&wake_up_dur, 1);
6743   }
6744 
6745   if (ret == 0)
6746   {
6747     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FREE_FALL,
6748                             (uint8_t *)&free_fall, 1);
6749   }
6750 
6751   if (ret == 0)
6752   {
6753     free_fall.ff_dur = val & 0x1FU;
6754     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FREE_FALL,
6755                              (uint8_t *)&free_fall, 1);
6756   }
6757 
6758   return ret;
6759 }
6760 
6761 /**
6762   * @brief  Free-fall duration event(1LSb = 1 / ODR).[get]
6763   *
6764   * @param  ctx    Read / write interface definitions.(ptr)
6765   * @param  val    Change the values of ff_dur in reg FREE_FALL
6766   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6767   *
6768   */
lsm6dsrx_ff_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)6769 int32_t lsm6dsrx_ff_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
6770 {
6771   lsm6dsrx_wake_up_dur_t wake_up_dur;
6772   lsm6dsrx_free_fall_t free_fall;
6773   int32_t ret;
6774 
6775   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_WAKE_UP_DUR,
6776                           (uint8_t *)&wake_up_dur, 1);
6777 
6778   if (ret == 0)
6779   {
6780     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FREE_FALL,
6781                             (uint8_t *)&free_fall, 1);
6782   }
6783 
6784   *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
6785 
6786   return ret;
6787 }
6788 
6789 /**
6790   * @}
6791   *
6792   */
6793 
6794 /**
6795   * @defgroup   LSM6DSRX_fifo
6796   * @brief      This section group all the functions concerning
6797   *             the fifo usage
6798   * @{
6799   *
6800   */
6801 
6802 /**
6803   * @brief  FIFO watermark level selection.[set]
6804   *
6805   * @param  ctx    Read / write interface definitions.(ptr)
6806   * @param  val    Change the values of wtm in reg FIFO_CTRL1
6807   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6808   *
6809   */
lsm6dsrx_fifo_watermark_set(const stmdev_ctx_t * ctx,uint16_t val)6810 int32_t lsm6dsrx_fifo_watermark_set(const stmdev_ctx_t *ctx, uint16_t val)
6811 {
6812   lsm6dsrx_fifo_ctrl1_t fifo_ctrl1;
6813   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
6814   int32_t ret;
6815 
6816   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
6817   ret += lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
6818 
6819   if (ret == 0)
6820   {
6821     fifo_ctrl1.wtm = (uint8_t)(val  & 0xFFU);
6822     fifo_ctrl2.wtm = (uint8_t)(val / 256U) & 0x01U;
6823 
6824     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
6825     ret += lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
6826   }
6827 
6828   return ret;
6829 }
6830 
6831 /**
6832   * @brief  FIFO watermark level selection.[get]
6833   *
6834   * @param  ctx    Read / write interface definitions.(ptr)
6835   * @param  val    Change the values of wtm in reg FIFO_CTRL1
6836   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6837   *
6838   */
lsm6dsrx_fifo_watermark_get(const stmdev_ctx_t * ctx,uint16_t * val)6839 int32_t lsm6dsrx_fifo_watermark_get(const stmdev_ctx_t *ctx,
6840                                     uint16_t *val)
6841 {
6842   lsm6dsrx_fifo_ctrl1_t fifo_ctrl1;
6843   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
6844   int32_t ret;
6845 
6846   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
6847   ret += lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
6848 
6849   *val = fifo_ctrl2.wtm;
6850   *val = (*val * 256U) +  fifo_ctrl1.wtm;;
6851 
6852   return ret;
6853 }
6854 
6855 /**
6856   * @brief  FIFO compression feature initialization request.[set].
6857   *
6858   * @param  ctx    Read / write interface definitions.(ptr)
6859   * @param  val    Change the values of FIFO_COMPR_INIT in reg EMB_FUNC_INIT_B
6860   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6861   *
6862   */
lsm6dsrx_compression_algo_init_set(const stmdev_ctx_t * ctx,uint8_t val)6863 int32_t lsm6dsrx_compression_algo_init_set(const stmdev_ctx_t *ctx,
6864                                            uint8_t val)
6865 {
6866   lsm6dsrx_emb_func_init_b_t emb_func_init_b;
6867   int32_t ret;
6868 
6869   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
6870 
6871   if (ret == 0)
6872   {
6873     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
6874                             (uint8_t *)&emb_func_init_b, 1);
6875   }
6876 
6877   if (ret == 0)
6878   {
6879     emb_func_init_b.fifo_compr_init = (uint8_t)val;
6880     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
6881                              (uint8_t *)&emb_func_init_b, 1);
6882   }
6883 
6884   if (ret == 0)
6885   {
6886     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
6887   }
6888 
6889   return ret;
6890 }
6891 
6892 /**
6893   * @brief  FIFO compression feature initialization request.[get].
6894   *
6895   * @param  ctx    Read / write interface definitions.(ptr)
6896   * @param  val    change the values of FIFO_COMPR_INIT in
6897   *                reg EMB_FUNC_INIT_B
6898   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6899   *
6900   */
lsm6dsrx_compression_algo_init_get(const stmdev_ctx_t * ctx,uint8_t * val)6901 int32_t lsm6dsrx_compression_algo_init_get(const stmdev_ctx_t *ctx,
6902                                            uint8_t *val)
6903 {
6904   lsm6dsrx_emb_func_init_b_t emb_func_init_b;
6905   int32_t ret;
6906 
6907   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
6908 
6909   if (ret == 0)
6910   {
6911     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
6912                             (uint8_t *)&emb_func_init_b, 1);
6913   }
6914 
6915   if (ret == 0)
6916   {
6917     *val = emb_func_init_b.fifo_compr_init;
6918     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
6919   }
6920 
6921   return ret;
6922 }
6923 
6924 /**
6925   * @brief  Enable and configure compression algo.[set]
6926   *
6927   * @param  ctx    Read / write interface definitions.(ptr)
6928   * @param  val    Change the values of uncoptr_rate in reg FIFO_CTRL2
6929   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6930   *
6931   */
lsm6dsrx_compression_algo_set(const stmdev_ctx_t * ctx,lsm6dsrx_uncoptr_rate_t val)6932 int32_t lsm6dsrx_compression_algo_set(const stmdev_ctx_t *ctx,
6933                                       lsm6dsrx_uncoptr_rate_t val)
6934 {
6935   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
6936   lsm6dsrx_emb_func_en_b_t emb_func_en_b;
6937   int32_t ret;
6938 
6939   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
6940 
6941   if (ret == 0)
6942   {
6943     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
6944                             (uint8_t *)&emb_func_en_b, 1);
6945   }
6946 
6947   if (ret == 0)
6948   {
6949     emb_func_en_b.fifo_compr_en = ((uint8_t)val & 0x04U) >> 2;
6950     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
6951                              (uint8_t *)&emb_func_en_b, 1);
6952   }
6953 
6954   if (ret == 0)
6955   {
6956     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
6957   }
6958 
6959   if (ret == 0)
6960   {
6961     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
6962                             (uint8_t *)&fifo_ctrl2, 1);
6963   }
6964 
6965   if (ret == 0)
6966   {
6967     fifo_ctrl2.fifo_compr_rt_en = ((uint8_t)val & 0x04U) >> 2;
6968     fifo_ctrl2.uncoptr_rate = (uint8_t)val & 0x03U;
6969   }
6970 
6971   if (ret == 0)
6972   {
6973     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL2,
6974                              (uint8_t *)&fifo_ctrl2, 1);
6975   }
6976 
6977   return ret;
6978 }
6979 
6980 /**
6981   * @brief  Enable and configure compression algo.[get]
6982   *
6983   * @param  ctx    Read / write interface definitions.(ptr)
6984   * @param  val    Get the values of uncoptr_rate in reg FIFO_CTRL2
6985   * @retval        Interface status (MANDATORY: return 0 -> no Error).
6986   *
6987   */
lsm6dsrx_compression_algo_get(const stmdev_ctx_t * ctx,lsm6dsrx_uncoptr_rate_t * val)6988 int32_t lsm6dsrx_compression_algo_get(const stmdev_ctx_t *ctx,
6989                                       lsm6dsrx_uncoptr_rate_t *val)
6990 {
6991   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
6992   int32_t ret;
6993 
6994   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
6995                           (uint8_t *)&fifo_ctrl2, 1);
6996 
6997   switch ((fifo_ctrl2.fifo_compr_rt_en << 2) +
6998           fifo_ctrl2.uncoptr_rate)
6999   {
7000     case LSM6DSRX_CMP_DISABLE:
7001       *val = LSM6DSRX_CMP_DISABLE;
7002       break;
7003 
7004     case LSM6DSRX_CMP_ALWAYS:
7005       *val = LSM6DSRX_CMP_ALWAYS;
7006       break;
7007 
7008     case LSM6DSRX_CMP_8_TO_1:
7009       *val = LSM6DSRX_CMP_8_TO_1;
7010       break;
7011 
7012     case LSM6DSRX_CMP_16_TO_1:
7013       *val = LSM6DSRX_CMP_16_TO_1;
7014       break;
7015 
7016     case LSM6DSRX_CMP_32_TO_1:
7017       *val = LSM6DSRX_CMP_32_TO_1;
7018       break;
7019 
7020     default:
7021       *val = LSM6DSRX_CMP_DISABLE;
7022       break;
7023   }
7024 
7025   return ret;
7026 }
7027 
7028 /**
7029   * @brief  Enables ODR CHANGE virtual sensor to be batched in FIFO.[set]
7030   *
7031   * @param  ctx    Read / write interface definitions.(ptr)
7032   * @param  val    Change the values of odrchg_en in reg FIFO_CTRL2
7033   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7034   *
7035   */
lsm6dsrx_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t * ctx,uint8_t val)7036 int32_t lsm6dsrx_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t *ctx,
7037                                                uint8_t val)
7038 {
7039   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7040   int32_t ret;
7041 
7042   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7043                           (uint8_t *)&fifo_ctrl2, 1);
7044 
7045   if (ret == 0)
7046   {
7047     fifo_ctrl2.odrchg_en = (uint8_t)val;
7048     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7049                              (uint8_t *)&fifo_ctrl2, 1);
7050   }
7051 
7052   return ret;
7053 }
7054 
7055 /**
7056   * @brief  Enables ODR CHANGE virtual sensor to be batched in FIFO.[get]
7057   *
7058   * @param  ctx    Read / write interface definitions.(ptr)
7059   * @param  val    Change the values of odrchg_en in reg FIFO_CTRL2
7060   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7061   *
7062   */
lsm6dsrx_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t * ctx,uint8_t * val)7063 int32_t lsm6dsrx_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t *ctx,
7064                                                uint8_t *val)
7065 {
7066   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7067   int32_t ret;
7068 
7069   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7070                           (uint8_t *)&fifo_ctrl2, 1);
7071   *val = fifo_ctrl2.odrchg_en;
7072 
7073   return ret;
7074 }
7075 
7076 /**
7077   * @brief  Enables/Disables compression algorithm runtime[set]
7078   *
7079   * @param  ctx    Read / write interface definitions.(ptr)
7080   * @param  val    Change the values of fifo_compr_rt_en in reg FIFO_CTRL2
7081   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7082   *
7083   */
lsm6dsrx_compression_algo_real_time_set(const stmdev_ctx_t * ctx,uint8_t val)7084 int32_t lsm6dsrx_compression_algo_real_time_set(const stmdev_ctx_t *ctx,
7085                                                 uint8_t val)
7086 {
7087   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7088   int32_t ret;
7089 
7090   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7091                           (uint8_t *)&fifo_ctrl2, 1);
7092 
7093   if (ret == 0)
7094   {
7095     fifo_ctrl2.fifo_compr_rt_en = (uint8_t)val;
7096     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7097                              (uint8_t *)&fifo_ctrl2, 1);
7098   }
7099 
7100   return ret;
7101 }
7102 
7103 /**
7104   * @brief  Enables/Disables compression algorithm runtime.[get]
7105   *
7106   * @param  ctx    Read / write interface definitions.(ptr)
7107   * @param  val    Change the values of fifo_compr_rt_en in reg FIFO_CTRL2
7108   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7109   *
7110   */
lsm6dsrx_compression_algo_real_time_get(const stmdev_ctx_t * ctx,uint8_t * val)7111 int32_t lsm6dsrx_compression_algo_real_time_get(const stmdev_ctx_t *ctx,
7112                                                 uint8_t *val)
7113 {
7114   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7115   int32_t ret;
7116 
7117   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7118                           (uint8_t *)&fifo_ctrl2, 1);
7119   *val = fifo_ctrl2.fifo_compr_rt_en;
7120 
7121   return ret;
7122 }
7123 
7124 /**
7125   * @brief  Sensing chain FIFO stop values memorization at threshold
7126   *         level.[set]
7127   *
7128   * @param  ctx    Read / write interface definitions.(ptr)
7129   * @param  val    Change the values of stop_on_wtm in reg FIFO_CTRL2
7130   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7131   *
7132   */
lsm6dsrx_fifo_stop_on_wtm_set(const stmdev_ctx_t * ctx,uint8_t val)7133 int32_t lsm6dsrx_fifo_stop_on_wtm_set(const stmdev_ctx_t *ctx,
7134                                       uint8_t val)
7135 {
7136   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7137   int32_t ret;
7138 
7139   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7140                           (uint8_t *)&fifo_ctrl2, 1);
7141 
7142   if (ret == 0)
7143   {
7144     fifo_ctrl2.stop_on_wtm = (uint8_t)val;
7145     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7146                              (uint8_t *)&fifo_ctrl2, 1);
7147   }
7148 
7149   return ret;
7150 }
7151 
7152 /**
7153   * @brief  Sensing chain FIFO stop values memorization at threshold
7154   *         level.[get]
7155   *
7156   * @param  ctx    Read / write interface definitions.(ptr)
7157   * @param  val    Change the values of stop_on_wtm in reg FIFO_CTRL2
7158   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7159   *
7160   */
lsm6dsrx_fifo_stop_on_wtm_get(const stmdev_ctx_t * ctx,uint8_t * val)7161 int32_t lsm6dsrx_fifo_stop_on_wtm_get(const stmdev_ctx_t *ctx,
7162                                       uint8_t *val)
7163 {
7164   lsm6dsrx_fifo_ctrl2_t fifo_ctrl2;
7165   int32_t ret;
7166 
7167   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL2,
7168                           (uint8_t *)&fifo_ctrl2, 1);
7169   *val = fifo_ctrl2.stop_on_wtm;
7170 
7171   return ret;
7172 }
7173 
7174 /**
7175   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7176   *         for accelerometer data.[set]
7177   *
7178   * @param  ctx    Read / write interface definitions.(ptr)
7179   * @param  val    Change the values of bdr_xl in reg FIFO_CTRL3
7180   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7181   *
7182   */
lsm6dsrx_fifo_xl_batch_set(const stmdev_ctx_t * ctx,lsm6dsrx_bdr_xl_t val)7183 int32_t lsm6dsrx_fifo_xl_batch_set(const stmdev_ctx_t *ctx,
7184                                    lsm6dsrx_bdr_xl_t val)
7185 {
7186   lsm6dsrx_fifo_ctrl3_t fifo_ctrl3;
7187   int32_t ret;
7188 
7189   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7190                           (uint8_t *)&fifo_ctrl3, 1);
7191 
7192   if (ret == 0)
7193   {
7194     fifo_ctrl3.bdr_xl = (uint8_t)val;
7195     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7196                              (uint8_t *)&fifo_ctrl3, 1);
7197   }
7198 
7199   return ret;
7200 }
7201 
7202 /**
7203   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7204   *         for accelerometer data.[get]
7205   *
7206   * @param  ctx    Read / write interface definitions.(ptr)
7207   * @param  val    Get the values of bdr_xl in reg FIFO_CTRL3
7208   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7209   *
7210   */
lsm6dsrx_fifo_xl_batch_get(const stmdev_ctx_t * ctx,lsm6dsrx_bdr_xl_t * val)7211 int32_t lsm6dsrx_fifo_xl_batch_get(const stmdev_ctx_t *ctx,
7212                                    lsm6dsrx_bdr_xl_t *val)
7213 {
7214   lsm6dsrx_fifo_ctrl3_t fifo_ctrl3;
7215   int32_t ret;
7216 
7217   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7218                           (uint8_t *)&fifo_ctrl3, 1);
7219 
7220   switch (fifo_ctrl3.bdr_xl)
7221   {
7222     case LSM6DSRX_XL_NOT_BATCHED:
7223       *val = LSM6DSRX_XL_NOT_BATCHED;
7224       break;
7225 
7226     case LSM6DSRX_XL_BATCHED_AT_12Hz5:
7227       *val = LSM6DSRX_XL_BATCHED_AT_12Hz5;
7228       break;
7229 
7230     case LSM6DSRX_XL_BATCHED_AT_26Hz:
7231       *val = LSM6DSRX_XL_BATCHED_AT_26Hz;
7232       break;
7233 
7234     case LSM6DSRX_XL_BATCHED_AT_52Hz:
7235       *val = LSM6DSRX_XL_BATCHED_AT_52Hz;
7236       break;
7237 
7238     case LSM6DSRX_XL_BATCHED_AT_104Hz:
7239       *val = LSM6DSRX_XL_BATCHED_AT_104Hz;
7240       break;
7241 
7242     case LSM6DSRX_XL_BATCHED_AT_208Hz:
7243       *val = LSM6DSRX_XL_BATCHED_AT_208Hz;
7244       break;
7245 
7246     case LSM6DSRX_XL_BATCHED_AT_417Hz:
7247       *val = LSM6DSRX_XL_BATCHED_AT_417Hz;
7248       break;
7249 
7250     case LSM6DSRX_XL_BATCHED_AT_833Hz:
7251       *val = LSM6DSRX_XL_BATCHED_AT_833Hz;
7252       break;
7253 
7254     case LSM6DSRX_XL_BATCHED_AT_1667Hz:
7255       *val = LSM6DSRX_XL_BATCHED_AT_1667Hz;
7256       break;
7257 
7258     case LSM6DSRX_XL_BATCHED_AT_3333Hz:
7259       *val = LSM6DSRX_XL_BATCHED_AT_3333Hz;
7260       break;
7261 
7262     case LSM6DSRX_XL_BATCHED_AT_6667Hz:
7263       *val = LSM6DSRX_XL_BATCHED_AT_6667Hz;
7264       break;
7265 
7266     case LSM6DSRX_XL_BATCHED_AT_6Hz5:
7267       *val = LSM6DSRX_XL_BATCHED_AT_6Hz5;
7268       break;
7269 
7270     default:
7271       *val = LSM6DSRX_XL_NOT_BATCHED;
7272       break;
7273   }
7274 
7275   return ret;
7276 }
7277 
7278 /**
7279   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7280   *         for gyroscope data.[set]
7281   *
7282   * @param  ctx    Read / write interface definitions.(ptr)
7283   * @param  val    Change the values of bdr_gy in reg FIFO_CTRL3
7284   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7285   *
7286   */
lsm6dsrx_fifo_gy_batch_set(const stmdev_ctx_t * ctx,lsm6dsrx_bdr_gy_t val)7287 int32_t lsm6dsrx_fifo_gy_batch_set(const stmdev_ctx_t *ctx,
7288                                    lsm6dsrx_bdr_gy_t val)
7289 {
7290   lsm6dsrx_fifo_ctrl3_t fifo_ctrl3;
7291   int32_t ret;
7292 
7293   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7294                           (uint8_t *)&fifo_ctrl3, 1);
7295 
7296   if (ret == 0)
7297   {
7298     fifo_ctrl3.bdr_gy = (uint8_t)val;
7299     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7300                              (uint8_t *)&fifo_ctrl3, 1);
7301   }
7302 
7303   return ret;
7304 }
7305 
7306 /**
7307   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7308   *         for gyroscope data.[get]
7309   *
7310   * @param  ctx    Read / write interface definitions.(ptr)
7311   * @param  val    Get the values of bdr_gy in reg FIFO_CTRL3
7312   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7313   *
7314   */
lsm6dsrx_fifo_gy_batch_get(const stmdev_ctx_t * ctx,lsm6dsrx_bdr_gy_t * val)7315 int32_t lsm6dsrx_fifo_gy_batch_get(const stmdev_ctx_t *ctx,
7316                                    lsm6dsrx_bdr_gy_t *val)
7317 {
7318   lsm6dsrx_fifo_ctrl3_t fifo_ctrl3;
7319   int32_t ret;
7320 
7321   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL3,
7322                           (uint8_t *)&fifo_ctrl3, 1);
7323 
7324   switch (fifo_ctrl3.bdr_gy)
7325   {
7326     case LSM6DSRX_GY_NOT_BATCHED:
7327       *val = LSM6DSRX_GY_NOT_BATCHED;
7328       break;
7329 
7330     case LSM6DSRX_GY_BATCHED_AT_12Hz5:
7331       *val = LSM6DSRX_GY_BATCHED_AT_12Hz5;
7332       break;
7333 
7334     case LSM6DSRX_GY_BATCHED_AT_26Hz:
7335       *val = LSM6DSRX_GY_BATCHED_AT_26Hz;
7336       break;
7337 
7338     case LSM6DSRX_GY_BATCHED_AT_52Hz:
7339       *val = LSM6DSRX_GY_BATCHED_AT_52Hz;
7340       break;
7341 
7342     case LSM6DSRX_GY_BATCHED_AT_104Hz:
7343       *val = LSM6DSRX_GY_BATCHED_AT_104Hz;
7344       break;
7345 
7346     case LSM6DSRX_GY_BATCHED_AT_208Hz:
7347       *val = LSM6DSRX_GY_BATCHED_AT_208Hz;
7348       break;
7349 
7350     case LSM6DSRX_GY_BATCHED_AT_417Hz:
7351       *val = LSM6DSRX_GY_BATCHED_AT_417Hz;
7352       break;
7353 
7354     case LSM6DSRX_GY_BATCHED_AT_833Hz:
7355       *val = LSM6DSRX_GY_BATCHED_AT_833Hz;
7356       break;
7357 
7358     case LSM6DSRX_GY_BATCHED_AT_1667Hz:
7359       *val = LSM6DSRX_GY_BATCHED_AT_1667Hz;
7360       break;
7361 
7362     case LSM6DSRX_GY_BATCHED_AT_3333Hz:
7363       *val = LSM6DSRX_GY_BATCHED_AT_3333Hz;
7364       break;
7365 
7366     case LSM6DSRX_GY_BATCHED_AT_6667Hz:
7367       *val = LSM6DSRX_GY_BATCHED_AT_6667Hz;
7368       break;
7369 
7370     case LSM6DSRX_GY_BATCHED_6Hz5:
7371       *val = LSM6DSRX_GY_BATCHED_6Hz5;
7372       break;
7373 
7374     default:
7375       *val = LSM6DSRX_GY_NOT_BATCHED;
7376       break;
7377   }
7378 
7379   return ret;
7380 }
7381 
7382 /**
7383   * @brief  FIFO mode selection.[set]
7384   *
7385   * @param  ctx    Read / write interface definitions.(ptr)
7386   * @param  val    Change the values of fifo_mode in reg FIFO_CTRL4
7387   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7388   *
7389   */
lsm6dsrx_fifo_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_fifo_mode_t val)7390 int32_t lsm6dsrx_fifo_mode_set(const stmdev_ctx_t *ctx,
7391                                lsm6dsrx_fifo_mode_t val)
7392 {
7393   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7394   int32_t ret;
7395 
7396   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7397                           (uint8_t *)&fifo_ctrl4, 1);
7398 
7399   if (ret == 0)
7400   {
7401     fifo_ctrl4.fifo_mode = (uint8_t)val;
7402     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7403                              (uint8_t *)&fifo_ctrl4, 1);
7404   }
7405 
7406   return ret;
7407 }
7408 
7409 /**
7410   * @brief  FIFO mode selection.[get]
7411   *
7412   * @param  ctx    Read / write interface definitions.(ptr)
7413   * @param  val    Get the values of fifo_mode in reg FIFO_CTRL4
7414   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7415   *
7416   */
lsm6dsrx_fifo_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_fifo_mode_t * val)7417 int32_t lsm6dsrx_fifo_mode_get(const stmdev_ctx_t *ctx,
7418                                lsm6dsrx_fifo_mode_t *val)
7419 {
7420   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7421   int32_t ret;
7422 
7423   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7424                           (uint8_t *)&fifo_ctrl4, 1);
7425 
7426   switch (fifo_ctrl4.fifo_mode)
7427   {
7428     case LSM6DSRX_BYPASS_MODE:
7429       *val = LSM6DSRX_BYPASS_MODE;
7430       break;
7431 
7432     case LSM6DSRX_FIFO_MODE:
7433       *val = LSM6DSRX_FIFO_MODE;
7434       break;
7435 
7436     case LSM6DSRX_STREAM_TO_FIFO_MODE:
7437       *val = LSM6DSRX_STREAM_TO_FIFO_MODE;
7438       break;
7439 
7440     case LSM6DSRX_BYPASS_TO_STREAM_MODE:
7441       *val = LSM6DSRX_BYPASS_TO_STREAM_MODE;
7442       break;
7443 
7444     case LSM6DSRX_STREAM_MODE:
7445       *val = LSM6DSRX_STREAM_MODE;
7446       break;
7447 
7448     case LSM6DSRX_BYPASS_TO_FIFO_MODE:
7449       *val = LSM6DSRX_BYPASS_TO_FIFO_MODE;
7450       break;
7451 
7452     default:
7453       *val = LSM6DSRX_BYPASS_MODE;
7454       break;
7455   }
7456 
7457   return ret;
7458 }
7459 
7460 /**
7461   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7462   *         for temperature data.[set]
7463   *
7464   * @param  ctx    Read / write interface definitions.(ptr)
7465   * @param  val    Change the values of odr_t_batch in reg FIFO_CTRL4
7466   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7467   *
7468   */
lsm6dsrx_fifo_temp_batch_set(const stmdev_ctx_t * ctx,lsm6dsrx_odr_t_batch_t val)7469 int32_t lsm6dsrx_fifo_temp_batch_set(const stmdev_ctx_t *ctx,
7470                                      lsm6dsrx_odr_t_batch_t val)
7471 {
7472   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7473   int32_t ret;
7474 
7475   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7476                           (uint8_t *)&fifo_ctrl4, 1);
7477 
7478   if (ret == 0)
7479   {
7480     fifo_ctrl4.odr_t_batch = (uint8_t)val;
7481     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7482                              (uint8_t *)&fifo_ctrl4, 1);
7483   }
7484 
7485   return ret;
7486 }
7487 
7488 /**
7489   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
7490   *         for temperature data.[get]
7491   *
7492   * @param  ctx    Read / write interface definitions.(ptr)
7493   * @param  val    Get the values of odr_t_batch in reg FIFO_CTRL4
7494   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7495   *
7496   */
lsm6dsrx_fifo_temp_batch_get(const stmdev_ctx_t * ctx,lsm6dsrx_odr_t_batch_t * val)7497 int32_t lsm6dsrx_fifo_temp_batch_get(const stmdev_ctx_t *ctx,
7498                                      lsm6dsrx_odr_t_batch_t *val)
7499 {
7500   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7501   int32_t ret;
7502 
7503   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7504                           (uint8_t *)&fifo_ctrl4, 1);
7505 
7506   switch (fifo_ctrl4.odr_t_batch)
7507   {
7508     case LSM6DSRX_TEMP_NOT_BATCHED:
7509       *val = LSM6DSRX_TEMP_NOT_BATCHED;
7510       break;
7511 
7512     case LSM6DSRX_TEMP_BATCHED_AT_52Hz:
7513       *val = LSM6DSRX_TEMP_BATCHED_AT_52Hz;
7514       break;
7515 
7516     case LSM6DSRX_TEMP_BATCHED_AT_12Hz5:
7517       *val = LSM6DSRX_TEMP_BATCHED_AT_12Hz5;
7518       break;
7519 
7520     case LSM6DSRX_TEMP_BATCHED_AT_1Hz6:
7521       *val = LSM6DSRX_TEMP_BATCHED_AT_1Hz6;
7522       break;
7523 
7524     default:
7525       *val = LSM6DSRX_TEMP_NOT_BATCHED;
7526       break;
7527   }
7528 
7529   return ret;
7530 }
7531 
7532 /**
7533   * @brief  Selects decimation for timestamp batching in FIFO.
7534   *         Writing rate will be the maximum rate between XL and
7535   *         GYRO BDR divided by decimation decoder.[set]
7536   *
7537   * @param  ctx    Read / write interface definitions.(ptr)
7538   * @param  val    Change the values of odr_ts_batch in reg FIFO_CTRL4
7539   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7540   *
7541   */
lsm6dsrx_fifo_timestamp_decimation_set(const stmdev_ctx_t * ctx,lsm6dsrx_odr_ts_batch_t val)7542 int32_t lsm6dsrx_fifo_timestamp_decimation_set(const stmdev_ctx_t *ctx,
7543                                                lsm6dsrx_odr_ts_batch_t val)
7544 {
7545   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7546   int32_t ret;
7547 
7548   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7549                           (uint8_t *)&fifo_ctrl4, 1);
7550 
7551   if (ret == 0)
7552   {
7553     fifo_ctrl4.odr_ts_batch = (uint8_t)val;
7554     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7555                              (uint8_t *)&fifo_ctrl4, 1);
7556   }
7557 
7558   return ret;
7559 }
7560 
7561 /**
7562   * @brief  Selects decimation for timestamp batching in FIFO.
7563   *         Writing rate will be the maximum rate between XL and
7564   *         GYRO BDR divided by decimation decoder.[get]
7565   *
7566   * @param  ctx    Read / write interface definitions.(ptr)
7567   * @param  val    Get the values of odr_ts_batch in reg
7568   *                                 FIFO_CTRL4
7569   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7570   *
7571   */
lsm6dsrx_fifo_timestamp_decimation_get(const stmdev_ctx_t * ctx,lsm6dsrx_odr_ts_batch_t * val)7572 int32_t lsm6dsrx_fifo_timestamp_decimation_get(const stmdev_ctx_t *ctx,
7573                                                lsm6dsrx_odr_ts_batch_t *val)
7574 {
7575   lsm6dsrx_fifo_ctrl4_t fifo_ctrl4;
7576   int32_t ret;
7577 
7578   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_CTRL4,
7579                           (uint8_t *)&fifo_ctrl4, 1);
7580 
7581   switch (fifo_ctrl4.odr_ts_batch)
7582   {
7583     case LSM6DSRX_NO_DECIMATION:
7584       *val = LSM6DSRX_NO_DECIMATION;
7585       break;
7586 
7587     case LSM6DSRX_DEC_1:
7588       *val = LSM6DSRX_DEC_1;
7589       break;
7590 
7591     case LSM6DSRX_DEC_8:
7592       *val = LSM6DSRX_DEC_8;
7593       break;
7594 
7595     case LSM6DSRX_DEC_32:
7596       *val = LSM6DSRX_DEC_32;
7597       break;
7598 
7599     default:
7600       *val = LSM6DSRX_NO_DECIMATION;
7601       break;
7602   }
7603 
7604   return ret;
7605 }
7606 
7607 /**
7608   * @brief  Selects the trigger for the internal counter of batching events
7609   *         between XL and gyro.[set]
7610   *
7611   * @param  ctx    Read / write interface definitions.(ptr)
7612   * @param  val    Change the values of trig_counter_bdr in
7613   *                reg COUNTER_BDR_REG1
7614   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7615   *
7616   */
lsm6dsrx_fifo_cnt_event_batch_set(const stmdev_ctx_t * ctx,lsm6dsrx_trig_counter_bdr_t val)7617 int32_t lsm6dsrx_fifo_cnt_event_batch_set(const stmdev_ctx_t *ctx,
7618                                           lsm6dsrx_trig_counter_bdr_t val)
7619 {
7620   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
7621   int32_t ret;
7622 
7623   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7624                           (uint8_t *)&counter_bdr_reg1, 1);
7625 
7626   if (ret == 0)
7627   {
7628     counter_bdr_reg1.trig_counter_bdr = (uint8_t)val;
7629     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7630                              (uint8_t *)&counter_bdr_reg1, 1);
7631   }
7632 
7633   return ret;
7634 }
7635 
7636 /**
7637   * @brief  Selects the trigger for the internal counter of batching events
7638   *          between XL and gyro.[get]
7639   *
7640   * @param  ctx    Read / write interface definitions.(ptr)
7641   * @param  val    Get the values of trig_counter_bdr
7642   *                in reg COUNTER_BDR_REG1
7643   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7644   *
7645   */
lsm6dsrx_fifo_cnt_event_batch_get(const stmdev_ctx_t * ctx,lsm6dsrx_trig_counter_bdr_t * val)7646 int32_t lsm6dsrx_fifo_cnt_event_batch_get(const stmdev_ctx_t *ctx,
7647                                           lsm6dsrx_trig_counter_bdr_t *val)
7648 {
7649   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
7650   int32_t ret;
7651 
7652   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7653                           (uint8_t *)&counter_bdr_reg1, 1);
7654 
7655   switch (counter_bdr_reg1.trig_counter_bdr)
7656   {
7657     case LSM6DSRX_XL_BATCH_EVENT:
7658       *val = LSM6DSRX_XL_BATCH_EVENT;
7659       break;
7660 
7661     case LSM6DSRX_GYRO_BATCH_EVENT:
7662       *val = LSM6DSRX_GYRO_BATCH_EVENT;
7663       break;
7664 
7665     default:
7666       *val = LSM6DSRX_XL_BATCH_EVENT;
7667       break;
7668   }
7669 
7670   return ret;
7671 }
7672 
7673 /**
7674   * @brief  Resets the internal counter of batching events for a single sensor.
7675   *         This bit is automatically reset to zero if it was set to '1'.[set]
7676   *
7677   * @param  ctx    Read / write interface definitions.(ptr)
7678   * @param  val    Change the values of rst_counter_bdr in reg COUNTER_BDR_REG1
7679   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7680   *
7681   */
lsm6dsrx_rst_batch_counter_set(const stmdev_ctx_t * ctx,uint8_t val)7682 int32_t lsm6dsrx_rst_batch_counter_set(const stmdev_ctx_t *ctx,
7683                                        uint8_t val)
7684 {
7685   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
7686   int32_t ret;
7687 
7688   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7689                           (uint8_t *)&counter_bdr_reg1, 1);
7690 
7691   if (ret == 0)
7692   {
7693     counter_bdr_reg1.rst_counter_bdr = (uint8_t)val;
7694     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7695                              (uint8_t *)&counter_bdr_reg1, 1);
7696   }
7697 
7698   return ret;
7699 }
7700 
7701 /**
7702   * @brief  Resets the internal counter of batching events for a single sensor.
7703   *         This bit is automatically reset to zero if it was set to '1'.[get]
7704   *
7705   * @param  ctx    Read / write interface definitions.(ptr)
7706   * @param  val    Change the values of rst_counter_bdr in reg COUNTER_BDR_REG1
7707   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7708   *
7709   */
lsm6dsrx_rst_batch_counter_get(const stmdev_ctx_t * ctx,uint8_t * val)7710 int32_t lsm6dsrx_rst_batch_counter_get(const stmdev_ctx_t *ctx,
7711                                        uint8_t *val)
7712 {
7713   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
7714   int32_t ret;
7715 
7716   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7717                           (uint8_t *)&counter_bdr_reg1, 1);
7718   *val = counter_bdr_reg1.rst_counter_bdr;
7719 
7720   return ret;
7721 }
7722 
7723 /**
7724   * @brief  Batch data rate counter.[set]
7725   *
7726   * @param  ctx    Read / write interface definitions.(ptr)
7727   * @param  val    Change the values of cnt_bdr_th in reg COUNTER_BDR_REG2
7728   *                and COUNTER_BDR_REG1.
7729   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7730   *
7731   */
lsm6dsrx_batch_counter_threshold_set(const stmdev_ctx_t * ctx,uint16_t val)7732 int32_t lsm6dsrx_batch_counter_threshold_set(const stmdev_ctx_t *ctx,
7733                                              uint16_t val)
7734 {
7735   lsm6dsrx_counter_bdr_reg2_t counter_bdr_reg1;
7736   lsm6dsrx_counter_bdr_reg2_t counter_bdr_reg2;
7737   int32_t ret;
7738 
7739   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7740                           (uint8_t *)&counter_bdr_reg1, 1);
7741 
7742   if (ret == 0)
7743   {
7744     counter_bdr_reg1.cnt_bdr_th = (uint8_t)((val / 256U) & 0x07U);
7745     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7746                              (uint8_t *)&counter_bdr_reg1, 1);
7747   }
7748 
7749   if (ret == 0)
7750   {
7751     counter_bdr_reg2.cnt_bdr_th = (uint8_t)(val -
7752                                             (counter_bdr_reg1.cnt_bdr_th * 256U));
7753     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_COUNTER_BDR_REG2,
7754                              (uint8_t *)&counter_bdr_reg2, 1);
7755   }
7756 
7757   return ret;
7758 }
7759 
7760 /**
7761   * @brief  Batch data rate counter.[get]
7762   *
7763   * @param  ctx    Read / write interface definitions.(ptr)
7764   * @param  val    Change the values of cnt_bdr_th in reg COUNTER_BDR_REG2
7765   *                and COUNTER_BDR_REG1.
7766   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7767   *
7768   */
lsm6dsrx_batch_counter_threshold_get(const stmdev_ctx_t * ctx,uint16_t * val)7769 int32_t lsm6dsrx_batch_counter_threshold_get(const stmdev_ctx_t *ctx,
7770                                              uint16_t *val)
7771 {
7772   lsm6dsrx_counter_bdr_reg1_t counter_bdr_reg1;
7773   lsm6dsrx_counter_bdr_reg2_t counter_bdr_reg2;
7774   int32_t ret;
7775 
7776   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG1,
7777                           (uint8_t *)&counter_bdr_reg1, 1);
7778 
7779   if (ret == 0)
7780   {
7781     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_COUNTER_BDR_REG2,
7782                             (uint8_t *)&counter_bdr_reg2, 1);
7783   }
7784 
7785   *val = counter_bdr_reg1.cnt_bdr_th;
7786   *val = (*val * 256U) +  counter_bdr_reg2.cnt_bdr_th;
7787 
7788   return ret;
7789 }
7790 
7791 /**
7792   * @brief  Number of unread sensor data (TAG + 6 bytes) stored in FIFO.[get]
7793   *
7794   * @param  ctx    Read / write interface definitions.(ptr)
7795   * @param  val    Read the value of diff_fifo in reg FIFO_STATUS1 and FIFO_STATUS2
7796   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7797   *
7798   */
lsm6dsrx_fifo_data_level_get(const stmdev_ctx_t * ctx,uint16_t * val)7799 int32_t lsm6dsrx_fifo_data_level_get(const stmdev_ctx_t *ctx,
7800                                      uint16_t *val)
7801 {
7802   uint8_t reg[2];
7803   lsm6dsrx_fifo_status1_t *fifo_status1 = (lsm6dsrx_fifo_status1_t *)&reg[0];
7804   lsm6dsrx_fifo_status2_t *fifo_status2 = (lsm6dsrx_fifo_status2_t *)&reg[1];
7805   int32_t ret;
7806 
7807   /* read both FIFO_STATUS1 + FIFO_STATUS2 regs */
7808   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_STATUS1, (uint8_t *)reg, 2);
7809   if (ret == 0)
7810   {
7811     *val = fifo_status2->diff_fifo;
7812     *val = (*val * 256U) + fifo_status1->diff_fifo;
7813   }
7814 
7815   return ret;
7816 }
7817 
7818 /**
7819   * @brief  Smart FIFO status.[get]
7820   *
7821   * @param  ctx    Read / write interface definitions.(ptr)
7822   * @param  val    Read registers FIFO_STATUS2
7823   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7824   *
7825   */
lsm6dsrx_fifo_status_get(const stmdev_ctx_t * ctx,lsm6dsrx_fifo_status2_t * val)7826 int32_t lsm6dsrx_fifo_status_get(const stmdev_ctx_t *ctx,
7827                                  lsm6dsrx_fifo_status2_t *val)
7828 {
7829   uint8_t reg[2];
7830   lsm6dsrx_fifo_status2_t *fifo_status2 = (lsm6dsrx_fifo_status2_t *)&reg[1];
7831   int32_t ret;
7832 
7833   /* read both FIFO_STATUS1 + FIFO_STATUS2 regs */
7834   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_STATUS1, (uint8_t *)reg, 2);
7835   if (ret == 0)
7836   {
7837     *val = *fifo_status2;
7838   }
7839 
7840   return ret;
7841 }
7842 
7843 /**
7844   * @brief  Smart FIFO full status.[get]
7845   *
7846   * @param  ctx    Read / write interface definitions.(ptr)
7847   * @param  val    Read the values of fifo_full_ia in reg FIFO_STATUS2
7848   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7849   *
7850   */
lsm6dsrx_fifo_full_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)7851 int32_t lsm6dsrx_fifo_full_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
7852 {
7853   uint8_t reg[2];
7854   lsm6dsrx_fifo_status2_t *fifo_status2 = (lsm6dsrx_fifo_status2_t *)&reg[1];
7855   int32_t ret;
7856 
7857   /* read both FIFO_STATUS1 + FIFO_STATUS2 regs */
7858   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_STATUS1, (uint8_t *)reg, 2);
7859   if (ret == 0)
7860   {
7861     *val = fifo_status2->fifo_full_ia;
7862   }
7863 
7864   return ret;
7865 }
7866 
7867 /**
7868   * @brief  FIFO overrun status.[get]
7869   *
7870   * @param  ctx    Read / write interface definitions.(ptr)
7871   * @param  val    Read the values of  fifo_over_run_latched in
7872   *                reg FIFO_STATUS2
7873   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7874   *
7875   */
lsm6dsrx_fifo_ovr_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)7876 int32_t lsm6dsrx_fifo_ovr_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
7877 {
7878   uint8_t reg[2];
7879   lsm6dsrx_fifo_status2_t *fifo_status2 = (lsm6dsrx_fifo_status2_t *)&reg[1];
7880   int32_t ret;
7881 
7882   /* read both FIFO_STATUS1 + FIFO_STATUS2 regs */
7883   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_STATUS1, (uint8_t *)reg, 2);
7884   if (ret == 0)
7885   {
7886     *val = fifo_status2->fifo_ovr_ia;
7887   }
7888 
7889   return ret;
7890 }
7891 
7892 /**
7893   * @brief  FIFO watermark status.[get]
7894   *
7895   * @param  ctx    Read / write interface definitions.(ptr)
7896   * @param  val    Read the values of fifo_wtm_ia in reg FIFO_STATUS2
7897   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7898   *
7899   */
lsm6dsrx_fifo_wtm_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)7900 int32_t lsm6dsrx_fifo_wtm_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
7901 {
7902   uint8_t reg[2];
7903   lsm6dsrx_fifo_status2_t *fifo_status2 = (lsm6dsrx_fifo_status2_t *)&reg[1];
7904   int32_t ret;
7905 
7906   /* read both FIFO_STATUS1 + FIFO_STATUS2 regs */
7907   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_STATUS1, (uint8_t *)reg, 2);
7908   if (ret == 0)
7909   {
7910     *val = fifo_status2->fifo_wtm_ia;
7911   }
7912 
7913   return ret;
7914 }
7915 
7916 /**
7917   * @brief  Identifies the sensor in FIFO_DATA_OUT.[get]
7918   *
7919   * @param  ctx    Read / write interface definitions.(ptr)
7920   * @param  val    Change the values of tag_sensor in reg FIFO_DATA_OUT_TAG
7921   * @retval        Interface status (MANDATORY: return 0 -> no Error).
7922   *
7923   */
lsm6dsrx_fifo_sensor_tag_get(const stmdev_ctx_t * ctx,lsm6dsrx_fifo_tag_t * val)7924 int32_t lsm6dsrx_fifo_sensor_tag_get(const stmdev_ctx_t *ctx,
7925                                      lsm6dsrx_fifo_tag_t *val)
7926 {
7927   lsm6dsrx_fifo_data_out_tag_t fifo_data_out_tag;
7928   int32_t ret;
7929 
7930   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FIFO_DATA_OUT_TAG,
7931                           (uint8_t *)&fifo_data_out_tag, 1);
7932 
7933   switch (fifo_data_out_tag.tag_sensor)
7934   {
7935     case LSM6DSRX_GYRO_NC_TAG:
7936       *val = LSM6DSRX_GYRO_NC_TAG;
7937       break;
7938 
7939     case LSM6DSRX_XL_NC_TAG:
7940       *val = LSM6DSRX_XL_NC_TAG;
7941       break;
7942 
7943     case LSM6DSRX_TEMPERATURE_TAG:
7944       *val = LSM6DSRX_TEMPERATURE_TAG;
7945       break;
7946 
7947     case LSM6DSRX_TIMESTAMP_TAG:
7948       *val = LSM6DSRX_TIMESTAMP_TAG;
7949       break;
7950 
7951     case LSM6DSRX_CFG_CHANGE_TAG:
7952       *val = LSM6DSRX_CFG_CHANGE_TAG;
7953       break;
7954 
7955     case LSM6DSRX_XL_NC_T_2_TAG:
7956       *val = LSM6DSRX_XL_NC_T_2_TAG;
7957       break;
7958 
7959     case LSM6DSRX_XL_NC_T_1_TAG:
7960       *val = LSM6DSRX_XL_NC_T_1_TAG;
7961       break;
7962 
7963     case LSM6DSRX_XL_2XC_TAG:
7964       *val = LSM6DSRX_XL_2XC_TAG;
7965       break;
7966 
7967     case LSM6DSRX_XL_3XC_TAG:
7968       *val = LSM6DSRX_XL_3XC_TAG;
7969       break;
7970 
7971     case LSM6DSRX_GYRO_NC_T_2_TAG:
7972       *val = LSM6DSRX_GYRO_NC_T_2_TAG;
7973       break;
7974 
7975     case LSM6DSRX_GYRO_NC_T_1_TAG:
7976       *val = LSM6DSRX_GYRO_NC_T_1_TAG;
7977       break;
7978 
7979     case LSM6DSRX_GYRO_2XC_TAG:
7980       *val = LSM6DSRX_GYRO_2XC_TAG;
7981       break;
7982 
7983     case LSM6DSRX_GYRO_3XC_TAG:
7984       *val = LSM6DSRX_GYRO_3XC_TAG;
7985       break;
7986 
7987     case LSM6DSRX_SENSORHUB_SLAVE0_TAG:
7988       *val = LSM6DSRX_SENSORHUB_SLAVE0_TAG;
7989       break;
7990 
7991     case LSM6DSRX_SENSORHUB_SLAVE1_TAG:
7992       *val = LSM6DSRX_SENSORHUB_SLAVE1_TAG;
7993       break;
7994 
7995     case LSM6DSRX_SENSORHUB_SLAVE2_TAG:
7996       *val = LSM6DSRX_SENSORHUB_SLAVE2_TAG;
7997       break;
7998 
7999     case LSM6DSRX_SENSORHUB_SLAVE3_TAG:
8000       *val = LSM6DSRX_SENSORHUB_SLAVE3_TAG;
8001       break;
8002 
8003     case LSM6DSRX_STEP_CPUNTER_TAG:
8004       *val = LSM6DSRX_STEP_CPUNTER_TAG;
8005       break;
8006 
8007     case LSM6DSRX_GAME_ROTATION_TAG:
8008       *val = LSM6DSRX_GAME_ROTATION_TAG;
8009       break;
8010 
8011     case LSM6DSRX_GEOMAG_ROTATION_TAG:
8012       *val = LSM6DSRX_GEOMAG_ROTATION_TAG;
8013       break;
8014 
8015     case LSM6DSRX_ROTATION_TAG:
8016       *val = LSM6DSRX_ROTATION_TAG;
8017       break;
8018 
8019     case LSM6DSRX_SENSORHUB_NACK_TAG:
8020       *val = LSM6DSRX_SENSORHUB_NACK_TAG;
8021       break;
8022 
8023     default:
8024       *val = LSM6DSRX_SENSORHUB_NACK_TAG;
8025       break;
8026   }
8027 
8028   return ret;
8029 }
8030 
8031 /**
8032   * @brief  Enable FIFO batching of pedometer embedded function values.[set]
8033   *
8034   * @param  ctx    Read / write interface definitions.(ptr)
8035   * @param  val    Change the values of gbias_fifo_en in
8036   *                reg LSM6DSRX_EMB_FUNC_FIFO_CFG
8037   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8038   *
8039   */
lsm6dsrx_fifo_pedo_batch_set(const stmdev_ctx_t * ctx,uint8_t val)8040 int32_t lsm6dsrx_fifo_pedo_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
8041 {
8042   lsm6dsrx_emb_func_fifo_cfg_t emb_func_fifo_cfg;
8043   int32_t ret;
8044 
8045   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
8046 
8047   if (ret == 0)
8048   {
8049     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_FIFO_CFG,
8050                             (uint8_t *)&emb_func_fifo_cfg, 1);
8051   }
8052 
8053   if (ret == 0)
8054   {
8055     emb_func_fifo_cfg.pedo_fifo_en = (uint8_t)val;
8056     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_FIFO_CFG,
8057                              (uint8_t *)&emb_func_fifo_cfg, 1);
8058   }
8059 
8060   if (ret == 0)
8061   {
8062     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8063   }
8064 
8065   return ret;
8066 }
8067 
8068 /**
8069   * @brief  Enable FIFO batching of pedometer embedded function values.[get]
8070   *
8071   * @param  ctx    Read / write interface definitions.(ptr)
8072   * @param  val    Change the values of pedo_fifo_en in reg
8073   *                LSM6DSRX_EMB_FUNC_FIFO_CFG
8074   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8075   *
8076   */
lsm6dsrx_fifo_pedo_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)8077 int32_t lsm6dsrx_fifo_pedo_batch_get(const stmdev_ctx_t *ctx,
8078                                      uint8_t *val)
8079 {
8080   lsm6dsrx_emb_func_fifo_cfg_t emb_func_fifo_cfg;
8081   int32_t ret;
8082 
8083   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
8084 
8085   if (ret == 0)
8086   {
8087     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_FIFO_CFG,
8088                             (uint8_t *)&emb_func_fifo_cfg, 1);
8089     *val = emb_func_fifo_cfg.pedo_fifo_en;
8090   }
8091 
8092   if (ret == 0)
8093   {
8094     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8095   }
8096 
8097   return ret;
8098 }
8099 
8100 /**
8101   * @brief  Enable FIFO batching data of first slave.[set]
8102   *
8103   * @param  ctx    Read / write interface definitions.(ptr)
8104   * @param  val    Change the values of  batch_ext_sens_0_en in reg SLV0_CONFIG
8105   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8106   *
8107   */
lsm6dsrx_sh_batch_slave_0_set(const stmdev_ctx_t * ctx,uint8_t val)8108 int32_t lsm6dsrx_sh_batch_slave_0_set(const stmdev_ctx_t *ctx,
8109                                       uint8_t val)
8110 {
8111   lsm6dsrx_slv0_config_t slv0_config;
8112   int32_t ret;
8113 
8114   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8115 
8116   if (ret == 0)
8117   {
8118     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV0_CONFIG,
8119                             (uint8_t *)&slv0_config, 1);
8120   }
8121 
8122   if (ret == 0)
8123   {
8124     slv0_config. batch_ext_sens_0_en = (uint8_t)val;
8125     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_CONFIG,
8126                              (uint8_t *)&slv0_config, 1);
8127   }
8128 
8129   if (ret == 0)
8130   {
8131     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8132   }
8133 
8134   return ret;
8135 }
8136 
8137 /**
8138   * @brief  Enable FIFO batching data of first slave.[get]
8139   *
8140   * @param  ctx    Read / write interface definitions.(ptr)
8141   * @param  val    Change the values of  batch_ext_sens_0_en in
8142   *                reg SLV0_CONFIG
8143   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8144   *
8145   */
lsm6dsrx_sh_batch_slave_0_get(const stmdev_ctx_t * ctx,uint8_t * val)8146 int32_t lsm6dsrx_sh_batch_slave_0_get(const stmdev_ctx_t *ctx,
8147                                       uint8_t *val)
8148 {
8149   lsm6dsrx_slv0_config_t slv0_config;
8150   int32_t ret;
8151 
8152   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8153 
8154   if (ret == 0)
8155   {
8156     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV0_CONFIG,
8157                             (uint8_t *)&slv0_config, 1);
8158   }
8159 
8160   if (ret == 0)
8161   {
8162     *val = slv0_config. batch_ext_sens_0_en;
8163     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8164   }
8165 
8166   return ret;
8167 }
8168 
8169 /**
8170   * @brief  Enable FIFO batching data of second slave.[set]
8171   *
8172   * @param  ctx    Read / write interface definitions.(ptr)
8173   * @param  val    Change the values of  batch_ext_sens_1_en in
8174   *                reg SLV1_CONFIG
8175   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8176   *
8177   */
lsm6dsrx_sh_batch_slave_1_set(const stmdev_ctx_t * ctx,uint8_t val)8178 int32_t lsm6dsrx_sh_batch_slave_1_set(const stmdev_ctx_t *ctx,
8179                                       uint8_t val)
8180 {
8181   lsm6dsrx_slv1_config_t slv1_config;
8182   int32_t ret;
8183 
8184   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8185 
8186   if (ret == 0)
8187   {
8188     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV1_CONFIG,
8189                             (uint8_t *)&slv1_config, 1);
8190   }
8191 
8192   if (ret == 0)
8193   {
8194     slv1_config. batch_ext_sens_1_en = (uint8_t)val;
8195     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV1_CONFIG,
8196                              (uint8_t *)&slv1_config, 1);
8197   }
8198 
8199   if (ret == 0)
8200   {
8201     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8202   }
8203 
8204   return ret;
8205 }
8206 
8207 /**
8208   * @brief  Enable FIFO batching data of second slave.[get]
8209   *
8210   * @param  ctx    Read / write interface definitions.(ptr)
8211   * @param  val    Change the values of  batch_ext_sens_1_en in
8212   *                reg SLV1_CONFIG
8213   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8214   *
8215   */
lsm6dsrx_sh_batch_slave_1_get(const stmdev_ctx_t * ctx,uint8_t * val)8216 int32_t lsm6dsrx_sh_batch_slave_1_get(const stmdev_ctx_t *ctx,
8217                                       uint8_t *val)
8218 {
8219   lsm6dsrx_slv1_config_t slv1_config;
8220   int32_t ret;
8221 
8222   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8223 
8224   if (ret == 0)
8225   {
8226     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV1_CONFIG,
8227                             (uint8_t *)&slv1_config, 1);
8228     *val = slv1_config. batch_ext_sens_1_en;
8229   }
8230 
8231   if (ret == 0)
8232   {
8233     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8234   }
8235 
8236   return ret;
8237 }
8238 
8239 /**
8240   * @brief  Enable FIFO batching data of third slave.[set]
8241   *
8242   * @param  ctx    Read / write interface definitions.(ptr)
8243   * @param  val    Change the values of  batch_ext_sens_2_en in
8244   *                reg SLV2_CONFIG
8245   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8246   *
8247   */
lsm6dsrx_sh_batch_slave_2_set(const stmdev_ctx_t * ctx,uint8_t val)8248 int32_t lsm6dsrx_sh_batch_slave_2_set(const stmdev_ctx_t *ctx,
8249                                       uint8_t val)
8250 {
8251   lsm6dsrx_slv2_config_t slv2_config;
8252   int32_t ret;
8253 
8254   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8255 
8256   if (ret == 0)
8257   {
8258     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV2_CONFIG,
8259                             (uint8_t *)&slv2_config, 1);
8260   }
8261 
8262   if (ret == 0)
8263   {
8264     slv2_config. batch_ext_sens_2_en = (uint8_t)val;
8265     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV2_CONFIG,
8266                              (uint8_t *)&slv2_config, 1);
8267   }
8268 
8269   if (ret == 0)
8270   {
8271     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8272   }
8273 
8274   return ret;
8275 }
8276 
8277 /**
8278   * @brief  Enable FIFO batching data of third slave.[get]
8279   *
8280   * @param  ctx    Read / write interface definitions.(ptr)
8281   * @param  val    Change the values of  batch_ext_sens_2_en in
8282   *                reg SLV2_CONFIG
8283   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8284   *
8285   */
lsm6dsrx_sh_batch_slave_2_get(const stmdev_ctx_t * ctx,uint8_t * val)8286 int32_t lsm6dsrx_sh_batch_slave_2_get(const stmdev_ctx_t *ctx,
8287                                       uint8_t *val)
8288 {
8289   lsm6dsrx_slv2_config_t slv2_config;
8290   int32_t ret;
8291 
8292   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8293 
8294   if (ret == 0)
8295   {
8296     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV2_CONFIG,
8297                             (uint8_t *)&slv2_config, 1);
8298   }
8299 
8300   if (ret == 0)
8301   {
8302     *val = slv2_config. batch_ext_sens_2_en;
8303     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8304   }
8305 
8306   return ret;
8307 }
8308 
8309 /**
8310   * @brief  Enable FIFO batching data of fourth slave.[set]
8311   *
8312   * @param  ctx    Read / write interface definitions.(ptr)
8313   * @param  val    Change the values of  batch_ext_sens_3_en in
8314   *                reg SLV3_CONFIG
8315   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8316   *
8317   */
lsm6dsrx_sh_batch_slave_3_set(const stmdev_ctx_t * ctx,uint8_t val)8318 int32_t lsm6dsrx_sh_batch_slave_3_set(const stmdev_ctx_t *ctx,
8319                                       uint8_t val)
8320 {
8321   lsm6dsrx_slv3_config_t slv3_config;
8322   int32_t ret;
8323 
8324   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8325 
8326   if (ret == 0)
8327   {
8328     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV3_CONFIG,
8329                             (uint8_t *)&slv3_config, 1);
8330   }
8331 
8332   if (ret == 0)
8333   {
8334     slv3_config. batch_ext_sens_3_en = (uint8_t)val;
8335     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV3_CONFIG,
8336                              (uint8_t *)&slv3_config, 1);
8337   }
8338 
8339   if (ret == 0)
8340   {
8341     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8342   }
8343 
8344   return ret;
8345 }
8346 
8347 /**
8348   * @brief  Enable FIFO batching data of fourth slave.[get]
8349   *
8350   * @param  ctx    Read / write interface definitions.(ptr)
8351   * @param  val    Change the values of  batch_ext_sens_3_en in
8352   *                reg SLV3_CONFIG
8353   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8354   *
8355   */
lsm6dsrx_sh_batch_slave_3_get(const stmdev_ctx_t * ctx,uint8_t * val)8356 int32_t lsm6dsrx_sh_batch_slave_3_get(const stmdev_ctx_t *ctx,
8357                                       uint8_t *val)
8358 {
8359   lsm6dsrx_slv3_config_t slv3_config;
8360   int32_t ret;
8361 
8362   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
8363 
8364   if (ret == 0)
8365   {
8366     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV3_CONFIG,
8367                             (uint8_t *)&slv3_config, 1);
8368     *val = slv3_config. batch_ext_sens_3_en;
8369   }
8370 
8371   if (ret == 0)
8372   {
8373     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8374   }
8375 
8376   return ret;
8377 }
8378 
8379 /**
8380   * @}
8381   *
8382   */
8383 
8384 /**
8385   * @defgroup   LSM6DSRX_DEN_functionality
8386   * @brief      This section groups all the functions concerning
8387   *             DEN functionality.
8388   * @{
8389   *
8390   */
8391 
8392 /**
8393   * @brief  DEN functionality marking mode.[set]
8394   *
8395   * @param  ctx    Read / write interface definitions.(ptr)
8396   * @param  val    Change the values of den_mode in reg CTRL6_C
8397   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8398   *
8399   */
lsm6dsrx_den_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_den_mode_t val)8400 int32_t lsm6dsrx_den_mode_set(const stmdev_ctx_t *ctx,
8401                               lsm6dsrx_den_mode_t val)
8402 {
8403   lsm6dsrx_ctrl6_c_t ctrl6_c;
8404   int32_t ret;
8405 
8406   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
8407                           (uint8_t *)&ctrl6_c, 1);
8408 
8409   if (ret == 0)
8410   {
8411     ctrl6_c.den_mode = (uint8_t)val;
8412     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL6_C,
8413                              (uint8_t *)&ctrl6_c, 1);
8414   }
8415 
8416   return ret;
8417 }
8418 
8419 /**
8420   * @brief  DEN functionality marking mode.[get]
8421   *
8422   * @param  ctx    Read / write interface definitions.(ptr)
8423   * @param  val    Get the values of den_mode in reg CTRL6_C
8424   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8425   *
8426   */
lsm6dsrx_den_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_den_mode_t * val)8427 int32_t lsm6dsrx_den_mode_get(const stmdev_ctx_t *ctx,
8428                               lsm6dsrx_den_mode_t *val)
8429 {
8430   lsm6dsrx_ctrl6_c_t ctrl6_c;
8431   int32_t ret;
8432 
8433   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL6_C,
8434                           (uint8_t *)&ctrl6_c, 1);
8435 
8436   switch (ctrl6_c.den_mode)
8437   {
8438     case LSM6DSRX_DEN_DISABLE:
8439       *val = LSM6DSRX_DEN_DISABLE;
8440       break;
8441 
8442     case LSM6DSRX_LEVEL_FIFO:
8443       *val = LSM6DSRX_LEVEL_FIFO;
8444       break;
8445 
8446     case LSM6DSRX_LEVEL_LETCHED:
8447       *val = LSM6DSRX_LEVEL_LETCHED;
8448       break;
8449 
8450     case LSM6DSRX_LEVEL_TRIGGER:
8451       *val = LSM6DSRX_LEVEL_TRIGGER;
8452       break;
8453 
8454     case LSM6DSRX_EDGE_TRIGGER:
8455       *val = LSM6DSRX_EDGE_TRIGGER;
8456       break;
8457 
8458     default:
8459       *val = LSM6DSRX_DEN_DISABLE;
8460       break;
8461   }
8462 
8463   return ret;
8464 }
8465 
8466 /**
8467   * @brief  DEN active level configuration.[set]
8468   *
8469   * @param  ctx    Read / write interface definitions.(ptr)
8470   * @param  val    Change the values of den_lh in reg CTRL9_XL
8471   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8472   *
8473   */
lsm6dsrx_den_polarity_set(const stmdev_ctx_t * ctx,lsm6dsrx_den_lh_t val)8474 int32_t lsm6dsrx_den_polarity_set(const stmdev_ctx_t *ctx,
8475                                   lsm6dsrx_den_lh_t val)
8476 {
8477   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8478   int32_t ret;
8479 
8480   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8481                           (uint8_t *)&ctrl9_xl, 1);
8482 
8483   if (ret == 0)
8484   {
8485     ctrl9_xl.den_lh = (uint8_t)val;
8486     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
8487                              (uint8_t *)&ctrl9_xl, 1);
8488   }
8489 
8490   return ret;
8491 }
8492 
8493 /**
8494   * @brief  DEN active level configuration.[get]
8495   *
8496   * @param  ctx    Read / write interface definitions.(ptr)
8497   * @param  val    Get the values of den_lh in reg CTRL9_XL
8498   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8499   *
8500   */
lsm6dsrx_den_polarity_get(const stmdev_ctx_t * ctx,lsm6dsrx_den_lh_t * val)8501 int32_t lsm6dsrx_den_polarity_get(const stmdev_ctx_t *ctx,
8502                                   lsm6dsrx_den_lh_t *val)
8503 {
8504   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8505   int32_t ret;
8506 
8507   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8508                           (uint8_t *)&ctrl9_xl, 1);
8509 
8510   switch (ctrl9_xl.den_lh)
8511   {
8512     case LSM6DSRX_DEN_ACT_LOW:
8513       *val = LSM6DSRX_DEN_ACT_LOW;
8514       break;
8515 
8516     case LSM6DSRX_DEN_ACT_HIGH:
8517       *val = LSM6DSRX_DEN_ACT_HIGH;
8518       break;
8519 
8520     default:
8521       *val = LSM6DSRX_DEN_ACT_LOW;
8522       break;
8523   }
8524 
8525   return ret;
8526 }
8527 
8528 /**
8529   * @brief  DEN configuration.[set]
8530   *
8531   * @param  ctx    Read / write interface definitions.(ptr)
8532   * @param  val    Change the values of den_xl_g in reg CTRL9_XL
8533   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8534   *
8535   */
lsm6dsrx_den_enable_set(const stmdev_ctx_t * ctx,lsm6dsrx_den_xl_g_t val)8536 int32_t lsm6dsrx_den_enable_set(const stmdev_ctx_t *ctx,
8537                                 lsm6dsrx_den_xl_g_t val)
8538 {
8539   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8540   int32_t ret;
8541 
8542   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8543                           (uint8_t *)&ctrl9_xl, 1);
8544 
8545   if (ret == 0)
8546   {
8547     ctrl9_xl.den_xl_g = (uint8_t)val;
8548     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
8549                              (uint8_t *)&ctrl9_xl, 1);
8550   }
8551 
8552   return ret;
8553 }
8554 
8555 /**
8556   * @brief  DEN configuration.[get]
8557   *
8558   * @param  ctx    Read / write interface definitions.(ptr)
8559   * @param  val    Get the values of den_xl_g in reg CTRL9_XL
8560   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8561   *
8562   */
lsm6dsrx_den_enable_get(const stmdev_ctx_t * ctx,lsm6dsrx_den_xl_g_t * val)8563 int32_t lsm6dsrx_den_enable_get(const stmdev_ctx_t *ctx,
8564                                 lsm6dsrx_den_xl_g_t *val)
8565 {
8566   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8567   int32_t ret;
8568 
8569   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8570                           (uint8_t *)&ctrl9_xl, 1);
8571 
8572   switch (ctrl9_xl.den_xl_g)
8573   {
8574     case LSM6DSRX_STAMP_IN_GY_DATA:
8575       *val = LSM6DSRX_STAMP_IN_GY_DATA;
8576       break;
8577 
8578     case LSM6DSRX_STAMP_IN_XL_DATA:
8579       *val = LSM6DSRX_STAMP_IN_XL_DATA;
8580       break;
8581 
8582     case LSM6DSRX_STAMP_IN_GY_XL_DATA:
8583       *val = LSM6DSRX_STAMP_IN_GY_XL_DATA;
8584       break;
8585 
8586     default:
8587       *val = LSM6DSRX_STAMP_IN_GY_DATA;
8588       break;
8589   }
8590 
8591   return ret;
8592 }
8593 
8594 /**
8595   * @brief  DEN value stored in LSB of X-axis.[set]
8596   *
8597   * @param  ctx    Read / write interface definitions.(ptr)
8598   * @param  val    Change the values of den_z in reg CTRL9_XL
8599   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8600   *
8601   */
lsm6dsrx_den_mark_axis_x_set(const stmdev_ctx_t * ctx,uint8_t val)8602 int32_t lsm6dsrx_den_mark_axis_x_set(const stmdev_ctx_t *ctx, uint8_t val)
8603 {
8604   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8605   int32_t ret;
8606 
8607   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8608                           (uint8_t *)&ctrl9_xl, 1);
8609 
8610   if (ret == 0)
8611   {
8612     ctrl9_xl.den_z = (uint8_t)val;
8613     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
8614                              (uint8_t *)&ctrl9_xl, 1);
8615   }
8616 
8617   return ret;
8618 }
8619 
8620 /**
8621   * @brief  DEN value stored in LSB of X-axis.[get]
8622   *
8623   * @param  ctx    Read / write interface definitions.(ptr)
8624   * @param  val    Change the values of den_z in reg CTRL9_XL
8625   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8626   *
8627   */
lsm6dsrx_den_mark_axis_x_get(const stmdev_ctx_t * ctx,uint8_t * val)8628 int32_t lsm6dsrx_den_mark_axis_x_get(const stmdev_ctx_t *ctx,
8629                                      uint8_t *val)
8630 {
8631   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8632   int32_t ret;
8633 
8634   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8635                           (uint8_t *)&ctrl9_xl, 1);
8636   *val = ctrl9_xl.den_z;
8637 
8638   return ret;
8639 }
8640 
8641 /**
8642   * @brief  DEN value stored in LSB of Y-axis.[set]
8643   *
8644   * @param  ctx    Read / write interface definitions.(ptr)
8645   * @param  val    Change the values of den_y in reg CTRL9_XL
8646   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8647   *
8648   */
lsm6dsrx_den_mark_axis_y_set(const stmdev_ctx_t * ctx,uint8_t val)8649 int32_t lsm6dsrx_den_mark_axis_y_set(const stmdev_ctx_t *ctx, uint8_t val)
8650 {
8651   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8652   int32_t ret;
8653 
8654   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8655                           (uint8_t *)&ctrl9_xl, 1);
8656 
8657   if (ret == 0)
8658   {
8659     ctrl9_xl.den_y = (uint8_t)val;
8660     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
8661                              (uint8_t *)&ctrl9_xl, 1);
8662   }
8663 
8664   return ret;
8665 }
8666 
8667 /**
8668   * @brief  DEN value stored in LSB of Y-axis.[get]
8669   *
8670   * @param  ctx    Read / write interface definitions.(ptr)
8671   * @param  val    Change the values of den_y in reg CTRL9_XL
8672   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8673   *
8674   */
lsm6dsrx_den_mark_axis_y_get(const stmdev_ctx_t * ctx,uint8_t * val)8675 int32_t lsm6dsrx_den_mark_axis_y_get(const stmdev_ctx_t *ctx,
8676                                      uint8_t *val)
8677 {
8678   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8679   int32_t ret;
8680 
8681   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8682                           (uint8_t *)&ctrl9_xl, 1);
8683   *val = ctrl9_xl.den_y;
8684 
8685   return ret;
8686 }
8687 
8688 /**
8689   * @brief  DEN value stored in LSB of Z-axis.[set]
8690   *
8691   * @param  ctx    Read / write interface definitions.(ptr)
8692   * @param  val    Change the values of den_x in reg CTRL9_XL
8693   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8694   *
8695   */
lsm6dsrx_den_mark_axis_z_set(const stmdev_ctx_t * ctx,uint8_t val)8696 int32_t lsm6dsrx_den_mark_axis_z_set(const stmdev_ctx_t *ctx, uint8_t val)
8697 {
8698   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8699   int32_t ret;
8700 
8701   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8702                           (uint8_t *)&ctrl9_xl, 1);
8703 
8704   if (ret == 0)
8705   {
8706     ctrl9_xl.den_x = (uint8_t)val;
8707     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_CTRL9_XL,
8708                              (uint8_t *)&ctrl9_xl, 1);
8709   }
8710 
8711   return ret;
8712 }
8713 
8714 /**
8715   * @brief  DEN value stored in LSB of Z-axis.[get]
8716   *
8717   * @param  ctx    Read / write interface definitions.(ptr)
8718   * @param  val    Change the values of den_x in reg CTRL9_XL
8719   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8720   *
8721   */
lsm6dsrx_den_mark_axis_z_get(const stmdev_ctx_t * ctx,uint8_t * val)8722 int32_t lsm6dsrx_den_mark_axis_z_get(const stmdev_ctx_t *ctx,
8723                                      uint8_t *val)
8724 {
8725   lsm6dsrx_ctrl9_xl_t ctrl9_xl;
8726   int32_t ret;
8727 
8728   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_CTRL9_XL,
8729                           (uint8_t *)&ctrl9_xl, 1);
8730   *val = ctrl9_xl.den_x;
8731 
8732   return ret;
8733 }
8734 
8735 /**
8736   * @}
8737   *
8738   */
8739 
8740 /**
8741   * @defgroup   LSM6DSRX_Pedometer
8742   * @brief      This section groups all the functions that manage pedometer.
8743   * @{
8744   *
8745   */
8746 
8747 /**
8748   * @brief  Enable pedometer algorithm.[set]
8749   *
8750   * @param  ctx    Read / write interface definitions.(ptr)
8751   * @param  val    Change the values of pedo_en in reg EMB_FUNC_EN_A
8752   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8753   *
8754   */
lsm6dsrx_pedo_sens_set(const stmdev_ctx_t * ctx,uint8_t val)8755 int32_t lsm6dsrx_pedo_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
8756 {
8757   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
8758   int32_t ret;
8759 
8760   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
8761 
8762   if (ret == 0)
8763   {
8764     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
8765                             (uint8_t *)&emb_func_en_a, 1);
8766   }
8767 
8768   if (ret == 0)
8769   {
8770     emb_func_en_a.pedo_en = (uint8_t)val;
8771     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
8772                              (uint8_t *)&emb_func_en_a, 1);
8773   }
8774 
8775   if (ret == 0)
8776   {
8777     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8778   }
8779 
8780   return ret;
8781 }
8782 
8783 /**
8784   * @brief  Enable pedometer algorithm.[get]
8785   *
8786   * @param  ctx    Read / write interface definitions.(ptr)
8787   * @param  val    Change the values of pedo_en in reg EMB_FUNC_EN_A
8788   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8789   *
8790   */
lsm6dsrx_pedo_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)8791 int32_t lsm6dsrx_pedo_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
8792 {
8793   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
8794   int32_t ret;
8795 
8796   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
8797 
8798   if (ret == 0)
8799   {
8800     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
8801                             (uint8_t *)&emb_func_en_a, 1);
8802     *val = emb_func_en_a.pedo_en;
8803   }
8804 
8805   if (ret == 0)
8806   {
8807     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8808   }
8809 
8810   return ret;
8811 }
8812 
8813 /**
8814   * @brief  Interrupt status bit for step detection.[get]
8815   *
8816   * @param  ctx    Read / write interface definitions.(ptr)
8817   * @param  val    Change the values of is_step_det in reg EMB_FUNC_STATUS
8818   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8819   *
8820   */
lsm6dsrx_pedo_step_detect_get(const stmdev_ctx_t * ctx,uint8_t * val)8821 int32_t lsm6dsrx_pedo_step_detect_get(const stmdev_ctx_t *ctx,
8822                                       uint8_t *val)
8823 {
8824   lsm6dsrx_emb_func_status_t emb_func_status;
8825   int32_t ret;
8826 
8827   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
8828 
8829   if (ret == 0)
8830   {
8831     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_STATUS,
8832                             (uint8_t *)&emb_func_status, 1);
8833     *val = emb_func_status.is_step_det;
8834   }
8835 
8836   if (ret == 0)
8837   {
8838     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
8839   }
8840 
8841   return ret;
8842 }
8843 
8844 /**
8845   * @brief  Pedometer debounce configuration register (r/w).[set]
8846   *
8847   * @param  ctx    Read / write interface definitions.(ptr)
8848   * @param  buff   Buffer that contains data to write
8849   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8850   *
8851   */
lsm6dsrx_pedo_debounce_steps_set(const stmdev_ctx_t * ctx,uint8_t * buff)8852 int32_t lsm6dsrx_pedo_debounce_steps_set(const stmdev_ctx_t *ctx,
8853                                          uint8_t *buff)
8854 {
8855   int32_t ret;
8856 
8857   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_PEDO_DEB_STEPS_CONF,
8858                                   buff);
8859 
8860   return ret;
8861 }
8862 
8863 /**
8864   * @brief  Pedometer debounce configuration register (r/w).[get]
8865   *
8866   * @param  ctx    Read / write interface definitions.(ptr)
8867   * @param  buff   Buffer that stores data read
8868   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8869   *
8870   */
lsm6dsrx_pedo_debounce_steps_get(const stmdev_ctx_t * ctx,uint8_t * buff)8871 int32_t lsm6dsrx_pedo_debounce_steps_get(const stmdev_ctx_t *ctx,
8872                                          uint8_t *buff)
8873 {
8874   int32_t ret;
8875 
8876   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_PEDO_DEB_STEPS_CONF,
8877                                  buff);
8878 
8879   return ret;
8880 }
8881 
8882 /**
8883   * @brief  Time period register for step detection on delta time (r/w).[set]
8884   *
8885   * @param  ctx    Read / write interface definitions.(ptr)
8886   * @param  buff   Buffer that contains data to write
8887   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8888   *
8889   */
lsm6dsrx_pedo_steps_period_set(const stmdev_ctx_t * ctx,uint16_t val)8890 int32_t lsm6dsrx_pedo_steps_period_set(const stmdev_ctx_t *ctx,
8891                                        uint16_t val)
8892 {
8893   uint8_t buff[2];
8894   int32_t ret;
8895 
8896   buff[1] = (uint8_t)(val / 256U);
8897   buff[0] = (uint8_t)(val - (buff[1] * 256U));
8898   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_PEDO_SC_DELTAT_L,
8899                                   &buff[0]);
8900 
8901   if (ret == 0)
8902   {
8903     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_PEDO_SC_DELTAT_H,
8904                                     &buff[1]);
8905   }
8906 
8907   return ret;
8908 }
8909 
8910 /**
8911   * @brief  Time period register for step detection on delta time (r/w).[get]
8912   *
8913   * @param  ctx    Read / write interface definitions.(ptr)
8914   * @param  buff   Buffer that stores data read
8915   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8916   *
8917   */
lsm6dsrx_pedo_steps_period_get(const stmdev_ctx_t * ctx,uint16_t * val)8918 int32_t lsm6dsrx_pedo_steps_period_get(const stmdev_ctx_t *ctx,
8919                                        uint16_t *val)
8920 {
8921   uint8_t buff[2];
8922   int32_t ret;
8923 
8924   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_PEDO_SC_DELTAT_L,
8925                                  &buff[0]);
8926 
8927   if (ret == 0)
8928   {
8929     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_PEDO_SC_DELTAT_H,
8930                                    &buff[1]);
8931     *val = buff[1];
8932     *val = (*val * 256U) +  buff[0];
8933   }
8934 
8935   return ret;
8936 }
8937 
8938 /**
8939   * @brief  Set when user wants to generate interrupt on count overflow
8940   *         event/every step.[set]
8941   *
8942   * @param  ctx    Read / write interface definitions.(ptr)
8943   * @param  val    Change the values of carry_count_en in reg PEDO_CMD_REG
8944   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8945   *
8946   */
lsm6dsrx_pedo_int_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_carry_count_en_t val)8947 int32_t lsm6dsrx_pedo_int_mode_set(const stmdev_ctx_t *ctx,
8948                                    lsm6dsrx_carry_count_en_t val)
8949 {
8950   lsm6dsrx_pedo_cmd_reg_t pedo_cmd_reg;
8951   int32_t ret;
8952 
8953   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_PEDO_CMD_REG,
8954                                  (uint8_t *)&pedo_cmd_reg);
8955 
8956   if (ret == 0)
8957   {
8958     pedo_cmd_reg.carry_count_en = (uint8_t)val;
8959     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_PEDO_CMD_REG,
8960                                     (uint8_t *)&pedo_cmd_reg);
8961   }
8962 
8963   return ret;
8964 }
8965 
8966 /**
8967   * @brief  Set when user wants to generate interrupt on count overflow
8968   *         event/every step.[get]
8969   *
8970   * @param  ctx    Read / write interface definitions.(ptr)
8971   * @param  val    Get the values of carry_count_en in reg PEDO_CMD_REG
8972   * @retval        Interface status (MANDATORY: return 0 -> no Error).
8973   *
8974   */
lsm6dsrx_pedo_int_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_carry_count_en_t * val)8975 int32_t lsm6dsrx_pedo_int_mode_get(const stmdev_ctx_t *ctx,
8976                                    lsm6dsrx_carry_count_en_t *val)
8977 {
8978   lsm6dsrx_pedo_cmd_reg_t pedo_cmd_reg;
8979   int32_t ret;
8980 
8981   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_PEDO_CMD_REG,
8982                                  (uint8_t *)&pedo_cmd_reg);
8983 
8984   switch (pedo_cmd_reg.carry_count_en)
8985   {
8986     case LSM6DSRX_EVERY_STEP:
8987       *val = LSM6DSRX_EVERY_STEP;
8988       break;
8989 
8990     case LSM6DSRX_COUNT_OVERFLOW:
8991       *val = LSM6DSRX_COUNT_OVERFLOW;
8992       break;
8993 
8994     default:
8995       *val = LSM6DSRX_EVERY_STEP;
8996       break;
8997   }
8998 
8999   return ret;
9000 }
9001 
9002 /**
9003   * @}
9004   *
9005   */
9006 
9007 /**
9008   * @defgroup   LSM6DSRX_significant_motion
9009   * @brief      This section groups all the functions that manage the
9010   *             significant motion detection.
9011   * @{
9012   *
9013   */
9014 
9015 /**
9016   * @brief  Enable significant motion detection function.[set]
9017   *
9018   * @param  ctx    Read / write interface definitions.(ptr)
9019   * @param  val    Change the values of sign_motion_en in reg EMB_FUNC_EN_A
9020   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9021   *
9022   */
lsm6dsrx_motion_sens_set(const stmdev_ctx_t * ctx,uint8_t val)9023 int32_t lsm6dsrx_motion_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
9024 {
9025   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
9026   int32_t ret;
9027 
9028   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9029 
9030   if (ret == 0)
9031   {
9032     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9033                             (uint8_t *)&emb_func_en_a, 1);
9034   }
9035 
9036   if (ret == 0)
9037   {
9038     emb_func_en_a.sign_motion_en = (uint8_t)val;
9039     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9040                              (uint8_t *)&emb_func_en_a, 1);
9041   }
9042 
9043   if (ret == 0)
9044   {
9045     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9046   }
9047 
9048   return ret;
9049 }
9050 
9051 /**
9052   * @brief  Enable significant motion detection function.[get]
9053   *
9054   * @param  ctx    Read / write interface definitions.(ptr)
9055   * @param  val    Change the values of sign_motion_en in reg EMB_FUNC_EN_A
9056   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9057   *
9058   */
lsm6dsrx_motion_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)9059 int32_t lsm6dsrx_motion_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
9060 {
9061   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
9062   int32_t ret;
9063 
9064   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9065 
9066   if (ret == 0)
9067   {
9068     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9069                             (uint8_t *)&emb_func_en_a, 1);
9070   }
9071 
9072   if (ret == 0)
9073   {
9074     *val = emb_func_en_a.sign_motion_en;
9075     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9076   }
9077 
9078   return ret;
9079 }
9080 
9081 /**
9082   * @brief  Interrupt status bit for significant motion detection.[get]
9083   *
9084   * @param  ctx    Read / write interface definitions.(ptr)
9085   * @param  val    Change the values of is_sigmot in reg EMB_FUNC_STATUS
9086   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9087   *
9088   */
lsm6dsrx_motion_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)9089 int32_t lsm6dsrx_motion_flag_data_ready_get(const stmdev_ctx_t *ctx,
9090                                             uint8_t *val)
9091 {
9092   lsm6dsrx_emb_func_status_t emb_func_status;
9093   int32_t ret;
9094 
9095   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9096 
9097   if (ret == 0)
9098   {
9099     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_STATUS,
9100                             (uint8_t *)&emb_func_status, 1);
9101   }
9102 
9103   if (ret == 0)
9104   {
9105     *val = emb_func_status.is_sigmot;
9106     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9107   }
9108 
9109   return ret;
9110 }
9111 
9112 /**
9113   * @}
9114   *
9115   */
9116 
9117 /**
9118   * @defgroup   LSM6DSRX_tilt_detection
9119   * @brief      This section groups all the functions that manage the tilt
9120   *             event detection.
9121   * @{
9122   *
9123   */
9124 
9125 /**
9126   * @brief  Enable tilt calculation.[set]
9127   *
9128   * @param  ctx    Read / write interface definitions.(ptr)
9129   * @param  val    Change the values of tilt_en in reg EMB_FUNC_EN_A
9130   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9131   *
9132   */
lsm6dsrx_tilt_sens_set(const stmdev_ctx_t * ctx,uint8_t val)9133 int32_t lsm6dsrx_tilt_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
9134 {
9135   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
9136   int32_t ret;
9137 
9138   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9139 
9140   if (ret == 0)
9141   {
9142     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9143                             (uint8_t *)&emb_func_en_a, 1);
9144   }
9145 
9146   if (ret == 0)
9147   {
9148     emb_func_en_a.tilt_en = (uint8_t)val;
9149     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9150                              (uint8_t *)&emb_func_en_a, 1);
9151   }
9152 
9153   if (ret == 0)
9154   {
9155     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9156   }
9157 
9158   return ret;
9159 }
9160 
9161 /**
9162   * @brief  Enable tilt calculation.[get]
9163   *
9164   * @param  ctx    Read / write interface definitions.(ptr)
9165   * @param  val    Change the values of tilt_en in reg EMB_FUNC_EN_A
9166   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9167   *
9168   */
lsm6dsrx_tilt_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)9169 int32_t lsm6dsrx_tilt_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
9170 {
9171   lsm6dsrx_emb_func_en_a_t emb_func_en_a;
9172   int32_t ret;
9173 
9174   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9175 
9176   if (ret == 0)
9177   {
9178     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_A,
9179                             (uint8_t *)&emb_func_en_a, 1);
9180   }
9181 
9182   if (ret == 0)
9183   {
9184     *val = emb_func_en_a.tilt_en;
9185     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9186   }
9187 
9188   return ret;
9189 }
9190 
9191 /**
9192   * @brief  Interrupt status bit for tilt detection.[get]
9193   *
9194   * @param  ctx    Read / write interface definitions.(ptr)
9195   * @param  val    Change the values of is_tilt in reg EMB_FUNC_STATUS
9196   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9197   *
9198   */
lsm6dsrx_tilt_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)9199 int32_t lsm6dsrx_tilt_flag_data_ready_get(const stmdev_ctx_t *ctx,
9200                                           uint8_t *val)
9201 {
9202   lsm6dsrx_emb_func_status_t emb_func_status;
9203   int32_t ret;
9204 
9205   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9206 
9207   if (ret == 0)
9208   {
9209     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_STATUS,
9210                             (uint8_t *)&emb_func_status, 1);
9211   }
9212 
9213   if (ret == 0)
9214   {
9215     *val = emb_func_status.is_tilt;
9216     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9217   }
9218 
9219   return ret;
9220 }
9221 
9222 /**
9223   * @}
9224   *
9225   */
9226 
9227 /**
9228   * @defgroup   LSM6DSRX_ magnetometer_sensor
9229   * @brief      This section groups all the functions that manage additional
9230   *             magnetometer sensor.
9231   * @{
9232   *
9233   */
9234 
9235 /**
9236   * @brief  External magnetometer sensitivity value register.[set]
9237   *
9238   * @param  ctx    Read / write interface definitions.(ptr)
9239   * @param  buff   Buffer that contains data to write
9240   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9241   *
9242   */
lsm6dsrx_mag_sensitivity_set(const stmdev_ctx_t * ctx,uint16_t val)9243 int32_t lsm6dsrx_mag_sensitivity_set(const stmdev_ctx_t *ctx,
9244                                      uint16_t val)
9245 {
9246   uint8_t buff[2];
9247   int32_t ret;
9248 
9249   buff[1] = (uint8_t)(val / 256U);
9250   buff[0] = (uint8_t)(val - (buff[1] * 256U));
9251   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SENSITIVITY_L,
9252                                   &buff[0]);
9253 
9254   if (ret == 0)
9255   {
9256     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SENSITIVITY_H,
9257                                     &buff[1]);
9258   }
9259 
9260   return ret;
9261 }
9262 
9263 /**
9264   * @brief  External magnetometer sensitivity value register.[get]
9265   *
9266   * @param  ctx    Read / write interface definitions.(ptr)
9267   * @param  buff   Buffer that stores data read
9268   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9269   *
9270   */
lsm6dsrx_mag_sensitivity_get(const stmdev_ctx_t * ctx,uint16_t * val)9271 int32_t lsm6dsrx_mag_sensitivity_get(const stmdev_ctx_t *ctx,
9272                                      uint16_t *val)
9273 {
9274   uint8_t buff[2];
9275   int32_t ret;
9276 
9277   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SENSITIVITY_L,
9278                                  &buff[0]);
9279 
9280   if (ret == 0)
9281   {
9282     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SENSITIVITY_H,
9283                                    &buff[1]);
9284     *val = buff[1];
9285     *val = (*val * 256U) + buff[0];
9286   }
9287 
9288   return ret;
9289 }
9290 
9291 /**
9292   * @brief  Offset for hard-iron compensation register (r/w).[set]
9293   *
9294   * @param  ctx    Read / write interface definitions.(ptr)
9295   * @param  buff   Buffer that contains data to write
9296   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9297   *
9298   */
lsm6dsrx_mag_offset_set(const stmdev_ctx_t * ctx,int16_t * val)9299 int32_t lsm6dsrx_mag_offset_set(const stmdev_ctx_t *ctx, int16_t *val)
9300 {
9301   uint8_t buff[6];
9302   int32_t ret;
9303   uint8_t i;
9304 
9305   buff[1] = (uint8_t)((uint16_t)val[0] / 256U);
9306   buff[0] = (uint8_t)((uint16_t)val[0] - (buff[1] * 256U));
9307   buff[3] = (uint8_t)((uint16_t)val[1] / 256U);
9308   buff[2] = (uint8_t)((uint16_t)val[1] - (buff[3] * 256U));
9309   buff[5] = (uint8_t)((uint16_t)val[2] / 256U);
9310   buff[4] = (uint8_t)((uint16_t)val[2] - (buff[5] * 256U));
9311   i = 0x00U;
9312   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFX_L, &buff[i]);
9313 
9314   if (ret == 0)
9315   {
9316     i++;
9317     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFX_H, &buff[i]);
9318   }
9319 
9320   if (ret == 0)
9321   {
9322     i++;
9323     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFY_L, &buff[i]);
9324   }
9325 
9326   if (ret == 0)
9327   {
9328     i++;
9329     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFY_H, &buff[i]);
9330   }
9331 
9332   if (ret == 0)
9333   {
9334     i++;
9335     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFZ_L, &buff[i]);
9336   }
9337 
9338   if (ret == 0)
9339   {
9340     i++;
9341     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_OFFZ_H, &buff[i]);
9342   }
9343 
9344   return ret;
9345 }
9346 
9347 /**
9348   * @brief  Offset for hard-iron compensation register (r/w).[get]
9349   *
9350   * @param  ctx    Read / write interface definitions.(ptr)
9351   * @param  buff   Buffer that stores data read
9352   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9353   *
9354   */
lsm6dsrx_mag_offset_get(const stmdev_ctx_t * ctx,int16_t * val)9355 int32_t lsm6dsrx_mag_offset_get(const stmdev_ctx_t *ctx, int16_t *val)
9356 {
9357   uint8_t buff[6];
9358   int32_t ret;
9359   uint8_t i;
9360 
9361   i = 0x00U;
9362   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFX_L, &buff[i]);
9363 
9364   if (ret == 0)
9365   {
9366     i++;
9367     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFX_H, &buff[i]);
9368   }
9369 
9370   if (ret == 0)
9371   {
9372     i++;
9373     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFY_L, &buff[i]);
9374   }
9375 
9376   if (ret == 0)
9377   {
9378     i++;
9379     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFY_H, &buff[i]);
9380   }
9381 
9382   if (ret == 0)
9383   {
9384     i++;
9385     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFZ_L, &buff[i]);
9386   }
9387 
9388   if (ret == 0)
9389   {
9390     i++;
9391     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_OFFZ_H, &buff[i]);
9392 
9393     val[0] = (int16_t)buff[1];
9394     val[0] = (val[0] * 256) + (int16_t)buff[0];
9395     val[1] = (int16_t)buff[3];
9396     val[1] = (val[1] * 256) + (int16_t)buff[2];
9397     val[2] = (int16_t)buff[5];
9398     val[2] = (val[2] * 256) + (int16_t)buff[4];
9399   }
9400 
9401   return ret;
9402 }
9403 
9404 /**
9405   * @brief  Soft-iron (3x3 symmetric) matrix correction register (r/w).
9406   *         The value is expressed as half-precision floating-point format:
9407   *         SEEEEEFFFFFFFFFF
9408   *         S: 1 sign bit;
9409   *         E: 5 exponent bits;
9410   *         F: 10 fraction bits).[set]
9411   *
9412   * @param  ctx    Read / write interface definitions.(ptr)
9413   * @param  buff   Buffer that contains data to write
9414   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9415   *
9416   */
lsm6dsrx_mag_soft_iron_set(const stmdev_ctx_t * ctx,uint16_t * val)9417 int32_t lsm6dsrx_mag_soft_iron_set(const stmdev_ctx_t *ctx, uint16_t *val)
9418 {
9419   uint8_t buff[12];
9420   int32_t ret;
9421   uint8_t i;
9422 
9423   buff[1] = (uint8_t)(val[0] / 256U);
9424   buff[0] = (uint8_t)(val[0] - (buff[1] * 256U));
9425   buff[3] = (uint8_t)(val[1] / 256U);
9426   buff[2] = (uint8_t)(val[1] - (buff[3] * 256U));
9427   buff[5] = (uint8_t)(val[2] / 256U);
9428   buff[4] = (uint8_t)(val[2] - (buff[5] * 256U));
9429   buff[7] = (uint8_t)(val[3] / 256U);
9430   buff[6] = (uint8_t)(val[3] - (buff[1] * 256U));
9431   buff[9] = (uint8_t)(val[4] / 256U);
9432   buff[8] = (uint8_t)(val[4] - (buff[3] * 256U));
9433   buff[11] = (uint8_t)(val[5] / 256U);
9434   buff[10] = (uint8_t)(val[5] - (buff[5] * 256U));
9435   i = 0x00U;
9436   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XX_L,
9437                                   &buff[i]);
9438 
9439   if (ret == 0)
9440   {
9441     i++;
9442     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XX_H,
9443                                     &buff[i]);
9444   }
9445 
9446   if (ret == 0)
9447   {
9448     i++;
9449     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XY_L,
9450                                     &buff[i]);
9451   }
9452 
9453   if (ret == 0)
9454   {
9455     i++;
9456     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XY_H,
9457                                     &buff[i]);
9458   }
9459 
9460   if (ret == 0)
9461   {
9462     i++;
9463     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XZ_L,
9464                                     &buff[i]);
9465   }
9466 
9467   if (ret == 0)
9468   {
9469     i++;
9470     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_XZ_H,
9471                                     &buff[i]);
9472   }
9473 
9474   if (ret == 0)
9475   {
9476     i++;
9477     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_YY_L,
9478                                     &buff[i]);
9479   }
9480 
9481   if (ret == 0)
9482   {
9483     i++;
9484     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_YY_H,
9485                                     &buff[i]);
9486   }
9487 
9488   if (ret == 0)
9489   {
9490     i++;
9491     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_YZ_L,
9492                                     &buff[i]);
9493   }
9494 
9495   if (ret == 0)
9496   {
9497     i++;
9498     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_YZ_H,
9499                                     &buff[i]);
9500   }
9501 
9502   if (ret == 0)
9503   {
9504     i++;
9505     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_ZZ_L,
9506                                     &buff[i]);
9507   }
9508 
9509   if (ret == 0)
9510   {
9511     i++;
9512     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_SI_ZZ_H,
9513                                     &buff[i]);
9514   }
9515 
9516   return ret;
9517 }
9518 
9519 /**
9520   * @brief  Soft-iron (3x3 symmetric) matrix correction register (r/w).
9521   *         The value is expressed as half-precision floating-point format:
9522   *         SEEEEEFFFFFFFFFF
9523   *         S: 1 sign bit;
9524   *         E: 5 exponent bits;
9525   *         F: 10 fraction bits).[get]
9526   *
9527   * @param  ctx    Read / write interface definitions.(ptr)
9528   * @param  buff   Buffer that stores data read
9529   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9530   *
9531   */
lsm6dsrx_mag_soft_iron_get(const stmdev_ctx_t * ctx,uint16_t * val)9532 int32_t lsm6dsrx_mag_soft_iron_get(const stmdev_ctx_t *ctx, uint16_t *val)
9533 {
9534   uint8_t buff[12];
9535   int32_t ret;
9536   uint8_t i;
9537 
9538   i = 0x00U;
9539   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XX_L,
9540                                  &buff[i]);
9541 
9542   if (ret == 0)
9543   {
9544     i++;
9545     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XX_H,
9546                                    &buff[i]);
9547   }
9548 
9549   if (ret == 0)
9550   {
9551     i++;
9552     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XY_L,
9553                                    &buff[i]);
9554   }
9555 
9556   if (ret == 0)
9557   {
9558     i++;
9559     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XY_H,
9560                                    &buff[i]);
9561   }
9562 
9563   if (ret == 0)
9564   {
9565     i++;
9566     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XZ_L,
9567                                    &buff[i]);
9568   }
9569 
9570   if (ret == 0)
9571   {
9572     i++;
9573     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_XZ_H,
9574                                    &buff[i]);
9575   }
9576 
9577   if (ret == 0)
9578   {
9579     i++;
9580     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_YY_L,
9581                                    &buff[i]);
9582   }
9583 
9584   if (ret == 0)
9585   {
9586     i++;
9587     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_YY_H,
9588                                    &buff[i]);
9589   }
9590 
9591   if (ret == 0)
9592   {
9593     i++;
9594     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_YZ_L,
9595                                    &buff[i]);
9596   }
9597 
9598   if (ret == 0)
9599   {
9600     i++;
9601     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_YZ_H,
9602                                    &buff[i]);
9603   }
9604 
9605   if (ret == 0)
9606   {
9607     i++;
9608     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_ZZ_L,
9609                                    &buff[i]);
9610   }
9611 
9612   if (ret == 0)
9613   {
9614     i++;
9615     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_SI_ZZ_H,
9616                                    &buff[i]);
9617   }
9618 
9619   val[0] = buff[1];
9620   val[0] = (val[0] * 256U) +  buff[0];
9621   val[1] = buff[3];
9622   val[1] = (val[1] * 256U) +  buff[2];
9623   val[2] = buff[5];
9624   val[2] = (val[2] * 256U) +  buff[4];
9625   val[3] = buff[7];
9626   val[3] = (val[3] * 256U) +  buff[6];
9627   val[4] = buff[9];
9628   val[4] = (val[4] * 256U) +  buff[8];
9629   val[5] = buff[11];
9630   val[6] = (val[5] * 256U) +  buff[10];
9631 
9632   return ret;
9633 }
9634 
9635 /**
9636   * @brief  Magnetometer Z-axis coordinates rotation (to be aligned to
9637   *         accelerometer/gyroscope axes orientation).[set]
9638   *
9639   * @param  ctx    Read / write interface definitions.(ptr)
9640   * @param  val    Change the values of mag_z_axis in reg MAG_CFG_A
9641   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9642   *
9643   */
lsm6dsrx_mag_z_orient_set(const stmdev_ctx_t * ctx,lsm6dsrx_mag_z_axis_t val)9644 int32_t lsm6dsrx_mag_z_orient_set(const stmdev_ctx_t *ctx,
9645                                   lsm6dsrx_mag_z_axis_t val)
9646 {
9647   lsm6dsrx_mag_cfg_a_t mag_cfg_a;
9648   int32_t ret;
9649 
9650   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_A,
9651                                  (uint8_t *)&mag_cfg_a);
9652 
9653   if (ret == 0)
9654   {
9655     mag_cfg_a.mag_z_axis = (uint8_t)val;
9656     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_CFG_A,
9657                                     (uint8_t *)&mag_cfg_a);
9658   }
9659 
9660   return ret;
9661 }
9662 
9663 /**
9664   * @brief  Magnetometer Z-axis coordinates rotation (to be aligned to
9665   *         accelerometer/gyroscope axes orientation).[get]
9666   *
9667   * @param  ctx    Read / write interface definitions.(ptr)
9668   * @param  val    Get the values of mag_z_axis in reg MAG_CFG_A
9669   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9670   *
9671   */
lsm6dsrx_mag_z_orient_get(const stmdev_ctx_t * ctx,lsm6dsrx_mag_z_axis_t * val)9672 int32_t lsm6dsrx_mag_z_orient_get(const stmdev_ctx_t *ctx,
9673                                   lsm6dsrx_mag_z_axis_t *val)
9674 {
9675   lsm6dsrx_mag_cfg_a_t mag_cfg_a;
9676   int32_t ret;
9677 
9678   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_A,
9679                                  (uint8_t *)&mag_cfg_a);
9680 
9681   switch (mag_cfg_a.mag_z_axis)
9682   {
9683     case LSM6DSRX_Z_EQ_Y:
9684       *val = LSM6DSRX_Z_EQ_Y;
9685       break;
9686 
9687     case LSM6DSRX_Z_EQ_MIN_Y:
9688       *val = LSM6DSRX_Z_EQ_MIN_Y;
9689       break;
9690 
9691     case LSM6DSRX_Z_EQ_X:
9692       *val = LSM6DSRX_Z_EQ_X;
9693       break;
9694 
9695     case LSM6DSRX_Z_EQ_MIN_X:
9696       *val = LSM6DSRX_Z_EQ_MIN_X;
9697       break;
9698 
9699     case LSM6DSRX_Z_EQ_MIN_Z:
9700       *val = LSM6DSRX_Z_EQ_MIN_Z;
9701       break;
9702 
9703     case LSM6DSRX_Z_EQ_Z:
9704       *val = LSM6DSRX_Z_EQ_Z;
9705       break;
9706 
9707     default:
9708       *val = LSM6DSRX_Z_EQ_Y;
9709       break;
9710   }
9711 
9712   return ret;
9713 }
9714 
9715 /**
9716   * @brief  Magnetometer Y-axis coordinates rotation (to be aligned to
9717   *         accelerometer/gyroscope axes orientation).[set]
9718   *
9719   * @param  ctx    Read / write interface definitions.(ptr)
9720   * @param  val    Change the values of mag_y_axis in
9721   *                               reg MAG_CFG_A
9722   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9723   *
9724   */
lsm6dsrx_mag_y_orient_set(const stmdev_ctx_t * ctx,lsm6dsrx_mag_y_axis_t val)9725 int32_t lsm6dsrx_mag_y_orient_set(const stmdev_ctx_t *ctx,
9726                                   lsm6dsrx_mag_y_axis_t val)
9727 {
9728   lsm6dsrx_mag_cfg_a_t mag_cfg_a;
9729   int32_t ret;
9730 
9731   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_A,
9732                                  (uint8_t *)&mag_cfg_a);
9733 
9734   if (ret == 0)
9735   {
9736     mag_cfg_a.mag_y_axis = (uint8_t)val;
9737     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_CFG_A,
9738                                     (uint8_t *)&mag_cfg_a);
9739   }
9740 
9741   return ret;
9742 }
9743 
9744 /**
9745   * @brief  Magnetometer Y-axis coordinates rotation (to be aligned to
9746   *         accelerometer/gyroscope axes orientation).[get]
9747   *
9748   * @param  ctx    Read / write interface definitions.(ptr)
9749   * @param  val    Get the values of mag_y_axis in reg MAG_CFG_A
9750   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9751   *
9752   */
lsm6dsrx_mag_y_orient_get(const stmdev_ctx_t * ctx,lsm6dsrx_mag_y_axis_t * val)9753 int32_t lsm6dsrx_mag_y_orient_get(const stmdev_ctx_t *ctx,
9754                                   lsm6dsrx_mag_y_axis_t *val)
9755 {
9756   lsm6dsrx_mag_cfg_a_t mag_cfg_a;
9757   int32_t ret;
9758 
9759   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_A,
9760                                  (uint8_t *)&mag_cfg_a);
9761 
9762   switch (mag_cfg_a.mag_y_axis)
9763   {
9764     case LSM6DSRX_Y_EQ_Y:
9765       *val = LSM6DSRX_Y_EQ_Y;
9766       break;
9767 
9768     case LSM6DSRX_Y_EQ_MIN_Y:
9769       *val = LSM6DSRX_Y_EQ_MIN_Y;
9770       break;
9771 
9772     case LSM6DSRX_Y_EQ_X:
9773       *val = LSM6DSRX_Y_EQ_X;
9774       break;
9775 
9776     case LSM6DSRX_Y_EQ_MIN_X:
9777       *val = LSM6DSRX_Y_EQ_MIN_X;
9778       break;
9779 
9780     case LSM6DSRX_Y_EQ_MIN_Z:
9781       *val = LSM6DSRX_Y_EQ_MIN_Z;
9782       break;
9783 
9784     case LSM6DSRX_Y_EQ_Z:
9785       *val = LSM6DSRX_Y_EQ_Z;
9786       break;
9787 
9788     default:
9789       *val = LSM6DSRX_Y_EQ_Y;
9790       break;
9791   }
9792 
9793   return ret;
9794 }
9795 
9796 /**
9797    * @brief  Magnetometer X-axis coordinates rotation (to be aligned to
9798   *         accelerometer/gyroscope axes orientation).[set]
9799   *
9800   * @param  ctx    Read / write interface definitions.(ptr)
9801   * @param  val    Change the values of mag_x_axis in reg MAG_CFG_B
9802   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9803   *
9804   */
lsm6dsrx_mag_x_orient_set(const stmdev_ctx_t * ctx,lsm6dsrx_mag_x_axis_t val)9805 int32_t lsm6dsrx_mag_x_orient_set(const stmdev_ctx_t *ctx,
9806                                   lsm6dsrx_mag_x_axis_t val)
9807 {
9808   lsm6dsrx_mag_cfg_b_t mag_cfg_b;
9809   int32_t ret;
9810 
9811   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_B,
9812                                  (uint8_t *)&mag_cfg_b);
9813 
9814   if (ret == 0)
9815   {
9816     mag_cfg_b.mag_x_axis = (uint8_t)val;
9817     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MAG_CFG_B,
9818                                     (uint8_t *)&mag_cfg_b);
9819   }
9820 
9821   return ret;
9822 }
9823 
9824 /**
9825   * @brief  Magnetometer X-axis coordinates rotation (to be aligned to
9826   *         accelerometer/gyroscope axes orientation).[get]
9827   *
9828   * @param  ctx    Read / write interface definitions.(ptr)
9829   * @param  val    Get the values of mag_x_axis in reg MAG_CFG_B
9830   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9831   *
9832   */
lsm6dsrx_mag_x_orient_get(const stmdev_ctx_t * ctx,lsm6dsrx_mag_x_axis_t * val)9833 int32_t lsm6dsrx_mag_x_orient_get(const stmdev_ctx_t *ctx,
9834                                   lsm6dsrx_mag_x_axis_t *val)
9835 {
9836   lsm6dsrx_mag_cfg_b_t mag_cfg_b;
9837   int32_t ret;
9838 
9839   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MAG_CFG_B,
9840                                  (uint8_t *)&mag_cfg_b);
9841 
9842   switch (mag_cfg_b.mag_x_axis)
9843   {
9844     case LSM6DSRX_X_EQ_Y:
9845       *val = LSM6DSRX_X_EQ_Y;
9846       break;
9847 
9848     case LSM6DSRX_X_EQ_MIN_Y:
9849       *val = LSM6DSRX_X_EQ_MIN_Y;
9850       break;
9851 
9852     case LSM6DSRX_X_EQ_X:
9853       *val = LSM6DSRX_X_EQ_X;
9854       break;
9855 
9856     case LSM6DSRX_X_EQ_MIN_X:
9857       *val = LSM6DSRX_X_EQ_MIN_X;
9858       break;
9859 
9860     case LSM6DSRX_X_EQ_MIN_Z:
9861       *val = LSM6DSRX_X_EQ_MIN_Z;
9862       break;
9863 
9864     case LSM6DSRX_X_EQ_Z:
9865       *val = LSM6DSRX_X_EQ_Z;
9866       break;
9867 
9868     default:
9869       *val = LSM6DSRX_X_EQ_Y;
9870       break;
9871   }
9872 
9873   return ret;
9874 }
9875 
9876 /**
9877   * @}
9878   *
9879   */
9880 
9881 /**
9882   * @defgroup   LSM6DSRX_finite_state_machine
9883   * @brief      This section groups all the functions that manage the
9884   *             state_machine.
9885   * @{
9886   *
9887   */
9888 
9889 /**
9890   * @brief  Interrupt status bit for FSM long counter timeout interrupt
9891   *         event.[get]
9892   *
9893   * @param  ctx    Read / write interface definitions.(ptr)
9894   * @param  val    Change the values of is_fsm_lc in reg EMB_FUNC_STATUS
9895   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9896   *
9897   */
lsm6dsrx_long_cnt_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)9898 int32_t lsm6dsrx_long_cnt_flag_data_ready_get(const stmdev_ctx_t *ctx,
9899                                               uint8_t *val)
9900 {
9901   lsm6dsrx_emb_func_status_t emb_func_status;
9902   int32_t ret;
9903 
9904   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9905 
9906   if (ret == 0)
9907   {
9908     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_STATUS,
9909                             (uint8_t *)&emb_func_status, 1);
9910   }
9911 
9912   if (ret == 0)
9913   {
9914     *val = emb_func_status.is_fsm_lc;
9915     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9916   }
9917 
9918   return ret;
9919 }
9920 
9921 /**
9922   * @brief  Embedded final state machine functions mode.[set]
9923   *
9924   * @param  ctx    Read / write interface definitions.(ptr)
9925   * @param  val    Change the values of fsm_en in reg EMB_FUNC_EN_B
9926   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9927   *
9928   */
lsm6dsrx_emb_fsm_en_set(const stmdev_ctx_t * ctx,uint8_t val)9929 int32_t lsm6dsrx_emb_fsm_en_set(const stmdev_ctx_t *ctx, uint8_t val)
9930 {
9931   int32_t ret;
9932 
9933   lsm6dsrx_emb_func_en_b_t emb_func_en_b;
9934   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9935 
9936   if (ret == 0)
9937   {
9938     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
9939                             (uint8_t *)&emb_func_en_b, 1);
9940   }
9941 
9942   if (ret == 0)
9943   {
9944     emb_func_en_b.fsm_en = (uint8_t)val;
9945     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
9946                              (uint8_t *)&emb_func_en_b, 1);
9947   }
9948 
9949   if (ret == 0)
9950   {
9951     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9952   }
9953 
9954   return ret;
9955 }
9956 
9957 /**
9958   * @brief  Embedded final state machine functions mode.[get]
9959   *
9960   * @param  ctx    Read / write interface definitions.(ptr)
9961   * @param  val    Get the values of fsm_en in reg EMB_FUNC_EN_B
9962   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9963   *
9964   */
lsm6dsrx_emb_fsm_en_get(const stmdev_ctx_t * ctx,uint8_t * val)9965 int32_t lsm6dsrx_emb_fsm_en_get(const stmdev_ctx_t *ctx, uint8_t *val)
9966 {
9967   int32_t ret;
9968   lsm6dsrx_emb_func_en_b_t emb_func_en_b;
9969 
9970   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
9971 
9972   if (ret == 0)
9973   {
9974     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
9975                             (uint8_t *)&emb_func_en_b, 1);
9976   }
9977 
9978   if (ret == 0)
9979   {
9980     *val = emb_func_en_b.fsm_en;
9981     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
9982                              (uint8_t *)&emb_func_en_b, 1);
9983   }
9984 
9985   if (ret == 0)
9986   {
9987     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
9988   }
9989 
9990   return ret;
9991 }
9992 
9993 /**
9994   * @brief  Embedded final state machine functions mode.[set]
9995   *
9996   * @param  ctx    Read / write interface definitions.(ptr)
9997   * @param  val    Structure of registers from FSM_ENABLE_A to FSM_ENABLE_B
9998   * @retval        Interface status (MANDATORY: return 0 -> no Error).
9999   *
10000   */
lsm6dsrx_fsm_enable_set(const stmdev_ctx_t * ctx,lsm6dsrx_emb_fsm_enable_t * val)10001 int32_t lsm6dsrx_fsm_enable_set(const stmdev_ctx_t *ctx,
10002                                 lsm6dsrx_emb_fsm_enable_t *val)
10003 {
10004   lsm6dsrx_emb_func_en_b_t emb_func_en_b;
10005   int32_t ret;
10006 
10007   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10008 
10009   if (ret == 0)
10010   {
10011     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_ENABLE_A,
10012                              (uint8_t *)&val->fsm_enable_a, 1);
10013   }
10014 
10015   if (ret == 0)
10016   {
10017     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_ENABLE_B,
10018                              (uint8_t *)&val->fsm_enable_b, 1);
10019   }
10020 
10021   if (ret == 0)
10022   {
10023     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
10024                             (uint8_t *)&emb_func_en_b, 1);
10025   }
10026 
10027   if (ret == 0)
10028   {
10029     if ((val->fsm_enable_a.fsm1_en |
10030          val->fsm_enable_a.fsm2_en |
10031          val->fsm_enable_a.fsm3_en |
10032          val->fsm_enable_a.fsm4_en |
10033          val->fsm_enable_a.fsm5_en |
10034          val->fsm_enable_a.fsm6_en |
10035          val->fsm_enable_a.fsm7_en |
10036          val->fsm_enable_a.fsm8_en |
10037          val->fsm_enable_b.fsm9_en |
10038          val->fsm_enable_b.fsm10_en |
10039          val->fsm_enable_b.fsm11_en |
10040          val->fsm_enable_b.fsm12_en |
10041          val->fsm_enable_b.fsm13_en |
10042          val->fsm_enable_b.fsm14_en |
10043          val->fsm_enable_b.fsm15_en |
10044          val->fsm_enable_b.fsm16_en) != PROPERTY_DISABLE)
10045     {
10046       emb_func_en_b.fsm_en = PROPERTY_ENABLE;
10047     }
10048 
10049     else
10050     {
10051       emb_func_en_b.fsm_en = PROPERTY_DISABLE;
10052     }
10053   }
10054 
10055   if (ret == 0)
10056   {
10057     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
10058                              (uint8_t *)&emb_func_en_b, 1);
10059   }
10060 
10061   if (ret == 0)
10062   {
10063     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10064   }
10065 
10066   return ret;
10067 }
10068 
10069 /**
10070   * @brief  Embedded final state machine functions mode.[get]
10071   *
10072   * @param  ctx    Read / write interface definitions.(ptr)
10073   * @param  val    Structure of registers from FSM_ENABLE_A to FSM_ENABLE_B
10074   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10075   *
10076   */
lsm6dsrx_fsm_enable_get(const stmdev_ctx_t * ctx,lsm6dsrx_emb_fsm_enable_t * val)10077 int32_t lsm6dsrx_fsm_enable_get(const stmdev_ctx_t *ctx,
10078                                 lsm6dsrx_emb_fsm_enable_t *val)
10079 {
10080   int32_t ret;
10081 
10082   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10083 
10084   if (ret == 0)
10085   {
10086     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_ENABLE_A,
10087                             (uint8_t *)&val->fsm_enable_a, 1);
10088   }
10089 
10090   if (ret == 0)
10091   {
10092     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_ENABLE_B,
10093                             (uint8_t *)&val->fsm_enable_b, 1);
10094   }
10095 
10096   if (ret == 0)
10097   {
10098     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10099   }
10100 
10101   return ret;
10102 }
10103 
10104 /**
10105   * @brief  FSM long counter status register. Long counter value is an
10106   *         unsigned integer value (16-bit format).[set]
10107   *
10108   * @param  ctx    Read / write interface definitions.(ptr)
10109   * @param  buff   Buffer that contains data to write
10110   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10111   *
10112   */
lsm6dsrx_long_cnt_set(const stmdev_ctx_t * ctx,uint16_t val)10113 int32_t lsm6dsrx_long_cnt_set(const stmdev_ctx_t *ctx, uint16_t val)
10114 {
10115   uint8_t buff[2];
10116   int32_t ret;
10117 
10118   buff[1] = (uint8_t)(val / 256U);
10119   buff[0] = (uint8_t)(val - (buff[1] * 256U));
10120   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10121 
10122   if (ret == 0)
10123   {
10124     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_LONG_COUNTER_L, buff,
10125                              2);
10126   }
10127 
10128   if (ret == 0)
10129   {
10130     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10131   }
10132 
10133   return ret;
10134 }
10135 
10136 /**
10137   * @brief  FSM long counter status register. Long counter value is an
10138   *         unsigned integer value (16-bit format).[get]
10139   *
10140   * @param  ctx    Read / write interface definitions.(ptr)
10141   * @param  buff   Buffer that stores data read
10142   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10143   *
10144   */
lsm6dsrx_long_cnt_get(const stmdev_ctx_t * ctx,uint16_t * val)10145 int32_t lsm6dsrx_long_cnt_get(const stmdev_ctx_t *ctx, uint16_t *val)
10146 {
10147   uint8_t buff[2];
10148   int32_t ret;
10149 
10150   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10151 
10152   if (ret == 0)
10153   {
10154     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_LONG_COUNTER_L, buff,
10155                             2);
10156     *val = buff[1];
10157     *val = (*val * 256U) +  buff[0];
10158   }
10159 
10160   if (ret == 0)
10161   {
10162     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10163   }
10164 
10165   return ret;
10166 }
10167 
10168 /**
10169   * @brief  Clear FSM long counter value.[set]
10170   *
10171   * @param  ctx    Read / write interface definitions.(ptr)
10172   * @param  val    Change the values of fsm_lc_clr in reg
10173   *                FSM_LONG_COUNTER_CLEAR
10174   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10175   *
10176   */
lsm6dsrx_long_clr_set(const stmdev_ctx_t * ctx,lsm6dsrx_fsm_lc_clr_t val)10177 int32_t lsm6dsrx_long_clr_set(const stmdev_ctx_t *ctx,
10178                               lsm6dsrx_fsm_lc_clr_t val)
10179 {
10180   lsm6dsrx_fsm_long_counter_clear_t fsm_long_counter_clear;
10181   int32_t ret;
10182 
10183   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10184 
10185   if (ret == 0)
10186   {
10187     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_LONG_COUNTER_CLEAR,
10188                             (uint8_t *)&fsm_long_counter_clear, 1);
10189   }
10190 
10191   if (ret == 0)
10192   {
10193     fsm_long_counter_clear.fsm_lc_clr = (uint8_t)val;
10194     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_FSM_LONG_COUNTER_CLEAR,
10195                              (uint8_t *)&fsm_long_counter_clear, 1);
10196   }
10197 
10198   if (ret == 0)
10199   {
10200     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10201   }
10202 
10203   return ret;
10204 }
10205 
10206 /**
10207   * @brief  Clear FSM long counter value.[get]
10208   *
10209   * @param  ctx    Read / write interface definitions.(ptr)
10210   * @param  val    Get the values of fsm_lc_clr in reg  FSM_LONG_COUNTER_CLEAR
10211   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10212   *
10213   */
lsm6dsrx_long_clr_get(const stmdev_ctx_t * ctx,lsm6dsrx_fsm_lc_clr_t * val)10214 int32_t lsm6dsrx_long_clr_get(const stmdev_ctx_t *ctx,
10215                               lsm6dsrx_fsm_lc_clr_t *val)
10216 {
10217   lsm6dsrx_fsm_long_counter_clear_t fsm_long_counter_clear;
10218   int32_t ret;
10219 
10220   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10221 
10222   if (ret == 0)
10223   {
10224     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_LONG_COUNTER_CLEAR,
10225                             (uint8_t *)&fsm_long_counter_clear, 1);
10226   }
10227 
10228   if (ret == 0)
10229   {
10230     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10231   }
10232 
10233   switch (fsm_long_counter_clear.fsm_lc_clr)
10234   {
10235     case LSM6DSRX_LC_NORMAL:
10236       *val = LSM6DSRX_LC_NORMAL;
10237       break;
10238 
10239     case LSM6DSRX_LC_CLEAR:
10240       *val = LSM6DSRX_LC_CLEAR;
10241       break;
10242 
10243     case LSM6DSRX_LC_CLEAR_DONE:
10244       *val = LSM6DSRX_LC_CLEAR_DONE;
10245       break;
10246 
10247     default:
10248       *val = LSM6DSRX_LC_NORMAL;
10249       break;
10250   }
10251 
10252   return ret;
10253 }
10254 
10255 /**
10256   * @brief  FSM output registers.[get]
10257   *
10258   * @param  ctx    Read / write interface definitions.(ptr)
10259   * @param  val    Structure of registers from FSM_OUTS1 to FSM_OUTS16
10260   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10261   *
10262   */
lsm6dsrx_fsm_out_get(const stmdev_ctx_t * ctx,lsm6dsrx_fsm_out_t * val)10263 int32_t lsm6dsrx_fsm_out_get(const stmdev_ctx_t *ctx,
10264                              lsm6dsrx_fsm_out_t *val)
10265 {
10266   int32_t ret;
10267 
10268   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10269 
10270   if (ret == 0)
10271   {
10272     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_FSM_OUTS1,
10273                             (uint8_t *)&val->fsm_outs1, 16);
10274   }
10275 
10276   if (ret == 0)
10277   {
10278     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10279   }
10280 
10281   return ret;
10282 }
10283 
10284 /**
10285   * @brief  Finite State Machine ODR configuration.[set]
10286   *
10287   * @param  ctx    Read / write interface definitions.(ptr)
10288   * @param  val    Change the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
10289   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10290   *
10291   */
lsm6dsrx_fsm_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsrx_fsm_odr_t val)10292 int32_t lsm6dsrx_fsm_data_rate_set(const stmdev_ctx_t *ctx,
10293                                    lsm6dsrx_fsm_odr_t val)
10294 {
10295   lsm6dsrx_emb_func_odr_cfg_b_t emb_func_odr_cfg_b;
10296   int32_t ret;
10297 
10298   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10299 
10300   if (ret == 0)
10301   {
10302     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_B,
10303                             (uint8_t *)&emb_func_odr_cfg_b, 1);
10304   }
10305 
10306   if (ret == 0)
10307   {
10308     emb_func_odr_cfg_b.not_used_01 = 3; /* set default values */
10309     emb_func_odr_cfg_b.not_used_02 = 1; /* set default values */
10310     emb_func_odr_cfg_b.fsm_odr = (uint8_t)val;
10311     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_B,
10312                              (uint8_t *)&emb_func_odr_cfg_b, 1);
10313   }
10314 
10315   if (ret == 0)
10316   {
10317     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10318   }
10319 
10320   return ret;
10321 }
10322 
10323 /**
10324   * @brief  Finite State Machine ODR configuration.[get]
10325   *
10326   * @param  ctx    Read / write interface definitions.(ptr)
10327   * @param  val    Get the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
10328   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10329   *
10330   */
lsm6dsrx_fsm_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsrx_fsm_odr_t * val)10331 int32_t lsm6dsrx_fsm_data_rate_get(const stmdev_ctx_t *ctx,
10332                                    lsm6dsrx_fsm_odr_t *val)
10333 {
10334   lsm6dsrx_emb_func_odr_cfg_b_t emb_func_odr_cfg_b;
10335   int32_t ret;
10336 
10337   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10338 
10339   if (ret == 0)
10340   {
10341     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_B,
10342                             (uint8_t *)&emb_func_odr_cfg_b, 1);
10343   }
10344 
10345   if (ret == 0)
10346   {
10347     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10348   }
10349 
10350   switch (emb_func_odr_cfg_b.fsm_odr)
10351   {
10352     case LSM6DSRX_ODR_FSM_12Hz5:
10353       *val = LSM6DSRX_ODR_FSM_12Hz5;
10354       break;
10355 
10356     case LSM6DSRX_ODR_FSM_26Hz:
10357       *val = LSM6DSRX_ODR_FSM_26Hz;
10358       break;
10359 
10360     case LSM6DSRX_ODR_FSM_52Hz:
10361       *val = LSM6DSRX_ODR_FSM_52Hz;
10362       break;
10363 
10364     case LSM6DSRX_ODR_FSM_104Hz:
10365       *val = LSM6DSRX_ODR_FSM_104Hz;
10366       break;
10367 
10368     default:
10369       *val = LSM6DSRX_ODR_FSM_12Hz5;
10370       break;
10371   }
10372 
10373   return ret;
10374 }
10375 
10376 /**
10377   * @brief  FSM initialization request.[set]
10378   *
10379   * @param  ctx    Read / write interface definitions.(ptr)
10380   * @param  val    Change the values of fsm_init in reg FSM_INIT
10381   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10382   *
10383   */
lsm6dsrx_fsm_init_set(const stmdev_ctx_t * ctx,uint8_t val)10384 int32_t lsm6dsrx_fsm_init_set(const stmdev_ctx_t *ctx, uint8_t val)
10385 {
10386   lsm6dsrx_emb_func_init_b_t emb_func_init_b;
10387   int32_t ret;
10388 
10389   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10390 
10391   if (ret == 0)
10392   {
10393     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
10394                             (uint8_t *)&emb_func_init_b, 1);
10395   }
10396 
10397   if (ret == 0)
10398   {
10399     emb_func_init_b.fsm_init = (uint8_t)val;
10400     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
10401                              (uint8_t *)&emb_func_init_b, 1);
10402   }
10403 
10404   if (ret == 0)
10405   {
10406     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10407   }
10408 
10409   return ret;
10410 }
10411 
10412 /**
10413   * @brief  FSM initialization request.[get]
10414   *
10415   * @param  ctx    Read / write interface definitions.(ptr)
10416   * @param  val    Change the values of fsm_init in reg FSM_INIT
10417   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10418   *
10419   */
lsm6dsrx_fsm_init_get(const stmdev_ctx_t * ctx,uint8_t * val)10420 int32_t lsm6dsrx_fsm_init_get(const stmdev_ctx_t *ctx, uint8_t *val)
10421 {
10422   lsm6dsrx_emb_func_init_b_t emb_func_init_b;
10423   int32_t ret;
10424 
10425   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10426 
10427   if (ret == 0)
10428   {
10429     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
10430                             (uint8_t *)&emb_func_init_b, 1);
10431   }
10432 
10433   if (ret == 0)
10434   {
10435     *val = emb_func_init_b.fsm_init;
10436     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10437   }
10438 
10439   return ret;
10440 }
10441 
10442 /**
10443   * @brief  FSM long counter timeout register (r/w). The long counter
10444   *         timeout value is an unsigned integer value (16-bit format).
10445   *         When the long counter value reached this value, the FSM
10446   *         generates an interrupt.[set]
10447   *
10448   * @param  ctx    Read / write interface definitions.(ptr)
10449   * @param  buff   Buffer that contains data to write
10450   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10451   *
10452   */
lsm6dsrx_long_cnt_int_value_set(const stmdev_ctx_t * ctx,uint16_t val)10453 int32_t lsm6dsrx_long_cnt_int_value_set(const stmdev_ctx_t *ctx,
10454                                         uint16_t val)
10455 {
10456   uint8_t buff[2];
10457   int32_t ret;
10458 
10459   buff[1] = (uint8_t)(val / 256U);
10460   buff[0] = (uint8_t)(val - (buff[1] * 256U));
10461   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_FSM_LC_TIMEOUT_L,
10462                                   &buff[0]);
10463 
10464   if (ret == 0)
10465   {
10466     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_FSM_LC_TIMEOUT_H,
10467                                     &buff[1]);
10468   }
10469 
10470   return ret;
10471 }
10472 
10473 /**
10474   * @brief  FSM long counter timeout register (r/w). The long counter
10475   *         timeout value is an unsigned integer value (16-bit format).
10476   *         When the long counter value reached this value, the FSM generates
10477   *         an interrupt.[get]
10478   *
10479   * @param  ctx    Read / write interface definitions.(ptr)
10480   * @param  buff   Buffer that stores data read
10481   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10482   *
10483   */
lsm6dsrx_long_cnt_int_value_get(const stmdev_ctx_t * ctx,uint16_t * val)10484 int32_t lsm6dsrx_long_cnt_int_value_get(const stmdev_ctx_t *ctx,
10485                                         uint16_t *val)
10486 {
10487   uint8_t buff[2];
10488   int32_t ret;
10489 
10490   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_FSM_LC_TIMEOUT_L,
10491                                  &buff[0]);
10492 
10493   if (ret == 0)
10494   {
10495     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_FSM_LC_TIMEOUT_H,
10496                                    &buff[1]);
10497     *val = buff[1];
10498     *val = (*val * 256U) +  buff[0];
10499   }
10500 
10501   return ret;
10502 }
10503 
10504 /**
10505   * @brief  FSM number of programs register.[set]
10506   *
10507   * @param  ctx    Read / write interface definitions.(ptr)
10508   * @param  buff   Buffer that contains data to write
10509   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10510   *
10511   */
lsm6dsrx_fsm_number_of_programs_set(const stmdev_ctx_t * ctx,uint8_t * buff)10512 int32_t lsm6dsrx_fsm_number_of_programs_set(const stmdev_ctx_t *ctx,
10513                                             uint8_t *buff)
10514 {
10515   int32_t ret;
10516 
10517   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_FSM_PROGRAMS, buff);
10518 
10519   if (ret == 0)
10520   {
10521     ret = lsm6dsrx_ln_pg_write_byte(ctx,
10522                                     LSM6DSRX_FSM_PROGRAMS + 0x01U,
10523                                     buff);
10524   }
10525 
10526   return ret;
10527 }
10528 
10529 /**
10530   * @brief  FSM number of programs register.[get]
10531   *
10532   * @param  ctx    Read / write interface definitions.(ptr)
10533   * @param  buff   Buffer that stores data read
10534   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10535   *
10536   */
lsm6dsrx_fsm_number_of_programs_get(const stmdev_ctx_t * ctx,uint8_t * buff)10537 int32_t lsm6dsrx_fsm_number_of_programs_get(const stmdev_ctx_t *ctx,
10538                                             uint8_t *buff)
10539 {
10540   int32_t ret;
10541 
10542   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_FSM_PROGRAMS, buff);
10543 
10544   return ret;
10545 }
10546 
10547 /**
10548   * @brief  FSM start address register (r/w). First available address is
10549   *         0x033C.[set]
10550   *
10551   * @param  ctx    Read / write interface definitions.(ptr)
10552   * @param  buff   Buffer that contains data to write
10553   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10554   *
10555   */
lsm6dsrx_fsm_start_address_set(const stmdev_ctx_t * ctx,uint16_t val)10556 int32_t lsm6dsrx_fsm_start_address_set(const stmdev_ctx_t *ctx,
10557                                        uint16_t val)
10558 {
10559   uint8_t buff[2];
10560   int32_t ret;
10561 
10562   buff[1] = (uint8_t)(val / 256U);
10563   buff[0] = (uint8_t)(val - (buff[1] * 256U));
10564   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_FSM_START_ADD_L,
10565                                   &buff[0]);
10566 
10567   if (ret == 0)
10568   {
10569     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_FSM_START_ADD_H,
10570                                     &buff[1]);
10571   }
10572 
10573   return ret;
10574 }
10575 
10576 /**
10577   * @brief  FSM start address register (r/w). First available address
10578   *         is 0x033C.[get]
10579   *
10580   * @param  ctx    Read / write interface definitions.(ptr)
10581   * @param  buff   Buffer that stores data read
10582   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10583   *
10584   */
lsm6dsrx_fsm_start_address_get(const stmdev_ctx_t * ctx,uint16_t * val)10585 int32_t lsm6dsrx_fsm_start_address_get(const stmdev_ctx_t *ctx,
10586                                        uint16_t *val)
10587 {
10588   uint8_t buff[2];
10589   int32_t ret;
10590 
10591   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_FSM_START_ADD_L,
10592                                  &buff[0]);
10593 
10594   if (ret == 0)
10595   {
10596     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_FSM_START_ADD_H,
10597                                    &buff[1]);
10598     *val = buff[1];
10599     *val = (*val * 256U) +  buff[0];
10600   }
10601 
10602   return ret;
10603 }
10604 
10605 /**
10606   * @}
10607   *
10608   */
10609 
10610 /**
10611   * @addtogroup  Machine Learning Core
10612   * @brief   This section group all the functions concerning the
10613   *          usage of Machine Learning Core
10614   * @{
10615   *
10616   */
10617 
10618 /**
10619   * @brief  Enable Machine Learning Core.[set]
10620   *
10621   * @param  ctx      read / write interface definitions
10622   * @param  val      change the values of mlc_en in
10623   *                  reg EMB_FUNC_EN_B and mlc_init
10624   *                  in EMB_FUNC_INIT_B
10625   *
10626   */
lsm6dsrx_mlc_set(const stmdev_ctx_t * ctx,uint8_t val)10627 int32_t lsm6dsrx_mlc_set(const stmdev_ctx_t *ctx, uint8_t val)
10628 {
10629   lsm6dsrx_emb_func_en_b_t reg;
10630   int32_t ret;
10631 
10632   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10633 
10634   if (ret == 0)
10635   {
10636     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
10637                             (uint8_t *)&reg, 1);
10638   }
10639 
10640   if (ret == 0)
10641   {
10642     reg.mlc_en = val;
10643     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
10644                              (uint8_t *)&reg, 1);
10645   }
10646 
10647   if ((val != PROPERTY_DISABLE) && (ret == 0))
10648   {
10649     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
10650                             (uint8_t *)&reg, 1);
10651 
10652     if (ret == 0)
10653     {
10654       reg.mlc_en = val;
10655       ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_INIT_B,
10656                                (uint8_t *)&reg, 1);
10657     }
10658   }
10659 
10660   if (ret == 0)
10661   {
10662     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10663   }
10664 
10665   return ret;
10666 }
10667 
10668 /**
10669   * @brief  Enable Machine Learning Core.[get]
10670   *
10671   * @param  ctx      read / write interface definitions
10672   * @param  val      Get the values of mlc_en in
10673   *                  reg EMB_FUNC_EN_B
10674   *
10675   */
lsm6dsrx_mlc_get(const stmdev_ctx_t * ctx,uint8_t * val)10676 int32_t lsm6dsrx_mlc_get(const stmdev_ctx_t *ctx, uint8_t *val)
10677 {
10678   lsm6dsrx_emb_func_en_b_t reg;
10679   int32_t ret;
10680 
10681   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10682 
10683   if (ret == 0)
10684   {
10685     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_EN_B,
10686                             (uint8_t *)&reg, 1);
10687   }
10688 
10689   if (ret == 0)
10690   {
10691     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10692     *val  = reg.mlc_en;
10693   }
10694 
10695   return ret;
10696 }
10697 
10698 /**
10699   * @brief  Machine Learning Core status register[get]
10700   *
10701   * @param  ctx      read / write interface definitions
10702   * @param  val      register MLC_STATUS_MAINPAGE
10703   *
10704   */
lsm6dsrx_mlc_status_get(const stmdev_ctx_t * ctx,lsm6dsrx_mlc_status_mainpage_t * val)10705 int32_t lsm6dsrx_mlc_status_get(const stmdev_ctx_t *ctx,
10706                                 lsm6dsrx_mlc_status_mainpage_t *val)
10707 {
10708   return lsm6dsrx_read_reg(ctx, LSM6DSRX_MLC_STATUS_MAINPAGE,
10709                            (uint8_t *) val, 1);
10710 }
10711 
10712 /**
10713   * @brief  Machine Learning Core data rate selection.[set]
10714   *
10715   * @param  ctx      read / write interface definitions
10716   * @param  val      get the values of mlc_odr in
10717   *                  reg EMB_FUNC_ODR_CFG_C
10718   *
10719   */
lsm6dsrx_mlc_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsrx_mlc_odr_t val)10720 int32_t lsm6dsrx_mlc_data_rate_set(const stmdev_ctx_t *ctx,
10721                                    lsm6dsrx_mlc_odr_t val)
10722 {
10723   lsm6dsrx_emb_func_odr_cfg_c_t reg;
10724   int32_t ret;
10725 
10726   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10727 
10728   if (ret == 0)
10729   {
10730     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_C,
10731                             (uint8_t *)&reg, 1);
10732   }
10733 
10734   if (ret == 0)
10735   {
10736     reg.mlc_odr = (uint8_t)val;
10737     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_C,
10738                              (uint8_t *)&reg, 1);
10739   }
10740 
10741   if (ret == 0)
10742   {
10743     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10744   }
10745 
10746   return ret;
10747 }
10748 
10749 /**
10750   * @brief  Machine Learning Core data rate selection.[get]
10751   *
10752   * @param  ctx      read / write interface definitions
10753   * @param  val      change the values of mlc_odr in
10754   *                  reg EMB_FUNC_ODR_CFG_C
10755   *
10756   */
lsm6dsrx_mlc_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsrx_mlc_odr_t * val)10757 int32_t lsm6dsrx_mlc_data_rate_get(const stmdev_ctx_t *ctx,
10758                                    lsm6dsrx_mlc_odr_t *val)
10759 {
10760   lsm6dsrx_emb_func_odr_cfg_c_t reg;
10761   int32_t ret;
10762 
10763   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10764 
10765   if (ret == 0)
10766   {
10767     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_EMB_FUNC_ODR_CFG_C,
10768                             (uint8_t *)&reg, 1);
10769   }
10770 
10771   if (ret == 0)
10772   {
10773     switch (reg.mlc_odr)
10774     {
10775       case LSM6DSRX_ODR_PRGS_12Hz5:
10776         *val = LSM6DSRX_ODR_PRGS_12Hz5;
10777         break;
10778 
10779       case LSM6DSRX_ODR_PRGS_26Hz:
10780         *val = LSM6DSRX_ODR_PRGS_26Hz;
10781         break;
10782 
10783       case LSM6DSRX_ODR_PRGS_52Hz:
10784         *val = LSM6DSRX_ODR_PRGS_52Hz;
10785         break;
10786 
10787       case LSM6DSRX_ODR_PRGS_104Hz:
10788         *val = LSM6DSRX_ODR_PRGS_104Hz;
10789         break;
10790 
10791       default:
10792         *val = LSM6DSRX_ODR_PRGS_12Hz5;
10793         break;
10794     }
10795 
10796     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10797   }
10798 
10799   return ret;
10800 }
10801 
10802 /**
10803   * @brief  prgsens_out: [get] Output value of all MLCx decision trees.
10804   *
10805   * @param  ctx_t *ctx: read / write interface definitions
10806   * @param  uint8_t * : buffer that stores data read
10807   *
10808   */
lsm6dsrx_mlc_out_get(const stmdev_ctx_t * ctx,uint8_t * buff)10809 int32_t lsm6dsrx_mlc_out_get(const stmdev_ctx_t *ctx, uint8_t *buff)
10810 {
10811   int32_t ret;
10812 
10813   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_EMBEDDED_FUNC_BANK);
10814 
10815   if (ret == 0)
10816   {
10817     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MLC0_SRC, buff, 8);
10818   }
10819 
10820   if (ret == 0)
10821   {
10822     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10823   }
10824 
10825   return ret;
10826 }
10827 
10828 /**
10829   * @brief  External magnetometer sensitivity value register for
10830   *         Machine Learning Core.[set]
10831   *
10832   * @param  ctx      read / write interface definitions
10833   * @param  buff     buffer that contains data to write
10834   *
10835   */
lsm6dsrx_mlc_mag_sensitivity_set(const stmdev_ctx_t * ctx,uint16_t val)10836 int32_t lsm6dsrx_mlc_mag_sensitivity_set(const stmdev_ctx_t *ctx,
10837                                          uint16_t val)
10838 {
10839   uint8_t buff[2];
10840   int32_t ret;
10841 
10842   buff[1] = (uint8_t)(val / 256U);
10843   buff[0] = (uint8_t)(val - (buff[1] * 256U));
10844   ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MLC_MAG_SENSITIVITY_L,
10845                                   &buff[0]);
10846 
10847   if (ret == 0)
10848   {
10849     ret = lsm6dsrx_ln_pg_write_byte(ctx, LSM6DSRX_MLC_MAG_SENSITIVITY_H,
10850                                     &buff[1]);
10851   }
10852 
10853   return ret;
10854 }
10855 
10856 /**
10857   * @brief  External magnetometer sensitivity value register for
10858   *         Machine Learning Core.[get]
10859   *
10860   * @param  ctx      read / write interface definitions
10861   * @param  buff     buffer that stores data read
10862   *
10863   */
lsm6dsrx_mlc_mag_sensitivity_get(const stmdev_ctx_t * ctx,uint16_t * val)10864 int32_t lsm6dsrx_mlc_mag_sensitivity_get(const stmdev_ctx_t *ctx,
10865                                          uint16_t *val)
10866 {
10867   uint8_t buff[2];
10868   int32_t ret;
10869 
10870   ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MLC_MAG_SENSITIVITY_L,
10871                                  &buff[0]);
10872 
10873   if (ret == 0)
10874   {
10875     ret = lsm6dsrx_ln_pg_read_byte(ctx, LSM6DSRX_MLC_MAG_SENSITIVITY_H,
10876                                    &buff[1]);
10877     *val = buff[1];
10878     *val = (*val * 256U) +  buff[0];
10879   }
10880 
10881   return ret;
10882 }
10883 
10884 /**
10885   * @}
10886   *
10887   */
10888 
10889 /**
10890   * @defgroup   LSM6DSRX_Sensor_hub
10891   * @brief      This section groups all the functions that manage the
10892   *             sensor hub.
10893   * @{
10894   *
10895   */
10896 
10897 /**
10898   * @brief  Sensor hub output registers.[get]
10899   *
10900   * @param  ctx    Read / write interface definitions.(ptr)
10901   * @param  val    Structure of registers from SENSOR_HUB_1 to SENSOR_HUB_18
10902   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10903   *
10904   */
lsm6dsrx_sh_read_data_raw_get(const stmdev_ctx_t * ctx,lsm6dsrx_emb_sh_read_t * val,uint8_t len)10905 int32_t lsm6dsrx_sh_read_data_raw_get(const stmdev_ctx_t *ctx,
10906                                       lsm6dsrx_emb_sh_read_t *val,
10907                                       uint8_t len)
10908 {
10909   int32_t ret;
10910 
10911   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
10912 
10913   if (ret == 0)
10914   {
10915     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SENSOR_HUB_1,
10916                             (uint8_t *)val, len);
10917   }
10918 
10919   if (ret == 0)
10920   {
10921     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10922   }
10923 
10924   return ret;
10925 }
10926 
10927 /**
10928   * @brief  Number of external sensors to be read by the sensor hub.[set]
10929   *
10930   * @param  ctx    Read / write interface definitions.(ptr)
10931   * @param  val    Change the values of aux_sens_on in reg MASTER_CONFIG
10932   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10933   *
10934   */
lsm6dsrx_sh_slave_connected_set(const stmdev_ctx_t * ctx,lsm6dsrx_aux_sens_on_t val)10935 int32_t lsm6dsrx_sh_slave_connected_set(const stmdev_ctx_t *ctx,
10936                                         lsm6dsrx_aux_sens_on_t val)
10937 {
10938   lsm6dsrx_master_config_t master_config;
10939   int32_t ret;
10940 
10941   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
10942 
10943   if (ret == 0)
10944   {
10945     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
10946                             (uint8_t *)&master_config, 1);
10947   }
10948 
10949   if (ret == 0)
10950   {
10951     master_config.aux_sens_on = (uint8_t)val;
10952     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
10953                              (uint8_t *)&master_config, 1);
10954   }
10955 
10956   if (ret == 0)
10957   {
10958     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10959   }
10960 
10961   return ret;
10962 }
10963 
10964 /**
10965   * @brief  Number of external sensors to be read by the sensor hub.[get]
10966   *
10967   * @param  ctx    Read / write interface definitions.(ptr)
10968   * @param  val    Get the values of aux_sens_on in reg MASTER_CONFIG
10969   * @retval        Interface status (MANDATORY: return 0 -> no Error).
10970   *
10971   */
lsm6dsrx_sh_slave_connected_get(const stmdev_ctx_t * ctx,lsm6dsrx_aux_sens_on_t * val)10972 int32_t lsm6dsrx_sh_slave_connected_get(const stmdev_ctx_t *ctx,
10973                                         lsm6dsrx_aux_sens_on_t *val)
10974 {
10975   lsm6dsrx_master_config_t master_config;
10976   int32_t ret;
10977 
10978   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
10979 
10980   if (ret == 0)
10981   {
10982     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
10983                             (uint8_t *)&master_config, 1);
10984   }
10985 
10986   if (ret == 0)
10987   {
10988     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
10989   }
10990 
10991   switch (master_config.aux_sens_on)
10992   {
10993     case LSM6DSRX_SLV_0:
10994       *val = LSM6DSRX_SLV_0;
10995       break;
10996 
10997     case LSM6DSRX_SLV_0_1:
10998       *val = LSM6DSRX_SLV_0_1;
10999       break;
11000 
11001     case LSM6DSRX_SLV_0_1_2:
11002       *val = LSM6DSRX_SLV_0_1_2;
11003       break;
11004 
11005     case LSM6DSRX_SLV_0_1_2_3:
11006       *val = LSM6DSRX_SLV_0_1_2_3;
11007       break;
11008 
11009     default:
11010       *val = LSM6DSRX_SLV_0;
11011       break;
11012   }
11013 
11014   return ret;
11015 }
11016 
11017 /**
11018   * @brief  Sensor hub I2C master enable.[set]
11019   *
11020   * @param  ctx    Read / write interface definitions.(ptr)
11021   * @param  val    Change the values of master_on in reg MASTER_CONFIG
11022   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11023   *
11024   */
lsm6dsrx_sh_master_set(const stmdev_ctx_t * ctx,uint8_t val)11025 int32_t lsm6dsrx_sh_master_set(const stmdev_ctx_t *ctx, uint8_t val)
11026 {
11027   lsm6dsrx_master_config_t master_config;
11028   int32_t ret;
11029 
11030   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11031 
11032   if (ret == 0)
11033   {
11034     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11035                             (uint8_t *)&master_config, 1);
11036   }
11037 
11038   if (ret == 0)
11039   {
11040     master_config.master_on = (uint8_t)val;
11041     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11042                              (uint8_t *)&master_config, 1);
11043   }
11044 
11045   if (ret == 0)
11046   {
11047     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11048   }
11049 
11050   return ret;
11051 }
11052 
11053 /**
11054   * @brief  Sensor hub I2C master enable.[get]
11055   *
11056   * @param  ctx    Read / write interface definitions.(ptr)
11057   * @param  val    Change the values of master_on in reg MASTER_CONFIG
11058   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11059   *
11060   */
lsm6dsrx_sh_master_get(const stmdev_ctx_t * ctx,uint8_t * val)11061 int32_t lsm6dsrx_sh_master_get(const stmdev_ctx_t *ctx, uint8_t *val)
11062 {
11063   lsm6dsrx_master_config_t master_config;
11064   int32_t ret;
11065 
11066   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11067 
11068   if (ret == 0)
11069   {
11070     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11071                             (uint8_t *)&master_config, 1);
11072   }
11073 
11074   if (ret == 0)
11075   {
11076     *val = master_config.master_on;
11077     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11078   }
11079 
11080   return ret;
11081 }
11082 
11083 /**
11084   * @brief  Master I2C pull-up enable.[set]
11085   *
11086   * @param  ctx    Read / write interface definitions.(ptr)
11087   * @param  val    Change the values of shub_pu_en in reg MASTER_CONFIG
11088   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11089   *
11090   */
lsm6dsrx_sh_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_shub_pu_en_t val)11091 int32_t lsm6dsrx_sh_pin_mode_set(const stmdev_ctx_t *ctx,
11092                                  lsm6dsrx_shub_pu_en_t val)
11093 {
11094   lsm6dsrx_master_config_t master_config;
11095   int32_t ret;
11096 
11097   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11098 
11099   if (ret == 0)
11100   {
11101     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11102                             (uint8_t *)&master_config, 1);
11103   }
11104 
11105   if (ret == 0)
11106   {
11107     master_config.shub_pu_en = (uint8_t)val;
11108     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11109                              (uint8_t *)&master_config, 1);
11110   }
11111 
11112   if (ret == 0)
11113   {
11114     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11115   }
11116 
11117   return ret;
11118 }
11119 
11120 /**
11121   * @brief  Master I2C pull-up enable.[get]
11122   *
11123   * @param  ctx    Read / write interface definitions.(ptr)
11124   * @param  val    Get the values of shub_pu_en in reg MASTER_CONFIG
11125   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11126   *
11127   */
lsm6dsrx_sh_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_shub_pu_en_t * val)11128 int32_t lsm6dsrx_sh_pin_mode_get(const stmdev_ctx_t *ctx,
11129                                  lsm6dsrx_shub_pu_en_t *val)
11130 {
11131   lsm6dsrx_master_config_t master_config;
11132   int32_t ret;
11133 
11134   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11135 
11136   if (ret == 0)
11137   {
11138     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11139                             (uint8_t *)&master_config, 1);
11140   }
11141 
11142   if (ret == 0)
11143   {
11144     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11145   }
11146 
11147   switch (master_config.shub_pu_en)
11148   {
11149     case LSM6DSRX_EXT_PULL_UP:
11150       *val = LSM6DSRX_EXT_PULL_UP;
11151       break;
11152 
11153     case LSM6DSRX_INTERNAL_PULL_UP:
11154       *val = LSM6DSRX_INTERNAL_PULL_UP;
11155       break;
11156 
11157     default:
11158       *val = LSM6DSRX_EXT_PULL_UP;
11159       break;
11160   }
11161 
11162   return ret;
11163 }
11164 
11165 /**
11166   * @brief  I2C interface pass-through.[set]
11167   *
11168   * @param  ctx    Read / write interface definitions.(ptr)
11169   * @param  val    Change the values of pass_through_mode in reg MASTER_CONFIG
11170   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11171   *
11172   */
lsm6dsrx_sh_pass_through_set(const stmdev_ctx_t * ctx,uint8_t val)11173 int32_t lsm6dsrx_sh_pass_through_set(const stmdev_ctx_t *ctx, uint8_t val)
11174 {
11175   lsm6dsrx_master_config_t master_config;
11176   int32_t ret;
11177 
11178   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11179 
11180   if (ret == 0)
11181   {
11182     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11183                             (uint8_t *)&master_config, 1);
11184   }
11185 
11186   if (ret == 0)
11187   {
11188     master_config.pass_through_mode = (uint8_t)val;
11189     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11190                              (uint8_t *)&master_config, 1);
11191   }
11192 
11193   if (ret == 0)
11194   {
11195     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11196   }
11197 
11198   return ret;
11199 }
11200 
11201 /**
11202   * @brief  I2C interface pass-through.[get]
11203   *
11204   * @param  ctx    Read / write interface definitions.(ptr)
11205   * @param  val    Change the values of pass_through_mode in reg MASTER_CONFIG
11206   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11207   *
11208   */
lsm6dsrx_sh_pass_through_get(const stmdev_ctx_t * ctx,uint8_t * val)11209 int32_t lsm6dsrx_sh_pass_through_get(const stmdev_ctx_t *ctx,
11210                                      uint8_t *val)
11211 {
11212   lsm6dsrx_master_config_t master_config;
11213   int32_t ret;
11214 
11215   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11216 
11217   if (ret == 0)
11218   {
11219     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11220                             (uint8_t *)&master_config, 1);
11221   }
11222 
11223   if (ret == 0)
11224   {
11225     *val = master_config.pass_through_mode;
11226     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11227   }
11228 
11229   return ret;
11230 }
11231 
11232 /**
11233   * @brief  Sensor hub trigger signal selection.[set]
11234   *
11235   * @param  ctx    Read / write interface definitions.(ptr)
11236   * @param  val    Change the values of start_config in reg MASTER_CONFIG
11237   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11238   *
11239   */
lsm6dsrx_sh_syncro_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_start_config_t val)11240 int32_t lsm6dsrx_sh_syncro_mode_set(const stmdev_ctx_t *ctx,
11241                                     lsm6dsrx_start_config_t val)
11242 {
11243   lsm6dsrx_master_config_t master_config;
11244   int32_t ret;
11245 
11246   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11247 
11248   if (ret == 0)
11249   {
11250     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11251                             (uint8_t *)&master_config, 1);
11252   }
11253 
11254   if (ret == 0)
11255   {
11256     master_config.start_config = (uint8_t)val;
11257     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11258                              (uint8_t *)&master_config, 1);
11259   }
11260 
11261   if (ret == 0)
11262   {
11263     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11264   }
11265 
11266   return ret;
11267 }
11268 
11269 /**
11270   * @brief  Sensor hub trigger signal selection.[get]
11271   *
11272   * @param  ctx    Read / write interface definitions.(ptr)
11273   * @param  val    Get the values of start_config in reg MASTER_CONFIG
11274   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11275   *
11276   */
lsm6dsrx_sh_syncro_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_start_config_t * val)11277 int32_t lsm6dsrx_sh_syncro_mode_get(const stmdev_ctx_t *ctx,
11278                                     lsm6dsrx_start_config_t *val)
11279 {
11280   lsm6dsrx_master_config_t master_config;
11281   int32_t ret;
11282 
11283   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11284 
11285   if (ret == 0)
11286   {
11287     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11288                             (uint8_t *)&master_config, 1);
11289   }
11290 
11291   if (ret == 0)
11292   {
11293     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11294   }
11295 
11296   switch (master_config.start_config)
11297   {
11298     case LSM6DSRX_EXT_ON_INT2_PIN:
11299       *val = LSM6DSRX_EXT_ON_INT2_PIN;
11300       break;
11301 
11302     case LSM6DSRX_XL_GY_DRDY:
11303       *val = LSM6DSRX_XL_GY_DRDY;
11304       break;
11305 
11306     default:
11307       *val = LSM6DSRX_EXT_ON_INT2_PIN;
11308       break;
11309   }
11310 
11311   return ret;
11312 }
11313 
11314 /**
11315   * @brief  Slave 0 write operation is performed only at the first sensor
11316   *         hub cycle.[set]
11317   *
11318   * @param  ctx    Read / write interface definitions.(ptr)
11319   * @param  val    Change the values of write_once in reg MASTER_CONFIG
11320   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11321   *
11322   */
lsm6dsrx_sh_write_mode_set(const stmdev_ctx_t * ctx,lsm6dsrx_write_once_t val)11323 int32_t lsm6dsrx_sh_write_mode_set(const stmdev_ctx_t *ctx,
11324                                    lsm6dsrx_write_once_t val)
11325 {
11326   lsm6dsrx_master_config_t master_config;
11327   int32_t ret;
11328 
11329   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11330 
11331   if (ret == 0)
11332   {
11333     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11334                             (uint8_t *)&master_config, 1);
11335   }
11336 
11337   if (ret == 0)
11338   {
11339     master_config.write_once = (uint8_t)val;
11340     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11341                              (uint8_t *)&master_config, 1);
11342   }
11343 
11344   if (ret == 0)
11345   {
11346     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11347   }
11348 
11349   return ret;
11350 }
11351 
11352 /**
11353   * @brief  Slave 0 write operation is performed only at the first sensor
11354   *         hub cycle.[get]
11355   *
11356   * @param  ctx    Read / write interface definitions.(ptr)
11357   * @param  val    Get the values of write_once in reg MASTER_CONFIG
11358   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11359   *
11360   */
lsm6dsrx_sh_write_mode_get(const stmdev_ctx_t * ctx,lsm6dsrx_write_once_t * val)11361 int32_t lsm6dsrx_sh_write_mode_get(const stmdev_ctx_t *ctx,
11362                                    lsm6dsrx_write_once_t *val)
11363 {
11364   lsm6dsrx_master_config_t master_config;
11365   int32_t ret;
11366 
11367   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11368 
11369   if (ret == 0)
11370   {
11371     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11372                             (uint8_t *)&master_config, 1);
11373   }
11374 
11375   if (ret == 0)
11376   {
11377     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11378   }
11379 
11380   switch (master_config.write_once)
11381   {
11382     case LSM6DSRX_EACH_SH_CYCLE:
11383       *val = LSM6DSRX_EACH_SH_CYCLE;
11384       break;
11385 
11386     case LSM6DSRX_ONLY_FIRST_CYCLE:
11387       *val = LSM6DSRX_ONLY_FIRST_CYCLE;
11388       break;
11389 
11390     default:
11391       *val = LSM6DSRX_EACH_SH_CYCLE;
11392       break;
11393   }
11394 
11395   return ret;
11396 }
11397 
11398 /**
11399   * @brief  Reset Master logic and output registers.[set]
11400   *
11401   * @param  ctx    Read / write interface definitions.(ptr)
11402   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11403   *
11404   */
lsm6dsrx_sh_reset_set(const stmdev_ctx_t * ctx)11405 int32_t lsm6dsrx_sh_reset_set(const stmdev_ctx_t *ctx)
11406 {
11407   lsm6dsrx_master_config_t master_config;
11408   int32_t ret;
11409 
11410   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11411 
11412   if (ret == 0)
11413   {
11414     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11415                             (uint8_t *)&master_config, 1);
11416   }
11417 
11418   if (ret == 0)
11419   {
11420     master_config.rst_master_regs = PROPERTY_ENABLE;
11421     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11422                              (uint8_t *)&master_config, 1);
11423   }
11424 
11425   if (ret == 0)
11426   {
11427     master_config.rst_master_regs = PROPERTY_DISABLE;
11428     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11429                              (uint8_t *)&master_config, 1);
11430   }
11431 
11432   if (ret == 0)
11433   {
11434     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11435   }
11436 
11437   return ret;
11438 }
11439 
11440 /**
11441   * @brief  Reset Master logic and output registers.[get]
11442   *
11443   * @param  ctx    Read / write interface definitions.(ptr)
11444   * @param  val    Change the values of rst_master_regs in reg MASTER_CONFIG
11445   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11446   *
11447   */
lsm6dsrx_sh_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)11448 int32_t lsm6dsrx_sh_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
11449 {
11450   lsm6dsrx_master_config_t master_config;
11451   int32_t ret;
11452 
11453   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11454 
11455   if (ret == 0)
11456   {
11457     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_MASTER_CONFIG,
11458                             (uint8_t *)&master_config, 1);
11459     *val = master_config.rst_master_regs;
11460   }
11461 
11462   if (ret == 0)
11463   {
11464     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11465   }
11466 
11467   return ret;
11468 }
11469 
11470 /**
11471   * @brief  Rate at which the master communicates.[set]
11472   *
11473   * @param  ctx    Read / write interface definitions.(ptr)
11474   * @param  val    Change the values of shub_odr in reg SLV0_CONFIG
11475   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11476   *
11477   */
lsm6dsrx_sh_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsrx_shub_odr_t val)11478 int32_t lsm6dsrx_sh_data_rate_set(const stmdev_ctx_t *ctx,
11479                                   lsm6dsrx_shub_odr_t val)
11480 {
11481   lsm6dsrx_slv0_config_t slv0_config;
11482   int32_t ret;
11483 
11484   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11485 
11486   if (ret == 0)
11487   {
11488     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV0_CONFIG,
11489                             (uint8_t *)&slv0_config, 1);
11490   }
11491 
11492   if (ret == 0)
11493   {
11494     slv0_config.shub_odr = (uint8_t)val;
11495     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_CONFIG,
11496                              (uint8_t *)&slv0_config, 1);
11497   }
11498 
11499   if (ret == 0)
11500   {
11501     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11502   }
11503 
11504   return ret;
11505 }
11506 
11507 /**
11508   * @brief  Rate at which the master communicates.[get]
11509   *
11510   * @param  ctx    Read / write interface definitions.(ptr)
11511   * @param  val    Get the values of shub_odr in reg slv1_CONFIG
11512   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11513   *
11514   */
lsm6dsrx_sh_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsrx_shub_odr_t * val)11515 int32_t lsm6dsrx_sh_data_rate_get(const stmdev_ctx_t *ctx,
11516                                   lsm6dsrx_shub_odr_t *val)
11517 {
11518   lsm6dsrx_slv0_config_t slv0_config;
11519   int32_t ret;
11520 
11521   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11522 
11523   if (ret == 0)
11524   {
11525     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV0_CONFIG,
11526                             (uint8_t *)&slv0_config, 1);
11527   }
11528 
11529   if (ret == 0)
11530   {
11531     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11532   }
11533 
11534   switch (slv0_config.shub_odr)
11535   {
11536     case LSM6DSRX_SH_ODR_104Hz:
11537       *val = LSM6DSRX_SH_ODR_104Hz;
11538       break;
11539 
11540     case LSM6DSRX_SH_ODR_52Hz:
11541       *val = LSM6DSRX_SH_ODR_52Hz;
11542       break;
11543 
11544     case LSM6DSRX_SH_ODR_26Hz:
11545       *val = LSM6DSRX_SH_ODR_26Hz;
11546       break;
11547 
11548     case LSM6DSRX_SH_ODR_13Hz:
11549       *val = LSM6DSRX_SH_ODR_13Hz;
11550       break;
11551 
11552     default:
11553       *val = LSM6DSRX_SH_ODR_104Hz;
11554       break;
11555   }
11556 
11557   return ret;
11558 }
11559 
11560 /**
11561   * @brief  Configure slave 0 for perform a write.[set]
11562   *
11563   * @param  ctx    Read / write interface definitions.(ptr)
11564   * @param  val    Structure that contain
11565   *                - uint8_t slv0_add;    8 bit i2c device address
11566   *                - uint8_t slv0_subadd; 8 bit register device address
11567   *                - uint8_t slv0_data;   8 bit data to write
11568   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11569   *
11570   */
lsm6dsrx_sh_cfg_write(const stmdev_ctx_t * ctx,lsm6dsrx_sh_cfg_write_t * val)11571 int32_t lsm6dsrx_sh_cfg_write(const stmdev_ctx_t *ctx,
11572                               lsm6dsrx_sh_cfg_write_t *val)
11573 {
11574   lsm6dsrx_slv0_add_t slv0_add;
11575   int32_t ret;
11576 
11577   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11578 
11579   if (ret == 0)
11580   {
11581     slv0_add.slave0 = (uint8_t)(val->slv0_add >> 1);
11582     slv0_add.rw_0 = 0;
11583     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_ADD,
11584                              (uint8_t *) & (slv0_add), 1);
11585   }
11586 
11587   if (ret == 0)
11588   {
11589     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_SUBADD,
11590                              (uint8_t *) & (val->slv0_subadd), 1);
11591   }
11592 
11593   if (ret == 0)
11594   {
11595     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_DATAWRITE_SLV0,
11596                              (uint8_t *) & (val->slv0_data), 1);
11597   }
11598 
11599   if (ret == 0)
11600   {
11601     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11602   }
11603 
11604   return ret;
11605 }
11606 
11607 /**
11608   * @brief Configure slave 0 for perform a write/read.[get]
11609   *
11610   * @param  ctx    Read / write interface definitions.(ptr)
11611   * @param  val    Structure that contain
11612   *                - uint8_t slv_add;    8 bit i2c device address
11613   *                - uint8_t slv_subadd; 8 bit register device address
11614   *                - uint8_t slv_len;    num of bit to read
11615   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11616   *
11617   */
lsm6dsrx_sh_slv0_cfg_read(const stmdev_ctx_t * ctx,lsm6dsrx_sh_cfg_read_t * val)11618 int32_t lsm6dsrx_sh_slv0_cfg_read(const stmdev_ctx_t *ctx,
11619                                   lsm6dsrx_sh_cfg_read_t *val)
11620 {
11621   lsm6dsrx_slv0_config_t slv0_config;
11622   lsm6dsrx_slv0_add_t slv0_add;
11623   int32_t ret;
11624 
11625   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11626 
11627   if (ret == 0)
11628   {
11629     slv0_add.slave0 = (uint8_t) val->slv_add >> 1;
11630     slv0_add.rw_0 = 1;
11631     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_ADD,
11632                              (uint8_t *) & (slv0_add), 1);
11633   }
11634 
11635   if (ret == 0)
11636   {
11637     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_SUBADD,
11638                              &(val->slv_subadd), 1);
11639   }
11640 
11641   if (ret == 0)
11642   {
11643     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV0_CONFIG,
11644                             (uint8_t *)&slv0_config, 1);
11645   }
11646 
11647   if (ret == 0)
11648   {
11649     slv0_config.slave0_numop = val->slv_len;
11650     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV0_CONFIG,
11651                              (uint8_t *)&slv0_config, 1);
11652   }
11653 
11654   if (ret == 0)
11655   {
11656     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11657   }
11658 
11659   return ret;
11660 }
11661 
11662 /**
11663   * @brief  Configure slave 0 for perform a write/read.[get]
11664   *
11665   * @param  ctx    Read / write interface definitions.(ptr)
11666   * @param  val    Structure that contain
11667   *                - uint8_t slv_add;    8 bit i2c device address
11668   *                - uint8_t slv_subadd; 8 bit register device address
11669   *                - uint8_t slv_len;    num of bit to read
11670   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11671   *
11672   */
lsm6dsrx_sh_slv1_cfg_read(const stmdev_ctx_t * ctx,lsm6dsrx_sh_cfg_read_t * val)11673 int32_t lsm6dsrx_sh_slv1_cfg_read(const stmdev_ctx_t *ctx,
11674                                   lsm6dsrx_sh_cfg_read_t *val)
11675 {
11676   lsm6dsrx_slv1_config_t slv1_config;
11677   lsm6dsrx_slv1_add_t slv1_add;
11678   int32_t ret;
11679 
11680   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11681 
11682   if (ret == 0)
11683   {
11684     slv1_add.slave1_add = (uint8_t)(val->slv_add >> 1);
11685     slv1_add.r_1 = 1;
11686     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV1_ADD,
11687                              (uint8_t *)&slv1_add, 1);
11688   }
11689 
11690   if (ret == 0)
11691   {
11692     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV1_SUBADD,
11693                              &(val->slv_subadd), 1);
11694   }
11695 
11696   if (ret == 0)
11697   {
11698     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV1_CONFIG,
11699                             (uint8_t *)&slv1_config, 1);
11700   }
11701 
11702   if (ret == 0)
11703   {
11704     slv1_config.slave1_numop = val->slv_len;
11705     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV1_CONFIG,
11706                              (uint8_t *)&slv1_config, 1);
11707   }
11708 
11709   if (ret == 0)
11710   {
11711     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11712   }
11713 
11714   return ret;
11715 }
11716 
11717 /**
11718   * @brief  Configure slave 2 for perform a write/read.[get]
11719   *
11720   * @param  ctx    Read / write interface definitions.(ptr)
11721   * @param  val    Structure that contain
11722   *                - uint8_t slv_add;    8 bit i2c device address
11723   *                - uint8_t slv_subadd; 8 bit register device address
11724   *                - uint8_t slv_len;    num of bit to read
11725   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11726   *
11727   */
lsm6dsrx_sh_slv2_cfg_read(const stmdev_ctx_t * ctx,lsm6dsrx_sh_cfg_read_t * val)11728 int32_t lsm6dsrx_sh_slv2_cfg_read(const stmdev_ctx_t *ctx,
11729                                   lsm6dsrx_sh_cfg_read_t *val)
11730 {
11731   lsm6dsrx_slv2_config_t slv2_config;
11732   lsm6dsrx_slv2_add_t slv2_add;
11733   int32_t ret;
11734 
11735   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11736 
11737   if (ret == 0)
11738   {
11739     slv2_add.slave2_add = (uint8_t)(val->slv_add >> 1);
11740     slv2_add.r_2 = 1;
11741     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV2_ADD,
11742                              (uint8_t *)&slv2_add, 1);
11743   }
11744 
11745   if (ret == 0)
11746   {
11747     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV2_SUBADD,
11748                              (uint8_t *) & (val->slv_subadd), 1);
11749   }
11750 
11751   if (ret == 0)
11752   {
11753     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV2_CONFIG,
11754                             (uint8_t *)&slv2_config, 1);
11755   }
11756 
11757   if (ret == 0)
11758   {
11759     slv2_config.slave2_numop = val->slv_len;
11760     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV2_CONFIG,
11761                              (uint8_t *)&slv2_config, 1);
11762   }
11763 
11764   if (ret == 0)
11765   {
11766     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11767   }
11768 
11769   return ret;
11770 }
11771 
11772 /**
11773   * @brief  Configure slave 3 for perform a write/read.[get]
11774   *
11775   * @param  ctx    Read / write interface definitions.(ptr)
11776   * @param  val    Structure that contain
11777   *                - uint8_t slv_add;    8 bit i2c device address
11778   *                - uint8_t slv_subadd; 8 bit register device address
11779   *                - uint8_t slv_len;    num of bit to read
11780   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11781   *
11782   */
lsm6dsrx_sh_slv3_cfg_read(const stmdev_ctx_t * ctx,lsm6dsrx_sh_cfg_read_t * val)11783 int32_t lsm6dsrx_sh_slv3_cfg_read(const stmdev_ctx_t *ctx,
11784                                   lsm6dsrx_sh_cfg_read_t *val)
11785 {
11786   lsm6dsrx_slv3_config_t slv3_config;
11787   lsm6dsrx_slv3_add_t slv3_add;
11788   int32_t ret;
11789 
11790   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11791 
11792   if (ret == 0)
11793   {
11794     slv3_add.slave3_add = (uint8_t)(val->slv_add >> 1);
11795     slv3_add.r_3 = 1;
11796     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV3_ADD,
11797                              (uint8_t *)&slv3_add, 1);
11798   }
11799 
11800   if (ret == 0)
11801   {
11802     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV3_SUBADD,
11803                              &(val->slv_subadd), 1);
11804   }
11805 
11806   if (ret == 0)
11807   {
11808     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_SLV3_CONFIG,
11809                             (uint8_t *)&slv3_config, 1);
11810   }
11811 
11812   if (ret == 0)
11813   {
11814     slv3_config.slave3_numop = val->slv_len;
11815     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_SLV3_CONFIG,
11816                              (uint8_t *)&slv3_config, 1);
11817   }
11818 
11819   if (ret == 0)
11820   {
11821     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11822   }
11823 
11824   return ret;
11825 }
11826 
11827 /**
11828   * @brief  Sensor hub source register.[get]
11829   *
11830   * @param  ctx    Read / write interface definitions.(ptr)
11831   * @param  val    Registers from STATUS_MASTER
11832   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11833   *
11834   */
lsm6dsrx_sh_status_get(const stmdev_ctx_t * ctx,lsm6dsrx_status_master_t * val)11835 int32_t lsm6dsrx_sh_status_get(const stmdev_ctx_t *ctx,
11836                                lsm6dsrx_status_master_t *val)
11837 {
11838   int32_t ret;
11839 
11840   ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_SENSOR_HUB_BANK);
11841 
11842   if (ret == 0)
11843   {
11844     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_STATUS_MASTER,
11845                             (uint8_t *)val, 1);
11846   }
11847 
11848   if (ret == 0)
11849   {
11850     ret = lsm6dsrx_mem_bank_set(ctx, LSM6DSRX_USER_BANK);
11851   }
11852 
11853   return ret;
11854 }
11855 
11856 /**
11857   * @}
11858   *
11859   */
11860 
11861 /**
11862   * @defgroup   LSM6DSRX_Sensors for Smart Mobile Devices
11863   * @brief      This section groups all the functions that manage the
11864   *             Sensors for Smart Mobile Devices.
11865   * @{
11866   *
11867   */
11868 
11869 /**
11870   * @brief  Sensor synchronization time frame resolution[set]
11871   *
11872   * @param  ctx    Read / write interface definitions.(ptr)
11873   * @param  val    Change the values of tph_h_sel in LSM6DSRX_S4S_TPH_L
11874   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11875   *
11876   */
lsm6dsrx_s4s_tph_res_set(const stmdev_ctx_t * ctx,lsm6dsrx_s4s_tph_res_t val)11877 int32_t lsm6dsrx_s4s_tph_res_set(const stmdev_ctx_t *ctx,
11878                                  lsm6dsrx_s4s_tph_res_t val)
11879 {
11880   lsm6dsrx_s4s_tph_l_t s4s_tph_l;
11881   int32_t ret;
11882 
11883   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_L, (uint8_t *)&s4s_tph_l, 1);
11884 
11885   if (ret == 0)
11886   {
11887     s4s_tph_l.tph_h_sel = (uint8_t)val;
11888     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_TPH_L,
11889                              (uint8_t *)&s4s_tph_l, 1);
11890   }
11891 
11892   return ret;
11893 }
11894 
11895 /**
11896   * @brief  Sensor synchronization time frame resolution.[get]
11897   *
11898   * @param  ctx    Read / write interface definitions.(ptr)
11899   * @param  val    Get the values of tph_h_sel in LSM6DSRX_S4S_TPH_L
11900   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11901   *
11902   */
lsm6dsrx_s4s_tph_res_get(const stmdev_ctx_t * ctx,lsm6dsrx_s4s_tph_res_t * val)11903 int32_t lsm6dsrx_s4s_tph_res_get(const stmdev_ctx_t *ctx,
11904                                  lsm6dsrx_s4s_tph_res_t *val)
11905 {
11906   lsm6dsrx_s4s_tph_l_t s4s_tph_l;
11907   int32_t ret;
11908 
11909   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_L, (uint8_t *)&s4s_tph_l, 1);
11910 
11911   switch (s4s_tph_l.tph_h_sel)
11912   {
11913     case LSM6DSRX_S4S_TPH_7bit:
11914       *val = LSM6DSRX_S4S_TPH_7bit;
11915       break;
11916 
11917     case LSM6DSRX_S4S_TPH_15bit:
11918       *val = LSM6DSRX_S4S_TPH_15bit;
11919       break;
11920 
11921     default:
11922       *val = LSM6DSRX_S4S_TPH_7bit;
11923       break;
11924   }
11925 
11926   return ret;
11927 }
11928 
11929 /**
11930   * @brief  Sensor synchronization time frame.[set]
11931   *
11932   * @param  ctx    Read / write interface definitions.(ptr)
11933   * @param  val    Change the values of tph_l in S4S_TPH_L and
11934   *                tph_h in S4S_TPH_H
11935   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11936   *
11937   */
lsm6dsrx_s4s_tph_val_set(const stmdev_ctx_t * ctx,uint16_t val)11938 int32_t lsm6dsrx_s4s_tph_val_set(const stmdev_ctx_t *ctx, uint16_t val)
11939 {
11940   lsm6dsrx_s4s_tph_l_t s4s_tph_l;
11941   lsm6dsrx_s4s_tph_h_t s4s_tph_h;
11942   int32_t ret;
11943 
11944   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_L, (uint8_t *)&s4s_tph_l, 1);
11945 
11946   if (ret == 0)
11947   {
11948     s4s_tph_l.tph_l = (uint8_t)(val & 0x007FU);
11949     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_TPH_L,
11950                              (uint8_t *)&s4s_tph_l, 1);
11951   }
11952 
11953   if (ret == 0)
11954   {
11955     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_H,
11956                             (uint8_t *)&s4s_tph_h, 1);
11957   }
11958 
11959   if (ret == 0)
11960   {
11961     s4s_tph_h.tph_h = (uint8_t)((val & 0x7F80U) >> 7);
11962     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_TPH_H,
11963                              (uint8_t *)&s4s_tph_h, 1);
11964   }
11965 
11966   return ret;
11967 }
11968 
11969 /**
11970   * @brief  Sensor synchronization time frame.[get]
11971   *
11972   * @param  ctx    Read / write interface definitions.(ptr)
11973   * @param  val    Get the values of tph_l in S4S_TPH_L and tph_h in S4S_TPH_H
11974   * @retval        Interface status (MANDATORY: return 0 -> no Error).
11975   *
11976   */
lsm6dsrx_s4s_tph_val_get(const stmdev_ctx_t * ctx,uint16_t * val)11977 int32_t lsm6dsrx_s4s_tph_val_get(const stmdev_ctx_t *ctx, uint16_t *val)
11978 {
11979   lsm6dsrx_s4s_tph_l_t s4s_tph_l;
11980   lsm6dsrx_s4s_tph_h_t s4s_tph_h;
11981   int32_t ret;
11982 
11983   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_L, (uint8_t *)&s4s_tph_l, 1);
11984 
11985   if (ret == 0)
11986   {
11987     ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_TPH_H,
11988                             (uint8_t *)&s4s_tph_h, 1);
11989   }
11990 
11991   *val = s4s_tph_h.tph_h;
11992   *val = *val << 7;
11993   *val += s4s_tph_l.tph_l;
11994 
11995   return ret;
11996 }
11997 
11998 /**
11999   * @brief  Sensor synchronization resolution ratio register.[set]
12000   *
12001   * @param  ctx    Read / write interface definitions.(ptr)
12002   * @param  val    Change the values of rr in S4S_RR.
12003   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12004   *
12005   */
lsm6dsrx_s4s_res_ratio_set(const stmdev_ctx_t * ctx,lsm6dsrx_s4s_res_ratio_t val)12006 int32_t lsm6dsrx_s4s_res_ratio_set(const stmdev_ctx_t *ctx,
12007                                    lsm6dsrx_s4s_res_ratio_t val)
12008 {
12009   lsm6dsrx_s4s_rr_t s4s_rr;
12010   int32_t ret;
12011 
12012   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_RR, (uint8_t *)&s4s_rr, 1);
12013 
12014   if (ret == 0)
12015   {
12016     s4s_rr.rr = (uint8_t)val;
12017     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_RR, (uint8_t *)&s4s_rr, 1);
12018   }
12019 
12020   return ret;
12021 }
12022 
12023 /**
12024   * @brief   Sensor synchronization resolution ratio register.[get]
12025   *
12026   * @param  ctx    Read / write interface definitions.(ptr)
12027   * @param  val    get the values of rr in S4S_RR
12028   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12029   *
12030   */
lsm6dsrx_s4s_res_ratio_get(const stmdev_ctx_t * ctx,lsm6dsrx_s4s_res_ratio_t * val)12031 int32_t lsm6dsrx_s4s_res_ratio_get(const stmdev_ctx_t *ctx,
12032                                    lsm6dsrx_s4s_res_ratio_t *val)
12033 {
12034   lsm6dsrx_s4s_rr_t s4s_rr;
12035   int32_t ret;
12036 
12037   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_RR, (uint8_t *)&s4s_rr, 1);
12038 
12039   switch (s4s_rr.rr)
12040   {
12041     case LSM6DSRX_S4S_DT_RES_11:
12042       *val = LSM6DSRX_S4S_DT_RES_11;
12043       break;
12044 
12045     case LSM6DSRX_S4S_DT_RES_12:
12046       *val = LSM6DSRX_S4S_DT_RES_12;
12047       break;
12048 
12049     case LSM6DSRX_S4S_DT_RES_13:
12050       *val = LSM6DSRX_S4S_DT_RES_13;
12051       break;
12052 
12053     case LSM6DSRX_S4S_DT_RES_14:
12054       *val = LSM6DSRX_S4S_DT_RES_14;
12055       break;
12056 
12057     default:
12058       *val = LSM6DSRX_S4S_DT_RES_11;
12059       break;
12060   }
12061 
12062   return ret;
12063 }
12064 
12065 /**
12066   * @brief  s4s master command.[set]
12067   *
12068   * @param  ctx    Read / write interface definitions.(ptr)
12069   * @param  val    Change the values of S4S_ST_CMD_CODE.
12070   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12071   *
12072   */
lsm6dsrx_s4s_command_set(const stmdev_ctx_t * ctx,uint8_t val)12073 int32_t lsm6dsrx_s4s_command_set(const stmdev_ctx_t *ctx, uint8_t val)
12074 {
12075   lsm6dsrx_s4s_st_cmd_code_t s4s_st_cmd_code;
12076   int32_t ret;
12077 
12078   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_ST_CMD_CODE,
12079                           (uint8_t *)&s4s_st_cmd_code, 1);
12080 
12081   if (ret == 0)
12082   {
12083     s4s_st_cmd_code.s4s_st_cmd_code = (uint8_t)val;
12084     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_ST_CMD_CODE,
12085                              (uint8_t *)&s4s_st_cmd_code, 1);
12086   }
12087 
12088   return ret;
12089 }
12090 
12091 /**
12092   * @brief  s4s master command.[get]
12093   *
12094   * @param  ctx    Read / write interface definitions.(ptr)
12095   * @param  val    get the values of S4S_ST_CMD_CODE.
12096   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12097   *
12098   */
lsm6dsrx_s4s_command_get(const stmdev_ctx_t * ctx,uint8_t * val)12099 int32_t lsm6dsrx_s4s_command_get(const stmdev_ctx_t *ctx, uint8_t *val)
12100 {
12101   lsm6dsrx_s4s_st_cmd_code_t s4s_st_cmd_code;
12102   int32_t ret;
12103 
12104   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_ST_CMD_CODE,
12105                           (uint8_t *)&s4s_st_cmd_code, 1);
12106   *val = s4s_st_cmd_code.s4s_st_cmd_code;
12107 
12108   return ret;
12109 }
12110 
12111 /**
12112   * @brief S4S DT register.[set]
12113   *
12114   * @param  ctx    Read / write interface definitions.(ptr)
12115   * @param  val    Change the values of S4S_DT_REG.
12116   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12117   *
12118   */
lsm6dsrx_s4s_dt_set(const stmdev_ctx_t * ctx,uint8_t val)12119 int32_t lsm6dsrx_s4s_dt_set(const stmdev_ctx_t *ctx, uint8_t val)
12120 {
12121   lsm6dsrx_s4s_dt_reg_t s4s_dt_reg;
12122   int32_t ret;
12123 
12124   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_DT_REG,
12125                           (uint8_t *)&s4s_dt_reg, 1);
12126 
12127   if (ret == 0)
12128   {
12129     s4s_dt_reg.dt = (uint8_t)val;
12130     ret = lsm6dsrx_write_reg(ctx, LSM6DSRX_S4S_DT_REG,
12131                              (uint8_t *)&s4s_dt_reg, 1);
12132   }
12133 
12134   return ret;
12135 }
12136 
12137 /**
12138   * @brief  S4S DT register.[get]
12139   *
12140   * @param  ctx    Read / write interface definitions.(ptr)
12141   * @param  val    get the values of S4S_DT_REG.
12142   * @retval        Interface status (MANDATORY: return 0 -> no Error).
12143   *
12144   */
lsm6dsrx_s4s_dt_get(const stmdev_ctx_t * ctx,uint8_t * val)12145 int32_t lsm6dsrx_s4s_dt_get(const stmdev_ctx_t *ctx, uint8_t *val)
12146 {
12147   lsm6dsrx_s4s_dt_reg_t s4s_dt_reg;
12148   int32_t ret;
12149 
12150   ret = lsm6dsrx_read_reg(ctx, LSM6DSRX_S4S_DT_REG,
12151                           (uint8_t *)&s4s_dt_reg, 1);
12152   *val = s4s_dt_reg.dt;
12153 
12154   return ret;
12155 }
12156 
12157 /**
12158   * @}
12159   *
12160   */
12161 
12162 /**
12163   * @}
12164   *
12165   */
12166 
12167 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
12168