1 /**
2   ******************************************************************************
3   * @file    lsm6dso16is_reg.c
4   * @author  Sensors Software Solution Team
5   * @brief   LSM6DSO16IS driver file
6   ******************************************************************************
7   * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2022 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 "lsm6dso16is_reg.h"
21 
22 /**
23   * @defgroup  LSM6DSO16IS
24   * @brief     This file provides a set of functions needed to drive the
25   *            lsm6dso16is enhanced inertial module.
26   * @{
27   *
28   */
29 
30 /**
31   * @defgroup  Interfaces functions
32   * @brief     This section provide a set of functions used to read and
33   *            write a generic register of the device.
34   *            MANDATORY: return 0 -> no Error.
35   * @{
36   *
37   */
38 
39 /**
40   * @brief  Read generic device register
41   *
42   * @param  ctx   communication interface handler.(ptr)
43   * @param  reg   first register address to read.
44   * @param  data  buffer for data read.(ptr)
45   * @param  len   number of consecutive register to read.
46   * @retval       interface status (MANDATORY: return 0 -> no Error)
47   *
48   */
lsm6dso16is_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lsm6dso16is_read_reg(const stmdev_ctx_t *ctx, uint8_t reg,
50                                     uint8_t *data,
51                                     uint16_t len)
52 {
53   int32_t ret;
54 
55   if (ctx == NULL)
56   {
57     return -1;
58   }
59 
60   ret = ctx->read_reg(ctx->handle, reg, data, len);
61 
62   return ret;
63 }
64 
65 /**
66   * @brief  Write generic device register
67   *
68   * @param  ctx   communication interface handler.(ptr)
69   * @param  reg   first register address to write.
70   * @param  data  the buffer contains data to be written.(ptr)
71   * @param  len   number of consecutive register to write.
72   * @retval       interface status (MANDATORY: return 0 -> no Error)
73   *
74   */
lsm6dso16is_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lsm6dso16is_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    LSM6DSO16IS_Sensitivity
98   * @brief       These functions convert raw-data into engineering units.
99   * @{
100   *
101   */
102 
lsm6dso16is_from_fs2g_to_mg(int16_t lsb)103 float_t lsm6dso16is_from_fs2g_to_mg(int16_t lsb)
104 {
105   return ((float_t)lsb * 0.061f);
106 }
107 
lsm6dso16is_from_fs4g_to_mg(int16_t lsb)108 float_t lsm6dso16is_from_fs4g_to_mg(int16_t lsb)
109 {
110   return ((float_t)lsb * 0.122f);
111 }
112 
lsm6dso16is_from_fs8g_to_mg(int16_t lsb)113 float_t lsm6dso16is_from_fs8g_to_mg(int16_t lsb)
114 {
115   return ((float_t)lsb * 0.244f);
116 }
117 
lsm6dso16is_from_fs16g_to_mg(int16_t lsb)118 float_t lsm6dso16is_from_fs16g_to_mg(int16_t lsb)
119 {
120   return ((float_t)lsb * 0.488f);
121 }
122 
lsm6dso16is_from_fs125dps_to_mdps(int16_t lsb)123 float_t lsm6dso16is_from_fs125dps_to_mdps(int16_t lsb)
124 {
125   return ((float_t)lsb * 4.375f);
126 }
127 
lsm6dso16is_from_fs250dps_to_mdps(int16_t lsb)128 float_t lsm6dso16is_from_fs250dps_to_mdps(int16_t lsb)
129 {
130   return ((float_t)lsb * 8.75f);
131 }
132 
lsm6dso16is_from_fs500dps_to_mdps(int16_t lsb)133 float_t lsm6dso16is_from_fs500dps_to_mdps(int16_t lsb)
134 {
135   return ((float_t)lsb * 17.50f);
136 }
137 
lsm6dso16is_from_fs1000dps_to_mdps(int16_t lsb)138 float_t lsm6dso16is_from_fs1000dps_to_mdps(int16_t lsb)
139 {
140   return ((float_t)lsb * 35.0f);
141 }
142 
lsm6dso16is_from_fs2000dps_to_mdps(int16_t lsb)143 float_t lsm6dso16is_from_fs2000dps_to_mdps(int16_t lsb)
144 {
145   return ((float_t)lsb * 70.0f);
146 }
147 
lsm6dso16is_from_lsb_to_celsius(int16_t lsb)148 float_t lsm6dso16is_from_lsb_to_celsius(int16_t lsb)
149 {
150   return (((float_t)lsb / 256.0f) + 25.0f);
151 }
152 
153 /**
154   * @defgroup Common
155   * @brief    Common
156   * @{/
157   *
158   */
159 
160 /**
161   * @brief  Difference in percentage of the effective ODR (and timestamp rate)
162   *         with respect to the typical.[set]
163   *         Step:  0.15%. 8-bit format, 2's complement.
164   *
165   * @param  ctx    Read / write interface definitions.(ptr)
166   * @param  val    Change the values of freq_fine in reg INTERNAL_FREQ_FINE
167   * @retval        Interface status (MANDATORY: return 0 -> no Error).
168   *
169   */
lsm6dso16is_odr_cal_reg_set(const stmdev_ctx_t * ctx,uint8_t val)170 int32_t lsm6dso16is_odr_cal_reg_set(const stmdev_ctx_t *ctx, uint8_t val)
171 {
172   lsm6dso16is_internal_freq_fine_t internal_freq_fine;
173   int32_t ret;
174 
175   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INTERNAL_FREQ_FINE,
176                              (uint8_t *)&internal_freq_fine, 1);
177 
178   if (ret == 0)
179   {
180     internal_freq_fine.freq_fine = (uint8_t)val;
181     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_INTERNAL_FREQ_FINE,
182                                 (uint8_t *)&internal_freq_fine, 1);
183   }
184 
185   return ret;
186 }
187 
188 /**
189   * @brief  Difference in percentage of the effective ODR (and timestamp rate)
190   *         with respect to the typical.[get]
191   *         Step:  0.15%. 8-bit format, 2's complement.
192   *
193   * @param  ctx    Read / write interface definitions.(ptr)
194   * @param  val    Change the values of freq_fine in reg INTERNAL_FREQ_FINE
195   * @retval        Interface status (MANDATORY: return 0 -> no Error).
196   *
197   */
lsm6dso16is_odr_cal_reg_get(const stmdev_ctx_t * ctx,uint8_t * val)198 int32_t lsm6dso16is_odr_cal_reg_get(const stmdev_ctx_t *ctx, uint8_t *val)
199 {
200   lsm6dso16is_internal_freq_fine_t internal_freq_fine;
201   int32_t ret;
202 
203   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INTERNAL_FREQ_FINE,
204                              (uint8_t *)&internal_freq_fine, 1);
205   *val = internal_freq_fine.freq_fine;
206 
207   return ret;
208 }
209 
210 /**
211   * @brief  Change memory bank.[set]
212   *
213   * @param  ctx      read / write interface definitions
214   * @param  val      MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK, SENSOR_HUB_MEM_BANK, ISPU_MEM_BANK,
215   * @retval          interface status (MANDATORY: return 0 -> no Error)
216   *
217   */
lsm6dso16is_mem_bank_set(const stmdev_ctx_t * ctx,lsm6dso16is_mem_bank_t val)218 int32_t lsm6dso16is_mem_bank_set(const stmdev_ctx_t *ctx, lsm6dso16is_mem_bank_t val)
219 {
220   lsm6dso16is_func_cfg_access_t func_cfg_access = {0x0};
221   int32_t ret;
222 
223   /* no need to read it first as the only other field is a ispu reset bit */
224   func_cfg_access.shub_reg_access = (val == LSM6DSO16IS_SENSOR_HUB_MEM_BANK) ? 0x1U : 0x0U;
225   func_cfg_access.ispu_reg_access = (val == LSM6DSO16IS_ISPU_MEM_BANK) ? 0x1U : 0x0U;
226   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
227 
228   return ret;
229 }
230 
231 /**
232   * @brief  Change memory bank.[get]
233   *
234   * @param  ctx      read / write interface definitions
235   * @param  val      MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK, SENSOR_HUB_MEM_BANK, ISPU_MEM_BANK,
236   * @retval          interface status (MANDATORY: return 0 -> no Error)
237   *
238   */
lsm6dso16is_mem_bank_get(const stmdev_ctx_t * ctx,lsm6dso16is_mem_bank_t * val)239 int32_t lsm6dso16is_mem_bank_get(const stmdev_ctx_t *ctx, lsm6dso16is_mem_bank_t *val)
240 {
241   lsm6dso16is_func_cfg_access_t func_cfg_access;
242   int32_t ret;
243 
244   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
245 
246   if (func_cfg_access.shub_reg_access == 1U)
247   {
248     *val = LSM6DSO16IS_SENSOR_HUB_MEM_BANK;
249   }
250   else if (func_cfg_access.ispu_reg_access == 1U)
251   {
252     *val = LSM6DSO16IS_ISPU_MEM_BANK;
253   }
254   else
255   {
256     *val = LSM6DSO16IS_MAIN_MEM_BANK;
257   }
258 
259   return ret;
260 }
261 
262 /**
263   * @brief  Enables pulsed data-ready mode (~75 us).[set]
264   *
265   * @param  ctx      read / write interface definitions
266   * @param  val      DRDY_LATCHED, DRDY_PULSED,
267   * @retval          interface status (MANDATORY: return 0 -> no Error)
268   *
269   */
lsm6dso16is_data_ready_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_data_ready_mode_t val)270 int32_t lsm6dso16is_data_ready_mode_set(const stmdev_ctx_t *ctx,
271                                         lsm6dso16is_data_ready_mode_t val)
272 {
273   lsm6dso16is_drdy_pulsed_reg_t drdy_pulsed_reg;
274   int32_t ret;
275 
276   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_DRDY_PULSED_REG, (uint8_t *)&drdy_pulsed_reg, 1);
277 
278   if (ret == 0)
279   {
280     drdy_pulsed_reg.drdy_pulsed = ((uint8_t)val & 0x1U);
281     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_DRDY_PULSED_REG, (uint8_t *)&drdy_pulsed_reg, 1);
282   }
283 
284   return ret;
285 }
286 
287 /**
288   * @brief  Enables pulsed data-ready mode (~75 us).[get]
289   *
290   * @param  ctx      read / write interface definitions
291   * @param  val      DRDY_LATCHED, DRDY_PULSED,
292   * @retval          interface status (MANDATORY: return 0 -> no Error)
293   *
294   */
lsm6dso16is_data_ready_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_data_ready_mode_t * val)295 int32_t lsm6dso16is_data_ready_mode_get(const stmdev_ctx_t *ctx,
296                                         lsm6dso16is_data_ready_mode_t *val)
297 {
298   lsm6dso16is_drdy_pulsed_reg_t drdy_pulsed_reg;
299   int32_t ret;
300 
301   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_DRDY_PULSED_REG, (uint8_t *)&drdy_pulsed_reg, 1);
302 
303   switch ((drdy_pulsed_reg.drdy_pulsed))
304   {
305     case LSM6DSO16IS_DRDY_LATCHED:
306       *val = LSM6DSO16IS_DRDY_LATCHED;
307       break;
308 
309     case LSM6DSO16IS_DRDY_PULSED:
310       *val = LSM6DSO16IS_DRDY_PULSED;
311       break;
312 
313     default:
314       *val = LSM6DSO16IS_DRDY_LATCHED;
315       break;
316   }
317   return ret;
318 }
319 
320 /**
321   * @brief  Device ID.[get]
322   *
323   * @param  ctx      read / write interface definitions
324   * @param  val      Device ID.
325   * @retval          interface status (MANDATORY: return 0 -> no Error)
326   *
327   */
lsm6dso16is_device_id_get(const stmdev_ctx_t * ctx,uint8_t * val)328 int32_t lsm6dso16is_device_id_get(const stmdev_ctx_t *ctx, uint8_t *val)
329 {
330   int32_t ret;
331 
332   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_WHO_AM_I, (uint8_t *)val, 1);
333 
334   return ret;
335 }
336 
337 /**
338   * @brief  Software reset. Restore the default values in user registers.[set]
339   *
340   * @param  ctx    Read / write interface definitions.(ptr)
341   * @retval        Interface status (MANDATORY: return 0 -> no Error).
342   *
343   */
lsm6dso16is_software_reset(const stmdev_ctx_t * ctx)344 int32_t lsm6dso16is_software_reset(const stmdev_ctx_t *ctx)
345 {
346   lsm6dso16is_ctrl3_c_t ctrl3_c;
347   int32_t ret;
348 
349   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
350 
351   if (ret == 0)
352   {
353     ret += lsm6dso16is_xl_data_rate_set(ctx, LSM6DSO16IS_XL_ODR_OFF);
354     ret += lsm6dso16is_gy_data_rate_set(ctx, LSM6DSO16IS_GY_ODR_OFF);
355 
356     ctrl3_c.sw_reset = PROPERTY_ENABLE;
357     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
358 
359     do
360     {
361       ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
362     } while (ret == 0 && ctrl3_c.sw_reset == PROPERTY_ENABLE);
363   }
364 
365   return ret;
366 }
367 
368 /**
369   * @brief  Reboot memory content. Reload the calibration parameters.[set]
370   *
371   * @param  ctx    Read / write interface definitions.(ptr)
372   * @param  val    Change the values of boot in reg CTRL_REG1
373   * @retval        Interface status (MANDATORY: return 0 -> no Error).
374   *
375   */
lsm6dso16is_boot_set(const stmdev_ctx_t * ctx,uint8_t val)376 int32_t lsm6dso16is_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
377 {
378   lsm6dso16is_ctrl3_c_t ctrl3_c;
379   int32_t ret;
380 
381   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
382 
383   if (ret == 0)
384   {
385     ctrl3_c.boot = val;
386     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
387   }
388 
389   return ret;
390 }
391 
392 /**
393   * @brief  Reboot memory content. Reload the calibration parameters.[get]
394   *
395   * @param  ctx    Read / write interface definitions.(ptr)
396   * @param  val    Get the values of boot in reg CTRL_REG1.(ptr)
397   * @retval        Interface status (MANDATORY: return 0 -> no Error).
398   *
399   */
lsm6dso16is_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)400 int32_t lsm6dso16is_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
401 {
402   lsm6dso16is_ctrl3_c_t ctrl3_c;
403   int32_t ret;
404 
405   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
406   *val = ctrl3_c.boot;
407 
408   return ret;
409 }
410 
411 /**
412   * @brief  Enable disable high-performance mode[set]
413   *
414   * @param  ctx      read / write interface definitions
415   * @param  val      HIGH_PERFOMANCE_MODE_ENABLED, HIGH_PERFOMANCE_MODE_DISABLED,
416   * @retval          interface status (MANDATORY: return 0 -> no Error)
417   *
418   */
lsm6dso16is_xl_hm_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_hm_mode_t val)419 int32_t lsm6dso16is_xl_hm_mode_set(const stmdev_ctx_t *ctx, lsm6dso16is_hm_mode_t val)
420 {
421   lsm6dso16is_ctrl6_c_t ctrl6_c;
422   int32_t ret;
423 
424   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
425 
426   if (ret == 0)
427   {
428     ctrl6_c.xl_hm_mode = ((uint8_t)val & 0x1U);
429     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
430   }
431 
432   return ret;
433 }
434 
435 /**
436   * @brief  Enable disable high-performance mode[get]
437   *
438   * @param  ctx      read / write interface definitions
439   * @param  val      HIGH_PERFOMANCE_MODE_ENABLED, HIGH_PERFOMANCE_MODE_DISABLED,
440   * @retval          interface status (MANDATORY: return 0 -> no Error)
441   *
442   */
lsm6dso16is_xl_hm_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_hm_mode_t * val)443 int32_t lsm6dso16is_xl_hm_mode_get(const stmdev_ctx_t *ctx, lsm6dso16is_hm_mode_t *val)
444 {
445   lsm6dso16is_ctrl6_c_t ctrl6_c;
446   int32_t ret;
447 
448   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
449 
450   switch ((ctrl6_c.xl_hm_mode))
451   {
452     case LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED:
453       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED;
454       break;
455 
456     case LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED:
457       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED;
458       break;
459 
460     default:
461       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED;
462       break;
463   }
464   return ret;
465 }
466 
467 /**
468   * @brief  Accelerometer full-scale selection.[set]
469   *
470   * @param  ctx      read / write interface definitions
471   * @param  val      2g, 4g, 8g, 16g,
472   * @retval          interface status (MANDATORY: return 0 -> no Error)
473   *
474   */
lsm6dso16is_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dso16is_xl_full_scale_t val)475 int32_t lsm6dso16is_xl_full_scale_set(const stmdev_ctx_t *ctx,
476                                       lsm6dso16is_xl_full_scale_t val)
477 {
478   lsm6dso16is_ctrl1_xl_t ctrl1_xl;
479   int32_t ret;
480 
481   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
482 
483   if (ret == 0)
484   {
485     ctrl1_xl.fs_xl = ((uint8_t)val & 0x3U);
486     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
487   }
488 
489   return ret;
490 }
491 
492 /**
493   * @brief  Accelerometer full-scale selection.[get]
494   *
495   * @param  ctx      read / write interface definitions
496   * @param  val      2g, 4g, 8g, 16g,
497   * @retval          interface status (MANDATORY: return 0 -> no Error)
498   *
499   */
lsm6dso16is_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dso16is_xl_full_scale_t * val)500 int32_t lsm6dso16is_xl_full_scale_get(const stmdev_ctx_t *ctx,
501                                       lsm6dso16is_xl_full_scale_t *val)
502 {
503   lsm6dso16is_ctrl1_xl_t ctrl1_xl;
504   int32_t ret;
505 
506   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
507 
508   switch ((ctrl1_xl.fs_xl))
509   {
510     case LSM6DSO16IS_2g:
511       *val = LSM6DSO16IS_2g;
512       break;
513 
514     case LSM6DSO16IS_4g:
515       *val = LSM6DSO16IS_4g;
516       break;
517 
518     case LSM6DSO16IS_8g:
519       *val = LSM6DSO16IS_8g;
520       break;
521 
522     case LSM6DSO16IS_16g:
523       *val = LSM6DSO16IS_16g;
524       break;
525 
526     default:
527       *val = LSM6DSO16IS_2g;
528       break;
529   }
530   return ret;
531 }
532 
533 /**
534   * @brief  Accelerometer output data rate (ODR) selection.[set]
535   *
536   * @param  ctx      read / write interface definitions
537   * @param  val      XL_ODR_OFF, XL_ODR_AT_1Hz875, XL_ODR_AT_7Hz5, XL_ODR_AT_15Hz, XL_ODR_AT_30Hz, XL_ODR_AT_60Hz, XL_ODR_AT_120Hz, XL_ODR_AT_240Hz, XL_ODR_AT_480Hz, XL_ODR_AT_960Hz, XL_ODR_AT_1920Hz, XL_ODR_AT_3840Hz, XL_ODR_AT_7680Hz,
538   * @retval          interface status (MANDATORY: return 0 -> no Error)
539   *
540   */
lsm6dso16is_xl_data_rate_set(const stmdev_ctx_t * ctx,lsm6dso16is_xl_data_rate_t val)541 int32_t lsm6dso16is_xl_data_rate_set(const stmdev_ctx_t *ctx,
542                                      lsm6dso16is_xl_data_rate_t val)
543 {
544   lsm6dso16is_ctrl1_xl_t ctrl1_xl;
545   int32_t ret;
546 
547   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
548 
549   if (ret == 0)
550   {
551     if (((uint8_t)val & 0x10U) == 0x10U)
552     {
553       ret += lsm6dso16is_xl_hm_mode_set(ctx, LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED);
554     }
555     else
556     {
557       ret += lsm6dso16is_xl_hm_mode_set(ctx, LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED);
558     }
559 
560     ctrl1_xl.odr_xl = ((uint8_t)val & 0xfU);
561     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
562   }
563 
564   return ret;
565 }
566 
567 /**
568   * @brief  Accelerometer output data rate (ODR) selection.[get]
569   *
570   * @param  ctx      read / write interface definitions
571   * @param  val      XL_ODR_OFF, XL_ODR_AT_1Hz875, XL_ODR_AT_7Hz5, XL_ODR_AT_15Hz, XL_ODR_AT_30Hz, XL_ODR_AT_60Hz, XL_ODR_AT_120Hz, XL_ODR_AT_240Hz, XL_ODR_AT_480Hz, XL_ODR_AT_960Hz, XL_ODR_AT_1920Hz, XL_ODR_AT_3840Hz, XL_ODR_AT_7680Hz,
572   * @retval          interface status (MANDATORY: return 0 -> no Error)
573   *
574   */
lsm6dso16is_xl_data_rate_get(const stmdev_ctx_t * ctx,lsm6dso16is_xl_data_rate_t * val)575 int32_t lsm6dso16is_xl_data_rate_get(const stmdev_ctx_t *ctx,
576                                      lsm6dso16is_xl_data_rate_t *val)
577 {
578   lsm6dso16is_ctrl1_xl_t ctrl1_xl;
579   lsm6dso16is_ctrl6_c_t ctrl6_c;
580   int32_t ret;
581 
582   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
583   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
584 
585   switch ((ctrl6_c.xl_hm_mode << 4) | (ctrl1_xl.odr_xl))
586   {
587     case LSM6DSO16IS_XL_ODR_OFF:
588       *val = LSM6DSO16IS_XL_ODR_OFF;
589       break;
590 
591     case LSM6DSO16IS_XL_ODR_AT_12Hz5_HP:
592       *val = LSM6DSO16IS_XL_ODR_AT_12Hz5_HP;
593       break;
594 
595     case LSM6DSO16IS_XL_ODR_AT_26H_HP:
596       *val = LSM6DSO16IS_XL_ODR_AT_26H_HP;
597       break;
598 
599     case LSM6DSO16IS_XL_ODR_AT_52Hz_HP:
600       *val = LSM6DSO16IS_XL_ODR_AT_52Hz_HP;
601       break;
602 
603     case LSM6DSO16IS_XL_ODR_AT_104Hz_HP:
604       *val = LSM6DSO16IS_XL_ODR_AT_104Hz_HP;
605       break;
606 
607     case LSM6DSO16IS_XL_ODR_AT_208Hz_HP:
608       *val = LSM6DSO16IS_XL_ODR_AT_208Hz_HP;
609       break;
610 
611     case LSM6DSO16IS_XL_ODR_AT_416Hz_HP:
612       *val = LSM6DSO16IS_XL_ODR_AT_416Hz_HP;
613       break;
614 
615     case LSM6DSO16IS_XL_ODR_AT_833Hz_HP:
616       *val = LSM6DSO16IS_XL_ODR_AT_833Hz_HP;
617       break;
618 
619     case LSM6DSO16IS_XL_ODR_AT_1667Hz_HP:
620       *val = LSM6DSO16IS_XL_ODR_AT_1667Hz_HP;
621       break;
622 
623     case LSM6DSO16IS_XL_ODR_AT_3333Hz_HP:
624       *val = LSM6DSO16IS_XL_ODR_AT_3333Hz_HP;
625       break;
626 
627     case LSM6DSO16IS_XL_ODR_AT_6667Hz_HP:
628       *val = LSM6DSO16IS_XL_ODR_AT_6667Hz_HP;
629       break;
630 
631     case LSM6DSO16IS_XL_ODR_AT_12Hz5_LP:
632       *val = LSM6DSO16IS_XL_ODR_AT_12Hz5_LP;
633       break;
634 
635     case LSM6DSO16IS_XL_ODR_AT_26H_LP:
636       *val = LSM6DSO16IS_XL_ODR_AT_26H_LP;
637       break;
638 
639     case LSM6DSO16IS_XL_ODR_AT_52Hz_LP:
640       *val = LSM6DSO16IS_XL_ODR_AT_52Hz_LP;
641       break;
642 
643     case LSM6DSO16IS_XL_ODR_AT_104Hz_LP:
644       *val = LSM6DSO16IS_XL_ODR_AT_104Hz_LP;
645       break;
646 
647     case LSM6DSO16IS_XL_ODR_AT_208Hz_LP:
648       *val = LSM6DSO16IS_XL_ODR_AT_208Hz_LP;
649       break;
650 
651     case LSM6DSO16IS_XL_ODR_AT_416Hz_LP:
652       *val = LSM6DSO16IS_XL_ODR_AT_416Hz_LP;
653       break;
654 
655     case LSM6DSO16IS_XL_ODR_AT_833Hz_LP:
656       *val = LSM6DSO16IS_XL_ODR_AT_833Hz_LP;
657       break;
658 
659     case LSM6DSO16IS_XL_ODR_AT_1667Hz_LP:
660       *val = LSM6DSO16IS_XL_ODR_AT_1667Hz_LP;
661       break;
662 
663     case LSM6DSO16IS_XL_ODR_AT_3333Hz_LP:
664       *val = LSM6DSO16IS_XL_ODR_AT_3333Hz_LP;
665       break;
666 
667     case LSM6DSO16IS_XL_ODR_AT_6667Hz_LP:
668       *val = LSM6DSO16IS_XL_ODR_AT_6667Hz_LP;
669       break;
670 
671     case LSM6DSO16IS_XL_ODR_AT_1Hz6_LP:
672       *val = LSM6DSO16IS_XL_ODR_AT_1Hz6_LP;
673       break;
674 
675     default:
676       *val = LSM6DSO16IS_XL_ODR_OFF;
677       break;
678   }
679 
680   return ret;
681 }
682 
683 /**
684   * @brief  Enable disable high-performance mode[set]
685   *
686   * @param  ctx      read / write interface definitions
687   * @param  val      HIGH_PERFOMANCE_MODE_ENABLED, HIGH_PERFOMANCE_MODE_DISABLED,
688   * @retval          interface status (MANDATORY: return 0 -> no Error)
689   *
690   */
lsm6dso16is_gy_hm_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_hm_mode_t val)691 int32_t lsm6dso16is_gy_hm_mode_set(const stmdev_ctx_t *ctx, lsm6dso16is_hm_mode_t val)
692 {
693   lsm6dso16is_ctrl7_g_t ctrl7_g;
694   int32_t ret;
695 
696   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
697 
698   if (ret == 0)
699   {
700     ctrl7_g.g_hm_mode = ((uint8_t)val & 0x1U);
701     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
702   }
703 
704   return ret;
705 }
706 
707 /**
708   * @brief  Enable disable high-performance mode[get]
709   *
710   * @param  ctx      read / write interface definitions
711   * @param  val      HIGH_PERFOMANCE_MODE_ENABLED, HIGH_PERFOMANCE_MODE_DISABLED,
712   * @retval          interface status (MANDATORY: return 0 -> no Error)
713   *
714   */
lsm6dso16is_gy_hm_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_hm_mode_t * val)715 int32_t lsm6dso16is_gy_hm_mode_get(const stmdev_ctx_t *ctx, lsm6dso16is_hm_mode_t *val)
716 {
717   lsm6dso16is_ctrl7_g_t ctrl7_g;
718   int32_t ret;
719 
720   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
721 
722   switch ((ctrl7_g.g_hm_mode))
723   {
724     case LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED:
725       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED;
726       break;
727 
728     case LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED:
729       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED;
730       break;
731 
732     default:
733       *val = LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED;
734       break;
735   }
736   return ret;
737 }
738 
739 /**
740   * @brief  Gyroscope full-scale selection[set]
741   *
742   * @param  ctx      read / write interface definitions
743   * @param  val      125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
744   * @retval          interface status (MANDATORY: return 0 -> no Error)
745   *
746   */
lsm6dso16is_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dso16is_gy_full_scale_t val)747 int32_t lsm6dso16is_gy_full_scale_set(const stmdev_ctx_t *ctx,
748                                       lsm6dso16is_gy_full_scale_t val)
749 {
750   lsm6dso16is_ctrl2_g_t ctrl2_g;
751   int32_t ret;
752 
753   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
754 
755   if (ret == 0)
756   {
757     ctrl2_g.fs_g = ((uint8_t)val & 0x3U);
758     ctrl2_g.fs_125 = ((uint8_t)val >> 4);
759     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
760   }
761 
762   return ret;
763 }
764 
765 /**
766   * @brief  Gyroscope full-scale selection[get]
767   *
768   * @param  ctx      read / write interface definitions
769   * @param  val      125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
770   * @retval          interface status (MANDATORY: return 0 -> no Error)
771   *
772   */
lsm6dso16is_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dso16is_gy_full_scale_t * val)773 int32_t lsm6dso16is_gy_full_scale_get(const stmdev_ctx_t *ctx,
774                                       lsm6dso16is_gy_full_scale_t *val)
775 {
776   lsm6dso16is_ctrl2_g_t ctrl2_g;
777   int32_t ret;
778 
779   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
780 
781   switch ((ctrl2_g.fs_125 << 4) | (ctrl2_g.fs_g))
782   {
783     case LSM6DSO16IS_125dps:
784       *val = LSM6DSO16IS_125dps;
785       break;
786 
787     case LSM6DSO16IS_250dps:
788       *val = LSM6DSO16IS_250dps;
789       break;
790 
791     case LSM6DSO16IS_500dps:
792       *val = LSM6DSO16IS_500dps;
793       break;
794 
795     case LSM6DSO16IS_1000dps:
796       *val = LSM6DSO16IS_1000dps;
797       break;
798 
799     case LSM6DSO16IS_2000dps:
800       *val = LSM6DSO16IS_2000dps;
801       break;
802 
803     default:
804       *val = LSM6DSO16IS_125dps;
805       break;
806   }
807   return ret;
808 }
809 
810 /**
811   * @brief  Gyroscope output data rate (ODR) selection.[set]
812   *
813   * @param  ctx      read / write interface definitions
814   * @param  val      GY_ODR_OFF, GY_ODR_AT_7Hz5, GY_ODR_AT_15Hz, GY_ODR_AT_30Hz, GY_ODR_AT_60Hz, GY_ODR_AT_120Hz, GY_ODR_AT_240Hz, GY_ODR_AT_480Hz, GY_ODR_AT_960Hz, GY_ODR_AT_1920Hz, GY_ODR_AT_3840Hz, GY_ODR_AT_7680Hz,
815   * @retval          interface status (MANDATORY: return 0 -> no Error)
816   *
817   */
lsm6dso16is_gy_data_rate_set(const stmdev_ctx_t * ctx,lsm6dso16is_gy_data_rate_t val)818 int32_t lsm6dso16is_gy_data_rate_set(const stmdev_ctx_t *ctx,
819                                      lsm6dso16is_gy_data_rate_t val)
820 {
821   lsm6dso16is_ctrl2_g_t ctrl2_g;
822   int32_t ret;
823 
824   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
825 
826   if (ret == 0)
827   {
828     if (((uint8_t)val & 0x10U) == 0x10U)
829     {
830       ret += lsm6dso16is_gy_hm_mode_set(ctx, LSM6DSO16IS_HIGH_PERFOMANCE_MODE_DISABLED);
831     }
832     else
833     {
834       ret += lsm6dso16is_gy_hm_mode_set(ctx, LSM6DSO16IS_HIGH_PERFOMANCE_MODE_ENABLED);
835     }
836 
837     ctrl2_g.odr_g = ((uint8_t)val & 0xfU);
838     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
839   }
840 
841   return ret;
842 }
843 
844 /**
845   * @brief  Gyroscope output data rate (ODR) selection.[get]
846   *
847   * @param  ctx      read / write interface definitions
848   * @param  val      GY_ODR_OFF, GY_ODR_AT_7Hz5, GY_ODR_AT_15Hz, GY_ODR_AT_30Hz, GY_ODR_AT_60Hz, GY_ODR_AT_120Hz, GY_ODR_AT_240Hz, GY_ODR_AT_480Hz, GY_ODR_AT_960Hz, GY_ODR_AT_1920Hz, GY_ODR_AT_3840Hz, GY_ODR_AT_7680Hz,
849   * @retval          interface status (MANDATORY: return 0 -> no Error)
850   *
851   */
lsm6dso16is_gy_data_rate_get(const stmdev_ctx_t * ctx,lsm6dso16is_gy_data_rate_t * val)852 int32_t lsm6dso16is_gy_data_rate_get(const stmdev_ctx_t *ctx,
853                                      lsm6dso16is_gy_data_rate_t *val)
854 {
855   lsm6dso16is_ctrl2_g_t ctrl2_g;
856   lsm6dso16is_ctrl7_g_t ctrl7_g;
857   int32_t ret;
858 
859   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
860   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
861 
862   switch ((ctrl7_g.g_hm_mode << 4) | (ctrl2_g.odr_g))
863   {
864     case LSM6DSO16IS_GY_ODR_OFF:
865       *val = LSM6DSO16IS_GY_ODR_OFF;
866       break;
867 
868     case LSM6DSO16IS_GY_ODR_AT_12Hz5_HP:
869       *val = LSM6DSO16IS_GY_ODR_AT_12Hz5_HP;
870       break;
871 
872     case LSM6DSO16IS_GY_ODR_AT_26H_HP:
873       *val = LSM6DSO16IS_GY_ODR_AT_26H_HP;
874       break;
875 
876     case LSM6DSO16IS_GY_ODR_AT_52Hz_HP:
877       *val = LSM6DSO16IS_GY_ODR_AT_52Hz_HP;
878       break;
879 
880     case LSM6DSO16IS_GY_ODR_AT_104Hz_HP:
881       *val = LSM6DSO16IS_GY_ODR_AT_104Hz_HP;
882       break;
883 
884     case LSM6DSO16IS_GY_ODR_AT_208Hz_HP:
885       *val = LSM6DSO16IS_GY_ODR_AT_208Hz_HP;
886       break;
887 
888     case LSM6DSO16IS_GY_ODR_AT_416Hz_HP:
889       *val = LSM6DSO16IS_GY_ODR_AT_416Hz_HP;
890       break;
891 
892     case LSM6DSO16IS_GY_ODR_AT_833Hz_HP:
893       *val = LSM6DSO16IS_GY_ODR_AT_833Hz_HP;
894       break;
895 
896     case LSM6DSO16IS_GY_ODR_AT_1667Hz_HP:
897       *val = LSM6DSO16IS_GY_ODR_AT_1667Hz_HP;
898       break;
899 
900     case LSM6DSO16IS_GY_ODR_AT_3333Hz_HP:
901       *val = LSM6DSO16IS_GY_ODR_AT_3333Hz_HP;
902       break;
903 
904     case LSM6DSO16IS_GY_ODR_AT_6667Hz_HP:
905       *val = LSM6DSO16IS_GY_ODR_AT_6667Hz_HP;
906       break;
907 
908     case LSM6DSO16IS_GY_ODR_AT_12Hz5_LP:
909       *val = LSM6DSO16IS_GY_ODR_AT_12Hz5_LP;
910       break;
911 
912     case LSM6DSO16IS_GY_ODR_AT_26H_LP:
913       *val = LSM6DSO16IS_GY_ODR_AT_26H_LP;
914       break;
915 
916     case LSM6DSO16IS_GY_ODR_AT_52Hz_LP:
917       *val = LSM6DSO16IS_GY_ODR_AT_52Hz_LP;
918       break;
919 
920     case LSM6DSO16IS_GY_ODR_AT_104Hz_LP:
921       *val = LSM6DSO16IS_GY_ODR_AT_104Hz_LP;
922       break;
923 
924     case LSM6DSO16IS_GY_ODR_AT_208Hz_LP:
925       *val = LSM6DSO16IS_GY_ODR_AT_208Hz_LP;
926       break;
927 
928     case LSM6DSO16IS_GY_ODR_AT_416Hz_LP:
929       *val = LSM6DSO16IS_GY_ODR_AT_416Hz_LP;
930       break;
931 
932     case LSM6DSO16IS_GY_ODR_AT_833Hz_LP:
933       *val = LSM6DSO16IS_GY_ODR_AT_833Hz_LP;
934       break;
935 
936     case LSM6DSO16IS_GY_ODR_AT_1667Hz_LP:
937       *val = LSM6DSO16IS_GY_ODR_AT_1667Hz_LP;
938       break;
939 
940     case LSM6DSO16IS_GY_ODR_AT_3333Hz_LP:
941       *val = LSM6DSO16IS_GY_ODR_AT_3333Hz_LP;
942       break;
943 
944     case LSM6DSO16IS_GY_ODR_AT_6667Hz_LP:
945       *val = LSM6DSO16IS_GY_ODR_AT_6667Hz_LP;
946       break;
947 
948     default:
949       *val = LSM6DSO16IS_GY_ODR_OFF;
950       break;
951   }
952 
953   return ret;
954 }
955 
956 /**
957   * @brief  Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[set]
958   *
959   * @param  ctx      read / write interface definitions
960   * @param  val      Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
961   * @retval          interface status (MANDATORY: return 0 -> no Error)
962   *
963   */
lsm6dso16is_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)964 int32_t lsm6dso16is_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
965 {
966   lsm6dso16is_ctrl3_c_t ctrl3_c;
967   int32_t ret;
968 
969   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
970 
971   if (ret == 0)
972   {
973     ctrl3_c.if_inc = val;
974     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
975   }
976 
977   return ret;
978 }
979 
980 /**
981   * @brief  Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[get]
982   *
983   * @param  ctx      read / write interface definitions
984   * @param  val      Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
985   * @retval          interface status (MANDATORY: return 0 -> no Error)
986   *
987   */
lsm6dso16is_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)988 int32_t lsm6dso16is_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
989 {
990   lsm6dso16is_ctrl3_c_t ctrl3_c;
991   int32_t ret;
992 
993   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
994 
995   *val = ctrl3_c.if_inc;
996 
997   return ret;
998 }
999 
1000 /**
1001   * @brief  Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [set]
1002   *
1003   * @param  ctx      read / write interface definitions
1004   * @param  val      Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
1005   * @retval          interface status (MANDATORY: return 0 -> no Error)
1006   *
1007   */
lsm6dso16is_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)1008 int32_t lsm6dso16is_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
1009 {
1010   lsm6dso16is_ctrl3_c_t ctrl3_c;
1011   int32_t ret;
1012 
1013   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1014 
1015   if (ret == 0)
1016   {
1017     ctrl3_c.bdu = val;
1018     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1019   }
1020 
1021   return ret;
1022 }
1023 
1024 /**
1025   * @brief  Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [get]
1026   *
1027   * @param  ctx      read / write interface definitions
1028   * @param  val      Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
1029   * @retval          interface status (MANDATORY: return 0 -> no Error)
1030   *
1031   */
lsm6dso16is_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)1032 int32_t lsm6dso16is_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
1033 {
1034   lsm6dso16is_ctrl3_c_t ctrl3_c;
1035   int32_t ret;
1036 
1037   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1038 
1039   *val = ctrl3_c.bdu;
1040 
1041   return ret;
1042 }
1043 
1044 /**
1045   * @brief  Enables gyroscope sleep mode[set]
1046   *
1047   * @param  ctx      read / write interface definitions
1048   * @param  val      SLEEP_G_ENABLE, SLEEP_G_DISABLE,
1049   * @retval          interface status (MANDATORY: return 0 -> no Error)
1050   *
1051   */
lsm6dso16is_sleep_set(const stmdev_ctx_t * ctx,lsm6dso16is_sleep_t val)1052 int32_t lsm6dso16is_sleep_set(const stmdev_ctx_t *ctx, lsm6dso16is_sleep_t val)
1053 {
1054   lsm6dso16is_ctrl4_c_t ctrl4_c;
1055   int32_t ret;
1056 
1057   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1058 
1059   if (ret == 0)
1060   {
1061     ctrl4_c.sleep_g = ((uint8_t)val & 0x1U);
1062     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1063   }
1064 
1065   return ret;
1066 }
1067 
1068 /**
1069   * @brief  Enables gyroscope sleep mode[get]
1070   *
1071   * @param  ctx      read / write interface definitions
1072   * @param  val      SLEEP_G_ENABLE, SLEEP_G_DISABLE,
1073   * @retval          interface status (MANDATORY: return 0 -> no Error)
1074   *
1075   */
lsm6dso16is_sleep_get(const stmdev_ctx_t * ctx,lsm6dso16is_sleep_t * val)1076 int32_t lsm6dso16is_sleep_get(const stmdev_ctx_t *ctx, lsm6dso16is_sleep_t *val)
1077 {
1078   lsm6dso16is_ctrl4_c_t ctrl4_c;
1079   int32_t ret;
1080 
1081   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1082 
1083   switch ((ctrl4_c.sleep_g))
1084   {
1085     case LSM6DSO16IS_SLEEP_G_ENABLE:
1086       *val = LSM6DSO16IS_SLEEP_G_ENABLE;
1087       break;
1088 
1089     case LSM6DSO16IS_SLEEP_G_DISABLE:
1090       *val = LSM6DSO16IS_SLEEP_G_DISABLE;
1091       break;
1092 
1093     default:
1094       *val = LSM6DSO16IS_SLEEP_G_ENABLE;
1095       break;
1096   }
1097   return ret;
1098 }
1099 
1100 /**
1101   * @brief  Accelerometer self-test selection.[set]
1102   *
1103   * @param  ctx      read / write interface definitions
1104   * @param  val      XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1105   * @retval          interface status (MANDATORY: return 0 -> no Error)
1106   *
1107   */
lsm6dso16is_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dso16is_xl_self_test_t val)1108 int32_t lsm6dso16is_xl_self_test_set(const stmdev_ctx_t *ctx,
1109                                      lsm6dso16is_xl_self_test_t val)
1110 {
1111   lsm6dso16is_ctrl5_c_t ctrl5_c;
1112   int32_t ret;
1113 
1114   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1115 
1116   if (ret == 0)
1117   {
1118     ctrl5_c.st_xl = ((uint8_t)val & 0x3U);
1119     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1120   }
1121 
1122   return ret;
1123 }
1124 
1125 /**
1126   * @brief  Accelerometer self-test selection.[get]
1127   *
1128   * @param  ctx      read / write interface definitions
1129   * @param  val      XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1130   * @retval          interface status (MANDATORY: return 0 -> no Error)
1131   *
1132   */
lsm6dso16is_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dso16is_xl_self_test_t * val)1133 int32_t lsm6dso16is_xl_self_test_get(const stmdev_ctx_t *ctx,
1134                                      lsm6dso16is_xl_self_test_t *val)
1135 {
1136   lsm6dso16is_ctrl5_c_t ctrl5_c;
1137   int32_t ret;
1138 
1139   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1140 
1141   switch ((ctrl5_c.st_xl))
1142   {
1143     case LSM6DSO16IS_XL_ST_DISABLE:
1144       *val = LSM6DSO16IS_XL_ST_DISABLE;
1145       break;
1146 
1147     case LSM6DSO16IS_XL_ST_POSITIVE:
1148       *val = LSM6DSO16IS_XL_ST_POSITIVE;
1149       break;
1150 
1151     case LSM6DSO16IS_XL_ST_NEGATIVE:
1152       *val = LSM6DSO16IS_XL_ST_NEGATIVE;
1153       break;
1154 
1155     default:
1156       *val = LSM6DSO16IS_XL_ST_DISABLE;
1157       break;
1158   }
1159   return ret;
1160 }
1161 
1162 /**
1163   * @brief  Gyroscope self-test selection.[set]
1164   *
1165   * @param  ctx      read / write interface definitions
1166   * @param  val      GY_ST_DISABLE, GY_ST_POSITIVE, GY_ST_NEGATIVE,
1167   * @retval          interface status (MANDATORY: return 0 -> no Error)
1168   *
1169   */
lsm6dso16is_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dso16is_gy_self_test_t val)1170 int32_t lsm6dso16is_gy_self_test_set(const stmdev_ctx_t *ctx,
1171                                      lsm6dso16is_gy_self_test_t val)
1172 {
1173   lsm6dso16is_ctrl5_c_t ctrl5_c;
1174   int32_t ret;
1175 
1176   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1177 
1178   if (ret == 0)
1179   {
1180     ctrl5_c.st_g = ((uint8_t)val & 0x3U);
1181     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1182   }
1183 
1184   return ret;
1185 }
1186 
1187 /**
1188   * @brief  Gyroscope self-test selection.[get]
1189   *
1190   * @param  ctx      read / write interface definitions
1191   * @param  val      GY_ST_DISABLE, GY_ST_POSITIVE, GY_ST_NEGATIVE,
1192   * @retval          interface status (MANDATORY: return 0 -> no Error)
1193   *
1194   */
lsm6dso16is_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dso16is_gy_self_test_t * val)1195 int32_t lsm6dso16is_gy_self_test_get(const stmdev_ctx_t *ctx,
1196                                      lsm6dso16is_gy_self_test_t *val)
1197 {
1198   lsm6dso16is_ctrl5_c_t ctrl5_c;
1199   int32_t ret;
1200 
1201   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1202 
1203   switch ((ctrl5_c.st_g))
1204   {
1205     case LSM6DSO16IS_GY_ST_DISABLE:
1206       *val = LSM6DSO16IS_GY_ST_DISABLE;
1207       break;
1208 
1209     case LSM6DSO16IS_GY_ST_POSITIVE:
1210       *val = LSM6DSO16IS_GY_ST_POSITIVE;
1211       break;
1212 
1213     case LSM6DSO16IS_GY_ST_NEGATIVE:
1214       *val = LSM6DSO16IS_GY_ST_NEGATIVE;
1215       break;
1216 
1217     default:
1218       *val = LSM6DSO16IS_GY_ST_DISABLE;
1219       break;
1220   }
1221   return ret;
1222 }
1223 
1224 /**
1225   * @defgroup Serial Interfaces
1226   * @brief    Serial Interfaces
1227   * @{/
1228   *
1229   */
1230 /**
1231   * @brief  Enables pull-up on SDO pin of UI (User Interface).[set]
1232   *
1233   * @param  ctx      read / write interface definitions
1234   * @param  val      Enables pull-up on SDO pin of UI (User Interface).
1235   * @retval          interface status (MANDATORY: return 0 -> no Error)
1236   *
1237   */
lsm6dso16is_ui_sdo_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)1238 int32_t lsm6dso16is_ui_sdo_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
1239 {
1240   lsm6dso16is_pin_ctrl_t pin_ctrl;
1241   int32_t ret;
1242 
1243   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
1244 
1245   if (ret == 0)
1246   {
1247     pin_ctrl.sdo_pu_en = val;
1248     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
1249   }
1250 
1251   return ret;
1252 }
1253 
1254 /**
1255   * @brief  Enables pull-up on SDO pin of UI (User Interface).[get]
1256   *
1257   * @param  ctx      read / write interface definitions
1258   * @param  val      Enables pull-up on SDO pin of UI (User Interface).
1259   * @retval          interface status (MANDATORY: return 0 -> no Error)
1260   *
1261   */
lsm6dso16is_ui_sdo_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)1262 int32_t lsm6dso16is_ui_sdo_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
1263 {
1264   lsm6dso16is_pin_ctrl_t pin_ctrl;
1265   int32_t ret;
1266 
1267   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
1268 
1269   *val = pin_ctrl.sdo_pu_en;
1270 
1271   return ret;
1272 }
1273 
1274 /**
1275   * @brief  SPI Serial Interface Mode selection.[set]
1276   *
1277   * @param  ctx      read / write interface definitions
1278   * @param  val      SPI_4_WIRE, SPI_3_WIRE,
1279   * @retval          interface status (MANDATORY: return 0 -> no Error)
1280   *
1281   */
lsm6dso16is_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_spi_mode_t val)1282 int32_t lsm6dso16is_spi_mode_set(const stmdev_ctx_t *ctx, lsm6dso16is_spi_mode_t val)
1283 {
1284   lsm6dso16is_ctrl3_c_t ctrl3_c;
1285   int32_t ret;
1286 
1287   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1288 
1289   if (ret == 0)
1290   {
1291     ctrl3_c.sim = ((uint8_t)val & 0x1U);
1292     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1293   }
1294 
1295   return ret;
1296 }
1297 
1298 /**
1299   * @brief  SPI Serial Interface Mode selection.[get]
1300   *
1301   * @param  ctx      read / write interface definitions
1302   * @param  val      SPI_4_WIRE, SPI_3_WIRE,
1303   * @retval          interface status (MANDATORY: return 0 -> no Error)
1304   *
1305   */
lsm6dso16is_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_spi_mode_t * val)1306 int32_t lsm6dso16is_spi_mode_get(const stmdev_ctx_t *ctx, lsm6dso16is_spi_mode_t *val)
1307 {
1308   lsm6dso16is_ctrl3_c_t ctrl3_c;
1309   int32_t ret;
1310 
1311   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1312 
1313   switch ((ctrl3_c.sim))
1314   {
1315     case LSM6DSO16IS_SPI_4_WIRE:
1316       *val = LSM6DSO16IS_SPI_4_WIRE;
1317       break;
1318 
1319     case LSM6DSO16IS_SPI_3_WIRE:
1320       *val = LSM6DSO16IS_SPI_3_WIRE;
1321       break;
1322 
1323     default:
1324       *val = LSM6DSO16IS_SPI_4_WIRE;
1325       break;
1326   }
1327   return ret;
1328 }
1329 
1330 /**
1331   * @brief  Disables I2C on UI (User Interface).[set]
1332   *
1333   * @param  ctx      read / write interface definitions
1334   * @param  val      I2C_ENABLE, I2C_DISABLE,
1335   * @retval          interface status (MANDATORY: return 0 -> no Error)
1336   *
1337   */
lsm6dso16is_ui_i2c_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_ui_i2c_mode_t val)1338 int32_t lsm6dso16is_ui_i2c_mode_set(const stmdev_ctx_t *ctx, lsm6dso16is_ui_i2c_mode_t val)
1339 {
1340   lsm6dso16is_ctrl4_c_t ctrl4_c;
1341   int32_t ret;
1342 
1343   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1344 
1345   if (ret == 0)
1346   {
1347     ctrl4_c.i2c_disable = ((uint8_t)val & 0x1U);
1348     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1349   }
1350 
1351   return ret;
1352 }
1353 
1354 /**
1355   * @brief  Disables I2C on UI (User Interface).[get]
1356   *
1357   * @param  ctx      read / write interface definitions
1358   * @param  val      I2C_ENABLE, I2C_DISABLE,
1359   * @retval          interface status (MANDATORY: return 0 -> no Error)
1360   *
1361   */
lsm6dso16is_ui_i2c_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_ui_i2c_mode_t * val)1362 int32_t lsm6dso16is_ui_i2c_mode_get(const stmdev_ctx_t *ctx, lsm6dso16is_ui_i2c_mode_t *val)
1363 {
1364   lsm6dso16is_ctrl4_c_t ctrl4_c;
1365   int32_t ret;
1366 
1367   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1368 
1369   switch ((ctrl4_c.i2c_disable))
1370   {
1371     case LSM6DSO16IS_I2C_ENABLE:
1372       *val = LSM6DSO16IS_I2C_ENABLE;
1373       break;
1374 
1375     case LSM6DSO16IS_I2C_DISABLE:
1376       *val = LSM6DSO16IS_I2C_DISABLE;
1377       break;
1378 
1379     default:
1380       *val = LSM6DSO16IS_I2C_ENABLE;
1381       break;
1382   }
1383   return ret;
1384 }
1385 
1386 /**
1387   * @}
1388   *
1389   */
1390 
1391 /**
1392   * @defgroup Timestamp
1393   * @brief    Timestamp
1394   * @{/
1395   *
1396   */
1397 /**
1398   * @brief  Enables timestamp counter.[set]
1399   *
1400   * @param  ctx      read / write interface definitions
1401   * @param  val      Enables timestamp counter.
1402   * @retval          interface status (MANDATORY: return 0 -> no Error)
1403   *
1404   */
lsm6dso16is_timestamp_set(const stmdev_ctx_t * ctx,uint8_t val)1405 int32_t lsm6dso16is_timestamp_set(const stmdev_ctx_t *ctx, uint8_t val)
1406 {
1407   lsm6dso16is_ctrl10_c_t ctrl10_c;
1408   int32_t ret;
1409 
1410   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1411 
1412   if (ret == 0)
1413   {
1414     ctrl10_c.timestamp_en = val;
1415     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1416   }
1417 
1418   return ret;
1419 }
1420 
1421 /**
1422   * @brief  Enables timestamp counter.[get]
1423   *
1424   * @param  ctx      read / write interface definitions
1425   * @param  val      Enables timestamp counter.
1426   * @retval          interface status (MANDATORY: return 0 -> no Error)
1427   *
1428   */
lsm6dso16is_timestamp_get(const stmdev_ctx_t * ctx,uint8_t * val)1429 int32_t lsm6dso16is_timestamp_get(const stmdev_ctx_t *ctx, uint8_t *val)
1430 {
1431   lsm6dso16is_ctrl10_c_t ctrl10_c;
1432   int32_t ret;
1433 
1434   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1435 
1436   *val = ctrl10_c.timestamp_en;
1437 
1438   return ret;
1439 }
1440 
1441 /**
1442   * @brief  Timestamp data output.[get]
1443   *
1444   * @param  ctx      read / write interface definitions
1445   * @param  val      Timestamp data output.
1446   * @retval          interface status (MANDATORY: return 0 -> no Error)
1447   *
1448   */
lsm6dso16is_timestamp_raw_get(const stmdev_ctx_t * ctx,uint32_t * val)1449 int32_t lsm6dso16is_timestamp_raw_get(const stmdev_ctx_t *ctx, uint32_t *val)
1450 {
1451   uint8_t buff[4];
1452   int32_t ret;
1453 
1454   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_TIMESTAMP0, &buff[0], 4);
1455 
1456   *val = (uint32_t)buff[3];
1457   *val = (*val * 256U) + (uint32_t)buff[2];
1458   *val = (*val * 256U) + (uint32_t)buff[1];
1459   *val = (*val * 256U) + (uint32_t)buff[0];
1460 
1461   return ret;
1462 }
1463 
1464 /**
1465   * @}
1466   *
1467   */
1468 
1469 /**
1470   * @brief  Get the status of all the interrupt sources.[get]
1471   *
1472   * @param  ctx      read / write interface definitions
1473   * @param  val      Get the status of all the interrupt sources.
1474   * @retval          interface status (MANDATORY: return 0 -> no Error)
1475   *
1476   */
lsm6dso16is_all_sources_get(const stmdev_ctx_t * ctx,lsm6dso16is_all_sources_t * val)1477 int32_t lsm6dso16is_all_sources_get(const stmdev_ctx_t *ctx, lsm6dso16is_all_sources_t *val)
1478 {
1479   lsm6dso16is_status_reg_t status_reg;
1480   lsm6dso16is_status_master_mainpage_t status_sh;
1481   uint32_t status_ispu;
1482   int32_t ret;
1483 
1484   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_REG, (uint8_t *)&status_reg, 1);
1485   if (ret != 0)
1486   {
1487     return ret;
1488   }
1489 
1490   val->drdy_xl = status_reg.xlda;
1491   val->drdy_gy = status_reg.gda;
1492   val->drdy_temp = status_reg.tda;
1493 
1494   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_MASTER_MAINPAGE, (uint8_t *)&status_sh, 1);
1495   if (ret != 0)
1496   {
1497     return ret;
1498   }
1499 
1500   val->sh_endop = status_sh.sens_hub_endop;
1501   val->sh_slave0_nack = status_sh.sens_hub_endop;
1502   val->sh_slave1_nack = status_sh.sens_hub_endop;
1503   val->sh_slave2_nack = status_sh.sens_hub_endop;
1504   val->sh_slave3_nack = status_sh.sens_hub_endop;
1505   val->sh_wr_once = status_sh.sens_hub_endop;
1506 
1507   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_INT_STATUS0_MAINPAGE, (uint8_t *)&status_ispu, 4);
1508   if (ret != 0)
1509   {
1510     return ret;
1511   }
1512 
1513   val->ispu = status_ispu;
1514 
1515   return ret;
1516 }
1517 
1518 /**
1519   * @brief  The STATUS_REG register is read by the primary interface.[get]
1520   *
1521   * @param  ctx    Read / write interface definitions.(ptr)
1522   * @param  val    Get register STATUS_REG
1523   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1524   *
1525   */
lsm6dso16is_status_reg_get(const stmdev_ctx_t * ctx,lsm6dso16is_status_reg_t * val)1526 int32_t lsm6dso16is_status_reg_get(const stmdev_ctx_t *ctx,
1527                                    lsm6dso16is_status_reg_t *val)
1528 {
1529   int32_t ret;
1530   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_REG, (uint8_t *) val, 1);
1531 
1532   return ret;
1533 }
1534 
1535 /**
1536   * @brief  Accelerometer new data available.[get]
1537   *
1538   * @param  ctx    Read / write interface definitions.(ptr)
1539   * @param  val    Change the values of xlda in reg STATUS_REG
1540   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1541   *
1542   */
lsm6dso16is_xl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1543 int32_t lsm6dso16is_xl_flag_data_ready_get(const stmdev_ctx_t *ctx,
1544                                            uint8_t *val)
1545 {
1546   lsm6dso16is_status_reg_t status_reg;
1547   int32_t ret;
1548   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_REG,
1549                              (uint8_t *)&status_reg, 1);
1550   *val = status_reg.xlda;
1551 
1552   return ret;
1553 }
1554 
1555 /**
1556   * @brief  Gyroscope new data available.[get]
1557   *
1558   * @param  ctx    Read / write interface definitions.(ptr)
1559   * @param  val    Change the values of gda in reg STATUS_REG
1560   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1561   *
1562   */
lsm6dso16is_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1563 int32_t lsm6dso16is_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
1564                                            uint8_t *val)
1565 {
1566   lsm6dso16is_status_reg_t status_reg;
1567   int32_t ret;
1568   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_REG,
1569                              (uint8_t *)&status_reg, 1);
1570   *val = status_reg.gda;
1571 
1572   return ret;
1573 }
1574 
1575 /**
1576   * @brief  Temperature new data available.[get]
1577   *
1578   * @param  ctx    Read / write interface definitions.(ptr)
1579   * @param  val    Change the values of tda in reg STATUS_REG
1580   * @retval        Interface status (MANDATORY: return 0 -> no Error).
1581   *
1582   */
lsm6dso16is_temp_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)1583 int32_t lsm6dso16is_temp_flag_data_ready_get(const stmdev_ctx_t *ctx,
1584                                              uint8_t *val)
1585 {
1586   lsm6dso16is_status_reg_t status_reg;
1587   int32_t ret;
1588   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_REG,
1589                              (uint8_t *)&status_reg, 1);
1590   *val = status_reg.tda;
1591 
1592   return ret;
1593 }
1594 
1595 /**
1596   * @brief  Temperature data output register[get]
1597   *
1598   * @param  ctx      read / write interface definitions
1599   * @param  val      Temperature data output register
1600   * @retval          interface status (MANDATORY: return 0 -> no Error)
1601   *
1602   */
lsm6dso16is_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1603 int32_t lsm6dso16is_temperature_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1604 {
1605   uint8_t buff[2];
1606   int32_t ret;
1607 
1608   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_OUT_TEMP_L, &buff[0], 2);
1609   *val = (int16_t)buff[1];
1610   *val = (*val * 256) + (int16_t)buff[0];
1611 
1612   return ret;
1613 }
1614 
1615 /**
1616   * @brief  Angular rate sensor.[get]
1617   *
1618   * @param  ctx      read / write interface definitions
1619   * @param  val      Angular rate sensor.
1620   * @retval          interface status (MANDATORY: return 0 -> no Error)
1621   *
1622   */
lsm6dso16is_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1623 int32_t lsm6dso16is_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1624 {
1625   uint8_t buff[6];
1626   int32_t ret;
1627 
1628   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_OUTX_L_G, buff, 6);
1629   val[0] = (int16_t)buff[1];
1630   val[0] = (val[0] * 256) + (int16_t)buff[0];
1631   val[1] = (int16_t)buff[3];
1632   val[1] = (val[1] * 256) + (int16_t)buff[2];
1633   val[2] = (int16_t)buff[5];
1634   val[2] = (val[2] * 256) + (int16_t)buff[4];
1635 
1636   return ret;
1637 }
1638 
1639 /**
1640   * @brief  Linear acceleration sensor.[get]
1641   *
1642   * @param  ctx      read / write interface definitions
1643   * @param  val      Linear acceleration sensor.
1644   * @retval          interface status (MANDATORY: return 0 -> no Error)
1645   *
1646   */
lsm6dso16is_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1647 int32_t lsm6dso16is_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1648 {
1649   uint8_t buff[6];
1650   int32_t ret;
1651 
1652   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_OUTX_L_A, buff, 6);
1653   val[0] = (int16_t)buff[1];
1654   val[0] = (val[0] * 256) + (int16_t)buff[0];
1655   val[1] = (int16_t)buff[3];
1656   val[1] = (val[1] * 256) + (int16_t)buff[2];
1657   val[2] = (int16_t)buff[5];
1658   val[2] = (val[2] * 256) + (int16_t)buff[4];
1659 
1660   return ret;
1661 }
1662 
1663 /**
1664   * @}
1665   *
1666   */
1667 
1668 /**
1669   * @defgroup Interrupt PINs
1670   * @brief    Interrupt PINs
1671   * @{/
1672   *
1673   */
1674 /**
1675   * @brief  It routes interrupt signals on INT 1 pin.[set]
1676   *
1677   * @param  ctx      read / write interface definitions
1678   * @param  val      It routes interrupt signals on INT 1 pin.
1679   * @retval          interface status (MANDATORY: return 0 -> no Error)
1680   *
1681   */
lsm6dso16is_pin_int1_route_set(const stmdev_ctx_t * ctx,lsm6dso16is_pin_int1_route_t val)1682 int32_t lsm6dso16is_pin_int1_route_set(const stmdev_ctx_t *ctx,
1683                                        lsm6dso16is_pin_int1_route_t val)
1684 {
1685   lsm6dso16is_int1_ctrl_t int1_ctrl;
1686   lsm6dso16is_md1_cfg_t md1_cfg;
1687   int32_t ret;
1688 
1689   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
1690   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MD1_CFG, (uint8_t *)&md1_cfg, 1);
1691   if (ret != 0)
1692   {
1693     return ret;
1694   }
1695 
1696   int1_ctrl.int1_drdy_xl = val.drdy_xl;
1697   int1_ctrl.int1_drdy_g = val.drdy_gy;
1698   int1_ctrl.int1_boot = val.boot;
1699   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_INT1_CTRL, (uint8_t *)&int1_ctrl,
1700                                1);
1701 
1702   md1_cfg.int1_shub = val.sh_endop;
1703   md1_cfg.int1_ispu = val.ispu;
1704   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MD1_CFG, (uint8_t *)&md1_cfg, 1);
1705 
1706   return ret;
1707 }
1708 
1709 /**
1710   * @brief  It routes interrupt signals on INT 1 pin.[get]
1711   *
1712   * @param  ctx      read / write interface definitions
1713   * @param  val      It routes interrupt signals on INT 1 pin.
1714   * @retval          interface status (MANDATORY: return 0 -> no Error)
1715   *
1716   */
lsm6dso16is_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dso16is_pin_int1_route_t * val)1717 int32_t lsm6dso16is_pin_int1_route_get(const stmdev_ctx_t *ctx,
1718                                        lsm6dso16is_pin_int1_route_t *val)
1719 {
1720   lsm6dso16is_int1_ctrl_t int1_ctrl;
1721   lsm6dso16is_md1_cfg_t md1_cfg;
1722   int32_t ret;
1723 
1724   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
1725   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MD1_CFG, (uint8_t *)&md1_cfg, 1);
1726   if (ret != 0)
1727   {
1728     return ret;
1729   }
1730 
1731   val->drdy_xl = int1_ctrl.int1_drdy_xl;
1732   val->drdy_gy = int1_ctrl.int1_drdy_g;
1733   val->boot = int1_ctrl.int1_boot;
1734   val->sh_endop = md1_cfg.int1_shub;
1735   val->ispu = md1_cfg.int1_ispu;
1736 
1737   return ret;
1738 }
1739 
1740 /**
1741   * @brief  It routes interrupt signals on INT 2 pin.[set]
1742   *
1743   * @param  ctx      read / write interface definitions
1744   * @param  val      It routes interrupt signals on INT 2 pin.
1745   * @retval          interface status (MANDATORY: return 0 -> no Error)
1746   *
1747   */
lsm6dso16is_pin_int2_route_set(const stmdev_ctx_t * ctx,lsm6dso16is_pin_int2_route_t val)1748 int32_t lsm6dso16is_pin_int2_route_set(const stmdev_ctx_t *ctx,
1749                                        lsm6dso16is_pin_int2_route_t val)
1750 {
1751   lsm6dso16is_int2_ctrl_t int2_ctrl;
1752   lsm6dso16is_md2_cfg_t md2_cfg;
1753   int32_t ret;
1754 
1755   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
1756   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MD2_CFG, (uint8_t *)&md2_cfg, 1);
1757   if (ret != 0)
1758   {
1759     return ret;
1760   }
1761 
1762   int2_ctrl.int2_drdy_xl = val.drdy_xl;
1763   int2_ctrl.int2_drdy_g = val.drdy_gy;
1764   int2_ctrl.int2_drdy_temp = val.drdy_temp;
1765   int2_ctrl.int2_sleep_ispu = val.ispu_sleep;
1766   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
1767 
1768   md2_cfg.int2_ispu = val.ispu;
1769   md2_cfg.int2_timestamp = val.timestamp;
1770   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MD2_CFG, (uint8_t *)&md2_cfg, 1);
1771 
1772   return ret;
1773 }
1774 
1775 /**
1776   * @brief  It routes interrupt signals on INT 2 pin.[get]
1777   *
1778   * @param  ctx      read / write interface definitions
1779   * @param  val      It routes interrupt signals on INT 2 pin.
1780   * @retval          interface status (MANDATORY: return 0 -> no Error)
1781   *
1782   */
lsm6dso16is_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dso16is_pin_int2_route_t * val)1783 int32_t lsm6dso16is_pin_int2_route_get(const stmdev_ctx_t *ctx,
1784                                        lsm6dso16is_pin_int2_route_t *val)
1785 {
1786   lsm6dso16is_int2_ctrl_t int2_ctrl;
1787   lsm6dso16is_md2_cfg_t md2_cfg;
1788   int32_t ret;
1789 
1790   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
1791   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MD2_CFG, (uint8_t *)&md2_cfg, 1);
1792   if (ret != 0)
1793   {
1794     return ret;
1795   }
1796 
1797   val->drdy_xl = int2_ctrl.int2_drdy_xl;
1798   val->drdy_gy = int2_ctrl.int2_drdy_g;
1799   val->drdy_temp = int2_ctrl.int2_drdy_temp;
1800   val->ispu_sleep = int2_ctrl.int2_sleep_ispu;
1801   val->ispu = md2_cfg.int2_ispu;
1802   val->timestamp = md2_cfg.int2_timestamp;
1803 
1804   return ret;
1805 }
1806 
1807 /**
1808   * @brief  Push-pull/open-drain selection on INT1 and INT2 pins.[set]
1809   *
1810   * @param  ctx      read / write interface definitions
1811   * @param  val      PUSH_PULL, OPEN_DRAIN,
1812   * @retval          interface status (MANDATORY: return 0 -> no Error)
1813   *
1814   */
lsm6dso16is_int_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_int_pin_mode_t val)1815 int32_t lsm6dso16is_int_pin_mode_set(const stmdev_ctx_t *ctx,
1816                                      lsm6dso16is_int_pin_mode_t val)
1817 {
1818   lsm6dso16is_ctrl3_c_t ctrl3_c;
1819   int32_t ret;
1820 
1821   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1822 
1823   if (ret == 0)
1824   {
1825     ctrl3_c.pp_od = ((uint8_t)val & 0x1U);
1826     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1827   }
1828 
1829   return ret;
1830 }
1831 
1832 /**
1833   * @brief  Push-pull/open-drain selection on INT1 and INT2 pins.[get]
1834   *
1835   * @param  ctx      read / write interface definitions
1836   * @param  val      PUSH_PULL, OPEN_DRAIN,
1837   * @retval          interface status (MANDATORY: return 0 -> no Error)
1838   *
1839   */
lsm6dso16is_int_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_int_pin_mode_t * val)1840 int32_t lsm6dso16is_int_pin_mode_get(const stmdev_ctx_t *ctx,
1841                                      lsm6dso16is_int_pin_mode_t *val)
1842 {
1843   lsm6dso16is_ctrl3_c_t ctrl3_c;
1844   int32_t ret;
1845 
1846   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1847 
1848   switch ((ctrl3_c.pp_od))
1849   {
1850     case LSM6DSO16IS_PUSH_PULL:
1851       *val = LSM6DSO16IS_PUSH_PULL;
1852       break;
1853 
1854     case LSM6DSO16IS_OPEN_DRAIN:
1855       *val = LSM6DSO16IS_OPEN_DRAIN;
1856       break;
1857 
1858     default:
1859       *val = LSM6DSO16IS_PUSH_PULL;
1860       break;
1861   }
1862   return ret;
1863 }
1864 
1865 /**
1866   * @brief  Interrupt activation level.[set]
1867   *
1868   * @param  ctx      read / write interface definitions
1869   * @param  val      ACTIVE_HIGH, ACTIVE_LOW,
1870   * @retval          interface status (MANDATORY: return 0 -> no Error)
1871   *
1872   */
lsm6dso16is_pin_polarity_set(const stmdev_ctx_t * ctx,lsm6dso16is_pin_polarity_t val)1873 int32_t lsm6dso16is_pin_polarity_set(const stmdev_ctx_t *ctx,
1874                                      lsm6dso16is_pin_polarity_t val)
1875 {
1876   lsm6dso16is_ctrl3_c_t ctrl3_c;
1877   int32_t ret;
1878 
1879   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1880 
1881   if (ret == 0)
1882   {
1883     ctrl3_c.h_lactive = ((uint8_t)val & 0x1U);
1884     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1885   }
1886 
1887   return ret;
1888 }
1889 
1890 /**
1891   * @brief  Interrupt activation level.[get]
1892   *
1893   * @param  ctx      read / write interface definitions
1894   * @param  val      ACTIVE_HIGH, ACTIVE_LOW,
1895   * @retval          interface status (MANDATORY: return 0 -> no Error)
1896   *
1897   */
lsm6dso16is_pin_polarity_get(const stmdev_ctx_t * ctx,lsm6dso16is_pin_polarity_t * val)1898 int32_t lsm6dso16is_pin_polarity_get(const stmdev_ctx_t *ctx,
1899                                      lsm6dso16is_pin_polarity_t *val)
1900 {
1901   lsm6dso16is_ctrl3_c_t ctrl3_c;
1902   int32_t ret;
1903 
1904   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1905 
1906   switch ((ctrl3_c.h_lactive))
1907   {
1908     case LSM6DSO16IS_ACTIVE_HIGH:
1909       *val = LSM6DSO16IS_ACTIVE_HIGH;
1910       break;
1911 
1912     case LSM6DSO16IS_ACTIVE_LOW:
1913       *val = LSM6DSO16IS_ACTIVE_LOW;
1914       break;
1915 
1916     default:
1917       *val = LSM6DSO16IS_ACTIVE_HIGH;
1918       break;
1919   }
1920   return ret;
1921 }
1922 
1923 /**
1924   * @}
1925   *
1926   */
1927 
1928 /**
1929   * @defgroup  Sensor hub
1930   * @brief     This section groups all the functions that manage the
1931   *            sensor hub.
1932   * @{
1933   *
1934   */
1935 
1936 /**
1937   * @brief  Sensor hub output registers.[get]
1938   *
1939   * @param  ctx      read / write interface definitions
1940   * @param  val      Sensor hub output registers.
1941   * @retval          interface status (MANDATORY: return 0 -> no Error)
1942   *
1943   */
lsm6dso16is_sh_read_data_raw_get(const stmdev_ctx_t * ctx,uint8_t * val,uint8_t len)1944 int32_t lsm6dso16is_sh_read_data_raw_get(const stmdev_ctx_t *ctx, uint8_t *val,
1945                                          uint8_t len)
1946 {
1947   int32_t ret;
1948 
1949   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
1950   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_SENSOR_HUB_1, val, len);
1951   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
1952 
1953   return ret;
1954 }
1955 
1956 /**
1957   * @brief  Number of external sensors to be read by the sensor hub.[set]
1958   *
1959   * @param  ctx      read / write interface definitions
1960   * @param  val      SLV_0, SLV_0_1, SLV_0_1_2, SLV_0_1_2_3,
1961   * @retval          interface status (MANDATORY: return 0 -> no Error)
1962   *
1963   */
lsm6dso16is_sh_slave_connected_set(const stmdev_ctx_t * ctx,lsm6dso16is_sh_slave_connected_t val)1964 int32_t lsm6dso16is_sh_slave_connected_set(const stmdev_ctx_t *ctx,
1965                                            lsm6dso16is_sh_slave_connected_t val)
1966 {
1967   lsm6dso16is_master_config_t master_config;
1968   int32_t ret;
1969 
1970   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
1971   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
1972   if (ret != 0)
1973   {
1974     goto exit;
1975   }
1976 
1977   master_config.aux_sens_on = (uint8_t)val & 0x3U;
1978   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
1979 
1980 exit:
1981   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
1982 
1983   return ret;
1984 }
1985 
1986 /**
1987   * @brief  Number of external sensors to be read by the sensor hub.[get]
1988   *
1989   * @param  ctx      read / write interface definitions
1990   * @param  val      SLV_0, SLV_0_1, SLV_0_1_2, SLV_0_1_2_3,
1991   * @retval          interface status (MANDATORY: return 0 -> no Error)
1992   *
1993   */
lsm6dso16is_sh_slave_connected_get(const stmdev_ctx_t * ctx,lsm6dso16is_sh_slave_connected_t * val)1994 int32_t lsm6dso16is_sh_slave_connected_get(const stmdev_ctx_t *ctx,
1995                                            lsm6dso16is_sh_slave_connected_t *val)
1996 {
1997   lsm6dso16is_master_config_t master_config;
1998   int32_t ret;
1999 
2000   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2001   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2002   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2003   if (ret != 0)
2004   {
2005     return ret;
2006   }
2007 
2008   switch (master_config.aux_sens_on)
2009   {
2010     case LSM6DSO16IS_SLV_0:
2011       *val = LSM6DSO16IS_SLV_0;
2012       break;
2013 
2014     case LSM6DSO16IS_SLV_0_1:
2015       *val = LSM6DSO16IS_SLV_0_1;
2016       break;
2017 
2018     case LSM6DSO16IS_SLV_0_1_2:
2019       *val = LSM6DSO16IS_SLV_0_1_2;
2020       break;
2021 
2022     case LSM6DSO16IS_SLV_0_1_2_3:
2023       *val = LSM6DSO16IS_SLV_0_1_2_3;
2024       break;
2025 
2026     default:
2027       *val = LSM6DSO16IS_SLV_0;
2028       break;
2029   }
2030 
2031   return ret;
2032 }
2033 
2034 /**
2035   * @brief  Sensor hub I2C master enable.[set]
2036   *
2037   * @param  ctx      read / write interface definitions
2038   * @param  val      Sensor hub I2C master enable.
2039   * @retval          interface status (MANDATORY: return 0 -> no Error)
2040   *
2041   */
lsm6dso16is_sh_master_set(const stmdev_ctx_t * ctx,uint8_t val)2042 int32_t lsm6dso16is_sh_master_set(const stmdev_ctx_t *ctx, uint8_t val)
2043 {
2044   lsm6dso16is_master_config_t master_config;
2045   int32_t ret;
2046 
2047   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2048   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2049   if (ret != 0)
2050   {
2051     goto exit;
2052   }
2053 
2054   master_config.master_on = val;
2055   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2056 
2057 exit:
2058   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2059 
2060   return ret;
2061 }
2062 
2063 /**
2064   * @brief  Sensor hub I2C master enable.[get]
2065   *
2066   * @param  ctx      read / write interface definitions
2067   * @param  val      Sensor hub I2C master enable.
2068   * @retval          interface status (MANDATORY: return 0 -> no Error)
2069   *
2070   */
lsm6dso16is_sh_master_get(const stmdev_ctx_t * ctx,uint8_t * val)2071 int32_t lsm6dso16is_sh_master_get(const stmdev_ctx_t *ctx, uint8_t *val)
2072 {
2073   lsm6dso16is_master_config_t master_config;
2074   int32_t ret;
2075 
2076   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2077   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2078   if (ret != 0)
2079   {
2080     return ret;
2081   }
2082 
2083   *val = master_config.master_on;
2084 
2085   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2086 
2087   return ret;
2088 }
2089 
2090 /**
2091   * @brief  Sensor Hub master I2C pull-up enable.[set]
2092   *
2093   * @param  ctx      read / write interface definitions
2094   * @param  val      Sensor Hub master I2C pull-up enable.
2095   * @retval          interface status (MANDATORY: return 0 -> no Error)
2096   *
2097   */
lsm6dso16is_sh_master_interface_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)2098 int32_t lsm6dso16is_sh_master_interface_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
2099 {
2100   lsm6dso16is_master_config_t master_config;
2101   int32_t ret;
2102 
2103   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2104   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2105   if (ret != 0)
2106   {
2107     goto exit;
2108   }
2109 
2110   master_config.shub_pu_en = val;
2111   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2112 
2113 exit:
2114   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2115 
2116   return ret;
2117 }
2118 
2119 /**
2120   * @brief  Sensor Hub master I2C pull-up enable.[get]
2121   *
2122   * @param  ctx      read / write interface definitions
2123   * @param  val      Sensor Hub master I2C pull-up enable.
2124   * @retval          interface status (MANDATORY: return 0 -> no Error)
2125   *
2126   */
lsm6dso16is_sh_master_interface_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)2127 int32_t lsm6dso16is_sh_master_interface_pull_up_get(const stmdev_ctx_t *ctx,
2128                                                     uint8_t *val)
2129 {
2130   lsm6dso16is_master_config_t master_config;
2131   int32_t ret;
2132 
2133   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2134   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2135   if (ret != 0)
2136   {
2137     return ret;
2138   }
2139 
2140   *val = master_config.shub_pu_en;
2141 
2142   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2143 
2144   return ret;
2145 }
2146 
2147 /**
2148   * @brief  I2C interface pass-through.[set]
2149   *
2150   * @param  ctx    Read / write interface definitions.(ptr)
2151   * @param  val    Change the values of pass_through_mode in reg MASTER_CONFIG
2152   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2153   *
2154   */
lsm6dso16is_sh_pass_through_set(const stmdev_ctx_t * ctx,uint8_t val)2155 int32_t lsm6dso16is_sh_pass_through_set(const stmdev_ctx_t *ctx, uint8_t val)
2156 {
2157   lsm6dso16is_master_config_t master_config;
2158   int32_t ret;
2159 
2160   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2161   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2162   if (ret != 0)
2163   {
2164     goto exit;
2165   }
2166 
2167   master_config.pass_through_mode = (uint8_t)val;
2168   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2169 
2170 exit:
2171   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2172 
2173   return ret;
2174 }
2175 
2176 /**
2177   * @brief  I2C interface pass-through.[get]
2178   *
2179   * @param  ctx    Read / write interface definitions.(ptr)
2180   * @param  val    Change the values of pass_through_mode in reg MASTER_CONFIG
2181   * @retval        Interface status (MANDATORY: return 0 -> no Error).
2182   *
2183   */
lsm6dso16is_sh_pass_through_get(const stmdev_ctx_t * ctx,uint8_t * val)2184 int32_t lsm6dso16is_sh_pass_through_get(const stmdev_ctx_t *ctx, uint8_t *val)
2185 {
2186   lsm6dso16is_master_config_t master_config;
2187   int32_t ret;
2188 
2189   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2190   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2191 
2192   *val = master_config.pass_through_mode;
2193   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2194 
2195   return ret;
2196 }
2197 
2198 /**
2199   * @brief  Sensor hub trigger signal selection.[set]
2200   *
2201   * @param  ctx      read / write interface definitions
2202   * @param  val      SH_TRG_XL_GY_DRDY, SH_TRIG_INT2,
2203   * @retval          interface status (MANDATORY: return 0 -> no Error)
2204   *
2205   */
lsm6dso16is_sh_syncro_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_sh_syncro_mode_t val)2206 int32_t lsm6dso16is_sh_syncro_mode_set(const stmdev_ctx_t *ctx,
2207                                        lsm6dso16is_sh_syncro_mode_t val)
2208 {
2209   lsm6dso16is_master_config_t master_config;
2210   int32_t ret;
2211 
2212   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2213   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2214   if (ret != 0)
2215   {
2216     goto exit;
2217   }
2218 
2219   master_config.start_config = (uint8_t)val & 0x01U;
2220   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2221 
2222 exit:
2223   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2224 
2225   return ret;
2226 }
2227 
2228 /**
2229   * @brief  Sensor hub trigger signal selection.[get]
2230   *
2231   * @param  ctx      read / write interface definitions
2232   * @param  val      SH_TRG_XL_GY_DRDY, SH_TRIG_INT2,
2233   * @retval          interface status (MANDATORY: return 0 -> no Error)
2234   *
2235   */
lsm6dso16is_sh_syncro_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_sh_syncro_mode_t * val)2236 int32_t lsm6dso16is_sh_syncro_mode_get(const stmdev_ctx_t *ctx,
2237                                        lsm6dso16is_sh_syncro_mode_t *val)
2238 {
2239   lsm6dso16is_master_config_t master_config;
2240   int32_t ret;
2241 
2242   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2243   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2244   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2245   if (ret != 0)
2246   {
2247     return ret;
2248   }
2249 
2250   switch (master_config.start_config)
2251   {
2252     case LSM6DSO16IS_SH_TRG_XL_GY_DRDY:
2253       *val = LSM6DSO16IS_SH_TRG_XL_GY_DRDY;
2254       break;
2255 
2256     case LSM6DSO16IS_SH_TRIG_INT2:
2257       *val = LSM6DSO16IS_SH_TRIG_INT2;
2258       break;
2259 
2260     default:
2261       *val = LSM6DSO16IS_SH_TRG_XL_GY_DRDY;
2262       break;
2263   }
2264 
2265   return ret;
2266 }
2267 
2268 /**
2269   * @brief  Slave 0 write operation is performed only at the first sensor hub cycle.[set]
2270   *
2271   * @param  ctx      read / write interface definitions
2272   * @param  val      EACH_SH_CYCLE, ONLY_FIRST_CYCLE,
2273   * @retval          interface status (MANDATORY: return 0 -> no Error)
2274   *
2275   */
lsm6dso16is_sh_write_mode_set(const stmdev_ctx_t * ctx,lsm6dso16is_sh_write_mode_t val)2276 int32_t lsm6dso16is_sh_write_mode_set(const stmdev_ctx_t *ctx,
2277                                       lsm6dso16is_sh_write_mode_t val)
2278 {
2279   lsm6dso16is_master_config_t master_config;
2280   int32_t ret;
2281 
2282   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2283   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2284   if (ret != 0)
2285   {
2286     goto exit;
2287   }
2288 
2289   master_config.write_once = (uint8_t)val & 0x01U;
2290   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2291 
2292 exit:
2293   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2294 
2295   return ret;
2296 }
2297 
2298 /**
2299   * @brief  Slave 0 write operation is performed only at the first sensor hub cycle.[get]
2300   *
2301   * @param  ctx      read / write interface definitions
2302   * @param  val      EACH_SH_CYCLE, ONLY_FIRST_CYCLE,
2303   * @retval          interface status (MANDATORY: return 0 -> no Error)
2304   *
2305   */
lsm6dso16is_sh_write_mode_get(const stmdev_ctx_t * ctx,lsm6dso16is_sh_write_mode_t * val)2306 int32_t lsm6dso16is_sh_write_mode_get(const stmdev_ctx_t *ctx,
2307                                       lsm6dso16is_sh_write_mode_t *val)
2308 {
2309   lsm6dso16is_master_config_t master_config;
2310   int32_t ret;
2311 
2312   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2313   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2314   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2315   if (ret != 0)
2316   {
2317     return ret;
2318   }
2319 
2320   switch (master_config.write_once)
2321   {
2322     case LSM6DSO16IS_EACH_SH_CYCLE:
2323       *val = LSM6DSO16IS_EACH_SH_CYCLE;
2324       break;
2325 
2326     case LSM6DSO16IS_ONLY_FIRST_CYCLE:
2327       *val = LSM6DSO16IS_ONLY_FIRST_CYCLE;
2328       break;
2329 
2330     default:
2331       *val = LSM6DSO16IS_EACH_SH_CYCLE;
2332       break;
2333   }
2334 
2335   return ret;
2336 }
2337 
2338 /**
2339   * @brief  Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.[set]
2340   *
2341   * @param  ctx      read / write interface definitions
2342   * @param  val      Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.
2343   * @retval          interface status (MANDATORY: return 0 -> no Error)
2344   *
2345   */
lsm6dso16is_sh_reset_set(const stmdev_ctx_t * ctx,uint8_t val)2346 int32_t lsm6dso16is_sh_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
2347 {
2348   lsm6dso16is_master_config_t master_config;
2349   int32_t ret;
2350 
2351   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2352   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2353   if (ret != 0)
2354   {
2355     goto exit;
2356   }
2357 
2358   master_config.rst_master_regs = val;
2359   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2360 
2361 exit:
2362   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2363 
2364   return ret;
2365 }
2366 
2367 /**
2368   * @brief  Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.[get]
2369   *
2370   * @param  ctx      read / write interface definitions
2371   * @param  val      Reset Master logic and output registers. Must be set to ‘1’ and then set it to ‘0’.
2372   * @retval          interface status (MANDATORY: return 0 -> no Error)
2373   *
2374   */
lsm6dso16is_sh_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)2375 int32_t lsm6dso16is_sh_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
2376 {
2377   lsm6dso16is_master_config_t master_config;
2378   int32_t ret;
2379 
2380   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2381   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_MASTER_CONFIG, (uint8_t *)&master_config, 1);
2382   if (ret != 0)
2383   {
2384     return ret;
2385   }
2386 
2387   *val = master_config.rst_master_regs;
2388 
2389   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2390 
2391   return ret;
2392 }
2393 
2394 /**
2395   * @brief  Configure slave 0 for perform a write.[set]
2396   *
2397   * @param  ctx      read / write interface definitions
2398   * @param  val      a structure that contain
2399   *                      - uint8_t slv1_add;    8 bit i2c device address
2400   *                      - uint8_t slv1_subadd; 8 bit register device address
2401   *                      - uint8_t slv1_data;   8 bit data to write
2402   * @retval             interface status (MANDATORY: return 0 -> no Error)
2403   *
2404   */
lsm6dso16is_sh_cfg_write(const stmdev_ctx_t * ctx,lsm6dso16is_sh_cfg_write_t * val)2405 int32_t lsm6dso16is_sh_cfg_write(const stmdev_ctx_t *ctx,
2406                                  lsm6dso16is_sh_cfg_write_t *val)
2407 {
2408   lsm6dso16is_slv0_add_t reg;
2409   int32_t ret;
2410 
2411   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2412   if (ret != 0)
2413   {
2414     return ret;
2415   }
2416 
2417   reg.slave0_add = val->slv0_add;
2418   reg.rw_0 = 0;
2419   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_ADD, (uint8_t *)&reg, 1);
2420   if (ret != 0)
2421   {
2422     goto exit;
2423   }
2424 
2425   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_SUBADD,
2426                               &(val->slv0_subadd), 1);
2427   if (ret != 0)
2428   {
2429     goto exit;
2430   }
2431 
2432   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_DATAWRITE_SLV0,
2433                               &(val->slv0_data), 1);
2434 
2435 exit:
2436   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2437 
2438   return ret;
2439 }
2440 
2441 /**
2442   * @brief  Rate at which the master communicates.[set]
2443   *
2444   * @param  ctx      read / write interface definitions
2445   * @param  val      SH_12_5Hz, SH_26Hz, SH_52Hz, SH_104Hz
2446   * @retval          interface status (MANDATORY: return 0 -> no Error)
2447   *
2448   */
lsm6dso16is_sh_data_rate_set(const stmdev_ctx_t * ctx,lsm6dso16is_sh_data_rate_t val)2449 int32_t lsm6dso16is_sh_data_rate_set(const stmdev_ctx_t *ctx,
2450                                      lsm6dso16is_sh_data_rate_t val)
2451 {
2452   lsm6dso16is_slv0_config_t slv0_config;
2453   int32_t ret;
2454 
2455   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2456   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
2457   if (ret != 0)
2458   {
2459     goto exit;
2460   }
2461 
2462   slv0_config.shub_odr = (uint8_t)val & 0x07U;
2463   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
2464 
2465 exit:
2466   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2467 
2468   return ret;
2469 }
2470 
2471 /**
2472   * @brief  Rate at which the master communicates.[get]
2473   *
2474   * @param  ctx      read / write interface definitions
2475   * @param  val      SH_12_5Hz, SH_26Hz, SH_52Hz, SH_104Hz
2476   * @retval          interface status (MANDATORY: return 0 -> no Error)
2477   *
2478   */
lsm6dso16is_sh_data_rate_get(const stmdev_ctx_t * ctx,lsm6dso16is_sh_data_rate_t * val)2479 int32_t lsm6dso16is_sh_data_rate_get(const stmdev_ctx_t *ctx,
2480                                      lsm6dso16is_sh_data_rate_t *val)
2481 {
2482   lsm6dso16is_slv0_config_t slv0_config;
2483   int32_t ret;
2484 
2485   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2486   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_SLV0_CONFIG, (uint8_t *)&slv0_config, 1);
2487   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2488   if (ret != 0)
2489   {
2490     return ret;
2491   }
2492 
2493   switch (slv0_config.shub_odr)
2494   {
2495     case LSM6DSO16IS_SH_12_5Hz:
2496       *val = LSM6DSO16IS_SH_12_5Hz;
2497       break;
2498 
2499     case LSM6DSO16IS_SH_26Hz:
2500       *val = LSM6DSO16IS_SH_26Hz;
2501       break;
2502 
2503     case LSM6DSO16IS_SH_52Hz:
2504       *val = LSM6DSO16IS_SH_52Hz;
2505       break;
2506 
2507     case LSM6DSO16IS_SH_104Hz:
2508       *val = LSM6DSO16IS_SH_104Hz;
2509       break;
2510 
2511     default:
2512       *val = LSM6DSO16IS_SH_12_5Hz;
2513       break;
2514   }
2515 
2516   return ret;
2517 }
2518 
2519 /**
2520   * @brief  Configure slave idx for perform a read.[set]
2521   *
2522   * @param  ctx      read / write interface definitions
2523   * @param  val      Structure that contain
2524   *                      - uint8_t slv_add;    8 bit i2c device address
2525   *                      - uint8_t slv_subadd; 8 bit register device address
2526   *                      - uint8_t slv_len;    num of bit to read
2527   * @retval             interface status (MANDATORY: return 0 -> no Error)
2528   *
2529   */
lsm6dso16is_sh_slv_cfg_read(const stmdev_ctx_t * ctx,uint8_t idx,lsm6dso16is_sh_cfg_read_t * val)2530 int32_t lsm6dso16is_sh_slv_cfg_read(const stmdev_ctx_t *ctx, uint8_t idx,
2531                                     lsm6dso16is_sh_cfg_read_t *val)
2532 {
2533   lsm6dso16is_slv0_add_t slv_add;
2534   lsm6dso16is_slv0_config_t slv_config;
2535   int32_t ret;
2536 
2537   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_SENSOR_HUB_MEM_BANK);
2538   if (ret != 0)
2539   {
2540     return ret;
2541   }
2542 
2543   slv_add.slave0_add = val->slv_add;
2544   slv_add.rw_0 = 1;
2545   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_ADD + idx * 3U,
2546                               (uint8_t *)&slv_add, 1);
2547   if (ret != 0)
2548   {
2549     goto exit;
2550   }
2551 
2552   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_SUBADD + idx * 3U,
2553                               &(val->slv_subadd), 1);
2554   if (ret != 0)
2555   {
2556     goto exit;
2557   }
2558 
2559   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_SLV0_CONFIG + idx * 3U,
2560                              (uint8_t *)&slv_config, 1);
2561   if (ret != 0)
2562   {
2563     goto exit;
2564   }
2565 
2566   slv_config.slave0_numop = val->slv_len;
2567   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_SLV0_CONFIG + idx * 3U,
2568                               (uint8_t *)&slv_config, 1);
2569 
2570 exit:
2571   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2572 
2573   return ret;
2574 }
2575 
2576 /**
2577   * @brief  Sensor hub source register.[get]
2578   *
2579   * @param  ctx      read / write interface definitions
2580   * @param  val      union of registers from STATUS_MASTER to
2581   * @retval          interface status (MANDATORY: return 0 -> no Error)
2582   *
2583   */
lsm6dso16is_sh_status_get(const stmdev_ctx_t * ctx,lsm6dso16is_status_master_t * val)2584 int32_t lsm6dso16is_sh_status_get(const stmdev_ctx_t *ctx,
2585                                   lsm6dso16is_status_master_t *val)
2586 {
2587   int32_t ret;
2588 
2589   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_STATUS_MASTER_MAINPAGE, (uint8_t *) val, 1);
2590 
2591   return ret;
2592 }
2593 
2594 /**
2595   * @}
2596   *
2597   */
2598 
2599 /**
2600   * @defgroup ispu
2601   * @brief    ispu
2602   * @{/
2603   *
2604   */
2605 /**
2606   * @brief  Software reset of ISPU core.[set]
2607   *
2608   * @param  ctx      read / write interface definitions
2609   * @param  val      Software reset of ISPU core.
2610   * @retval          interface status (MANDATORY: return 0 -> no Error)
2611   *
2612   */
lsm6dso16is_ispu_reset_set(const stmdev_ctx_t * ctx,uint8_t val)2613 int32_t lsm6dso16is_ispu_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
2614 {
2615   lsm6dso16is_func_cfg_access_t func_cfg_access;
2616   int32_t ret;
2617 
2618   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
2619 
2620   if (ret == 0)
2621   {
2622     func_cfg_access.sw_reset_ispu = val;
2623     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
2624   }
2625 
2626   return ret;
2627 }
2628 
2629 /**
2630   * @brief  Software reset of ISPU core.[get]
2631   *
2632   * @param  ctx      read / write interface definitions
2633   * @param  val      Software reset of ISPU core.
2634   * @retval          interface status (MANDATORY: return 0 -> no Error)
2635   *
2636   */
lsm6dso16is_ispu_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)2637 int32_t lsm6dso16is_ispu_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
2638 {
2639   lsm6dso16is_func_cfg_access_t func_cfg_access;
2640   int32_t ret;
2641 
2642   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
2643 
2644   *val = func_cfg_access.sw_reset_ispu;
2645 
2646 
2647   return ret;
2648 }
2649 
lsm6dso16is_ispu_clock_set(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_clock_sel_t val)2650 int32_t lsm6dso16is_ispu_clock_set(const stmdev_ctx_t *ctx,
2651                                    lsm6dso16is_ispu_clock_sel_t val)
2652 {
2653   lsm6dso16is_ctrl10_c_t ctrl10_c;
2654   int32_t ret;
2655 
2656   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
2657 
2658   if (ret == 0)
2659   {
2660     ctrl10_c.ispu_clk_sel = (uint8_t)val;
2661     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
2662   }
2663 
2664   return ret;
2665 }
2666 
lsm6dso16is_ispu_clock_get(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_clock_sel_t * val)2667 int32_t lsm6dso16is_ispu_clock_get(const stmdev_ctx_t *ctx,
2668                                    lsm6dso16is_ispu_clock_sel_t *val)
2669 {
2670   lsm6dso16is_ctrl10_c_t ctrl10_c;
2671   int32_t ret;
2672 
2673   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
2674 
2675   switch (ctrl10_c.ispu_clk_sel)
2676   {
2677     default:
2678     case 0:
2679       *val = LSM6DSO16IS_ISPU_CLK_5MHz;
2680       break;
2681     case 1:
2682       *val = LSM6DSO16IS_ISPU_CLK_10MHz;
2683       break;
2684   }
2685 
2686   return ret;
2687 }
2688 
2689 /**
2690   * @brief  ISPU irq rate selection.[set]
2691   *
2692   * @param  ctx      read / write interface definitions
2693   * @param  val      ISPU_ODR_OFF, ISPU_ODR_AT_12Hz5, ISPU_ODR_AT_26Hz, ISPU_ODR_AT_52Hz,
2694   *                  ISPU_ODR_AT_104Hz, ISPU_ODR_AT_208Hz, ISPU_ODR_AT_417Hz, ISPU_ODR_AT_833Hz,
2695   *                  ISPU_ODR_AT_1667Hz, ISPU_ODR_AT_3333Hz, ISPU_ODR_AT_6667Hz
2696   * @retval          interface status (MANDATORY: return 0 -> no Error)
2697   *
2698   */
lsm6dso16is_ispu_data_rate_set(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_data_rate_t val)2699 int32_t lsm6dso16is_ispu_data_rate_set(const stmdev_ctx_t *ctx,
2700                                        lsm6dso16is_ispu_data_rate_t val)
2701 {
2702   lsm6dso16is_ctrl9_c_t ctrl9_c;
2703   int32_t ret;
2704 
2705   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2706 
2707   if (ret == 0)
2708   {
2709     ctrl9_c.ispu_rate = ((uint8_t)val & 0xfU);
2710     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2711   }
2712 
2713   return ret;
2714 }
2715 
2716 /**
2717   * @brief  ISPU irq rate selection.[get]
2718   *
2719   * @param  ctx      read / write interface definitions
2720   * @param  val      ISPU_ODR_OFF, ISPU_ODR_AT_12Hz5, ISPU_ODR_AT_26Hz, ISPU_ODR_AT_52Hz,
2721   *                  ISPU_ODR_AT_104Hz, ISPU_ODR_AT_208Hz, ISPU_ODR_AT_417Hz, ISPU_ODR_AT_833Hz,
2722   *                  ISPU_ODR_AT_1667Hz, ISPU_ODR_AT_3333Hz, ISPU_ODR_AT_6667Hz
2723   * @retval          interface status (MANDATORY: return 0 -> no Error)
2724   *
2725   */
lsm6dso16is_ispu_data_rate_get(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_data_rate_t * val)2726 int32_t lsm6dso16is_ispu_data_rate_get(const stmdev_ctx_t *ctx,
2727                                        lsm6dso16is_ispu_data_rate_t *val)
2728 {
2729   lsm6dso16is_ctrl9_c_t ctrl9_c;
2730   int32_t ret;
2731 
2732   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2733 
2734   switch ((ctrl9_c.ispu_rate))
2735   {
2736     case LSM6DSO16IS_ISPU_ODR_OFF:
2737       *val = LSM6DSO16IS_ISPU_ODR_OFF;
2738       break;
2739 
2740     case LSM6DSO16IS_ISPU_ODR_AT_12Hz5:
2741       *val = LSM6DSO16IS_ISPU_ODR_AT_12Hz5;
2742       break;
2743 
2744     case LSM6DSO16IS_ISPU_ODR_AT_26Hz:
2745       *val = LSM6DSO16IS_ISPU_ODR_AT_26Hz;
2746       break;
2747 
2748     case LSM6DSO16IS_ISPU_ODR_AT_52Hz:
2749       *val = LSM6DSO16IS_ISPU_ODR_AT_52Hz;
2750       break;
2751 
2752     case LSM6DSO16IS_ISPU_ODR_AT_104Hz:
2753       *val = LSM6DSO16IS_ISPU_ODR_AT_104Hz;
2754       break;
2755 
2756     case LSM6DSO16IS_ISPU_ODR_AT_208Hz:
2757       *val = LSM6DSO16IS_ISPU_ODR_AT_208Hz;
2758       break;
2759 
2760     case LSM6DSO16IS_ISPU_ODR_AT_416Hz:
2761       *val = LSM6DSO16IS_ISPU_ODR_AT_416Hz;
2762       break;
2763 
2764     case LSM6DSO16IS_ISPU_ODR_AT_833Hz:
2765       *val = LSM6DSO16IS_ISPU_ODR_AT_833Hz;
2766       break;
2767 
2768     case LSM6DSO16IS_ISPU_ODR_AT_1667Hz:
2769       *val = LSM6DSO16IS_ISPU_ODR_AT_1667Hz;
2770       break;
2771 
2772     case LSM6DSO16IS_ISPU_ODR_AT_3333Hz:
2773       *val = LSM6DSO16IS_ISPU_ODR_AT_3333Hz;
2774       break;
2775 
2776     case LSM6DSO16IS_ISPU_ODR_AT_6667Hz:
2777       *val = LSM6DSO16IS_ISPU_ODR_AT_6667Hz;
2778       break;
2779 
2780     default:
2781       *val = LSM6DSO16IS_ISPU_ODR_OFF;
2782       break;
2783   }
2784   return ret;
2785 }
2786 
2787 /**
2788   * @brief  ISPU bdu selection.[set]
2789   *
2790   * @param  ctx      read / write interface definitions
2791   * @param  val      ISPU_BDU_OFF, ISPU_BDU_ON_2B_4B, ISPU_BDU_ON_2B_2B, ISPU_BDU_ON_4B_4B,
2792   * @retval          interface status (MANDATORY: return 0 -> no Error)
2793   *
2794   */
lsm6dso16is_ispu_bdu_set(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_bdu_t val)2795 int32_t lsm6dso16is_ispu_bdu_set(const stmdev_ctx_t *ctx, lsm6dso16is_ispu_bdu_t val)
2796 {
2797   lsm6dso16is_ctrl9_c_t ctrl9_c;
2798   int32_t ret;
2799 
2800   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2801 
2802   if (ret == 0)
2803   {
2804     ctrl9_c.ispu_bdu = ((uint8_t)val & 0x3U);
2805     ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2806   }
2807 
2808   return ret;
2809 }
2810 
2811 /**
2812   * @brief  ISPU bdu selection.[get]
2813   *
2814   * @param  ctx      read / write interface definitions
2815   * @param  val      ISPU_BDU_OFF, ISPU_BDU_ON_2B_4B, ISPU_BDU_ON_2B_2B, ISPU_BDU_ON_4B_4B,
2816   * @retval          interface status (MANDATORY: return 0 -> no Error)
2817   *
2818   */
lsm6dso16is_ispu_bdu_get(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_bdu_t * val)2819 int32_t lsm6dso16is_ispu_bdu_get(const stmdev_ctx_t *ctx, lsm6dso16is_ispu_bdu_t *val)
2820 {
2821   lsm6dso16is_ctrl9_c_t ctrl9_c;
2822   int32_t ret;
2823 
2824   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_CTRL9_C, (uint8_t *)&ctrl9_c, 1);
2825 
2826   switch ((ctrl9_c.ispu_rate))
2827   {
2828     case LSM6DSO16IS_ISPU_BDU_OFF:
2829       *val = LSM6DSO16IS_ISPU_BDU_OFF;
2830       break;
2831 
2832     case LSM6DSO16IS_ISPU_BDU_ON_2B_4B:
2833       *val = LSM6DSO16IS_ISPU_BDU_ON_2B_4B;
2834       break;
2835 
2836     case LSM6DSO16IS_ISPU_BDU_ON_2B_2B:
2837       *val = LSM6DSO16IS_ISPU_BDU_ON_2B_2B;
2838       break;
2839 
2840     case LSM6DSO16IS_ISPU_BDU_ON_4B_4B:
2841       *val = LSM6DSO16IS_ISPU_BDU_ON_4B_4B;
2842       break;
2843 
2844     default:
2845       *val = LSM6DSO16IS_ISPU_BDU_OFF;
2846       break;
2847   }
2848   return ret;
2849 }
2850 
2851 /**
2852   * @brief  Generic Interrupt Flags from ISPU.[get]
2853   *
2854   * @param  ctx      read / write interface definitions
2855   * @param  val      Generic Interrupt Flags from ISPU.
2856   * @retval          interface status (MANDATORY: return 0 -> no Error)
2857   *
2858   */
lsm6dso16is_ia_ispu_get(const stmdev_ctx_t * ctx,uint32_t * val)2859 int32_t lsm6dso16is_ia_ispu_get(const stmdev_ctx_t *ctx, uint32_t *val)
2860 {
2861   uint8_t buff[4];
2862   int32_t ret;
2863 
2864   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_INT_STATUS0_MAINPAGE, &buff[0], 4);
2865 
2866   *val = (uint32_t)buff[3];
2867   *val = (*val * 256U) + (uint32_t)buff[2];
2868   *val = (*val * 256U) + (uint32_t)buff[1];
2869   *val = (*val * 256U) + (uint32_t)buff[0];
2870 
2871   return ret;
2872 }
2873 
2874 /**
2875   * @brief  General purpose input configuration register for ISPU[set]
2876   *
2877   * @param  ctx      read / write interface definitions
2878   * @param  offset   offset from ISPU_DUMMY_CFG_1 register
2879   * @param  val      General purpose input configuration register for ISPU
2880   * @param  len      number of bytes to write
2881   * @retval          interface status (MANDATORY: return 0 -> no Error)
2882   *
2883   */
lsm6dso16is_ispu_write_dummy_cfg(const stmdev_ctx_t * ctx,uint8_t offset,uint8_t * val,uint8_t len)2884 int32_t lsm6dso16is_ispu_write_dummy_cfg(const stmdev_ctx_t *ctx, uint8_t offset,
2885                                          uint8_t *val, uint8_t len)
2886 {
2887   int32_t ret;
2888 
2889   /* check if we are writing outside of the range */
2890   if (LSM6DSO16IS_ISPU_DUMMY_CFG_1_L + offset + len > LSM6DSO16IS_ISPU_DUMMY_CFG_4_H)
2891   {
2892     return -1;
2893   }
2894 
2895   ret = lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_DUMMY_CFG_1_L + offset, val, len);
2896 
2897   return ret;
2898 }
2899 
2900 /**
2901   * @brief  General purpose input configuration register for ISPU[set]
2902   *
2903   * @param  ctx      read / write interface definitions
2904   * @param  offset   offset from ISPU_DUMMY_CFG_1 register
2905   * @param  val      General purpose input configuration register for ISPU
2906   * @param  len      number of bytes to write
2907   * @retval          interface status (MANDATORY: return 0 -> no Error)
2908   *
2909   */
lsm6dso16is_ispu_read_dummy_cfg(const stmdev_ctx_t * ctx,uint8_t offset,uint8_t * val,uint8_t len)2910 int32_t lsm6dso16is_ispu_read_dummy_cfg(const stmdev_ctx_t *ctx, uint8_t offset,
2911                                         uint8_t *val, uint8_t len)
2912 {
2913   int32_t ret;
2914 
2915   /* check if we are reading outside of the range */
2916   if (LSM6DSO16IS_ISPU_DUMMY_CFG_1_L + offset + len > LSM6DSO16IS_ISPU_DUMMY_CFG_4_H)
2917   {
2918     return -1;
2919   }
2920 
2921   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_DUMMY_CFG_1_L + offset, val, len);
2922 
2923   return ret;
2924 }
2925 
2926 /**
2927   * @brief  Boot ISPU core[set]
2928   *
2929   * @param  ctx      read / write interface definitions
2930   * @param  val      Boot ISPU core
2931   * @retval          interface status (MANDATORY: return 0 -> no Error)
2932   *
2933   */
lsm6dso16is_ispu_boot_set(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_boot_latched_t val)2934 int32_t lsm6dso16is_ispu_boot_set(const stmdev_ctx_t *ctx,
2935                                   lsm6dso16is_ispu_boot_latched_t val)
2936 {
2937   lsm6dso16is_ispu_config_t ispu_config;
2938   int32_t ret;
2939 
2940   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
2941   if (ret != 0)
2942   {
2943     return ret;
2944   }
2945 
2946   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
2947   if (ret != 0)
2948   {
2949     goto exit;
2950   }
2951 
2952   ispu_config.ispu_rst_n = (uint8_t)val;
2953   ispu_config.clk_dis = (uint8_t)val;
2954   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
2955 
2956 exit:
2957   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2958 
2959   return ret;
2960 }
2961 
2962 /**
2963   * @brief  Boot ISPU core[get]
2964   *
2965   * @param  ctx      read / write interface definitions
2966   * @param  val      Boot ISPU core
2967   * @retval          interface status (MANDATORY: return 0 -> no Error)
2968   *
2969   */
lsm6dso16is_ispu_boot_get(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_boot_latched_t * val)2970 int32_t lsm6dso16is_ispu_boot_get(const stmdev_ctx_t *ctx,
2971                                   lsm6dso16is_ispu_boot_latched_t *val)
2972 {
2973   lsm6dso16is_ispu_config_t ispu_config;
2974   int32_t ret;
2975 
2976   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
2977   if (ret != 0)
2978   {
2979     return ret;
2980   }
2981 
2982   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
2983   if (ret != 0)
2984   {
2985     goto exit;
2986   }
2987 
2988   *val = LSM6DSO16IS_ISPU_TURN_OFF;
2989   if (ispu_config.ispu_rst_n == 1U || ispu_config.clk_dis == 1U)
2990   {
2991     *val = LSM6DSO16IS_ISPU_TURN_ON;
2992   }
2993 
2994 exit:
2995   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
2996 
2997   return ret;
2998 }
2999 
3000 /**
3001   * @brief  Enables latched ISPU interrupt.[set]
3002   *
3003   * @param  ctx      read / write interface definitions
3004   * @param  val      ISPU_INT_PULSED, ISPU_INT_LATCHED,
3005   * @retval          interface status (MANDATORY: return 0 -> no Error)
3006   *
3007   */
lsm6dso16is_ispu_int_latched_set(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_int_latched_t val)3008 int32_t lsm6dso16is_ispu_int_latched_set(const stmdev_ctx_t *ctx,
3009                                          lsm6dso16is_ispu_int_latched_t val)
3010 {
3011   lsm6dso16is_ispu_config_t ispu_config;
3012   int32_t ret;
3013 
3014   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3015   if (ret != 0)
3016   {
3017     return ret;
3018   }
3019 
3020   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
3021   if (ret != 0)
3022   {
3023     goto exit;
3024   }
3025 
3026   ispu_config.latched = ((uint8_t)val & 0x1U);
3027   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
3028 
3029 exit:
3030   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3031 
3032   return ret;
3033 }
3034 
3035 /**
3036   * @brief  Enables latched ISPU interrupt.[get]
3037   *
3038   * @param  ctx      read / write interface definitions
3039   * @param  val      ISPU_INT_PULSED, ISPU_INT_LATCHED,
3040   * @retval          interface status (MANDATORY: return 0 -> no Error)
3041   *
3042   */
lsm6dso16is_ispu_int_latched_get(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_int_latched_t * val)3043 int32_t lsm6dso16is_ispu_int_latched_get(const stmdev_ctx_t *ctx,
3044                                          lsm6dso16is_ispu_int_latched_t *val)
3045 {
3046   lsm6dso16is_ispu_config_t ispu_config;
3047   int32_t ret;
3048 
3049   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3050   ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_config, 1);
3051   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3052   if (ret != 0)
3053   {
3054     return ret;
3055   }
3056 
3057   switch ((ispu_config.latched))
3058   {
3059     case LSM6DSO16IS_ISPU_INT_PULSED:
3060       *val = LSM6DSO16IS_ISPU_INT_PULSED;
3061       break;
3062 
3063     case LSM6DSO16IS_ISPU_INT_LATCHED:
3064       *val = LSM6DSO16IS_ISPU_INT_LATCHED;
3065       break;
3066 
3067     default:
3068       *val = LSM6DSO16IS_ISPU_INT_PULSED;
3069       break;
3070   }
3071 
3072   return ret;
3073 }
3074 
3075 /**
3076   * @brief  returns ISPU boot status
3077   *
3078   * @param  ctx      read / write interface definitions
3079   * @param  val      LSM6DSO16IS_ISPU_BOOT_IN_PROGRESS, LSM6DSO16IS_ISPU_BOOT_ENDED
3080   * @retval          interface status (MANDATORY: return 0 -> no Error)
3081   *
3082   */
lsm6dso16is_ispu_get_boot_status(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_boot_end_t * val)3083 int32_t lsm6dso16is_ispu_get_boot_status(const stmdev_ctx_t *ctx,
3084                                          lsm6dso16is_ispu_boot_end_t *val)
3085 {
3086   lsm6dso16is_ispu_status_t ispu_boot_status;
3087   int32_t ret;
3088 
3089   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3090   if (ret != 0)
3091   {
3092     return ret;
3093   }
3094 
3095   ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_STATUS, (uint8_t *)&ispu_boot_status, 1);
3096   *val = (lsm6dso16is_ispu_boot_end_t)ispu_boot_status.boot_end;
3097   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3098 
3099   return ret;
3100 }
3101 
lsm6dso16is_ispu_sel_memory_addr(const stmdev_ctx_t * ctx,uint16_t mem_addr)3102 static int32_t lsm6dso16is_ispu_sel_memory_addr(const stmdev_ctx_t *ctx, uint16_t mem_addr)
3103 {
3104   uint8_t mem_addr_l, mem_addr_h;
3105   int32_t ret = 0;
3106 
3107   mem_addr_l = (uint8_t)(mem_addr & 0xFFU);
3108   mem_addr_h = (uint8_t)(mem_addr / 256U);
3109   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_ADDR1,
3110                                (uint8_t *)&mem_addr_h, 1);
3111   ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_ADDR0,
3112                                (uint8_t *)&mem_addr_l, 1);
3113 
3114   return ret;
3115 }
3116 
3117 /**
3118   * @brief  ISPU write memory. ISPU clock is disabled inside the routine.
3119   *
3120   * @param  ctx      read / write interface definitions
3121   * @param  mem_sel  LSM6DSO16IS_ISPU_DATA_RAM_MEMORY, LSM6DSO16IS_ISPU_PROGRAM_RAM_MEMORY
3122   * @param  mem_addr memory address
3123   * @param  mem_data memory data
3124   * @param  len      data length
3125   * @retval          interface status (MANDATORY: return 0 -> no Error)
3126   *
3127   */
lsm6dso16is_ispu_write_memory(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_memory_type_t mem_sel,uint16_t mem_addr,uint8_t * mem_data,uint16_t len)3128 int32_t lsm6dso16is_ispu_write_memory(const stmdev_ctx_t *ctx,
3129                                       lsm6dso16is_ispu_memory_type_t mem_sel,
3130                                       uint16_t mem_addr, uint8_t *mem_data, uint16_t len)
3131 {
3132   lsm6dso16is_ispu_mem_sel_t ispu_mem_sel;
3133   lsm6dso16is_ispu_config_t ispu_cfg;
3134   uint8_t clk_dis;
3135   int32_t ret;
3136   uint16_t i;
3137 
3138   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3139   if (ret == 0)
3140   {
3141     /* disable ISPU clock */
3142     ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3143     clk_dis = ispu_cfg.clk_dis;
3144     ispu_cfg.clk_dis = 1;
3145     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3146 
3147     /* select memory to be written */
3148     ispu_mem_sel.read_mem_en = 0;
3149     ispu_mem_sel.mem_sel = (uint8_t)mem_sel;
3150     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_SEL, (uint8_t *)&ispu_mem_sel, 1);
3151 
3152     if (mem_sel == LSM6DSO16IS_ISPU_PROGRAM_RAM_MEMORY)
3153     {
3154       uint16_t addr_s[4] = {(uint16_t)0, (uint16_t)0, (uint16_t)0, (uint16_t)0};
3155       uint16_t len_s[4] = {(uint16_t)0, (uint16_t)0, (uint16_t)0, (uint16_t)0};
3156       uint8_t j = 0;
3157       uint16_t k;
3158 
3159       addr_s[0] = mem_addr;
3160       k = 0U;
3161       for (i = 0U; i < len; i++)
3162       {
3163         if ((mem_addr + i == 0x2000U) || (mem_addr + i == 0x4000U) || (mem_addr + i == 0x6000U))
3164         {
3165           len_s[j++] = k;
3166           addr_s[j] = mem_addr + i;
3167           k = 0U;
3168         }
3169 
3170         k++;
3171       }
3172       len_s[j++] = k;
3173 
3174       k = 0U;
3175       for (i = 0U; i < j; i++)
3176       {
3177         ret += lsm6dso16is_ispu_sel_memory_addr(ctx, addr_s[i]);
3178         ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_DATA, &mem_data[k], len_s[i]);
3179         k += len_s[i];
3180       }
3181     }
3182     else
3183     {
3184       /* select memory address */
3185       ret += lsm6dso16is_ispu_sel_memory_addr(ctx, mem_addr);
3186       ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_DATA, &mem_data[0], len);
3187     }
3188 
3189     /* set ISPU clock back to previous value */
3190     ispu_cfg.clk_dis = clk_dis;
3191     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3192   }
3193 
3194   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3195 
3196   return ret;
3197 }
3198 
3199 /**
3200   * @brief  ISPU read memory. ISPU clock is disabled inside the routine.
3201   *
3202   * @param  ctx      read / write interface definitions
3203   * @param  mem_sel  LSM6DSO16IS_ISPU_DATA_RAM_MEMORY, LSM6DSO16IS_ISPU_PROGRAM_RAM_MEMORY
3204   * @param  mem_addr memory address
3205   * @param  mem_data memory data
3206   * @param  len      data length
3207   * @retval          interface status (MANDATORY: return 0 -> no Error)
3208   *
3209   */
lsm6dso16is_ispu_read_memory(const stmdev_ctx_t * ctx,lsm6dso16is_ispu_memory_type_t mem_sel,uint16_t mem_addr,uint8_t * mem_data,uint16_t len)3210 int32_t lsm6dso16is_ispu_read_memory(const stmdev_ctx_t *ctx,
3211                                      lsm6dso16is_ispu_memory_type_t mem_sel,
3212                                      uint16_t mem_addr, uint8_t *mem_data, uint16_t len)
3213 {
3214   lsm6dso16is_ispu_mem_sel_t ispu_mem_sel;
3215   lsm6dso16is_ispu_config_t ispu_cfg;
3216   uint8_t clk_dis;
3217   int32_t ret;
3218   uint8_t dummy;
3219 
3220   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3221   if (ret == 0)
3222   {
3223     /* disable ISPU clock */
3224     ret = lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3225     clk_dis = ispu_cfg.clk_dis;
3226     ispu_cfg.clk_dis = 1;
3227     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3228 
3229     /* select memory to be read */
3230     ispu_mem_sel.read_mem_en = 1;
3231     ispu_mem_sel.mem_sel = (uint8_t)mem_sel;
3232     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_MEM_SEL, (uint8_t *)&ispu_mem_sel, 1);
3233 
3234     /* select memory address */
3235     ret += lsm6dso16is_ispu_sel_memory_addr(ctx, mem_addr);
3236 
3237     /* read data */
3238     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_MEM_DATA, &dummy, 1);
3239     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_MEM_DATA, &mem_data[0], len);
3240 
3241     /* set ISPU clock back to previous value */
3242     ispu_cfg.clk_dis = clk_dis;
3243     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_CONFIG, (uint8_t *)&ispu_cfg, 1);
3244   }
3245 
3246   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3247 
3248   return ret;
3249 }
3250 
3251 /**
3252   * @brief  ISPU write flags (IF2S)
3253   *
3254   * @param  ctx      read / write interface definitions
3255   * @param  data     ISPU flags
3256   * @retval          interface status (MANDATORY: return 0 -> no Error)
3257   *
3258   */
lsm6dso16is_ispu_write_flags(const stmdev_ctx_t * ctx,uint16_t data)3259 int32_t lsm6dso16is_ispu_write_flags(const stmdev_ctx_t *ctx, uint16_t data)
3260 {
3261   lsm6dso16is_ispu_if2s_flag_l_t flag_l;
3262   lsm6dso16is_ispu_if2s_flag_h_t flag_h;
3263   int32_t ret;
3264 
3265   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3266   if (ret == 0)
3267   {
3268     /* write the flags */
3269     flag_h.if2s = (uint8_t)(data / 256U);
3270     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_IF2S_FLAG_H, (uint8_t *)&flag_h,
3271                                  1);
3272     flag_l.if2s = (uint8_t)(data & 0xffU);
3273     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_IF2S_FLAG_L, (uint8_t *)&flag_l,
3274                                  1);
3275   }
3276 
3277   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3278 
3279   return ret;
3280 }
3281 
3282 /**
3283   * @brief  ISPU read flags (S2IF)
3284   *
3285   * @param  ctx      read / write interface definitions
3286   * @param  data     ISPU flags
3287   * @retval          interface status (MANDATORY: return 0 -> no Error)
3288   *
3289   */
lsm6dso16is_ispu_read_flags(const stmdev_ctx_t * ctx,uint16_t * data)3290 int32_t lsm6dso16is_ispu_read_flags(const stmdev_ctx_t *ctx, uint16_t *data)
3291 {
3292   uint8_t buff[2];
3293   int32_t ret;
3294 
3295   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3296   if (ret == 0)
3297   {
3298     /* read the flags */
3299     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_S2IF_FLAG_L, buff, 2);
3300     data[0] = (uint16_t)buff[1];
3301     data[0] = (data[0] * 256U) + (uint16_t)buff[0];
3302   }
3303 
3304   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3305 
3306   return ret;
3307 }
3308 
3309 /**
3310   * @brief  ISPU clear flags (S2IF)
3311   *
3312   * @param  ctx      read / write interface definitions
3313   * @retval          interface status (MANDATORY: return 0 -> no Error)
3314   *
3315   */
lsm6dso16is_ispu_clear_flags(const stmdev_ctx_t * ctx)3316 int32_t lsm6dso16is_ispu_clear_flags(const stmdev_ctx_t *ctx)
3317 {
3318   uint8_t data = 1;
3319   int32_t ret;
3320 
3321   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3322 
3323   if (ret == 0)
3324   {
3325     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_S2IF_FLAG_H, &data, 1);
3326     ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3327   }
3328 
3329   return ret;
3330 }
3331 
3332 /**
3333   * @brief  ISPU DOUT registers.[get]
3334   *
3335   * @param  ctx      read / write interface definitions
3336   * @param  val      ISPU DOUT output registers.
3337   * @retval          interface status (MANDATORY: return 0 -> no Error)
3338   *
3339   */
lsm6dso16is_ispu_read_data_raw_get(const stmdev_ctx_t * ctx,uint8_t * val,uint8_t len)3340 int32_t lsm6dso16is_ispu_read_data_raw_get(const stmdev_ctx_t *ctx,
3341                                            uint8_t *val,
3342                                            uint8_t len)
3343 {
3344   int32_t ret;
3345 
3346   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3347   if (ret == 0)
3348   {
3349     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_DOUT_00_L, (uint8_t *) val,
3350                                 len);
3351   }
3352 
3353   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3354 
3355   return ret;
3356 }
3357 
3358 /**
3359   * @brief  ISPU int1_ctrl.[get]
3360   *
3361   * @param  ctx      read / write interface definitions
3362   * @param  val      ISPU int1_ctrl register value
3363   * @retval          interface status (MANDATORY: return 0 -> no Error)
3364   *
3365   */
lsm6dso16is_ispu_int1_ctrl_get(const stmdev_ctx_t * ctx,uint32_t * val)3366 int32_t lsm6dso16is_ispu_int1_ctrl_get(const stmdev_ctx_t *ctx, uint32_t *val)
3367 {
3368   uint8_t buff[4];
3369   int32_t ret;
3370 
3371   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3372   if (ret == 0)
3373   {
3374     /* read int1_ctrl reg */
3375     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_INT1_CTRL0, &buff[0], 4);
3376 
3377     *val = (uint32_t)buff[3];
3378     *val = (*val * 256U) + (uint32_t)buff[2];
3379     *val = (*val * 256U) + (uint32_t)buff[1];
3380     *val = (*val * 256U) + (uint32_t)buff[0];
3381   }
3382 
3383   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3384 
3385   return ret;
3386 }
3387 
3388 /**
3389   * @brief  ISPU int1_ctrl.[set]
3390   *
3391   * @param  ctx      read / write interface definitions
3392   * @param  val      ISPU int1_ctrl register value
3393   * @retval          interface status (MANDATORY: return 0 -> no Error)
3394   *
3395   */
lsm6dso16is_ispu_int1_ctrl_set(const stmdev_ctx_t * ctx,uint32_t val)3396 int32_t lsm6dso16is_ispu_int1_ctrl_set(const stmdev_ctx_t *ctx, uint32_t val)
3397 {
3398   lsm6dso16is_ispu_int1_ctrl0_t int1_ctrl0;
3399   lsm6dso16is_ispu_int1_ctrl1_t int1_ctrl1;
3400   lsm6dso16is_ispu_int1_ctrl2_t int1_ctrl2;
3401   lsm6dso16is_ispu_int1_ctrl3_t int1_ctrl3;
3402   int32_t ret;
3403 
3404   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3405   if (ret == 0)
3406   {
3407     /* write the int1_ctrl reg */
3408     int1_ctrl3.ispu_int1_ctrl = (uint8_t)((val >> 24) & 0xffU);
3409     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT1_CTRL3, (uint8_t *)&int1_ctrl3,
3410                                  1);
3411 
3412     int1_ctrl2.ispu_int1_ctrl = (uint8_t)((val >> 16) & 0xffU);
3413     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT1_CTRL2, (uint8_t *)&int1_ctrl2,
3414                                  1);
3415 
3416     int1_ctrl1.ispu_int1_ctrl = (uint8_t)((val >>  8) & 0xffU);
3417     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT1_CTRL1, (uint8_t *)&int1_ctrl1,
3418                                  1);
3419 
3420     int1_ctrl0.ispu_int1_ctrl = (uint8_t)(val & 0xffU);
3421     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT1_CTRL0, (uint8_t *)&int1_ctrl0,
3422                                  1);
3423   }
3424 
3425   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3426 
3427   return ret;
3428 }
3429 
3430 /**
3431   * @brief  ISPU int2_ctrl.[get]
3432   *
3433   * @param  ctx      read / write interface definitions
3434   * @param  val      ISPU int2_ctrl register value
3435   * @retval          interface status (MANDATORY: return 0 -> no Error)
3436   *
3437   */
lsm6dso16is_ispu_int2_ctrl_get(const stmdev_ctx_t * ctx,uint32_t * val)3438 int32_t lsm6dso16is_ispu_int2_ctrl_get(const stmdev_ctx_t *ctx, uint32_t *val)
3439 {
3440   uint8_t buff[4];
3441   int32_t ret;
3442 
3443   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3444   if (ret == 0)
3445   {
3446     /* read int2_ctrl reg */
3447     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_INT2_CTRL0, &buff[0], 4);
3448 
3449     *val = (uint32_t)buff[3];
3450     *val = (*val * 256U) + (uint32_t)buff[2];
3451     *val = (*val * 256U) + (uint32_t)buff[1];
3452     *val = (*val * 256U) + (uint32_t)buff[0];
3453   }
3454 
3455   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3456 
3457   return ret;
3458 }
3459 
3460 /**
3461   * @brief  ISPU int2_ctrl.[set]
3462   *
3463   * @param  ctx      read / write interface definitions
3464   * @param  val      ISPU int2_ctrl register value
3465   * @retval          interface status (MANDATORY: return 0 -> no Error)
3466   *
3467   */
lsm6dso16is_ispu_int2_ctrl_set(const stmdev_ctx_t * ctx,uint32_t val)3468 int32_t lsm6dso16is_ispu_int2_ctrl_set(const stmdev_ctx_t *ctx, uint32_t val)
3469 {
3470   lsm6dso16is_ispu_int2_ctrl0_t int2_ctrl0;
3471   lsm6dso16is_ispu_int2_ctrl1_t int2_ctrl1;
3472   lsm6dso16is_ispu_int2_ctrl2_t int2_ctrl2;
3473   lsm6dso16is_ispu_int2_ctrl3_t int2_ctrl3;
3474   int32_t ret;
3475 
3476   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3477   if (ret == 0)
3478   {
3479     /* write the int2_ctrl reg */
3480     int2_ctrl3.ispu_int2_ctrl = (uint8_t)((val >> 24) & 0xffU);
3481     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT2_CTRL3, (uint8_t *)&int2_ctrl3,
3482                                  1);
3483 
3484     int2_ctrl2.ispu_int2_ctrl = (uint8_t)((val >> 16) & 0xffU);
3485     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT2_CTRL2, (uint8_t *)&int2_ctrl2,
3486                                  1);
3487 
3488     int2_ctrl1.ispu_int2_ctrl = (uint8_t)((val >>  8) & 0xffU);
3489     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT2_CTRL1, (uint8_t *)&int2_ctrl1,
3490                                  1);
3491 
3492     int2_ctrl0.ispu_int2_ctrl = (uint8_t)(val & 0xffU);
3493     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_INT2_CTRL0, (uint8_t *)&int2_ctrl0,
3494                                  1);
3495   }
3496 
3497   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3498 
3499   return ret;
3500 }
3501 
3502 /**
3503   * @brief  ISPU int_status.[get]
3504   *
3505   * @param  ctx      read / write interface definitions
3506   * @param  val      ISPU int2_status register value
3507   * @retval          interface status (MANDATORY: return 0 -> no Error)
3508   *
3509   */
lsm6dso16is_ispu_int_status_get(const stmdev_ctx_t * ctx,uint32_t * val)3510 int32_t lsm6dso16is_ispu_int_status_get(const stmdev_ctx_t *ctx, uint32_t *val)
3511 {
3512   uint8_t buff[4];
3513   int32_t ret;
3514 
3515   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3516   if (ret == 0)
3517   {
3518     /* read int2_ctrl reg */
3519     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_INT_STATUS0, &buff[0], 4);
3520 
3521     *val = (uint32_t)buff[3];
3522     *val = (*val * 256U) + (uint32_t)buff[2];
3523     *val = (*val * 256U) + (uint32_t)buff[1];
3524     *val = (*val * 256U) + (uint32_t)buff[0];
3525   }
3526 
3527   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3528 
3529   return ret;
3530 }
3531 
3532 /**
3533   * @brief  ISPU algo.[get]
3534   *
3535   * @param  ctx      read / write interface definitions
3536   * @param  val      ISPU algo register value
3537   * @retval          interface status (MANDATORY: return 0 -> no Error)
3538   *
3539   */
lsm6dso16is_ispu_algo_get(const stmdev_ctx_t * ctx,uint32_t * val)3540 int32_t lsm6dso16is_ispu_algo_get(const stmdev_ctx_t *ctx, uint32_t *val)
3541 {
3542   uint8_t buff[4];
3543   int32_t ret;
3544 
3545   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3546   if (ret == 0)
3547   {
3548     /* read int2_ctrl reg */
3549     ret += lsm6dso16is_read_reg(ctx, LSM6DSO16IS_ISPU_ALGO0, &buff[0], 4);
3550 
3551     *val = (uint32_t)buff[3];
3552     *val = (*val * 256U) + (uint32_t)buff[2];
3553     *val = (*val * 256U) + (uint32_t)buff[1];
3554     *val = (*val * 256U) + (uint32_t)buff[0];
3555   }
3556 
3557   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3558 
3559   return ret;
3560 }
3561 
3562 /**
3563   * @brief  ISPU algo.[set]
3564   *
3565   * @param  ctx      read / write interface definitions
3566   * @param  val      ISPU algo register value
3567   * @retval          interface status (MANDATORY: return 0 -> no Error)
3568   *
3569   */
lsm6dso16is_ispu_algo_set(const stmdev_ctx_t * ctx,uint32_t val)3570 int32_t lsm6dso16is_ispu_algo_set(const stmdev_ctx_t *ctx, uint32_t val)
3571 {
3572   lsm6dso16is_ispu_algo0_t algo0;
3573   lsm6dso16is_ispu_algo1_t algo1;
3574   lsm6dso16is_ispu_algo2_t algo2;
3575   lsm6dso16is_ispu_algo3_t algo3;
3576   int32_t ret;
3577 
3578   ret = lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_ISPU_MEM_BANK);
3579   if (ret == 0)
3580   {
3581     /* write the algo reg */
3582     algo3.ispu_algo = (uint8_t)((val >> 24) & 0xffU);
3583     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_ALGO3, (uint8_t *)&algo3, 1);
3584 
3585     algo2.ispu_algo = (uint8_t)((val >> 16) & 0xffU);
3586     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_ALGO2, (uint8_t *)&algo2, 1);
3587 
3588     algo1.ispu_algo = (uint8_t)((val >>  8) & 0xffU);
3589     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_ALGO1, (uint8_t *)&algo1, 1);
3590 
3591     algo0.ispu_algo = (uint8_t)(val & 0xffU);
3592     ret += lsm6dso16is_write_reg(ctx, LSM6DSO16IS_ISPU_ALGO0, (uint8_t *)&algo0, 1);
3593   }
3594 
3595   ret += lsm6dso16is_mem_bank_set(ctx, LSM6DSO16IS_MAIN_MEM_BANK);
3596 
3597   return ret;
3598 }
3599 
3600 /**
3601   * @}
3602   *
3603   */
3604