1 /**
2 ******************************************************************************
3 * @file lsm6dsv16b_reg.c
4 * @author Sensors Software Solution Team
5 * @brief LSM6DSV16B driver file
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2024 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19
20 #include "lsm6dsv16b_reg.h"
21
22 /**
23 * @defgroup LSM6DSV16B
24 * @brief This file provides a set of functions needed to drive the
25 * lsm6dsv16b 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 */
lsm6dsv16b_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lsm6dsv16b_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 */
lsm6dsv16b_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lsm6dsv16b_write_reg(const stmdev_ctx_t *ctx, uint8_t reg,
76 uint8_t *data,
77 uint16_t len)
78 {
79 int32_t ret;
80
81 if (ctx == NULL)
82 {
83 return -1;
84 }
85
86 ret = ctx->write_reg(ctx->handle, reg, data, len);
87
88 return ret;
89 }
90
91 /**
92 * @}
93 *
94 */
95
96 /**
97 * @defgroup Private functions
98 * @brief Section collect all the utility functions needed by APIs.
99 * @{
100 *
101 */
102
bytecpy(uint8_t * target,uint8_t * source)103 static void bytecpy(uint8_t *target, uint8_t *source)
104 {
105 if ((target != NULL) && (source != NULL))
106 {
107 *target = *source;
108 }
109 }
110
111 /**
112 * @}
113 *
114 */
115
116 /**
117 * @defgroup Sensitivity
118 * @brief These functions convert raw-data into engineering units.
119 * @{
120 *
121 */
lsm6dsv16b_from_sflp_to_mg(int16_t lsb)122 float_t lsm6dsv16b_from_sflp_to_mg(int16_t lsb)
123 {
124 return ((float_t)lsb) * 0.061f;
125 }
126
lsm6dsv16b_from_fs2_to_mg(int16_t lsb)127 float_t lsm6dsv16b_from_fs2_to_mg(int16_t lsb)
128 {
129 return ((float_t)lsb) * 0.061f;
130 }
131
lsm6dsv16b_from_fs4_to_mg(int16_t lsb)132 float_t lsm6dsv16b_from_fs4_to_mg(int16_t lsb)
133 {
134 return ((float_t)lsb) * 0.122f;
135 }
136
lsm6dsv16b_from_fs8_to_mg(int16_t lsb)137 float_t lsm6dsv16b_from_fs8_to_mg(int16_t lsb)
138 {
139 return ((float_t)lsb) * 0.244f;
140 }
141
lsm6dsv16b_from_fs16_to_mg(int16_t lsb)142 float_t lsm6dsv16b_from_fs16_to_mg(int16_t lsb)
143 {
144 return ((float_t)lsb) * 0.488f;
145 }
146
lsm6dsv16b_from_fs125_to_mdps(int16_t lsb)147 float_t lsm6dsv16b_from_fs125_to_mdps(int16_t lsb)
148 {
149 return ((float_t)lsb) * 4.375f;
150 }
151
lsm6dsv16b_from_fs250_to_mdps(int16_t lsb)152 float_t lsm6dsv16b_from_fs250_to_mdps(int16_t lsb)
153 {
154 return ((float_t)lsb) * 8.750f;
155 }
156
lsm6dsv16b_from_fs500_to_mdps(int16_t lsb)157 float_t lsm6dsv16b_from_fs500_to_mdps(int16_t lsb)
158 {
159 return ((float_t)lsb) * 17.50f;
160 }
161
lsm6dsv16b_from_fs1000_to_mdps(int16_t lsb)162 float_t lsm6dsv16b_from_fs1000_to_mdps(int16_t lsb)
163 {
164 return ((float_t)lsb) * 35.0f;
165 }
166
lsm6dsv16b_from_fs2000_to_mdps(int16_t lsb)167 float_t lsm6dsv16b_from_fs2000_to_mdps(int16_t lsb)
168 {
169 return ((float_t)lsb) * 70.0f;
170 }
171
lsm6dsv16b_from_fs4000_to_mdps(int16_t lsb)172 float_t lsm6dsv16b_from_fs4000_to_mdps(int16_t lsb)
173 {
174 return ((float_t)lsb) * 140.0f;
175 }
176
lsm6dsv16b_from_lsb_to_celsius(int16_t lsb)177 float_t lsm6dsv16b_from_lsb_to_celsius(int16_t lsb)
178 {
179 return (((float_t)lsb / 256.0f) + 25.0f);
180 }
181
lsm6dsv16b_from_lsb_to_nsec(uint32_t lsb)182 uint64_t lsm6dsv16b_from_lsb_to_nsec(uint32_t lsb)
183 {
184 return ((uint64_t)lsb * 21750);
185 }
186
lsm6dsv16b_from_lsb_to_mv(int16_t lsb)187 float_t lsm6dsv16b_from_lsb_to_mv(int16_t lsb)
188 {
189 return ((float_t)lsb) / 78.0f;
190 }
191
192 /**
193 * @}
194 *
195 */
196
197 /**
198 * @defgroup Common
199 * @brief This section groups common useful functions.
200 *
201 */
202
203 /**
204 * @brief Reset of the device.[set]
205 *
206 * @param ctx read / write interface definitions
207 * @param val Reset of the device.
208 * @retval interface status (MANDATORY: return 0 -> no Error)
209 *
210 */
lsm6dsv16b_reset_set(const stmdev_ctx_t * ctx,lsm6dsv16b_reset_t val)211 int32_t lsm6dsv16b_reset_set(const stmdev_ctx_t *ctx, lsm6dsv16b_reset_t val)
212 {
213 lsm6dsv16b_func_cfg_access_t func_cfg_access;
214 lsm6dsv16b_ctrl3_t ctrl3;
215 int32_t ret;
216
217 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
218 if (ret == 0)
219 {
220 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
221 }
222
223 ctrl3.boot = ((uint8_t)val & 0x04U) >> 2;
224 ctrl3.sw_reset = ((uint8_t)val & 0x02U) >> 1;
225 func_cfg_access.sw_por = (uint8_t)val & 0x01U;
226
227 if (ret == 0)
228 {
229 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
230 }
231 if (ret == 0)
232 {
233 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
234 }
235
236 return ret;
237 }
238
239 /**
240 * @brief Global reset of the device.[get]
241 *
242 * @param ctx read / write interface definitions
243 * @param val Global reset of the device.
244 * @retval interface status (MANDATORY: return 0 -> no Error)
245 *
246 */
lsm6dsv16b_reset_get(const stmdev_ctx_t * ctx,lsm6dsv16b_reset_t * val)247 int32_t lsm6dsv16b_reset_get(const stmdev_ctx_t *ctx, lsm6dsv16b_reset_t *val)
248 {
249 lsm6dsv16b_func_cfg_access_t func_cfg_access;
250 lsm6dsv16b_ctrl3_t ctrl3;
251 int32_t ret;
252
253 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
254 if (ret == 0)
255 {
256 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
257 }
258
259 switch ((ctrl3.sw_reset << 2) + (ctrl3.boot << 1) + func_cfg_access.sw_por)
260 {
261 case LSM6DSV16B_READY:
262 *val = LSM6DSV16B_READY;
263 break;
264
265 case LSM6DSV16B_GLOBAL_RST:
266 *val = LSM6DSV16B_GLOBAL_RST;
267 break;
268
269 case LSM6DSV16B_RESTORE_CAL_PARAM:
270 *val = LSM6DSV16B_RESTORE_CAL_PARAM;
271 break;
272
273 case LSM6DSV16B_RESTORE_CTRL_REGS:
274 *val = LSM6DSV16B_RESTORE_CTRL_REGS;
275 break;
276
277 default:
278 *val = LSM6DSV16B_GLOBAL_RST;
279 break;
280 }
281 return ret;
282 }
283
284 /**
285 * @brief Change memory bank.[set]
286 *
287 * @param ctx read / write interface definitions
288 * @param val MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK,
289 * @retval interface status (MANDATORY: return 0 -> no Error)
290 *
291 */
lsm6dsv16b_mem_bank_set(const stmdev_ctx_t * ctx,lsm6dsv16b_mem_bank_t val)292 int32_t lsm6dsv16b_mem_bank_set(const stmdev_ctx_t *ctx, lsm6dsv16b_mem_bank_t val)
293 {
294 lsm6dsv16b_func_cfg_access_t func_cfg_access;
295 int32_t ret;
296
297 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
298 if (ret == 0)
299 {
300 func_cfg_access.emb_func_reg_access = (uint8_t)val & 0x01U;
301 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
302 }
303
304 return ret;
305 }
306
307 /**
308 * @brief Change memory bank.[get]
309 *
310 * @param ctx read / write interface definitions
311 * @param val MAIN_MEM_BANK, SENSOR_HUB_MEM_BANK, EMBED_FUNC_MEM_BANK,
312 * @retval interface status (MANDATORY: return 0 -> no Error)
313 *
314 */
lsm6dsv16b_mem_bank_get(const stmdev_ctx_t * ctx,lsm6dsv16b_mem_bank_t * val)315 int32_t lsm6dsv16b_mem_bank_get(const stmdev_ctx_t *ctx, lsm6dsv16b_mem_bank_t *val)
316 {
317 lsm6dsv16b_func_cfg_access_t func_cfg_access;
318 int32_t ret;
319
320 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
321
322 switch (func_cfg_access.emb_func_reg_access)
323 {
324 case LSM6DSV16B_MAIN_MEM_BANK:
325 *val = LSM6DSV16B_MAIN_MEM_BANK;
326 break;
327
328 case LSM6DSV16B_EMBED_FUNC_MEM_BANK:
329 *val = LSM6DSV16B_EMBED_FUNC_MEM_BANK;
330 break;
331
332 default:
333 *val = LSM6DSV16B_MAIN_MEM_BANK;
334 break;
335 }
336 return ret;
337 }
338
339 /**
340 * @brief Device ID.[get]
341 *
342 * @param ctx read / write interface definitions
343 * @param val Device ID.
344 * @retval interface status (MANDATORY: return 0 -> no Error)
345 *
346 */
lsm6dsv16b_device_id_get(const stmdev_ctx_t * ctx,uint8_t * val)347 int32_t lsm6dsv16b_device_id_get(const stmdev_ctx_t *ctx, uint8_t *val)
348 {
349 lsm6dsv16b_who_am_i_t who_am_i;
350 int32_t ret;
351
352 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WHO_AM_I, (uint8_t *)&who_am_i, 1);
353 *val = who_am_i.id;
354
355 return ret;
356 }
357
358 /**
359 * @brief Accelerometer output data rate (ODR) selection.[set]
360 *
361 * @param ctx read / write interface definitions
362 * @param val lsm6dsv16b_xl_data_rate_t enum
363 * @retval interface status (MANDATORY: return 0 -> no Error)
364 *
365 */
lsm6dsv16b_xl_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_data_rate_t val)366 int32_t lsm6dsv16b_xl_data_rate_set(const stmdev_ctx_t *ctx,
367 lsm6dsv16b_xl_data_rate_t val)
368 {
369 lsm6dsv16b_ctrl1_t ctrl1;
370 int32_t ret;
371
372 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
373 if (ret == 0)
374 {
375 ctrl1.odr_xl = (uint8_t)val & 0xFU;
376 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
377 }
378
379 return ret;
380 }
381
382 /**
383 * @brief Accelerometer output data rate (ODR) selection.[get]
384 *
385 * @param ctx read / write interface definitions
386 * @param val lsm6dsv16b_xl_data_rate_t enum
387 * @retval interface status (MANDATORY: return 0 -> no Error)
388 *
389 */
lsm6dsv16b_xl_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_data_rate_t * val)390 int32_t lsm6dsv16b_xl_data_rate_get(const stmdev_ctx_t *ctx,
391 lsm6dsv16b_xl_data_rate_t *val)
392 {
393 lsm6dsv16b_ctrl1_t ctrl1;
394 int32_t ret;
395
396 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
397
398 switch (ctrl1.odr_xl)
399 {
400 case LSM6DSV16B_XL_ODR_OFF:
401 *val = LSM6DSV16B_XL_ODR_OFF;
402 break;
403
404 case LSM6DSV16B_XL_ODR_AT_1Hz875:
405 *val = LSM6DSV16B_XL_ODR_AT_1Hz875;
406 break;
407
408 case LSM6DSV16B_XL_ODR_AT_7Hz5:
409 *val = LSM6DSV16B_XL_ODR_AT_7Hz5;
410 break;
411
412 case LSM6DSV16B_XL_ODR_AT_15Hz:
413 *val = LSM6DSV16B_XL_ODR_AT_15Hz;
414 break;
415
416 case LSM6DSV16B_XL_ODR_AT_30Hz:
417 *val = LSM6DSV16B_XL_ODR_AT_30Hz;
418 break;
419
420 case LSM6DSV16B_XL_ODR_AT_60Hz:
421 *val = LSM6DSV16B_XL_ODR_AT_60Hz;
422 break;
423
424 case LSM6DSV16B_XL_ODR_AT_120Hz:
425 *val = LSM6DSV16B_XL_ODR_AT_120Hz;
426 break;
427
428 case LSM6DSV16B_XL_ODR_AT_240Hz:
429 *val = LSM6DSV16B_XL_ODR_AT_240Hz;
430 break;
431
432 case LSM6DSV16B_XL_ODR_AT_480Hz:
433 *val = LSM6DSV16B_XL_ODR_AT_480Hz;
434 break;
435
436 case LSM6DSV16B_XL_ODR_AT_960Hz:
437 *val = LSM6DSV16B_XL_ODR_AT_960Hz;
438 break;
439
440 case LSM6DSV16B_XL_ODR_AT_1920Hz:
441 *val = LSM6DSV16B_XL_ODR_AT_1920Hz;
442 break;
443
444 case LSM6DSV16B_XL_ODR_AT_3840Hz:
445 *val = LSM6DSV16B_XL_ODR_AT_3840Hz;
446 break;
447
448 case LSM6DSV16B_XL_ODR_AT_7680Hz:
449 *val = LSM6DSV16B_XL_ODR_AT_7680Hz;
450 break;
451
452 default:
453 *val = LSM6DSV16B_XL_ODR_OFF;
454 break;
455 }
456 return ret;
457 }
458
459 /**
460 * @brief Accelerometer operating mode selection.[set]
461 *
462 * @param ctx read / write interface definitions
463 * @param val lsm6dsv16b_xl_mode_t struct
464 * @retval interface status (MANDATORY: return 0 -> no Error)
465 *
466 */
lsm6dsv16b_xl_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_mode_t val)467 int32_t lsm6dsv16b_xl_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_xl_mode_t val)
468 {
469 lsm6dsv16b_ctrl1_t ctrl1;
470 int32_t ret;
471
472 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
473
474 if (ret == 0)
475 {
476 ctrl1.op_mode_xl = (uint8_t)val & 0x07U;
477 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
478 }
479
480 return ret;
481 }
482
483 /**
484 * @brief Accelerometer operating mode selection.[get]
485 *
486 * @param ctx read / write interface definitions
487 * @param val lsm6dsv16b_xl_mode_t struct
488 * @retval interface status (MANDATORY: return 0 -> no Error)
489 *
490 */
lsm6dsv16b_xl_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_mode_t * val)491 int32_t lsm6dsv16b_xl_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_xl_mode_t *val)
492 {
493 lsm6dsv16b_ctrl1_t ctrl1;
494 int32_t ret;
495
496 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL1, (uint8_t *)&ctrl1, 1);
497
498 switch (ctrl1.op_mode_xl)
499 {
500 case LSM6DSV16B_XL_HIGH_PERFORMANCE_MD:
501 *val = LSM6DSV16B_XL_HIGH_PERFORMANCE_MD;
502 break;
503
504 case LSM6DSV16B_XL_HIGH_PERFORMANCE_TDM_MD:
505 *val = LSM6DSV16B_XL_HIGH_PERFORMANCE_TDM_MD;
506 break;
507
508 case LSM6DSV16B_XL_LOW_POWER_2_AVG_MD:
509 *val = LSM6DSV16B_XL_LOW_POWER_2_AVG_MD;
510 break;
511
512 case LSM6DSV16B_XL_LOW_POWER_4_AVG_MD:
513 *val = LSM6DSV16B_XL_LOW_POWER_4_AVG_MD;
514 break;
515
516 case LSM6DSV16B_XL_LOW_POWER_8_AVG_MD:
517 *val = LSM6DSV16B_XL_LOW_POWER_8_AVG_MD;
518 break;
519
520 default:
521 *val = LSM6DSV16B_XL_HIGH_PERFORMANCE_MD;
522 break;
523 }
524 return ret;
525 }
526
527 /**
528 * @brief Gyroscope output data rate (ODR) selection.[set]
529 *
530 * @param ctx read / write interface definitions
531 * @param val lsm6dsv16b_gy_data_rate_t enum
532 * @retval interface status (MANDATORY: return 0 -> no Error)
533 *
534 */
lsm6dsv16b_gy_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_data_rate_t val)535 int32_t lsm6dsv16b_gy_data_rate_set(const stmdev_ctx_t *ctx,
536 lsm6dsv16b_gy_data_rate_t val)
537 {
538 lsm6dsv16b_ctrl2_t ctrl2;
539 int32_t ret;
540
541 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
542
543 if (ret == 0)
544 {
545 ctrl2.odr_g = (uint8_t)val & 0xFU;
546 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
547 }
548
549 return ret;
550 }
551
552 /**
553 * @brief Gyroscope output data rate (ODR) selection.[get]
554 *
555 * @param ctx read / write interface definitions
556 * @param val lsm6dsv16b_gy_data_rate_t enum
557 * @retval interface status (MANDATORY: return 0 -> no Error)
558 *
559 */
lsm6dsv16b_gy_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_data_rate_t * val)560 int32_t lsm6dsv16b_gy_data_rate_get(const stmdev_ctx_t *ctx,
561 lsm6dsv16b_gy_data_rate_t *val)
562 {
563 lsm6dsv16b_ctrl2_t ctrl2;
564 int32_t ret;
565
566 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
567
568 switch (ctrl2.odr_g)
569 {
570 case LSM6DSV16B_GY_ODR_OFF:
571 *val = LSM6DSV16B_GY_ODR_OFF;
572 break;
573
574 case LSM6DSV16B_GY_ODR_AT_7Hz5:
575 *val = LSM6DSV16B_GY_ODR_AT_7Hz5;
576 break;
577
578 case LSM6DSV16B_GY_ODR_AT_15Hz:
579 *val = LSM6DSV16B_GY_ODR_AT_15Hz;
580 break;
581
582 case LSM6DSV16B_GY_ODR_AT_30Hz:
583 *val = LSM6DSV16B_GY_ODR_AT_30Hz;
584 break;
585
586 case LSM6DSV16B_GY_ODR_AT_60Hz:
587 *val = LSM6DSV16B_GY_ODR_AT_60Hz;
588 break;
589
590 case LSM6DSV16B_GY_ODR_AT_120Hz:
591 *val = LSM6DSV16B_GY_ODR_AT_120Hz;
592 break;
593
594 case LSM6DSV16B_GY_ODR_AT_240Hz:
595 *val = LSM6DSV16B_GY_ODR_AT_240Hz;
596 break;
597
598 case LSM6DSV16B_GY_ODR_AT_480Hz:
599 *val = LSM6DSV16B_GY_ODR_AT_480Hz;
600 break;
601
602 case LSM6DSV16B_GY_ODR_AT_960Hz:
603 *val = LSM6DSV16B_GY_ODR_AT_960Hz;
604 break;
605
606 case LSM6DSV16B_GY_ODR_AT_1920Hz:
607 *val = LSM6DSV16B_GY_ODR_AT_1920Hz;
608 break;
609
610 case LSM6DSV16B_GY_ODR_AT_3840Hz:
611 *val = LSM6DSV16B_GY_ODR_AT_3840Hz;
612 break;
613
614 case LSM6DSV16B_GY_ODR_AT_7680Hz:
615 *val = LSM6DSV16B_GY_ODR_AT_7680Hz;
616 break;
617
618 default:
619 *val = LSM6DSV16B_GY_ODR_OFF;
620 break;
621 }
622 return ret;
623 }
624
625 /**
626 * @brief Gyroscope operating mode selection.[set]
627 *
628 * @param ctx read / write interface definitions
629 * @param val GY_HIGH_PERFORMANCE_MD, GY_HIGH_ACCURANCY_ODR_MD, GY_SLEEP_MD, GY_LOW_POWER_MD,
630 * @retval interface status (MANDATORY: return 0 -> no Error)
631 *
632 */
lsm6dsv16b_gy_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_mode_t val)633 int32_t lsm6dsv16b_gy_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_gy_mode_t val)
634 {
635 lsm6dsv16b_ctrl2_t ctrl2;
636 int32_t ret;
637
638 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
639 if (ret == 0)
640 {
641 ctrl2.op_mode_g = (uint8_t)val & 0x07U;
642 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
643 }
644
645 return ret;
646 }
647
648 /**
649 * @brief Gyroscope operating mode selection.[get]
650 *
651 * @param ctx read / write interface definitions
652 * @param val GY_HIGH_PERFORMANCE_MD, GY_HIGH_ACCURANCY_ODR_MD, GY_SLEEP_MD, GY_LOW_POWER_MD,
653 * @retval interface status (MANDATORY: return 0 -> no Error)
654 *
655 */
lsm6dsv16b_gy_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_mode_t * val)656 int32_t lsm6dsv16b_gy_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_gy_mode_t *val)
657 {
658 lsm6dsv16b_ctrl2_t ctrl2;
659 int32_t ret;
660
661 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL2, (uint8_t *)&ctrl2, 1);
662 switch (ctrl2.op_mode_g)
663 {
664 case LSM6DSV16B_GY_HIGH_PERFORMANCE_MD:
665 *val = LSM6DSV16B_GY_HIGH_PERFORMANCE_MD;
666 break;
667
668 case LSM6DSV16B_GY_SLEEP_MD:
669 *val = LSM6DSV16B_GY_SLEEP_MD;
670 break;
671
672 case LSM6DSV16B_GY_LOW_POWER_MD:
673 *val = LSM6DSV16B_GY_LOW_POWER_MD;
674 break;
675
676 default:
677 *val = LSM6DSV16B_GY_HIGH_PERFORMANCE_MD;
678 break;
679 }
680 return ret;
681 }
682
683 /**
684 * @brief Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[set]
685 *
686 * @param ctx read / write interface definitions
687 * @param val Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
688 * @retval interface status (MANDATORY: return 0 -> no Error)
689 *
690 */
lsm6dsv16b_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)691 int32_t lsm6dsv16b_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
692 {
693 lsm6dsv16b_ctrl3_t ctrl3;
694 int32_t ret;
695
696 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
697 if (ret == 0)
698 {
699 ctrl3.if_inc = val;
700 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
701 }
702
703 return ret;
704 }
705
706 /**
707 * @brief Register address automatically incremented during a multiple byte access with a serial interface (enable by default).[get]
708 *
709 * @param ctx read / write interface definitions
710 * @param val Register address automatically incremented during a multiple byte access with a serial interface (enable by default).
711 * @retval interface status (MANDATORY: return 0 -> no Error)
712 *
713 */
lsm6dsv16b_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)714 int32_t lsm6dsv16b_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
715 {
716 lsm6dsv16b_ctrl3_t ctrl3;
717 int32_t ret;
718
719 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
720 *val = ctrl3.if_inc;
721
722
723 return ret;
724 }
725
726 /**
727 * @brief Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [set]
728 *
729 * @param ctx read / write interface definitions
730 * @param val Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
731 * @retval interface status (MANDATORY: return 0 -> no Error)
732 *
733 */
lsm6dsv16b_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)734 int32_t lsm6dsv16b_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
735 {
736 lsm6dsv16b_ctrl3_t ctrl3;
737 int32_t ret;
738
739 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
740
741 if (ret == 0)
742 {
743 ctrl3.bdu = val;
744 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
745 }
746
747 return ret;
748 }
749
750 /**
751 * @brief Block Data Update (BDU): output registers are not updated until LSB and MSB have been read). [get]
752 *
753 * @param ctx read / write interface definitions
754 * @param val Block Data Update (BDU): output registers are not updated until LSB and MSB have been read).
755 * @retval interface status (MANDATORY: return 0 -> no Error)
756 *
757 */
lsm6dsv16b_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)758 int32_t lsm6dsv16b_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
759 {
760 lsm6dsv16b_ctrl3_t ctrl3;
761 int32_t ret;
762
763 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL3, (uint8_t *)&ctrl3, 1);
764 *val = ctrl3.bdu;
765
766 return ret;
767 }
768
769 /**
770 * @brief Enables pulsed data-ready mode (~75 us).[set]
771 *
772 * @param ctx read / write interface definitions
773 * @param val DRDY_LATCHED, DRDY_PULSED,
774 * @retval interface status (MANDATORY: return 0 -> no Error)
775 *
776 */
lsm6dsv16b_data_ready_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_data_ready_mode_t val)777 int32_t lsm6dsv16b_data_ready_mode_set(const stmdev_ctx_t *ctx,
778 lsm6dsv16b_data_ready_mode_t val)
779 {
780 lsm6dsv16b_ctrl4_t ctrl4;
781 int32_t ret;
782
783 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
784
785 if (ret == 0)
786 {
787 ctrl4.drdy_pulsed = (uint8_t)val & 0x1U;
788 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
789 }
790
791 return ret;
792 }
793
794 /**
795 * @brief Enables pulsed data-ready mode (~75 us).[get]
796 *
797 * @param ctx read / write interface definitions
798 * @param val DRDY_LATCHED, DRDY_PULSED,
799 * @retval interface status (MANDATORY: return 0 -> no Error)
800 *
801 */
lsm6dsv16b_data_ready_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_data_ready_mode_t * val)802 int32_t lsm6dsv16b_data_ready_mode_get(const stmdev_ctx_t *ctx,
803 lsm6dsv16b_data_ready_mode_t *val)
804 {
805 lsm6dsv16b_ctrl4_t ctrl4;
806 int32_t ret;
807
808 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
809
810 switch (ctrl4.drdy_pulsed)
811 {
812 case LSM6DSV16B_DRDY_LATCHED:
813 *val = LSM6DSV16B_DRDY_LATCHED;
814 break;
815
816 case LSM6DSV16B_DRDY_PULSED:
817 *val = LSM6DSV16B_DRDY_PULSED;
818 break;
819
820 default:
821 *val = LSM6DSV16B_DRDY_LATCHED;
822 break;
823 }
824 return ret;
825 }
826
827 /**
828 * @brief Gyroscope full-scale selection[set]
829 *
830 * @param ctx read / write interface definitions
831 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
832 * @retval interface status (MANDATORY: return 0 -> no Error)
833 *
834 */
lsm6dsv16b_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_full_scale_t val)835 int32_t lsm6dsv16b_gy_full_scale_set(const stmdev_ctx_t *ctx,
836 lsm6dsv16b_gy_full_scale_t val)
837 {
838 lsm6dsv16b_ctrl6_t ctrl6;
839 int32_t ret;
840
841 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
842
843 if (ret == 0)
844 {
845 ctrl6.fs_g = (uint8_t)val & 0xFU;
846 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
847 }
848
849 return ret;
850 }
851
852 /**
853 * @brief Gyroscope full-scale selection[get]
854 *
855 * @param ctx read / write interface definitions
856 * @param val 125dps, 250dps, 500dps, 1000dps, 2000dps, 4000dps,
857 * @retval interface status (MANDATORY: return 0 -> no Error)
858 *
859 */
lsm6dsv16b_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_full_scale_t * val)860 int32_t lsm6dsv16b_gy_full_scale_get(const stmdev_ctx_t *ctx,
861 lsm6dsv16b_gy_full_scale_t *val)
862 {
863 lsm6dsv16b_ctrl6_t ctrl6;
864 int32_t ret;
865
866 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
867
868 switch (ctrl6.fs_g)
869 {
870 case LSM6DSV16B_125dps:
871 *val = LSM6DSV16B_125dps;
872 break;
873
874 case LSM6DSV16B_250dps:
875 *val = LSM6DSV16B_250dps;
876 break;
877
878 case LSM6DSV16B_500dps:
879 *val = LSM6DSV16B_500dps;
880 break;
881
882 case LSM6DSV16B_1000dps:
883 *val = LSM6DSV16B_1000dps;
884 break;
885
886 case LSM6DSV16B_2000dps:
887 *val = LSM6DSV16B_2000dps;
888 break;
889
890 case LSM6DSV16B_4000dps:
891 *val = LSM6DSV16B_4000dps;
892 break;
893
894 default:
895 *val = LSM6DSV16B_125dps;
896 break;
897 }
898 return ret;
899 }
900
901 /**
902 * @brief Accelerometer full-scale selection.[set]
903 *
904 * @param ctx read / write interface definitions
905 * @param val 2g, 4g, 8g, 16g,
906 * @retval interface status (MANDATORY: return 0 -> no Error)
907 *
908 */
lsm6dsv16b_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_full_scale_t val)909 int32_t lsm6dsv16b_xl_full_scale_set(const stmdev_ctx_t *ctx,
910 lsm6dsv16b_xl_full_scale_t val)
911 {
912 lsm6dsv16b_ctrl8_t ctrl8;
913 int32_t ret;
914
915 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
916
917 if (ret == 0)
918 {
919 ctrl8.fs_xl = (uint8_t)val & 0x3U;
920 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
921 }
922
923 return ret;
924 }
925
926 /**
927 * @brief Accelerometer full-scale selection.[get]
928 *
929 * @param ctx read / write interface definitions
930 * @param val 2g, 4g, 8g, 16g,
931 * @retval interface status (MANDATORY: return 0 -> no Error)
932 *
933 */
lsm6dsv16b_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_full_scale_t * val)934 int32_t lsm6dsv16b_xl_full_scale_get(const stmdev_ctx_t *ctx,
935 lsm6dsv16b_xl_full_scale_t *val)
936 {
937 lsm6dsv16b_ctrl8_t ctrl8;
938 int32_t ret;
939
940 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
941
942 switch (ctrl8.fs_xl)
943 {
944 case LSM6DSV16B_2g:
945 *val = LSM6DSV16B_2g;
946 break;
947
948 case LSM6DSV16B_4g:
949 *val = LSM6DSV16B_4g;
950 break;
951
952 case LSM6DSV16B_8g:
953 *val = LSM6DSV16B_8g;
954 break;
955
956 case LSM6DSV16B_16g:
957 *val = LSM6DSV16B_16g;
958 break;
959
960 default:
961 *val = LSM6DSV16B_2g;
962 break;
963 }
964 return ret;
965 }
966
967 /**
968 * @brief It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.[set]
969 *
970 * @param ctx read / write interface definitions
971 * @param val It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.
972 * @retval interface status (MANDATORY: return 0 -> no Error)
973 *
974 */
lsm6dsv16b_xl_dual_channel_set(const stmdev_ctx_t * ctx,uint8_t val)975 int32_t lsm6dsv16b_xl_dual_channel_set(const stmdev_ctx_t *ctx, uint8_t val)
976 {
977 lsm6dsv16b_ctrl8_t ctrl8;
978 int32_t ret;
979
980 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
981
982 if (ret == 0)
983 {
984 ctrl8.xl_dualc_en = val;
985 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
986 }
987
988 return ret;
989 }
990
991 /**
992 * @brief It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.[get]
993 *
994 * @param ctx read / write interface definitions
995 * @param val It enables the accelerometer Dual channel mode: data with selected full scale and data with maximum full scale are sent simultaneously to two different set of output registers.
996 * @retval interface status (MANDATORY: return 0 -> no Error)
997 *
998 */
lsm6dsv16b_xl_dual_channel_get(const stmdev_ctx_t * ctx,uint8_t * val)999 int32_t lsm6dsv16b_xl_dual_channel_get(const stmdev_ctx_t *ctx, uint8_t *val)
1000 {
1001 lsm6dsv16b_ctrl8_t ctrl8;
1002 int32_t ret;
1003
1004 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
1005 *val = ctrl8.xl_dualc_en;
1006
1007 return ret;
1008 }
1009
1010 /**
1011 * @brief Accelerometer self-test selection.[set]
1012 *
1013 * @param ctx read / write interface definitions
1014 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1015 * @retval interface status (MANDATORY: return 0 -> no Error)
1016 *
1017 */
lsm6dsv16b_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_self_test_t val)1018 int32_t lsm6dsv16b_xl_self_test_set(const stmdev_ctx_t *ctx,
1019 lsm6dsv16b_xl_self_test_t val)
1020 {
1021 lsm6dsv16b_ctrl10_t ctrl10;
1022 int32_t ret;
1023
1024 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1025
1026 if (ret == 0)
1027 {
1028 ctrl10.st_xl = (uint8_t)val & 0x3U;
1029 ctrl10.xl_st_offset = ((uint8_t)val & 0x04U) >> 2;
1030 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1031 }
1032
1033 return ret;
1034 }
1035
1036 /**
1037 * @brief Accelerometer self-test selection.[get]
1038 *
1039 * @param ctx read / write interface definitions
1040 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1041 * @retval interface status (MANDATORY: return 0 -> no Error)
1042 *
1043 */
lsm6dsv16b_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_self_test_t * val)1044 int32_t lsm6dsv16b_xl_self_test_get(const stmdev_ctx_t *ctx,
1045 lsm6dsv16b_xl_self_test_t *val)
1046 {
1047 lsm6dsv16b_ctrl10_t ctrl10;
1048 int32_t ret;
1049
1050 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1051
1052 //switch (ctrl10.xl_st_offset)
1053 switch (ctrl10.st_xl)
1054 {
1055 case LSM6DSV16B_XL_ST_DISABLE:
1056 *val = LSM6DSV16B_XL_ST_DISABLE;
1057 break;
1058
1059 case LSM6DSV16B_XL_ST_POSITIVE:
1060 *val = LSM6DSV16B_XL_ST_POSITIVE;
1061 break;
1062
1063 case LSM6DSV16B_XL_ST_NEGATIVE:
1064 *val = LSM6DSV16B_XL_ST_NEGATIVE;
1065 break;
1066
1067 default:
1068 *val = LSM6DSV16B_XL_ST_DISABLE;
1069 break;
1070 }
1071 return ret;
1072 }
1073
1074 /**
1075 * @brief Gyroscope self-test selection.[set]
1076 *
1077 * @param ctx read / write interface definitions
1078 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1079 * @retval interface status (MANDATORY: return 0 -> no Error)
1080 *
1081 */
lsm6dsv16b_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_self_test_t val)1082 int32_t lsm6dsv16b_gy_self_test_set(const stmdev_ctx_t *ctx,
1083 lsm6dsv16b_gy_self_test_t val)
1084 {
1085 lsm6dsv16b_ctrl10_t ctrl10;
1086 int32_t ret;
1087
1088 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1089
1090 if (ret == 0)
1091 {
1092 ctrl10.st_g = (uint8_t)val & 0x3U;
1093 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1094 }
1095
1096 return ret;
1097 }
1098
1099 /**
1100 * @brief Gyroscope self-test selection.[get]
1101 *
1102 * @param ctx read / write interface definitions
1103 * @param val XL_ST_DISABLE, XL_ST_POSITIVE, XL_ST_NEGATIVE,
1104 * @retval interface status (MANDATORY: return 0 -> no Error)
1105 *
1106 */
lsm6dsv16b_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsv16b_gy_self_test_t * val)1107 int32_t lsm6dsv16b_gy_self_test_get(const stmdev_ctx_t *ctx,
1108 lsm6dsv16b_gy_self_test_t *val)
1109 {
1110 lsm6dsv16b_ctrl10_t ctrl10;
1111 int32_t ret;
1112
1113 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
1114
1115 switch (ctrl10.st_g)
1116 {
1117 case LSM6DSV16B_GY_ST_DISABLE:
1118 *val = LSM6DSV16B_GY_ST_DISABLE;
1119 break;
1120
1121 case LSM6DSV16B_GY_ST_POSITIVE:
1122 *val = LSM6DSV16B_GY_ST_POSITIVE;
1123 break;
1124
1125 case LSM6DSV16B_GY_ST_NEGATIVE:
1126 *val = LSM6DSV16B_GY_ST_NEGATIVE;
1127 break;
1128
1129 default:
1130 *val = LSM6DSV16B_GY_ST_DISABLE;
1131 break;
1132 }
1133 return ret;
1134 }
1135
1136 /**
1137 * @brief Get the status of all the interrupt sources.[get]
1138 *
1139 * @param ctx read / write interface definitions
1140 * @param val Get the status of all the interrupt sources.
1141 * @retval interface status (MANDATORY: return 0 -> no Error)
1142 *
1143 */
lsm6dsv16b_all_sources_get(const stmdev_ctx_t * ctx,lsm6dsv16b_all_sources_t * val)1144 int32_t lsm6dsv16b_all_sources_get(const stmdev_ctx_t *ctx,
1145 lsm6dsv16b_all_sources_t *val)
1146 {
1147 lsm6dsv16b_emb_func_status_mainpage_t emb_func_status_mainpage;
1148 lsm6dsv16b_emb_func_exec_status_t emb_func_exec_status;
1149 lsm6dsv16b_fsm_status_mainpage_t fsm_status_mainpage;
1150 lsm6dsv16b_functions_enable_t functions_enable;
1151 lsm6dsv16b_emb_func_src_t emb_func_src;
1152 lsm6dsv16b_fifo_status2_t fifo_status2;
1153 lsm6dsv16b_all_int_src_t all_int_src;
1154 lsm6dsv16b_wake_up_src_t wake_up_src;
1155 lsm6dsv16b_status_reg_t status_reg;
1156 lsm6dsv16b_d6d_src_t d6d_src;
1157 lsm6dsv16b_tap_src_t tap_src;
1158 uint8_t buff[6];
1159 int32_t ret;
1160
1161 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1162 if (ret == 0)
1163 {
1164 functions_enable.dis_rst_lir_all_int = PROPERTY_ENABLE;
1165 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1166 }
1167
1168 if (ret == 0)
1169 {
1170 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_STATUS1, (uint8_t *)&buff, 4);
1171 }
1172 bytecpy((uint8_t *)&fifo_status2, &buff[1]);
1173 bytecpy((uint8_t *)&all_int_src, &buff[2]);
1174 bytecpy((uint8_t *)&status_reg, &buff[3]);
1175
1176 val->fifo_ovr = fifo_status2.fifo_ovr_ia;
1177 val->fifo_bdr = fifo_status2.counter_bdr_ia;
1178 val->fifo_full = fifo_status2.fifo_full_ia;
1179 val->fifo_th = fifo_status2.fifo_wtm_ia;
1180
1181 val->free_fall = all_int_src.ff_ia;
1182 val->wake_up = all_int_src.wu_ia;
1183 val->six_d = all_int_src.d6d_ia;
1184
1185 val->drdy_xl = status_reg.xlda;
1186 val->drdy_gy = status_reg.gda;
1187 val->drdy_temp = status_reg.tda;
1188 val->timestamp = status_reg.timestamp_endcount;
1189
1190 if (ret == 0)
1191 {
1192 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1193 }
1194 if (ret == 0)
1195 {
1196 functions_enable.dis_rst_lir_all_int = PROPERTY_DISABLE;
1197 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1198 }
1199
1200 if (ret == 0)
1201 {
1202 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_SRC, (uint8_t *)&buff, 6);
1203 }
1204
1205 if (ret == 0)
1206 {
1207 bytecpy((uint8_t *)&wake_up_src, &buff[0]);
1208 bytecpy((uint8_t *)&tap_src, &buff[1]);
1209 bytecpy((uint8_t *)&d6d_src, &buff[2]);
1210 bytecpy((uint8_t *)&emb_func_status_mainpage, &buff[4]);
1211 bytecpy((uint8_t *)&fsm_status_mainpage, &buff[5]);
1212
1213 val->sleep_change = wake_up_src.sleep_change_ia;
1214 val->wake_up_x = wake_up_src.x_wu;
1215 val->wake_up_y = wake_up_src.y_wu;
1216 val->wake_up_z = wake_up_src.z_wu;
1217 val->sleep_state = wake_up_src.sleep_state;
1218
1219 val->tap_x = tap_src.x_tap;
1220 val->tap_y = tap_src.y_tap;
1221 val->tap_z = tap_src.z_tap;
1222 val->tap_sign = tap_src.tap_sign;
1223 val->double_tap = tap_src.double_tap;
1224 val->single_tap = tap_src.single_tap;
1225
1226 val->six_d_zl = d6d_src.zl;
1227 val->six_d_zh = d6d_src.zh;
1228 val->six_d_yl = d6d_src.yl;
1229 val->six_d_yh = d6d_src.yh;
1230 val->six_d_xl = d6d_src.xl;
1231 val->six_d_xh = d6d_src.xh;
1232
1233 val->step_detector = emb_func_status_mainpage.is_step_det;
1234 val->tilt = emb_func_status_mainpage.is_tilt;
1235 val->sig_mot = emb_func_status_mainpage.is_sigmot;
1236 val->fsm_lc = emb_func_status_mainpage.is_fsm_lc;
1237
1238 val->fsm1 = fsm_status_mainpage.is_fsm1;
1239 val->fsm2 = fsm_status_mainpage.is_fsm2;
1240 val->fsm3 = fsm_status_mainpage.is_fsm3;
1241 val->fsm4 = fsm_status_mainpage.is_fsm4;
1242 val->fsm5 = fsm_status_mainpage.is_fsm5;
1243 val->fsm6 = fsm_status_mainpage.is_fsm6;
1244 val->fsm7 = fsm_status_mainpage.is_fsm7;
1245 val->fsm8 = fsm_status_mainpage.is_fsm8;
1246
1247 }
1248
1249
1250 if (ret == 0)
1251 {
1252 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
1253 }
1254 if (ret == 0)
1255 {
1256 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EXEC_STATUS, (uint8_t *)&emb_func_exec_status,
1257 1);
1258 }
1259 if (ret == 0)
1260 {
1261 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
1262 }
1263
1264 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
1265
1266 val->emb_func_stand_by = emb_func_exec_status.emb_func_endop;
1267 val->emb_func_time_exceed = emb_func_exec_status.emb_func_exec_ovr;
1268 val->step_count_inc = emb_func_src.stepcounter_bit_set;
1269 val->step_count_overflow = emb_func_src.step_overflow;
1270 val->step_on_delta_time = emb_func_src.step_count_delta_ia;
1271
1272 val->step_detector = emb_func_src.step_detected;
1273
1274 return ret;
1275 }
1276
lsm6dsv16b_flag_data_ready_get(const stmdev_ctx_t * ctx,lsm6dsv16b_data_ready_t * val)1277 int32_t lsm6dsv16b_flag_data_ready_get(const stmdev_ctx_t *ctx,
1278 lsm6dsv16b_data_ready_t *val)
1279 {
1280 lsm6dsv16b_status_reg_t status;
1281 int32_t ret;
1282
1283 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_STATUS_REG, (uint8_t *)&status, 1);
1284 val->drdy_xl = status.xlda;
1285 val->drdy_gy = status.gda;
1286 val->drdy_temp = status.tda;
1287
1288 return ret;
1289 }
1290
1291 /**
1292 * @brief Temperature data output register[get]
1293 *
1294 * @param ctx read / write interface definitions
1295 * @param val Temperature data output register
1296 * @retval interface status (MANDATORY: return 0 -> no Error)
1297 *
1298 */
lsm6dsv16b_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1299 int32_t lsm6dsv16b_temperature_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1300 {
1301 uint8_t buff[2];
1302 int32_t ret;
1303
1304 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_OUT_TEMP_L, &buff[0], 2);
1305 *val = (int16_t)buff[1];
1306 *val = (*val * 256) + (int16_t)buff[0];
1307
1308 return ret;
1309 }
1310
1311 /**
1312 * @brief Angular rate sensor.[get]
1313 *
1314 * @param ctx read / write interface definitions
1315 * @param val Angular rate sensor.
1316 * @retval interface status (MANDATORY: return 0 -> no Error)
1317 *
1318 */
lsm6dsv16b_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1319 int32_t lsm6dsv16b_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1320 {
1321 uint8_t buff[6];
1322 int32_t ret;
1323
1324 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_OUTX_L_G, &buff[0], 6);
1325 val[0] = (int16_t)buff[1];
1326 val[0] = (val[0] * 256) + (int16_t)buff[0];
1327 val[1] = (int16_t)buff[3];
1328 val[1] = (val[1] * 256) + (int16_t)buff[2];
1329 val[2] = (int16_t)buff[5];
1330 val[2] = (val[2] * 256) + (int16_t)buff[4];
1331
1332 return ret;
1333 }
1334
1335 /**
1336 * @brief Linear acceleration sensor.[get]
1337 *
1338 * @param ctx read / write interface definitions
1339 * @param val Linear acceleration sensor.
1340 * @retval interface status (MANDATORY: return 0 -> no Error)
1341 *
1342 */
lsm6dsv16b_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1343 int32_t lsm6dsv16b_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1344 {
1345 uint8_t buff[6];
1346 int32_t ret;
1347
1348 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_OUTZ_L_A, &buff[0], 6);
1349 val[2] = (int16_t)buff[1];
1350 val[2] = (val[2] * 256) + (int16_t)buff[0];
1351 val[1] = (int16_t)buff[3];
1352 val[1] = (val[1] * 256) + (int16_t)buff[2];
1353 val[0] = (int16_t)buff[5];
1354 val[0] = (val[0] * 256) + (int16_t)buff[4];
1355
1356 return ret;
1357 }
1358
1359 /**
1360 * @brief Linear acceleration sensor for Dual channel mode.[get]
1361 *
1362 * @param ctx read / write interface definitions
1363 * @param val Linear acceleration sensor or Dual channel mode.
1364 * @retval interface status (MANDATORY: return 0 -> no Error)
1365 *
1366 */
lsm6dsv16b_dual_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1367 int32_t lsm6dsv16b_dual_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1368 {
1369 uint8_t buff[6];
1370 int32_t ret;
1371
1372 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_UI_OUTZ_L_A_DUALC, &buff[0], 6);
1373 val[2] = (int16_t)buff[1];
1374 val[2] = (val[2] * 256) + (int16_t)buff[0];
1375 val[1] = (int16_t)buff[3];
1376 val[1] = (val[1] * 256) + (int16_t)buff[2];
1377 val[0] = (int16_t)buff[5];
1378 val[0] = (val[0] * 256) + (int16_t)buff[4];
1379
1380 return ret;
1381 }
1382
1383 /**
1384 * @brief Difference in percentage of the effective ODR (and timestamp rate) with respect to the typical. Step: 0.13%. 8-bit format, 2's complement.[get]
1385 *
1386 * @param ctx read / write interface definitions
1387 * @param val Difference in percentage of the effective ODR (and timestamp rate) with respect to the typical. Step: 0.13%. 8-bit format, 2's complement.
1388 * @retval interface status (MANDATORY: return 0 -> no Error)
1389 *
1390 */
lsm6dsv16b_odr_cal_reg_get(const stmdev_ctx_t * ctx,int8_t * val)1391 int32_t lsm6dsv16b_odr_cal_reg_get(const stmdev_ctx_t *ctx, int8_t *val)
1392 {
1393 lsm6dsv16b_internal_freq_t internal_freq;
1394 int32_t ret;
1395
1396 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INTERNAL_FREQ, (uint8_t *)&internal_freq, 1);
1397 *val = (int8_t)internal_freq.freq_fine;
1398
1399 return ret;
1400 }
1401
1402 /**
1403 * @brief Enable accelerometer axis.[set]
1404 *
1405 * @param ctx read / write interface definitions
1406 * @param val Enable accelerometer axis.
1407 * @retval interface status (MANDATORY: return 0 -> no Error)
1408 *
1409 */
lsm6dsv16b_tdm_xl_axis_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_xl_axis_t val)1410 int32_t lsm6dsv16b_tdm_xl_axis_set(const stmdev_ctx_t *ctx, lsm6dsv16b_tdm_xl_axis_t val)
1411 {
1412 lsm6dsv16b_tdm_cfg1_t tdm_cfg1;
1413 int32_t ret;
1414
1415 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
1416 if (ret == 0)
1417 {
1418 tdm_cfg1.tdm_xl_z_en = val.z;
1419 tdm_cfg1.tdm_xl_y_en = val.y;
1420 tdm_cfg1.tdm_xl_x_en = val.x;
1421 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
1422 }
1423
1424 return ret;
1425 }
1426
1427 /**
1428 * @brief Enable accelerometer axis.[get]
1429 *
1430 * @param ctx read / write interface definitions
1431 * @param val Enable accelerometer axis.
1432 * @retval interface status (MANDATORY: return 0 -> no Error)
1433 *
1434 */
lsm6dsv16b_tdm_xl_axis_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_xl_axis_t * val)1435 int32_t lsm6dsv16b_tdm_xl_axis_get(const stmdev_ctx_t *ctx, lsm6dsv16b_tdm_xl_axis_t *val)
1436 {
1437 lsm6dsv16b_tdm_cfg1_t tdm_cfg1;
1438 int32_t ret;
1439
1440 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
1441 val->x = tdm_cfg1.tdm_xl_x_en;
1442 val->y = tdm_cfg1.tdm_xl_y_en;
1443 val->z = tdm_cfg1.tdm_xl_z_en;
1444
1445 return ret;
1446 }
1447
1448 /**
1449 * @brief Write buffer in a page.[set]
1450 *
1451 * @param ctx read / write interface definitions
1452 * @param val Write buffer in a page.
1453 * @retval interface status (MANDATORY: return 0 -> no Error)
1454 *
1455 */
lsm6dsv16b_ln_pg_write(const stmdev_ctx_t * ctx,uint16_t address,uint8_t * buf,uint8_t len)1456 int32_t lsm6dsv16b_ln_pg_write(const stmdev_ctx_t *ctx, uint16_t address,
1457 uint8_t *buf, uint8_t len)
1458 {
1459 lsm6dsv16b_page_address_t page_address;
1460 lsm6dsv16b_page_sel_t page_sel;
1461 lsm6dsv16b_page_rw_t page_rw;
1462 uint8_t msb;
1463 uint8_t lsb;
1464 int32_t ret;
1465 uint8_t i ;
1466
1467 msb = ((uint8_t)(address >> 8) & 0x0FU);
1468 lsb = (uint8_t)address & 0xFFU;
1469
1470 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
1471
1472 /* set page write */
1473 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1474 page_rw.page_read = PROPERTY_DISABLE;
1475 page_rw.page_write = PROPERTY_ENABLE;
1476 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1477
1478 /* select page */
1479 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel, 1);
1480 page_sel.page_sel = msb;
1481 page_sel.not_used0 = 1; // Default value
1482 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1483 1);
1484
1485 /* set page addr */
1486 page_address.page_addr = lsb;
1487 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_ADDRESS,
1488 (uint8_t *)&page_address, 1);
1489
1490 for (i = 0; ((i < len) && (ret == 0)); i++)
1491 {
1492 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_VALUE, &buf[i], 1);
1493 lsb++;
1494
1495 /* Check if page wrap */
1496 if (((lsb & 0xFFU) == 0x00U) && (ret == 0))
1497 {
1498 msb++;
1499 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel, 1);
1500
1501 if (ret == 0)
1502 {
1503 page_sel.page_sel = msb;
1504 page_sel.not_used0 = 1; // Default value
1505 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1506 1);
1507 }
1508 }
1509 }
1510
1511 page_sel.page_sel = 0;
1512 page_sel.not_used0 = 1;// Default value
1513 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1514 1);
1515
1516 /* unset page write */
1517 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1518 page_rw.page_read = PROPERTY_DISABLE;
1519 page_rw.page_write = PROPERTY_DISABLE;
1520 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1521
1522 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
1523
1524 return ret;
1525 }
1526
1527 /**
1528 * @brief Read buffer in a page.[set]
1529 *
1530 * @param ctx read / write interface definitions
1531 * @param val Write buffer in a page.
1532 * @retval interface status (MANDATORY: return 0 -> no Error)
1533 *
1534 */
lsm6dsv16b_ln_pg_read(const stmdev_ctx_t * ctx,uint16_t address,uint8_t * buf,uint8_t len)1535 int32_t lsm6dsv16b_ln_pg_read(const stmdev_ctx_t *ctx, uint16_t address,
1536 uint8_t *buf, uint8_t len)
1537 {
1538 lsm6dsv16b_page_address_t page_address;
1539 lsm6dsv16b_page_sel_t page_sel;
1540 lsm6dsv16b_page_rw_t page_rw;
1541 uint8_t msb;
1542 uint8_t lsb;
1543 int32_t ret;
1544 uint8_t i ;
1545
1546 msb = ((uint8_t)(address >> 8) & 0x0FU);
1547 lsb = (uint8_t)address & 0xFFU;
1548
1549 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
1550
1551 /* set page write */
1552 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1553 page_rw.page_read = PROPERTY_ENABLE;
1554 page_rw.page_write = PROPERTY_DISABLE;
1555 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1556
1557 /* select page */
1558 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel, 1);
1559 page_sel.page_sel = msb;
1560 page_sel.not_used0 = 1; // Default value
1561 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1562 1);
1563
1564 /* set page addr */
1565 page_address.page_addr = lsb;
1566 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_ADDRESS,
1567 (uint8_t *)&page_address, 1);
1568
1569 for (i = 0; ((i < len) && (ret == 0)); i++)
1570 {
1571 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_VALUE, &buf[i], 1);
1572 lsb++;
1573
1574 /* Check if page wrap */
1575 if (((lsb & 0xFFU) == 0x00U) && (ret == 0))
1576 {
1577 msb++;
1578 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel, 1);
1579
1580 if (ret == 0)
1581 {
1582 page_sel.page_sel = msb;
1583 page_sel.not_used0 = 1; // Default value
1584 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1585 1);
1586 }
1587 }
1588 }
1589
1590 page_sel.page_sel = 0;
1591 page_sel.not_used0 = 1;// Default value
1592 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_SEL, (uint8_t *)&page_sel,
1593 1);
1594
1595 /* unset page write */
1596 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1597 page_rw.page_read = PROPERTY_DISABLE;
1598 page_rw.page_write = PROPERTY_DISABLE;
1599 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
1600
1601 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
1602
1603 return ret;
1604 }
1605
1606 /**
1607 * @}
1608 *
1609 */
1610
1611 /**
1612 * @defgroup Timestamp
1613 * @brief This section groups all the functions that manage the
1614 * timestamp generation.
1615 * @{
1616 *
1617 */
1618
1619 /**
1620 * @brief Enables timestamp counter.[set]
1621 *
1622 * @param ctx read / write interface definitions
1623 * @param val Enables timestamp counter.
1624 * @retval interface status (MANDATORY: return 0 -> no Error)
1625 *
1626 */
lsm6dsv16b_timestamp_set(const stmdev_ctx_t * ctx,uint8_t val)1627 int32_t lsm6dsv16b_timestamp_set(const stmdev_ctx_t *ctx, uint8_t val)
1628 {
1629 lsm6dsv16b_functions_enable_t functions_enable;
1630 int32_t ret;
1631
1632 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1633 if (ret == 0)
1634 {
1635 functions_enable.timestamp_en = val;
1636 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1637 }
1638
1639 return ret;
1640 }
1641
1642 /**
1643 * @brief Enables timestamp counter.[get]
1644 *
1645 * @param ctx read / write interface definitions
1646 * @param val Enables timestamp counter.
1647 * @retval interface status (MANDATORY: return 0 -> no Error)
1648 *
1649 */
lsm6dsv16b_timestamp_get(const stmdev_ctx_t * ctx,uint8_t * val)1650 int32_t lsm6dsv16b_timestamp_get(const stmdev_ctx_t *ctx, uint8_t *val)
1651 {
1652 lsm6dsv16b_functions_enable_t functions_enable;
1653 int32_t ret;
1654
1655 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
1656 *val = functions_enable.timestamp_en;
1657
1658 return ret;
1659 }
1660
1661 /**
1662 * @brief Timestamp data output.[get]
1663 *
1664 * @param ctx read / write interface definitions
1665 * @param val Timestamp data output.
1666 * @retval interface status (MANDATORY: return 0 -> no Error)
1667 *
1668 */
lsm6dsv16b_timestamp_raw_get(const stmdev_ctx_t * ctx,uint32_t * val)1669 int32_t lsm6dsv16b_timestamp_raw_get(const stmdev_ctx_t *ctx, uint32_t *val)
1670 {
1671 uint8_t buff[4];
1672 int32_t ret;
1673
1674 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TIMESTAMP0, &buff[0], 4);
1675 *val = buff[3];
1676 *val = (*val * 256U) + buff[2];
1677 *val = (*val * 256U) + buff[1];
1678 *val = (*val * 256U) + buff[0];
1679
1680 return ret;
1681 }
1682
1683 /**
1684 * @}
1685 *
1686 */
1687
1688 /**
1689 * @defgroup Filters
1690 * @brief This section group all the functions concerning the
1691 * filters configuration
1692 * @{
1693 *
1694 */
1695
1696 /**
1697 * @brief Protocol anti-spike filters.[set]
1698 *
1699 * @param ctx read / write interface definitions
1700 * @param val AUTO, ALWAYS_ACTIVE,
1701 * @retval interface status (MANDATORY: return 0 -> no Error)
1702 *
1703 */
lsm6dsv16b_filt_anti_spike_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_anti_spike_t val)1704 int32_t lsm6dsv16b_filt_anti_spike_set(const stmdev_ctx_t *ctx,
1705 lsm6dsv16b_filt_anti_spike_t val)
1706 {
1707 lsm6dsv16b_if_cfg_t if_cfg;
1708 int32_t ret;
1709
1710 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
1711
1712 if (ret == 0)
1713 {
1714 if_cfg.asf_ctrl = (uint8_t)val & 0x01U;
1715 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
1716 }
1717
1718 return ret;
1719 }
1720
1721 /**
1722 * @brief Protocol anti-spike filters.[get]
1723 *
1724 * @param ctx read / write interface definitions
1725 * @param val AUTO, ALWAYS_ACTIVE,
1726 * @retval interface status (MANDATORY: return 0 -> no Error)
1727 *
1728 */
lsm6dsv16b_filt_anti_spike_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_anti_spike_t * val)1729 int32_t lsm6dsv16b_filt_anti_spike_get(const stmdev_ctx_t *ctx,
1730 lsm6dsv16b_filt_anti_spike_t *val)
1731 {
1732 lsm6dsv16b_if_cfg_t if_cfg;
1733 int32_t ret;
1734
1735 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
1736 switch (if_cfg.asf_ctrl)
1737 {
1738 case LSM6DSV16B_AUTO:
1739 *val = LSM6DSV16B_AUTO;
1740 break;
1741
1742 case LSM6DSV16B_ALWAYS_ACTIVE:
1743 *val = LSM6DSV16B_ALWAYS_ACTIVE;
1744 break;
1745
1746 default:
1747 *val = LSM6DSV16B_AUTO;
1748 break;
1749 }
1750 return ret;
1751 }
1752
1753 /**
1754 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[set]
1755 *
1756 * @param ctx read / write interface definitions
1757 * @param val It masks DRDY and Interrupts RQ until filter settling ends.
1758 * @retval interface status (MANDATORY: return 0 -> no Error)
1759 *
1760 */
lsm6dsv16b_filt_settling_mask_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_settling_mask_t val)1761 int32_t lsm6dsv16b_filt_settling_mask_set(const stmdev_ctx_t *ctx,
1762 lsm6dsv16b_filt_settling_mask_t val)
1763 {
1764 lsm6dsv16b_emb_func_cfg_t emb_func_cfg;
1765 lsm6dsv16b_tdm_cfg2_t tdm_cfg2;
1766 lsm6dsv16b_ctrl4_t ctrl4;
1767 int32_t ret;
1768
1769 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
1770
1771 if (ret == 0)
1772 {
1773 ctrl4.drdy_mask = val.drdy;
1774
1775 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
1776 }
1777
1778 if (ret == 0)
1779 {
1780 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
1781 }
1782
1783 if (ret == 0)
1784 {
1785 emb_func_cfg.emb_func_irq_mask_xl_settl = val.irq_xl;
1786 emb_func_cfg.emb_func_irq_mask_g_settl = val.irq_g;
1787 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
1788 }
1789
1790 if (ret == 0)
1791 {
1792 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
1793 }
1794
1795 if (ret == 0)
1796 {
1797 tdm_cfg2.tdm_data_mask = val.tdm_excep_code;
1798 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
1799 }
1800
1801 return ret;
1802 }
1803
1804 /**
1805 * @brief It masks DRDY and Interrupts RQ until filter settling ends.[get]
1806 *
1807 * @param ctx read / write interface definitions
1808 * @param val It masks DRDY and Interrupts RQ until filter settling ends.
1809 * @retval interface status (MANDATORY: return 0 -> no Error)
1810 *
1811 */
lsm6dsv16b_filt_settling_mask_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_settling_mask_t * val)1812 int32_t lsm6dsv16b_filt_settling_mask_get(const stmdev_ctx_t *ctx,
1813 lsm6dsv16b_filt_settling_mask_t *val)
1814 {
1815 lsm6dsv16b_emb_func_cfg_t emb_func_cfg;
1816 lsm6dsv16b_tdm_cfg2_t tdm_cfg2;
1817 lsm6dsv16b_ctrl4_t ctrl4;
1818 int32_t ret;
1819
1820 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
1821 if (ret == 0)
1822 {
1823 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_CFG, (uint8_t *)&emb_func_cfg, 1);
1824 }
1825 if (ret == 0)
1826 {
1827 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
1828 }
1829
1830 val->drdy = ctrl4.drdy_mask;
1831 val->irq_xl = emb_func_cfg.emb_func_irq_mask_xl_settl;
1832 val->irq_g = emb_func_cfg.emb_func_irq_mask_g_settl;
1833 val->tdm_excep_code = tdm_cfg2.tdm_data_mask;
1834
1835 return ret;
1836 }
1837
1838 /**
1839 * @brief Gyroscope low-pass filter (LPF1) bandwidth selection.[set]
1840 *
1841 * @param ctx read / write interface definitions
1842 * @param val ULTRA_LIGHT, VERY_LIGHT, LIGHT, MEDIUM, STRONG, VERY_STRONG, AGGRESSIVE, XTREME,
1843 * @retval interface status (MANDATORY: return 0 -> no Error)
1844 *
1845 */
lsm6dsv16b_filt_gy_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_gy_lp1_bandwidth_t val)1846 int32_t lsm6dsv16b_filt_gy_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
1847 lsm6dsv16b_filt_gy_lp1_bandwidth_t val)
1848 {
1849 lsm6dsv16b_ctrl6_t ctrl6;
1850 int32_t ret;
1851
1852 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
1853 if (ret == 0)
1854 {
1855 ctrl6.lpf1_g_bw = (uint8_t)val & 0x7U;
1856 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
1857 }
1858
1859 return ret;
1860 }
1861
1862 /**
1863 * @brief Gyroscope low-pass filter (LPF1) bandwidth selection.[get]
1864 *
1865 * @param ctx read / write interface definitions
1866 * @param val ULTRA_LIGHT, VERY_LIGHT, LIGHT, MEDIUM, STRONG, VERY_STRONG, AGGRESSIVE, XTREME,
1867 * @retval interface status (MANDATORY: return 0 -> no Error)
1868 *
1869 */
lsm6dsv16b_filt_gy_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_gy_lp1_bandwidth_t * val)1870 int32_t lsm6dsv16b_filt_gy_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
1871 lsm6dsv16b_filt_gy_lp1_bandwidth_t *val)
1872 {
1873 lsm6dsv16b_ctrl6_t ctrl6;
1874 int32_t ret;
1875
1876 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL6, (uint8_t *)&ctrl6, 1);
1877
1878 switch (ctrl6.lpf1_g_bw)
1879 {
1880 case LSM6DSV16B_GY_ULTRA_LIGHT:
1881 *val = LSM6DSV16B_GY_ULTRA_LIGHT;
1882 break;
1883
1884 case LSM6DSV16B_GY_VERY_LIGHT:
1885 *val = LSM6DSV16B_GY_VERY_LIGHT;
1886 break;
1887
1888 case LSM6DSV16B_GY_LIGHT:
1889 *val = LSM6DSV16B_GY_LIGHT;
1890 break;
1891
1892 case LSM6DSV16B_GY_MEDIUM:
1893 *val = LSM6DSV16B_GY_MEDIUM;
1894 break;
1895
1896 case LSM6DSV16B_GY_STRONG:
1897 *val = LSM6DSV16B_GY_STRONG;
1898 break;
1899
1900 case LSM6DSV16B_GY_VERY_STRONG:
1901 *val = LSM6DSV16B_GY_VERY_STRONG;
1902 break;
1903
1904 case LSM6DSV16B_GY_AGGRESSIVE:
1905 *val = LSM6DSV16B_GY_AGGRESSIVE;
1906 break;
1907
1908 case LSM6DSV16B_GY_XTREME:
1909 *val = LSM6DSV16B_GY_XTREME;
1910 break;
1911
1912 default:
1913 *val = LSM6DSV16B_GY_ULTRA_LIGHT;
1914 break;
1915 }
1916 return ret;
1917 }
1918
1919 /**
1920 * @brief It enables gyroscope digital LPF1 filter.[set]
1921 *
1922 * @param ctx read / write interface definitions
1923 * @param val It enables gyroscope digital LPF1 filter.
1924 * @retval interface status (MANDATORY: return 0 -> no Error)
1925 *
1926 */
lsm6dsv16b_filt_gy_lp1_set(const stmdev_ctx_t * ctx,uint8_t val)1927 int32_t lsm6dsv16b_filt_gy_lp1_set(const stmdev_ctx_t *ctx, uint8_t val)
1928 {
1929 lsm6dsv16b_ctrl7_t ctrl7;
1930 int32_t ret;
1931
1932 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL7, (uint8_t *)&ctrl7, 1);
1933
1934 if (ret == 0)
1935 {
1936 ctrl7.lpf1_g_en = val;
1937 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL7, (uint8_t *)&ctrl7, 1);
1938 }
1939
1940 return ret;
1941 }
1942
1943 /**
1944 * @brief It enables gyroscope digital LPF1 filter.[get]
1945 *
1946 * @param ctx read / write interface definitions
1947 * @param val It enables gyroscope digital LPF1 filter.
1948 * @retval interface status (MANDATORY: return 0 -> no Error)
1949 *
1950 */
lsm6dsv16b_filt_gy_lp1_get(const stmdev_ctx_t * ctx,uint8_t * val)1951 int32_t lsm6dsv16b_filt_gy_lp1_get(const stmdev_ctx_t *ctx, uint8_t *val)
1952 {
1953 lsm6dsv16b_ctrl7_t ctrl7;
1954 int32_t ret;
1955
1956 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL7, (uint8_t *)&ctrl7, 1);
1957 *val = ctrl7.lpf1_g_en;
1958
1959 return ret;
1960 }
1961
1962 /**
1963 * @brief Accelerometer LPF2 and high pass filter configuration and cutoff setting.[set]
1964 *
1965 * @param ctx read / write interface definitions
1966 * @param val ULTRA_LIGHT, VERY_LIGHT, LIGHT, MEDIUM, STRONG, VERY_STRONG, AGGRESSIVE, XTREME,
1967 * @retval interface status (MANDATORY: return 0 -> no Error)
1968 *
1969 */
lsm6dsv16b_filt_xl_lp2_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_xl_lp2_bandwidth_t val)1970 int32_t lsm6dsv16b_filt_xl_lp2_bandwidth_set(const stmdev_ctx_t *ctx,
1971 lsm6dsv16b_filt_xl_lp2_bandwidth_t val)
1972 {
1973 lsm6dsv16b_ctrl8_t ctrl8;
1974 int32_t ret;
1975
1976 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
1977 if (ret == 0)
1978 {
1979 ctrl8.hp_lpf2_xl_bw = (uint8_t)val & 0x7U;
1980 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
1981 }
1982
1983 return ret;
1984 }
1985
1986 /**
1987 * @brief Accelerometer LPF2 and high pass filter configuration and cutoff setting.[get]
1988 *
1989 * @param ctx read / write interface definitions
1990 * @param val ULTRA_LIGHT, VERY_LIGHT, LIGHT, MEDIUM, STRONG, VERY_STRONG, AGGRESSIVE, XTREME,
1991 * @retval interface status (MANDATORY: return 0 -> no Error)
1992 *
1993 */
lsm6dsv16b_filt_xl_lp2_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_xl_lp2_bandwidth_t * val)1994 int32_t lsm6dsv16b_filt_xl_lp2_bandwidth_get(const stmdev_ctx_t *ctx,
1995 lsm6dsv16b_filt_xl_lp2_bandwidth_t *val)
1996 {
1997 lsm6dsv16b_ctrl8_t ctrl8;
1998 int32_t ret;
1999
2000 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL8, (uint8_t *)&ctrl8, 1);
2001 switch (ctrl8.hp_lpf2_xl_bw)
2002 {
2003 case LSM6DSV16B_XL_ULTRA_LIGHT:
2004 *val = LSM6DSV16B_XL_ULTRA_LIGHT;
2005 break;
2006
2007 case LSM6DSV16B_XL_VERY_LIGHT:
2008 *val = LSM6DSV16B_XL_VERY_LIGHT;
2009 break;
2010
2011 case LSM6DSV16B_XL_LIGHT:
2012 *val = LSM6DSV16B_XL_LIGHT;
2013 break;
2014
2015 case LSM6DSV16B_XL_MEDIUM:
2016 *val = LSM6DSV16B_XL_MEDIUM;
2017 break;
2018
2019 case LSM6DSV16B_XL_STRONG:
2020 *val = LSM6DSV16B_XL_STRONG;
2021 break;
2022
2023 case LSM6DSV16B_XL_VERY_STRONG:
2024 *val = LSM6DSV16B_XL_VERY_STRONG;
2025 break;
2026
2027 case LSM6DSV16B_XL_AGGRESSIVE:
2028 *val = LSM6DSV16B_XL_AGGRESSIVE;
2029 break;
2030
2031 case LSM6DSV16B_XL_XTREME:
2032 *val = LSM6DSV16B_XL_XTREME;
2033 break;
2034
2035 default:
2036 *val = LSM6DSV16B_XL_ULTRA_LIGHT;
2037 break;
2038 }
2039 return ret;
2040 }
2041
2042 /**
2043 * @brief Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.[set]
2044 *
2045 * @param ctx read / write interface definitions
2046 * @param val Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.
2047 * @retval interface status (MANDATORY: return 0 -> no Error)
2048 *
2049 */
lsm6dsv16b_filt_xl_lp2_set(const stmdev_ctx_t * ctx,uint8_t val)2050 int32_t lsm6dsv16b_filt_xl_lp2_set(const stmdev_ctx_t *ctx, uint8_t val)
2051 {
2052 lsm6dsv16b_ctrl9_t ctrl9;
2053 int32_t ret;
2054
2055 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2056 if (ret == 0)
2057 {
2058 ctrl9.lpf2_xl_en = val;
2059 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2060 }
2061
2062 return ret;
2063 }
2064
2065 /**
2066 * @brief Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.[get]
2067 *
2068 * @param ctx read / write interface definitions
2069 * @param val Enable accelerometer LPS2 (Low Pass Filter 2) filtering stage.
2070 * @retval interface status (MANDATORY: return 0 -> no Error)
2071 *
2072 */
lsm6dsv16b_filt_xl_lp2_get(const stmdev_ctx_t * ctx,uint8_t * val)2073 int32_t lsm6dsv16b_filt_xl_lp2_get(const stmdev_ctx_t *ctx, uint8_t *val)
2074 {
2075 lsm6dsv16b_ctrl9_t ctrl9;
2076 int32_t ret;
2077
2078 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2079 *val = ctrl9.lpf2_xl_en;
2080
2081 return ret;
2082 }
2083
2084 /**
2085 * @brief Accelerometer slope filter / high-pass filter selection.[set]
2086 *
2087 * @param ctx read / write interface definitions
2088 * @param val Accelerometer slope filter / high-pass filter selection.
2089 * @retval interface status (MANDATORY: return 0 -> no Error)
2090 *
2091 */
lsm6dsv16b_filt_xl_hp_set(const stmdev_ctx_t * ctx,uint8_t val)2092 int32_t lsm6dsv16b_filt_xl_hp_set(const stmdev_ctx_t *ctx, uint8_t val)
2093 {
2094 lsm6dsv16b_ctrl9_t ctrl9;
2095 int32_t ret;
2096
2097 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2098 if (ret == 0)
2099 {
2100 ctrl9.hp_slope_xl_en = val;
2101 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2102 }
2103
2104 return ret;
2105 }
2106
2107 /**
2108 * @brief Accelerometer slope filter / high-pass filter selection.[get]
2109 *
2110 * @param ctx read / write interface definitions
2111 * @param val Accelerometer slope filter / high-pass filter selection.
2112 * @retval interface status (MANDATORY: return 0 -> no Error)
2113 *
2114 */
lsm6dsv16b_filt_xl_hp_get(const stmdev_ctx_t * ctx,uint8_t * val)2115 int32_t lsm6dsv16b_filt_xl_hp_get(const stmdev_ctx_t *ctx, uint8_t *val)
2116 {
2117 lsm6dsv16b_ctrl9_t ctrl9;
2118 int32_t ret;
2119
2120 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2121 *val = ctrl9.hp_slope_xl_en;
2122
2123 return ret;
2124 }
2125
2126 /**
2127 * @brief Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.[set]
2128 *
2129 * @param ctx read / write interface definitions
2130 * @param val Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.
2131 * @retval interface status (MANDATORY: return 0 -> no Error)
2132 *
2133 */
lsm6dsv16b_filt_xl_fast_settling_set(const stmdev_ctx_t * ctx,uint8_t val)2134 int32_t lsm6dsv16b_filt_xl_fast_settling_set(const stmdev_ctx_t *ctx, uint8_t val)
2135 {
2136 lsm6dsv16b_ctrl9_t ctrl9;
2137 int32_t ret;
2138
2139 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2140 if (ret == 0)
2141 {
2142 ctrl9.xl_fastsettl_mode = val;
2143 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2144 }
2145
2146 return ret;
2147 }
2148
2149 /**
2150 * @brief Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.[get]
2151 *
2152 * @param ctx read / write interface definitions
2153 * @param val Enables accelerometer LPF2 and HPF fast-settling mode. The filter sets the first sample.
2154 * @retval interface status (MANDATORY: return 0 -> no Error)
2155 *
2156 */
lsm6dsv16b_filt_xl_fast_settling_get(const stmdev_ctx_t * ctx,uint8_t * val)2157 int32_t lsm6dsv16b_filt_xl_fast_settling_get(const stmdev_ctx_t *ctx, uint8_t *val)
2158 {
2159 lsm6dsv16b_ctrl9_t ctrl9;
2160 int32_t ret;
2161
2162 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2163 *val = ctrl9.xl_fastsettl_mode;
2164
2165 return ret;
2166 }
2167
2168 /**
2169 * @brief Accelerometer high-pass filter mode.[set]
2170 *
2171 * @param ctx read / write interface definitions
2172 * @param val HP_MD_NORMAL, HP_MD_REFERENCE,
2173 * @retval interface status (MANDATORY: return 0 -> no Error)
2174 *
2175 */
lsm6dsv16b_filt_xl_hp_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_xl_hp_mode_t val)2176 int32_t lsm6dsv16b_filt_xl_hp_mode_set(const stmdev_ctx_t *ctx,
2177 lsm6dsv16b_filt_xl_hp_mode_t val)
2178 {
2179 lsm6dsv16b_ctrl9_t ctrl9;
2180 int32_t ret;
2181
2182 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2183 if (ret == 0)
2184 {
2185 ctrl9.hp_ref_mode_xl = (uint8_t)val & 0x01U;
2186 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2187 }
2188
2189 return ret;
2190 }
2191
2192 /**
2193 * @brief Accelerometer high-pass filter mode.[get]
2194 *
2195 * @param ctx read / write interface definitions
2196 * @param val HP_MD_NORMAL, HP_MD_REFERENCE,
2197 * @retval interface status (MANDATORY: return 0 -> no Error)
2198 *
2199 */
lsm6dsv16b_filt_xl_hp_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_xl_hp_mode_t * val)2200 int32_t lsm6dsv16b_filt_xl_hp_mode_get(const stmdev_ctx_t *ctx,
2201 lsm6dsv16b_filt_xl_hp_mode_t *val)
2202 {
2203 lsm6dsv16b_ctrl9_t ctrl9;
2204 int32_t ret;
2205
2206 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
2207 switch (ctrl9.hp_ref_mode_xl)
2208 {
2209 case LSM6DSV16B_HP_MD_NORMAL:
2210 *val = LSM6DSV16B_HP_MD_NORMAL;
2211 break;
2212
2213 case LSM6DSV16B_HP_MD_REFERENCE:
2214 *val = LSM6DSV16B_HP_MD_REFERENCE;
2215 break;
2216
2217 default:
2218 *val = LSM6DSV16B_HP_MD_NORMAL;
2219 break;
2220 }
2221 return ret;
2222 }
2223
2224 /**
2225 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity functions.[set]
2226 *
2227 * @param ctx read / write interface definitions
2228 * @param val WK_FEED_SLOPE, WK_FEED_HIGH_PASS,
2229 * @retval interface status (MANDATORY: return 0 -> no Error)
2230 *
2231 */
lsm6dsv16b_filt_wkup_act_feed_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_wkup_act_feed_t val)2232 int32_t lsm6dsv16b_filt_wkup_act_feed_set(const stmdev_ctx_t *ctx,
2233 lsm6dsv16b_filt_wkup_act_feed_t val)
2234 {
2235 lsm6dsv16b_wake_up_ths_t wake_up_ths;
2236 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2237 int32_t ret;
2238
2239 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2240 if (ret == 0)
2241 {
2242 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
2243 }
2244
2245 tap_cfg0.slope_fds = (uint8_t)val & 0x01U;
2246 wake_up_ths.usr_off_on_wu = ((uint8_t)val & 0x02U) >> 1;
2247
2248 if (ret == 0)
2249 {
2250
2251 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2252 }
2253 if (ret == 0)
2254 {
2255
2256 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
2257 }
2258
2259 return ret;
2260 }
2261
2262 /**
2263 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity functions.[get]
2264 *
2265 * @param ctx read / write interface definitions
2266 * @param val WK_FEED_SLOPE, WK_FEED_HIGH_PASS,
2267 * @retval interface status (MANDATORY: return 0 -> no Error)
2268 *
2269 */
lsm6dsv16b_filt_wkup_act_feed_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_wkup_act_feed_t * val)2270 int32_t lsm6dsv16b_filt_wkup_act_feed_get(const stmdev_ctx_t *ctx,
2271 lsm6dsv16b_filt_wkup_act_feed_t *val)
2272 {
2273 lsm6dsv16b_wake_up_ths_t wake_up_ths;
2274 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2275 int32_t ret;
2276
2277 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
2278 if (ret == 0)
2279 {
2280 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2281 }
2282
2283 switch ((wake_up_ths.usr_off_on_wu << 1) + tap_cfg0.slope_fds)
2284 {
2285 case LSM6DSV16B_WK_FEED_SLOPE:
2286 *val = LSM6DSV16B_WK_FEED_SLOPE;
2287 break;
2288
2289 case LSM6DSV16B_WK_FEED_HIGH_PASS:
2290 *val = LSM6DSV16B_WK_FEED_HIGH_PASS;
2291 break;
2292
2293 case LSM6DSV16B_WK_FEED_LP_WITH_OFFSET:
2294 *val = LSM6DSV16B_WK_FEED_LP_WITH_OFFSET;
2295 break;
2296
2297 default:
2298 *val = LSM6DSV16B_WK_FEED_SLOPE;
2299 break;
2300 }
2301 return ret;
2302 }
2303
2304 /**
2305 * @brief Mask hw function triggers when xl is settling.[set]
2306 *
2307 * @param ctx read / write interface definitions
2308 * @param val 0 or 1,
2309 * @retval interface status (MANDATORY: return 0 -> no Error)
2310 *
2311 */
lsm6dsv16b_mask_trigger_xl_settl_set(const stmdev_ctx_t * ctx,uint8_t val)2312 int32_t lsm6dsv16b_mask_trigger_xl_settl_set(const stmdev_ctx_t *ctx, uint8_t val)
2313 {
2314 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2315 int32_t ret;
2316
2317 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2318
2319 if (ret == 0)
2320 {
2321 tap_cfg0.hw_func_mask_xl_settl = val & 0x01U;
2322 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2323 }
2324
2325 return ret;
2326 }
2327
2328 /**
2329 * @brief Mask hw function triggers when xl is settling.[get]
2330 *
2331 * @param ctx read / write interface definitions
2332 * @param val 0 or 1,
2333 * @retval interface status (MANDATORY: return 0 -> no Error)
2334 *
2335 */
lsm6dsv16b_mask_trigger_xl_settl_get(const stmdev_ctx_t * ctx,uint8_t * val)2336 int32_t lsm6dsv16b_mask_trigger_xl_settl_get(const stmdev_ctx_t *ctx, uint8_t *val)
2337 {
2338 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2339 int32_t ret;
2340
2341 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2342 *val = tap_cfg0.hw_func_mask_xl_settl;
2343
2344 return ret;
2345 }
2346
2347
2348 /**
2349 * @brief LPF2 filter on 6D (sixd) function selection.[set]
2350 *
2351 * @param ctx read / write interface definitions
2352 * @param val SIXD_FEED_ODR_DIV_2, SIXD_FEED_LOW_PASS,
2353 * @retval interface status (MANDATORY: return 0 -> no Error)
2354 *
2355 */
lsm6dsv16b_filt_sixd_feed_set(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_sixd_feed_t val)2356 int32_t lsm6dsv16b_filt_sixd_feed_set(const stmdev_ctx_t *ctx,
2357 lsm6dsv16b_filt_sixd_feed_t val)
2358 {
2359 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2360 int32_t ret;
2361
2362 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2363 if (ret == 0)
2364 {
2365 tap_cfg0.low_pass_on_6d = (uint8_t)val & 0x01U;
2366 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2367 }
2368
2369 return ret;
2370 }
2371
2372 /**
2373 * @brief LPF2 filter on 6D (sixd) function selection.[get]
2374 *
2375 * @param ctx read / write interface definitions
2376 * @param val SIXD_FEED_ODR_DIV_2, SIXD_FEED_LOW_PASS,
2377 * @retval interface status (MANDATORY: return 0 -> no Error)
2378 *
2379 */
lsm6dsv16b_filt_sixd_feed_get(const stmdev_ctx_t * ctx,lsm6dsv16b_filt_sixd_feed_t * val)2380 int32_t lsm6dsv16b_filt_sixd_feed_get(const stmdev_ctx_t *ctx,
2381 lsm6dsv16b_filt_sixd_feed_t *val)
2382 {
2383 lsm6dsv16b_tap_cfg0_t tap_cfg0;
2384 int32_t ret;
2385
2386 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
2387 switch (tap_cfg0.low_pass_on_6d)
2388 {
2389 case LSM6DSV16B_SIXD_FEED_ODR_DIV_2:
2390 *val = LSM6DSV16B_SIXD_FEED_ODR_DIV_2;
2391 break;
2392
2393 case LSM6DSV16B_SIXD_FEED_LOW_PASS:
2394 *val = LSM6DSV16B_SIXD_FEED_LOW_PASS;
2395 break;
2396
2397 default:
2398 *val = LSM6DSV16B_SIXD_FEED_ODR_DIV_2;
2399 break;
2400 }
2401 return ret;
2402 }
2403
2404 /**
2405 * @}
2406 *
2407 */
2408
2409 /**
2410 * @defgroup Serial interfaces
2411 * @brief This section groups all the functions concerning
2412 * serial interfaces management (not auxiliary)
2413 * @{
2414 *
2415 */
2416
2417 /**
2418 * @brief Enables pull-up on SDO pin of UI (User Interface).[set]
2419 *
2420 * @param ctx read / write interface definitions
2421 * @param val Enables pull-up on SDO pin of UI (User Interface).
2422 * @retval interface status (MANDATORY: return 0 -> no Error)
2423 *
2424 */
lsm6dsv16b_ui_sdo_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)2425 int32_t lsm6dsv16b_ui_sdo_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
2426 {
2427 lsm6dsv16b_pin_ctrl_t pin_ctrl;
2428 int32_t ret;
2429
2430 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
2431 if (ret == 0)
2432 {
2433 pin_ctrl.sdo_pu_en = val;
2434 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
2435 }
2436
2437 return ret;
2438 }
2439
2440 /**
2441 * @brief Enables pull-up on SDO pin of UI (User Interface).[get]
2442 *
2443 * @param ctx read / write interface definitions
2444 * @param val Enables pull-up on SDO pin of UI (User Interface).
2445 * @retval interface status (MANDATORY: return 0 -> no Error)
2446 *
2447 */
lsm6dsv16b_ui_sdo_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)2448 int32_t lsm6dsv16b_ui_sdo_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
2449 {
2450 lsm6dsv16b_pin_ctrl_t pin_ctrl;
2451 int32_t ret;
2452
2453 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
2454 *val = pin_ctrl.sdo_pu_en;
2455
2456 return ret;
2457 }
2458
2459 /**
2460 * @brief Disables I2C and I3C on UI (User Interface).[set]
2461 *
2462 * @param ctx read / write interface definitions
2463 * @param val I2C_I3C_ENABLE, I2C_I3C_DISABLE,
2464 * @retval interface status (MANDATORY: return 0 -> no Error)
2465 *
2466 */
lsm6dsv16b_ui_i2c_i3c_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_ui_i2c_i3c_mode_t val)2467 int32_t lsm6dsv16b_ui_i2c_i3c_mode_set(const stmdev_ctx_t *ctx,
2468 lsm6dsv16b_ui_i2c_i3c_mode_t val)
2469 {
2470 lsm6dsv16b_if_cfg_t if_cfg;
2471 int32_t ret;
2472
2473 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2474 if (ret == 0)
2475 {
2476 if_cfg.i2c_i3c_disable = (uint8_t)val & 0x01U;
2477 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2478 }
2479
2480 return ret;
2481 }
2482
2483 /**
2484 * @brief Disables I2C and I3C on UI (User Interface).[get]
2485 *
2486 * @param ctx read / write interface definitions
2487 * @param val I2C_I3C_ENABLE, I2C_I3C_DISABLE,
2488 * @retval interface status (MANDATORY: return 0 -> no Error)
2489 *
2490 */
lsm6dsv16b_ui_i2c_i3c_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_ui_i2c_i3c_mode_t * val)2491 int32_t lsm6dsv16b_ui_i2c_i3c_mode_get(const stmdev_ctx_t *ctx,
2492 lsm6dsv16b_ui_i2c_i3c_mode_t *val)
2493 {
2494 lsm6dsv16b_if_cfg_t if_cfg;
2495 int32_t ret;
2496
2497 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2498 switch (if_cfg.i2c_i3c_disable)
2499 {
2500 case LSM6DSV16B_I2C_I3C_ENABLE:
2501 *val = LSM6DSV16B_I2C_I3C_ENABLE;
2502 break;
2503
2504 case LSM6DSV16B_I2C_I3C_DISABLE:
2505 *val = LSM6DSV16B_I2C_I3C_DISABLE;
2506 break;
2507
2508 default:
2509 *val = LSM6DSV16B_I2C_I3C_ENABLE;
2510 break;
2511 }
2512 return ret;
2513 }
2514
2515 /**
2516 * @brief SPI Serial Interface Mode selection.[set]
2517 *
2518 * @param ctx read / write interface definitions
2519 * @param val SPI_4_WIRE, SPI_3_WIRE,
2520 * @retval interface status (MANDATORY: return 0 -> no Error)
2521 *
2522 */
lsm6dsv16b_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_spi_mode_t val)2523 int32_t lsm6dsv16b_spi_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_spi_mode_t val)
2524 {
2525 lsm6dsv16b_if_cfg_t if_cfg;
2526 int32_t ret;
2527
2528 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2529 if (ret == 0)
2530 {
2531 if_cfg.sim = (uint8_t)val & 0x01U;
2532 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2533 }
2534
2535 return ret;
2536 }
2537
2538 /**
2539 * @brief SPI Serial Interface Mode selection.[get]
2540 *
2541 * @param ctx read / write interface definitions
2542 * @param val SPI_4_WIRE, SPI_3_WIRE,
2543 * @retval interface status (MANDATORY: return 0 -> no Error)
2544 *
2545 */
lsm6dsv16b_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_spi_mode_t * val)2546 int32_t lsm6dsv16b_spi_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_spi_mode_t *val)
2547 {
2548 lsm6dsv16b_if_cfg_t if_cfg;
2549 int32_t ret;
2550
2551 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2552 switch (if_cfg.sim)
2553 {
2554 case LSM6DSV16B_SPI_4_WIRE:
2555 *val = LSM6DSV16B_SPI_4_WIRE;
2556 break;
2557
2558 case LSM6DSV16B_SPI_3_WIRE:
2559 *val = LSM6DSV16B_SPI_3_WIRE;
2560 break;
2561
2562 default:
2563 *val = LSM6DSV16B_SPI_4_WIRE;
2564 break;
2565 }
2566 return ret;
2567 }
2568
2569 /**
2570 * @brief Enables pull-up on SDA pin.[set]
2571 *
2572 * @param ctx read / write interface definitions
2573 * @param val Enables pull-up on SDA pin.
2574 * @retval interface status (MANDATORY: return 0 -> no Error)
2575 *
2576 */
lsm6dsv16b_ui_sda_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)2577 int32_t lsm6dsv16b_ui_sda_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
2578 {
2579 lsm6dsv16b_if_cfg_t if_cfg;
2580 int32_t ret;
2581
2582 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2583 if (ret == 0)
2584 {
2585 if_cfg.sda_pu_en = (uint8_t)val & 0x01U;
2586 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2587 }
2588
2589 return ret;
2590 }
2591
2592 /**
2593 * @brief Enables pull-up on SDA pin.[get]
2594 *
2595 * @param ctx read / write interface definitions
2596 * @param val Enables pull-up on SDA pin.
2597 * @retval interface status (MANDATORY: return 0 -> no Error)
2598 *
2599 */
lsm6dsv16b_ui_sda_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)2600 int32_t lsm6dsv16b_ui_sda_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
2601 {
2602 lsm6dsv16b_if_cfg_t if_cfg;
2603 int32_t ret;
2604
2605 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2606 *val = if_cfg.sda_pu_en;
2607
2608 return ret;
2609 }
2610
2611 /**
2612 * @brief Select the us activity time for IBI (In-Band Interrupt) with I3C[set]
2613 *
2614 * @param ctx read / write interface definitions
2615 * @param val IBI_2us, IBI_50us, IBI_1ms, IBI_25ms,
2616 * @retval interface status (MANDATORY: return 0 -> no Error)
2617 *
2618 */
lsm6dsv16b_i3c_ibi_time_set(const stmdev_ctx_t * ctx,lsm6dsv16b_i3c_ibi_time_t val)2619 int32_t lsm6dsv16b_i3c_ibi_time_set(const stmdev_ctx_t *ctx,
2620 lsm6dsv16b_i3c_ibi_time_t val)
2621 {
2622 lsm6dsv16b_ctrl5_t ctrl5;
2623 int32_t ret;
2624
2625 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
2626 if (ret == 0)
2627 {
2628 ctrl5.bus_act_sel = (uint8_t)val & 0x03U;
2629 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
2630 }
2631
2632 return ret;
2633 }
2634
2635 /**
2636 * @brief Select the us activity time for IBI (In-Band Interrupt) with I3C[get]
2637 *
2638 * @param ctx read / write interface definitions
2639 * @param val IBI_2us, IBI_50us, IBI_1ms, IBI_25ms,
2640 * @retval interface status (MANDATORY: return 0 -> no Error)
2641 *
2642 */
lsm6dsv16b_i3c_ibi_time_get(const stmdev_ctx_t * ctx,lsm6dsv16b_i3c_ibi_time_t * val)2643 int32_t lsm6dsv16b_i3c_ibi_time_get(const stmdev_ctx_t *ctx,
2644 lsm6dsv16b_i3c_ibi_time_t *val)
2645 {
2646 lsm6dsv16b_ctrl5_t ctrl5;
2647 int32_t ret;
2648
2649 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
2650 switch (ctrl5.bus_act_sel)
2651 {
2652 case LSM6DSV16B_IBI_2us:
2653 *val = LSM6DSV16B_IBI_2us;
2654 break;
2655
2656 case LSM6DSV16B_IBI_50us:
2657 *val = LSM6DSV16B_IBI_50us;
2658 break;
2659
2660 case LSM6DSV16B_IBI_1ms:
2661 *val = LSM6DSV16B_IBI_1ms;
2662 break;
2663
2664 case LSM6DSV16B_IBI_25ms:
2665 *val = LSM6DSV16B_IBI_25ms;
2666 break;
2667
2668 default:
2669 *val = LSM6DSV16B_IBI_2us;
2670 break;
2671 }
2672 return ret;
2673 }
2674
2675 /**
2676 * @}
2677 *
2678 */
2679
2680 /**
2681 * @defgroup Interrupt pins
2682 * @brief This section groups all the functions that manage interrupt pins
2683 * @{
2684 *
2685 */
2686
2687 /**
2688 * @brief Push-pull/open-drain selection on INT1 and INT2 pins.[set]
2689 *
2690 * @param ctx read / write interface definitions
2691 * @param val PUSH_PULL, OPEN_DRAIN,
2692 * @retval interface status (MANDATORY: return 0 -> no Error)
2693 *
2694 */
lsm6dsv16b_int_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_int_pin_mode_t val)2695 int32_t lsm6dsv16b_int_pin_mode_set(const stmdev_ctx_t *ctx,
2696 lsm6dsv16b_int_pin_mode_t val)
2697 {
2698 lsm6dsv16b_if_cfg_t if_cfg;
2699 int32_t ret;
2700
2701 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2702 if (ret == 0)
2703 {
2704 if_cfg.pp_od = (uint8_t)val & 0x01U;
2705 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2706 }
2707
2708 return ret;
2709 }
2710
2711 /**
2712 * @brief Push-pull/open-drain selection on INT1 and INT2 pins.[get]
2713 *
2714 * @param ctx read / write interface definitions
2715 * @param val PUSH_PULL, OPEN_DRAIN,
2716 * @retval interface status (MANDATORY: return 0 -> no Error)
2717 *
2718 */
lsm6dsv16b_int_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_int_pin_mode_t * val)2719 int32_t lsm6dsv16b_int_pin_mode_get(const stmdev_ctx_t *ctx,
2720 lsm6dsv16b_int_pin_mode_t *val)
2721 {
2722 lsm6dsv16b_if_cfg_t if_cfg;
2723 int32_t ret;
2724
2725 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2726 switch (if_cfg.pp_od)
2727 {
2728 case LSM6DSV16B_PUSH_PULL:
2729 *val = LSM6DSV16B_PUSH_PULL;
2730 break;
2731
2732 case LSM6DSV16B_OPEN_DRAIN:
2733 *val = LSM6DSV16B_OPEN_DRAIN;
2734 break;
2735
2736 default:
2737 *val = LSM6DSV16B_PUSH_PULL;
2738 break;
2739 }
2740 return ret;
2741 }
2742
2743 /**
2744 * @brief Interrupt activation level.[set]
2745 *
2746 * @param ctx read / write interface definitions
2747 * @param val ACTIVE_HIGH, ACTIVE_LOW,
2748 * @retval interface status (MANDATORY: return 0 -> no Error)
2749 *
2750 */
lsm6dsv16b_pin_polarity_set(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_polarity_t val)2751 int32_t lsm6dsv16b_pin_polarity_set(const stmdev_ctx_t *ctx,
2752 lsm6dsv16b_pin_polarity_t val)
2753 {
2754 lsm6dsv16b_if_cfg_t if_cfg;
2755 int32_t ret;
2756
2757 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2758 if (ret == 0)
2759 {
2760 if_cfg.h_lactive = (uint8_t)val & 0x01U;
2761 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2762 }
2763
2764 return ret;
2765 }
2766
2767 /**
2768 * @brief Interrupt activation level.[get]
2769 *
2770 * @param ctx read / write interface definitions
2771 * @param val ACTIVE_HIGH, ACTIVE_LOW,
2772 * @retval interface status (MANDATORY: return 0 -> no Error)
2773 *
2774 */
lsm6dsv16b_pin_polarity_get(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_polarity_t * val)2775 int32_t lsm6dsv16b_pin_polarity_get(const stmdev_ctx_t *ctx,
2776 lsm6dsv16b_pin_polarity_t *val)
2777 {
2778 lsm6dsv16b_if_cfg_t if_cfg;
2779 int32_t ret;
2780
2781 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
2782 switch (if_cfg.h_lactive)
2783 {
2784 case LSM6DSV16B_ACTIVE_HIGH:
2785 *val = LSM6DSV16B_ACTIVE_HIGH;
2786 break;
2787
2788 case LSM6DSV16B_ACTIVE_LOW:
2789 *val = LSM6DSV16B_ACTIVE_LOW;
2790 break;
2791
2792 default:
2793 *val = LSM6DSV16B_ACTIVE_HIGH;
2794 break;
2795 }
2796 return ret;
2797 }
2798
2799 /**
2800 * @brief It routes interrupt signals on INT 1 pin.[set]
2801 *
2802 * @param ctx read / write interface definitions
2803 * @param val It routes interrupt signals on INT 1 pin.
2804 * @retval interface status (MANDATORY: return 0 -> no Error)
2805 *
2806 */
lsm6dsv16b_pin_int1_route_set(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_int_route_t val)2807 int32_t lsm6dsv16b_pin_int1_route_set(const stmdev_ctx_t *ctx,
2808 lsm6dsv16b_pin_int_route_t val)
2809 {
2810 lsm6dsv16b_functions_enable_t functions_enable;
2811 lsm6dsv16b_pin_int_route_t pin_int2_route;
2812 lsm6dsv16b_inactivity_dur_t inactivity_dur;
2813 lsm6dsv16b_emb_func_int1_t emb_func_int1;
2814 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
2815 lsm6dsv16b_int2_ctrl_t int2_ctrl;
2816 lsm6dsv16b_int1_ctrl_t int1_ctrl;
2817 lsm6dsv16b_fsm_int1_t fsm_int1;
2818 lsm6dsv16b_md1_cfg_t md1_cfg;
2819 lsm6dsv16b_md2_cfg_t md2_cfg;
2820 lsm6dsv16b_ctrl4_t ctrl4;
2821 int32_t ret;
2822
2823 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
2824 if (ret == 0)
2825 {
2826 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
2827 }
2828 if (ret == 0)
2829 {
2830 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_INT1, (uint8_t *)&fsm_int1, 1);
2831 }
2832
2833 if (ret == 0)
2834 {
2835 emb_func_int1.int1_step_detector = val.step_detector;
2836 emb_func_int1.int1_tilt = val.tilt;
2837 emb_func_int1.int1_sig_mot = val.sig_mot;
2838 emb_func_int1.int1_fsm_lc = val.fsm_lc;
2839 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
2840 }
2841 if (ret == 0)
2842 {
2843 fsm_int1.int1_fsm1 = val.fsm1;
2844 fsm_int1.int1_fsm2 = val.fsm2;
2845 fsm_int1.int1_fsm3 = val.fsm3;
2846 fsm_int1.int1_fsm4 = val.fsm4;
2847 fsm_int1.int1_fsm5 = val.fsm5;
2848 fsm_int1.int1_fsm6 = val.fsm6;
2849 fsm_int1.int1_fsm7 = val.fsm7;
2850 fsm_int1.int1_fsm8 = val.fsm8;
2851 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FSM_INT1, (uint8_t *)&fsm_int1, 1);
2852 }
2853
2854 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
2855
2856 if (ret == 0)
2857 {
2858 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
2859 }
2860 if (ret == 0)
2861 {
2862 if ((val.emb_func_stand_by | val.timestamp) != PROPERTY_DISABLE)
2863 {
2864 ctrl4.int2_on_int1 = PROPERTY_ENABLE;
2865 }
2866 else
2867 {
2868 ctrl4.int2_on_int1 = PROPERTY_DISABLE;
2869 }
2870 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
2871 }
2872
2873 if (ret == 0)
2874 {
2875 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
2876 }
2877
2878 if (ret == 0)
2879 {
2880 int2_ctrl.int2_emb_func_endop = val.emb_func_stand_by;
2881 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
2882 }
2883
2884
2885 if (ret == 0)
2886 {
2887 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2888 }
2889
2890 if (ret == 0)
2891 {
2892 md2_cfg.int2_timestamp = val.timestamp;
2893 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
2894 }
2895
2896 if (ret == 0)
2897 {
2898 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
2899 }
2900
2901 if (ret == 0)
2902 {
2903 inactivity_dur.sleep_status_on_int = val.sleep_status;
2904 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
2905 }
2906
2907
2908 if (ret == 0)
2909 {
2910 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
2911 }
2912
2913 if (ret == 0)
2914 {
2915 int1_ctrl.int1_drdy_xl = val.drdy_xl;
2916 int1_ctrl.int1_drdy_g = val.drdy_gy;
2917 int1_ctrl.int1_fifo_th = val.fifo_th;
2918 int1_ctrl.int1_fifo_ovr = val.fifo_ovr;
2919 int1_ctrl.int1_fifo_full = val.fifo_full;
2920 int1_ctrl.int1_cnt_bdr = val.fifo_bdr;
2921 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
2922 }
2923
2924 if (ret == 0)
2925 {
2926 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2927 }
2928
2929 if (ret == 0)
2930 {
2931 if ((emb_func_int1.int1_fsm_lc
2932 | emb_func_int1.int1_sig_mot
2933 | emb_func_int1.int1_step_detector
2934 | emb_func_int1.int1_tilt
2935 | fsm_int1.int1_fsm1
2936 | fsm_int1.int1_fsm2
2937 | fsm_int1.int1_fsm3
2938 | fsm_int1.int1_fsm4
2939 | fsm_int1.int1_fsm5
2940 | fsm_int1.int1_fsm6
2941 | fsm_int1.int1_fsm7
2942 | fsm_int1.int1_fsm8) != PROPERTY_DISABLE)
2943 {
2944 md1_cfg.int1_emb_func = PROPERTY_ENABLE;
2945 }
2946 else
2947 {
2948 md1_cfg.int1_emb_func = PROPERTY_DISABLE;
2949 }
2950 md1_cfg.int1_6d = val.six_d;
2951 md1_cfg.int1_double_tap = val.double_tap;
2952 md1_cfg.int1_ff = val.free_fall;
2953 md1_cfg.int1_wu = val.wake_up;
2954 md1_cfg.int1_single_tap = val.single_tap;
2955 if ((val.sleep_status | val.sleep_change) != PROPERTY_DISABLE)
2956 {
2957 md1_cfg.int1_sleep_change = PROPERTY_ENABLE;
2958 }
2959 else
2960 {
2961 md1_cfg.int1_sleep_change = PROPERTY_DISABLE;
2962 }
2963 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_MD1_CFG, (uint8_t *)&md1_cfg, 1);
2964 }
2965
2966 if (ret == 0)
2967 {
2968 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
2969 }
2970
2971 if (ret == 0)
2972 {
2973 pedo_cmd_reg.carry_count_en = val.step_count_overflow;
2974 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
2975 }
2976
2977
2978 if (ret == 0)
2979 {
2980 ret = lsm6dsv16b_pin_int2_route_get(ctx, &pin_int2_route);
2981 }
2982
2983 if (ret == 0)
2984 {
2985 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
2986 }
2987 if (ret == 0)
2988 {
2989 if ((pin_int2_route.six_d
2990 | pin_int2_route.double_tap
2991 | pin_int2_route.free_fall
2992 | pin_int2_route.wake_up
2993 | pin_int2_route.single_tap
2994 | pin_int2_route.sleep_status
2995 | pin_int2_route.sleep_change
2996 | val.six_d
2997 | val.double_tap
2998 | val.free_fall
2999 | val.wake_up
3000 | val.single_tap
3001 | val.sleep_status
3002 | val.sleep_change) != PROPERTY_DISABLE)
3003 {
3004 functions_enable.interrupts_enable = PROPERTY_ENABLE;
3005 }
3006
3007 else
3008 {
3009 functions_enable.interrupts_enable = PROPERTY_DISABLE;
3010 }
3011
3012 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3013 }
3014
3015 return ret;
3016 }
3017
3018 /**
3019 * @brief It routes interrupt signals on INT 1 pin.[get]
3020 *
3021 * @param ctx read / write interface definitions
3022 * @param val It routes interrupt signals on INT 1 pin.
3023 * @retval interface status (MANDATORY: return 0 -> no Error)
3024 *
3025 */
lsm6dsv16b_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_int_route_t * val)3026 int32_t lsm6dsv16b_pin_int1_route_get(const stmdev_ctx_t *ctx,
3027 lsm6dsv16b_pin_int_route_t *val)
3028 {
3029 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3030 lsm6dsv16b_emb_func_int1_t emb_func_int1;
3031 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
3032 lsm6dsv16b_int1_ctrl_t int1_ctrl;
3033 lsm6dsv16b_int2_ctrl_t int2_ctrl;
3034 lsm6dsv16b_fsm_int1_t fsm_int1;
3035 lsm6dsv16b_md1_cfg_t md1_cfg;
3036 lsm6dsv16b_md2_cfg_t md2_cfg;
3037 lsm6dsv16b_ctrl4_t ctrl4;
3038 int32_t ret;
3039
3040
3041 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
3042 if (ctrl4.int2_on_int1 == PROPERTY_ENABLE)
3043 {
3044 if (ret == 0)
3045 {
3046 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3047 val->emb_func_stand_by = int2_ctrl.int2_emb_func_endop;
3048 }
3049 if (ret == 0)
3050 {
3051 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3052 val->timestamp = md2_cfg.int2_timestamp;
3053 }
3054 }
3055
3056 if (ret == 0)
3057 {
3058 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3059 val->sleep_status = inactivity_dur.sleep_status_on_int;
3060 }
3061
3062
3063 if (ret == 0)
3064 {
3065 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
3066 val->drdy_xl = int1_ctrl.int1_drdy_xl;
3067 val->drdy_gy = int1_ctrl.int1_drdy_g;
3068 val->fifo_th = int1_ctrl.int1_fifo_th;
3069 val->fifo_ovr = int1_ctrl.int1_fifo_ovr;
3070 val->fifo_full = int1_ctrl.int1_fifo_full;
3071 val->fifo_bdr = int1_ctrl.int1_cnt_bdr;
3072 }
3073
3074
3075 if (ret == 0)
3076 {
3077 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD1_CFG, (uint8_t *)&md1_cfg, 1);
3078 val->six_d = md1_cfg.int1_6d;
3079 val->double_tap = md1_cfg.int1_double_tap;
3080 val->free_fall = md1_cfg.int1_ff;
3081 val->wake_up = md1_cfg.int1_wu;
3082 val->single_tap = md1_cfg.int1_single_tap;
3083 val->sleep_change = md1_cfg.int1_sleep_change;
3084 }
3085
3086 if (ret == 0)
3087 {
3088 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
3089 }
3090 if (ret == 0)
3091 {
3092 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_INT1, (uint8_t *)&emb_func_int1, 1);
3093 val->step_detector = emb_func_int1.int1_step_detector;
3094 val->tilt = emb_func_int1.int1_tilt;
3095 val->sig_mot = emb_func_int1.int1_sig_mot;
3096 val->fsm_lc = emb_func_int1.int1_fsm_lc;
3097 }
3098 if (ret == 0)
3099 {
3100 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_INT1, (uint8_t *)&fsm_int1, 1);
3101 val->fsm1 = fsm_int1.int1_fsm1;
3102 val->fsm2 = fsm_int1.int1_fsm2;
3103 val->fsm3 = fsm_int1.int1_fsm3;
3104 val->fsm4 = fsm_int1.int1_fsm4;
3105 val->fsm5 = fsm_int1.int1_fsm5;
3106 val->fsm6 = fsm_int1.int1_fsm6;
3107 val->fsm7 = fsm_int1.int1_fsm7;
3108 val->fsm8 = fsm_int1.int1_fsm8;
3109 }
3110
3111 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
3112
3113 if (ret == 0)
3114 {
3115 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
3116 val->step_count_overflow = pedo_cmd_reg.carry_count_en;
3117 }
3118
3119 return ret;
3120 }
3121
3122
3123 /**
3124 * @brief It routes interrupt signals on INT 2 pin.[set]
3125 *
3126 * @param ctx read / write interface definitions
3127 * @param val It routes interrupt signals on INT 2 pin.
3128 * @retval interface status (MANDATORY: return 0 -> no Error)
3129 *
3130 */
lsm6dsv16b_pin_int2_route_set(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_int_route_t val)3131 int32_t lsm6dsv16b_pin_int2_route_set(const stmdev_ctx_t *ctx,
3132 lsm6dsv16b_pin_int_route_t val)
3133 {
3134 lsm6dsv16b_functions_enable_t functions_enable;
3135 lsm6dsv16b_pin_int_route_t pin_int1_route;
3136 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3137 lsm6dsv16b_emb_func_int2_t emb_func_int2;
3138 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
3139 lsm6dsv16b_int2_ctrl_t int2_ctrl;
3140 lsm6dsv16b_fsm_int2_t fsm_int2;
3141 lsm6dsv16b_md2_cfg_t md2_cfg;
3142 lsm6dsv16b_ctrl4_t ctrl4;
3143 int32_t ret;
3144
3145
3146 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
3147 if (ret == 0)
3148 {
3149 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
3150 }
3151 if (ret == 0)
3152 {
3153 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_INT2, (uint8_t *)&fsm_int2, 1);
3154 }
3155
3156 if (ret == 0)
3157 {
3158 emb_func_int2.int2_step_detector = val.step_detector;
3159 emb_func_int2.int2_tilt = val.tilt;
3160 emb_func_int2.int2_sig_mot = val.sig_mot;
3161 emb_func_int2.int2_fsm_lc = val.fsm_lc;
3162 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
3163 }
3164 if (ret == 0)
3165 {
3166 fsm_int2.int2_fsm1 = val.fsm1;
3167 fsm_int2.int2_fsm2 = val.fsm2;
3168 fsm_int2.int2_fsm3 = val.fsm3;
3169 fsm_int2.int2_fsm4 = val.fsm4;
3170 fsm_int2.int2_fsm5 = val.fsm5;
3171 fsm_int2.int2_fsm6 = val.fsm6;
3172 fsm_int2.int2_fsm7 = val.fsm7;
3173 fsm_int2.int2_fsm8 = val.fsm8;
3174 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FSM_INT2, (uint8_t *)&fsm_int2, 1);
3175 }
3176
3177 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
3178
3179 if (ret == 0)
3180 {
3181 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
3182 }
3183 if (ret == 0)
3184 {
3185 if ((val.emb_func_stand_by | val.timestamp) != PROPERTY_DISABLE)
3186 {
3187 ctrl4.int2_on_int1 = PROPERTY_DISABLE;
3188 }
3189 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
3190 }
3191
3192 if (ret == 0)
3193 {
3194 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3195 }
3196
3197 if (ret == 0)
3198 {
3199 inactivity_dur.sleep_status_on_int = val.sleep_status;
3200 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3201 }
3202
3203 if (ret == 0)
3204 {
3205 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3206 }
3207
3208 if (ret == 0)
3209 {
3210 int2_ctrl.int2_drdy_xl = val.drdy_xl;
3211 int2_ctrl.int2_drdy_g = val.drdy_gy;
3212 int2_ctrl.int2_fifo_th = val.fifo_th;
3213 int2_ctrl.int2_fifo_ovr = val.fifo_ovr;
3214 int2_ctrl.int2_fifo_full = val.fifo_full;
3215 int2_ctrl.int2_cnt_bdr = val.fifo_bdr;
3216 int2_ctrl.int2_emb_func_endop = val.emb_func_stand_by;
3217 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3218 }
3219
3220 if (ret == 0)
3221 {
3222 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3223 }
3224
3225 if (ret == 0)
3226 {
3227 if ((emb_func_int2.int2_fsm_lc
3228 | emb_func_int2.int2_sig_mot
3229 | emb_func_int2.int2_step_detector
3230 | emb_func_int2.int2_tilt
3231 | fsm_int2.int2_fsm1
3232 | fsm_int2.int2_fsm2
3233 | fsm_int2.int2_fsm3
3234 | fsm_int2.int2_fsm4
3235 | fsm_int2.int2_fsm5
3236 | fsm_int2.int2_fsm6
3237 | fsm_int2.int2_fsm7
3238 | fsm_int2.int2_fsm8) != PROPERTY_DISABLE)
3239 {
3240 md2_cfg.int2_emb_func = PROPERTY_ENABLE;
3241 }
3242 else
3243 {
3244 md2_cfg.int2_emb_func = PROPERTY_DISABLE;
3245 }
3246 md2_cfg.int2_6d = val.six_d;
3247 md2_cfg.int2_double_tap = val.double_tap;
3248 md2_cfg.int2_ff = val.free_fall;
3249 md2_cfg.int2_wu = val.wake_up;
3250 md2_cfg.int2_single_tap = val.single_tap;
3251 md2_cfg.int2_timestamp = val.timestamp;
3252 if ((val.sleep_status | val.sleep_change) != PROPERTY_DISABLE)
3253 {
3254 md2_cfg.int2_sleep_change = PROPERTY_ENABLE;
3255 }
3256 else
3257 {
3258 md2_cfg.int2_sleep_change = PROPERTY_DISABLE;
3259 }
3260 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3261 }
3262
3263 if (ret == 0)
3264 {
3265 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
3266 }
3267
3268 if (ret == 0)
3269 {
3270 pedo_cmd_reg.carry_count_en = val.step_count_overflow;
3271 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
3272 }
3273
3274
3275 if (ret == 0)
3276 {
3277 ret = lsm6dsv16b_pin_int1_route_get(ctx, &pin_int1_route);
3278 }
3279
3280 if (ret == 0)
3281 {
3282 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3283 }
3284 if (ret == 0)
3285 {
3286 if ((pin_int1_route.six_d
3287 | pin_int1_route.double_tap
3288 | pin_int1_route.free_fall
3289 | pin_int1_route.wake_up
3290 | pin_int1_route.single_tap
3291 | pin_int1_route.sleep_status
3292 | pin_int1_route.sleep_change
3293 | val.six_d
3294 | val.double_tap
3295 | val.free_fall
3296 | val.wake_up
3297 | val.single_tap
3298 | val.sleep_status
3299 | val.sleep_change) != PROPERTY_DISABLE)
3300 {
3301 functions_enable.interrupts_enable = PROPERTY_ENABLE;
3302 }
3303
3304 else
3305 {
3306 functions_enable.interrupts_enable = PROPERTY_DISABLE;
3307 }
3308
3309 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3310 }
3311
3312 return ret;
3313 }
3314
3315 /**
3316 * @brief It routes interrupt signals on INT 2 pin.[get]
3317 *
3318 * @param ctx read / write interface definitions
3319 * @param val It routes interrupt signals on INT 2 pin.
3320 * @retval interface status (MANDATORY: return 0 -> no Error)
3321 *
3322 */
lsm6dsv16b_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dsv16b_pin_int_route_t * val)3323 int32_t lsm6dsv16b_pin_int2_route_get(const stmdev_ctx_t *ctx,
3324 lsm6dsv16b_pin_int_route_t *val)
3325 {
3326 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3327 lsm6dsv16b_emb_func_int2_t emb_func_int2;
3328 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
3329 lsm6dsv16b_int2_ctrl_t int2_ctrl;
3330 lsm6dsv16b_fsm_int2_t fsm_int2;
3331 lsm6dsv16b_md2_cfg_t md2_cfg;
3332 lsm6dsv16b_ctrl4_t ctrl4;
3333 int32_t ret;
3334
3335
3336 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL4, (uint8_t *)&ctrl4, 1);
3337 if (ctrl4.int2_on_int1 == PROPERTY_DISABLE)
3338 {
3339 if (ret == 0)
3340 {
3341 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3342 val->emb_func_stand_by = int2_ctrl.int2_emb_func_endop;
3343 }
3344 if (ret == 0)
3345 {
3346 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3347 val->timestamp = md2_cfg.int2_timestamp;
3348 }
3349 }
3350
3351 if (ret == 0)
3352 {
3353 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3354 val->sleep_status = inactivity_dur.sleep_status_on_int;
3355 }
3356
3357
3358 if (ret == 0)
3359 {
3360 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3361 val->drdy_xl = int2_ctrl.int2_drdy_xl;
3362 val->drdy_gy = int2_ctrl.int2_drdy_g;
3363 val->fifo_th = int2_ctrl.int2_fifo_th;
3364 val->fifo_ovr = int2_ctrl.int2_fifo_ovr;
3365 val->fifo_full = int2_ctrl.int2_fifo_full;
3366 val->fifo_bdr = int2_ctrl.int2_cnt_bdr;
3367 }
3368
3369 if (ret == 0)
3370 {
3371 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3372 val->six_d = md2_cfg.int2_6d;
3373 val->double_tap = md2_cfg.int2_double_tap;
3374 val->free_fall = md2_cfg.int2_ff;
3375 val->wake_up = md2_cfg.int2_wu;
3376 val->single_tap = md2_cfg.int2_single_tap;
3377 val->sleep_change = md2_cfg.int2_sleep_change;
3378 }
3379
3380 if (ret == 0)
3381 {
3382 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
3383 }
3384 if (ret == 0)
3385 {
3386 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_INT2, (uint8_t *)&emb_func_int2, 1);
3387 val->step_detector = emb_func_int2.int2_step_detector;
3388 val->tilt = emb_func_int2.int2_tilt;
3389 val->sig_mot = emb_func_int2.int2_sig_mot;
3390 val->fsm_lc = emb_func_int2.int2_fsm_lc;
3391 }
3392 if (ret == 0)
3393 {
3394 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_INT2, (uint8_t *)&fsm_int2, 1);
3395 val->fsm1 = fsm_int2.int2_fsm1;
3396 val->fsm2 = fsm_int2.int2_fsm2;
3397 val->fsm3 = fsm_int2.int2_fsm3;
3398 val->fsm4 = fsm_int2.int2_fsm4;
3399 val->fsm5 = fsm_int2.int2_fsm5;
3400 val->fsm6 = fsm_int2.int2_fsm6;
3401 val->fsm7 = fsm_int2.int2_fsm7;
3402 val->fsm8 = fsm_int2.int2_fsm8;
3403 }
3404
3405 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
3406
3407 if (ret == 0)
3408 {
3409 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
3410 val->step_count_overflow = pedo_cmd_reg.carry_count_en;
3411 }
3412
3413 return ret;
3414 }
3415
3416 /**
3417 * @brief Enables INT pin when I3C is enabled.[set]
3418 *
3419 * @param ctx read / write interface definitions
3420 * @param val Enables INT pin when I3C is enabled.
3421 * @retval interface status (MANDATORY: return 0 -> no Error)
3422 *
3423 */
lsm6dsv16b_pin_int_en_when_i2c_set(const stmdev_ctx_t * ctx,uint8_t val)3424 int32_t lsm6dsv16b_pin_int_en_when_i2c_set(const stmdev_ctx_t *ctx, uint8_t val)
3425 {
3426 lsm6dsv16b_ctrl5_t ctrl5;
3427 int32_t ret;
3428
3429 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
3430 if (ret == 0)
3431 {
3432 ctrl5.int_en_i3c = val;
3433 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
3434 }
3435
3436 return ret;
3437 }
3438
3439 /**
3440 * @brief Enables INT pin when I3C is enabled.[get]
3441 *
3442 * @param ctx read / write interface definitions
3443 * @param val Enables INT pin when I3C is enabled.
3444 * @retval interface status (MANDATORY: return 0 -> no Error)
3445 *
3446 */
lsm6dsv16b_pin_int_en_when_i2c_get(const stmdev_ctx_t * ctx,uint8_t * val)3447 int32_t lsm6dsv16b_pin_int_en_when_i2c_get(const stmdev_ctx_t *ctx, uint8_t *val)
3448 {
3449 lsm6dsv16b_ctrl5_t ctrl5;
3450 int32_t ret;
3451
3452 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL5, (uint8_t *)&ctrl5, 1);
3453 *val = ctrl5.int_en_i3c;
3454
3455 return ret;
3456 }
3457
3458 /**
3459 * @brief Interrupt notification mode.[set]
3460 *
3461 * @param ctx read / write interface definitions
3462 * @param val ALL_INT_PULSED, BASE_LATCHED_EMB_PULSED, BASE_PULSED_EMB_LATCHED, ALL_INT_LATCHED,
3463 * @retval interface status (MANDATORY: return 0 -> no Error)
3464 *
3465 */
lsm6dsv16b_int_notification_set(const stmdev_ctx_t * ctx,lsm6dsv16b_int_notification_t val)3466 int32_t lsm6dsv16b_int_notification_set(const stmdev_ctx_t *ctx,
3467 lsm6dsv16b_int_notification_t val)
3468 {
3469 lsm6dsv16b_tap_cfg0_t tap_cfg0;
3470 lsm6dsv16b_page_rw_t page_rw;
3471 int32_t ret;
3472
3473 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
3474 if (ret == 0)
3475 {
3476 tap_cfg0.lir = (uint8_t)val & 0x01U;
3477 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
3478 }
3479
3480 if (ret == 0)
3481 {
3482 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
3483 }
3484 if (ret == 0)
3485 {
3486 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
3487 }
3488
3489 if (ret == 0)
3490 {
3491 page_rw.emb_func_lir = ((uint8_t)val & 0x02U) >> 1;
3492 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
3493 }
3494
3495 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
3496
3497 return ret;
3498 }
3499
3500 /**
3501 * @brief Interrupt notification mode.[get]
3502 *
3503 * @param ctx read / write interface definitions
3504 * @param val ALL_INT_PULSED, BASE_LATCHED_EMB_PULSED, BASE_PULSED_EMB_LATCHED, ALL_INT_LATCHED,
3505 * @retval interface status (MANDATORY: return 0 -> no Error)
3506 *
3507 */
lsm6dsv16b_int_notification_get(const stmdev_ctx_t * ctx,lsm6dsv16b_int_notification_t * val)3508 int32_t lsm6dsv16b_int_notification_get(const stmdev_ctx_t *ctx,
3509 lsm6dsv16b_int_notification_t *val)
3510 {
3511 lsm6dsv16b_tap_cfg0_t tap_cfg0;
3512 lsm6dsv16b_page_rw_t page_rw;
3513 int32_t ret;
3514
3515 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
3516 if (ret == 0)
3517 {
3518 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
3519 }
3520 if (ret == 0)
3521 {
3522 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PAGE_RW, (uint8_t *)&page_rw, 1);
3523 }
3524
3525 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
3526
3527 switch ((page_rw.emb_func_lir << 1) + tap_cfg0.lir)
3528 {
3529 case LSM6DSV16B_ALL_INT_PULSED:
3530 *val = LSM6DSV16B_ALL_INT_PULSED;
3531 break;
3532
3533 case LSM6DSV16B_BASE_LATCHED_EMB_PULSED:
3534 *val = LSM6DSV16B_BASE_LATCHED_EMB_PULSED;
3535 break;
3536
3537 case LSM6DSV16B_BASE_PULSED_EMB_LATCHED:
3538 *val = LSM6DSV16B_BASE_PULSED_EMB_LATCHED;
3539 break;
3540
3541 case LSM6DSV16B_ALL_INT_LATCHED:
3542 *val = LSM6DSV16B_ALL_INT_LATCHED;
3543 break;
3544
3545 default:
3546 *val = LSM6DSV16B_ALL_INT_PULSED;
3547 break;
3548 }
3549 return ret;
3550 }
3551
3552 /**
3553 * @}
3554 *
3555 */
3556
3557 /**
3558 * @defgroup Wake Up event and Activity / Inactivity detection
3559 * @brief This section groups all the functions that manage the Wake Up
3560 * event generation.
3561 * @{
3562 *
3563 */
3564
3565 /**
3566 * @brief Enable activity/inactivity (sleep) function.[set]
3567 *
3568 * @param ctx read / write interface definitions
3569 * @param val XL_AND_GY_NOT_AFFECTED, XL_LOW_POWER_GY_NOT_AFFECTED, XL_LOW_POWER_GY_SLEEP, XL_LOW_POWER_GY_POWER_DOWN,
3570 * @retval interface status (MANDATORY: return 0 -> no Error)
3571 *
3572 */
lsm6dsv16b_act_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_act_mode_t val)3573 int32_t lsm6dsv16b_act_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_act_mode_t val)
3574 {
3575 lsm6dsv16b_functions_enable_t functions_enable;
3576 int32_t ret;
3577
3578 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3579 if (ret == 0)
3580 {
3581 functions_enable.inact_en = (uint8_t)val & 0x03U;
3582 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3583 }
3584
3585 return ret;
3586 }
3587
3588 /**
3589 * @brief Enable activity/inactivity (sleep) function.[get]
3590 *
3591 * @param ctx read / write interface definitions
3592 * @param val XL_AND_GY_NOT_AFFECTED, XL_LOW_POWER_GY_NOT_AFFECTED, XL_LOW_POWER_GY_SLEEP, XL_LOW_POWER_GY_POWER_DOWN,
3593 * @retval interface status (MANDATORY: return 0 -> no Error)
3594 *
3595 */
lsm6dsv16b_act_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_act_mode_t * val)3596 int32_t lsm6dsv16b_act_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_act_mode_t *val)
3597 {
3598 lsm6dsv16b_functions_enable_t functions_enable;
3599 int32_t ret;
3600
3601 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
3602 switch (functions_enable.inact_en)
3603 {
3604 case LSM6DSV16B_XL_AND_GY_NOT_AFFECTED:
3605 *val = LSM6DSV16B_XL_AND_GY_NOT_AFFECTED;
3606 break;
3607
3608 case LSM6DSV16B_XL_LOW_POWER_GY_NOT_AFFECTED:
3609 *val = LSM6DSV16B_XL_LOW_POWER_GY_NOT_AFFECTED;
3610 break;
3611
3612 case LSM6DSV16B_XL_LOW_POWER_GY_SLEEP:
3613 *val = LSM6DSV16B_XL_LOW_POWER_GY_SLEEP;
3614 break;
3615
3616 case LSM6DSV16B_XL_LOW_POWER_GY_POWER_DOWN:
3617 *val = LSM6DSV16B_XL_LOW_POWER_GY_POWER_DOWN;
3618 break;
3619
3620 default:
3621 *val = LSM6DSV16B_XL_AND_GY_NOT_AFFECTED;
3622 break;
3623 }
3624 return ret;
3625 }
3626
3627 /**
3628 * @brief Duration in the transition from Stationary to Motion (from Inactivity to Activity).[set]
3629 *
3630 * @param ctx read / write interface definitions
3631 * @param val SLEEP_TO_ACT_AT_1ST_SAMPLE, SLEEP_TO_ACT_AT_2ND_SAMPLE, SLEEP_TO_ACT_AT_3RD_SAMPLE, SLEEP_TO_ACT_AT_4th_SAMPLE,
3632 * @retval interface status (MANDATORY: return 0 -> no Error)
3633 *
3634 */
lsm6dsv16b_act_from_sleep_to_act_dur_set(const stmdev_ctx_t * ctx,lsm6dsv16b_act_from_sleep_to_act_dur_t val)3635 int32_t lsm6dsv16b_act_from_sleep_to_act_dur_set(const stmdev_ctx_t *ctx,
3636 lsm6dsv16b_act_from_sleep_to_act_dur_t val)
3637 {
3638 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3639 int32_t ret;
3640
3641 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3642 if (ret == 0)
3643 {
3644 inactivity_dur.inact_dur = (uint8_t)val & 0x3U;
3645 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3646 }
3647
3648 return ret;
3649 }
3650
3651 /**
3652 * @brief Duration in the transition from Stationary to Motion (from Inactivity to Activity).[get]
3653 *
3654 * @param ctx read / write interface definitions
3655 * @param val SLEEP_TO_ACT_AT_1ST_SAMPLE, SLEEP_TO_ACT_AT_2ND_SAMPLE, SLEEP_TO_ACT_AT_3RD_SAMPLE, SLEEP_TO_ACT_AT_4th_SAMPLE,
3656 * @retval interface status (MANDATORY: return 0 -> no Error)
3657 *
3658 */
lsm6dsv16b_act_from_sleep_to_act_dur_get(const stmdev_ctx_t * ctx,lsm6dsv16b_act_from_sleep_to_act_dur_t * val)3659 int32_t lsm6dsv16b_act_from_sleep_to_act_dur_get(const stmdev_ctx_t *ctx,
3660 lsm6dsv16b_act_from_sleep_to_act_dur_t *val)
3661 {
3662 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3663 int32_t ret;
3664
3665 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3666 switch (inactivity_dur.inact_dur)
3667 {
3668 case LSM6DSV16B_SLEEP_TO_ACT_AT_1ST_SAMPLE:
3669 *val = LSM6DSV16B_SLEEP_TO_ACT_AT_1ST_SAMPLE;
3670 break;
3671
3672 case LSM6DSV16B_SLEEP_TO_ACT_AT_2ND_SAMPLE:
3673 *val = LSM6DSV16B_SLEEP_TO_ACT_AT_2ND_SAMPLE;
3674 break;
3675
3676 case LSM6DSV16B_SLEEP_TO_ACT_AT_3RD_SAMPLE:
3677 *val = LSM6DSV16B_SLEEP_TO_ACT_AT_3RD_SAMPLE;
3678 break;
3679
3680 case LSM6DSV16B_SLEEP_TO_ACT_AT_4th_SAMPLE:
3681 *val = LSM6DSV16B_SLEEP_TO_ACT_AT_4th_SAMPLE;
3682 break;
3683
3684 default:
3685 *val = LSM6DSV16B_SLEEP_TO_ACT_AT_1ST_SAMPLE;
3686 break;
3687 }
3688 return ret;
3689 }
3690
3691 /**
3692 * @brief Selects the accelerometer data rate during Inactivity.[set]
3693 *
3694 * @param ctx read / write interface definitions
3695 * @param val 1Hz875, 15Hz, 30Hz, 60Hz,
3696 * @retval interface status (MANDATORY: return 0 -> no Error)
3697 *
3698 */
lsm6dsv16b_act_sleep_xl_odr_set(const stmdev_ctx_t * ctx,lsm6dsv16b_act_sleep_xl_odr_t val)3699 int32_t lsm6dsv16b_act_sleep_xl_odr_set(const stmdev_ctx_t *ctx,
3700 lsm6dsv16b_act_sleep_xl_odr_t val)
3701 {
3702 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3703 int32_t ret;
3704
3705 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3706 if (ret == 0)
3707 {
3708 inactivity_dur.xl_inact_odr = (uint8_t)val & 0x03U;
3709 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3710 }
3711
3712 return ret;
3713 }
3714
3715 /**
3716 * @brief Selects the accelerometer data rate during Inactivity.[get]
3717 *
3718 * @param ctx read / write interface definitions
3719 * @param val 1Hz875, 15Hz, 30Hz, 60Hz,
3720 * @retval interface status (MANDATORY: return 0 -> no Error)
3721 *
3722 */
lsm6dsv16b_act_sleep_xl_odr_get(const stmdev_ctx_t * ctx,lsm6dsv16b_act_sleep_xl_odr_t * val)3723 int32_t lsm6dsv16b_act_sleep_xl_odr_get(const stmdev_ctx_t *ctx,
3724 lsm6dsv16b_act_sleep_xl_odr_t *val)
3725 {
3726 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3727 int32_t ret;
3728
3729 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3730 switch (inactivity_dur.xl_inact_odr)
3731 {
3732 case LSM6DSV16B_1Hz875:
3733 *val = LSM6DSV16B_1Hz875;
3734 break;
3735
3736 case LSM6DSV16B_15Hz:
3737 *val = LSM6DSV16B_15Hz;
3738 break;
3739
3740 case LSM6DSV16B_30Hz:
3741 *val = LSM6DSV16B_30Hz;
3742 break;
3743
3744 case LSM6DSV16B_60Hz:
3745 *val = LSM6DSV16B_60Hz;
3746 break;
3747
3748 default:
3749 *val = LSM6DSV16B_1Hz875;
3750 break;
3751 }
3752 return ret;
3753 }
3754
3755 /**
3756 * @brief Wakeup and activity/inactivity threshold.[set]
3757 *
3758 * @param ctx read / write interface definitions
3759 * @param val Wakeup and activity/inactivity threshold.
3760 * @retval interface status (MANDATORY: return 0 -> no Error)
3761 *
3762 */
lsm6dsv16b_act_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16b_act_thresholds_t val)3763 int32_t lsm6dsv16b_act_thresholds_set(const stmdev_ctx_t *ctx,
3764 lsm6dsv16b_act_thresholds_t val)
3765 {
3766 lsm6dsv16b_inactivity_ths_t inactivity_ths;
3767 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3768 lsm6dsv16b_wake_up_ths_t wake_up_ths;
3769 int32_t ret;
3770 float_t tmp;
3771
3772 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3773 if (ret == 0)
3774 {
3775 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
3776 }
3777
3778 if (ret == 0)
3779 {
3780 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
3781 }
3782
3783 if ((val.wk_ths_mg < (uint32_t)(7.8125f * 63.0f))
3784 && (val.inact_ths_mg < (uint32_t)(7.8125f * 63.0f)))
3785 {
3786 inactivity_dur.wu_inact_ths_w = 0;
3787
3788 tmp = (float_t)val.inact_ths_mg / 7.8125f;
3789 inactivity_ths.inact_ths = (uint8_t)tmp;
3790
3791 tmp = (float_t)val.wk_ths_mg / 7.8125f;
3792 wake_up_ths.wk_ths = (uint8_t)tmp;
3793 }
3794 else if ((val.wk_ths_mg < (uint32_t)(15.625f * 63.0f))
3795 && (val.inact_ths_mg < (uint32_t)(15.625f * 63.0f)))
3796 {
3797 inactivity_dur.wu_inact_ths_w = 1;
3798
3799 tmp = (float_t)val.inact_ths_mg / 15.625f;
3800 inactivity_ths.inact_ths = (uint8_t)tmp;
3801
3802 tmp = (float_t)val.wk_ths_mg / 15.625f;
3803 wake_up_ths.wk_ths = (uint8_t)tmp;
3804 }
3805 else if ((val.wk_ths_mg < (uint32_t)(31.25f * 63.0f))
3806 && (val.inact_ths_mg < (uint32_t)(31.25f * 63.0f)))
3807 {
3808 inactivity_dur.wu_inact_ths_w = 2;
3809
3810 tmp = (float_t)val.inact_ths_mg / 31.25f;
3811 inactivity_ths.inact_ths = (uint8_t)tmp;
3812
3813 tmp = (float_t)val.wk_ths_mg / 31.25f;
3814 wake_up_ths.wk_ths = (uint8_t)tmp;
3815 }
3816 else if ((val.wk_ths_mg < (uint32_t)(62.5f * 63.0f))
3817 && (val.inact_ths_mg < (uint32_t)(62.5f * 63.0f)))
3818 {
3819 inactivity_dur.wu_inact_ths_w = 3;
3820
3821 tmp = (float_t)val.inact_ths_mg / 62.5f;
3822 inactivity_ths.inact_ths = (uint8_t)tmp;
3823
3824 tmp = (float_t)val.wk_ths_mg / 62.5f;
3825 wake_up_ths.wk_ths = (uint8_t)tmp;
3826 }
3827 else if ((val.wk_ths_mg < (uint32_t)(125.0f * 63.0f))
3828 && (val.inact_ths_mg < (uint32_t)(125.0f * 63.0f)))
3829 {
3830 inactivity_dur.wu_inact_ths_w = 4;
3831
3832 tmp = (float_t)val.inact_ths_mg / 125.0f;
3833 inactivity_ths.inact_ths = (uint8_t)tmp;
3834
3835 tmp = (float_t)val.wk_ths_mg / 125.0f;
3836 wake_up_ths.wk_ths = (uint8_t)tmp;
3837 }
3838 else if ((val.wk_ths_mg < (uint32_t)(250.0f * 63.0f))
3839 && (val.inact_ths_mg < (uint32_t)(250.0f * 63.0f)))
3840 {
3841 inactivity_dur.wu_inact_ths_w = 5;
3842
3843 tmp = (float_t)val.inact_ths_mg / 250.0f;
3844 inactivity_ths.inact_ths = (uint8_t)tmp;
3845
3846 tmp = (float_t)val.wk_ths_mg / 250.0f;
3847 wake_up_ths.wk_ths = (uint8_t)tmp;
3848 }
3849 else // out of limit
3850 {
3851 inactivity_dur.wu_inact_ths_w = 5;
3852 inactivity_ths.inact_ths = 0x3FU;
3853 wake_up_ths.wk_ths = 0x3FU;
3854 }
3855
3856 if (ret == 0)
3857 {
3858 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3859 }
3860 if (ret == 0)
3861 {
3862
3863 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
3864 }
3865 if (ret == 0)
3866 {
3867
3868 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
3869 }
3870
3871 return ret;
3872 }
3873
3874 /**
3875 * @brief Wakeup and activity/inactivity threshold.[get]
3876 *
3877 * @param ctx read / write interface definitions
3878 * @param val Wakeup and activity/inactivity threshold.
3879 * @retval interface status (MANDATORY: return 0 -> no Error)
3880 *
3881 */
lsm6dsv16b_act_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16b_act_thresholds_t * val)3882 int32_t lsm6dsv16b_act_thresholds_get(const stmdev_ctx_t *ctx,
3883 lsm6dsv16b_act_thresholds_t *val)
3884 {
3885 lsm6dsv16b_inactivity_dur_t inactivity_dur;
3886 lsm6dsv16b_inactivity_ths_t inactivity_ths;
3887 lsm6dsv16b_wake_up_ths_t wake_up_ths;
3888 int32_t ret;
3889 float_t tmp;
3890
3891 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_DUR, (uint8_t *)&inactivity_dur, 1);
3892 if (ret == 0)
3893 {
3894 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_INACTIVITY_THS, (uint8_t *)&inactivity_ths, 1);
3895 }
3896 if (ret == 0)
3897 {
3898 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
3899 }
3900
3901 switch (inactivity_dur.wu_inact_ths_w)
3902 {
3903 case 0:
3904 tmp = (float_t)wake_up_ths.wk_ths * 7.8125f;
3905 val->wk_ths_mg = (uint32_t)tmp;
3906
3907 tmp = (float_t)inactivity_ths.inact_ths * 7.8125f;
3908 val->inact_ths_mg = (uint32_t)tmp;
3909 break;
3910
3911 case 1:
3912 tmp = (float_t)wake_up_ths.wk_ths * 15.625f;
3913 val->wk_ths_mg = (uint32_t)tmp;
3914
3915 tmp = (float_t)inactivity_ths.inact_ths * 15.625f;
3916 val->inact_ths_mg = (uint32_t)tmp;
3917 break;
3918
3919 case 2:
3920 tmp = (float_t)wake_up_ths.wk_ths * 31.25f;
3921 val->wk_ths_mg = (uint32_t)tmp;
3922
3923 tmp = (float_t)inactivity_ths.inact_ths * 31.25f;
3924 val->inact_ths_mg = (uint32_t)tmp;
3925 break;
3926
3927 case 3:
3928 tmp = (float_t)wake_up_ths.wk_ths * 62.5f;
3929 val->wk_ths_mg = (uint32_t)tmp;
3930
3931 tmp = (float_t)inactivity_ths.inact_ths * 62.5f;
3932 val->inact_ths_mg = (uint32_t)tmp;
3933 break;
3934
3935 case 4:
3936 tmp = (float_t)wake_up_ths.wk_ths * 125.0f;
3937 val->wk_ths_mg = (uint32_t)tmp;
3938
3939 tmp = (float_t)inactivity_ths.inact_ths * 125.0f;
3940 val->inact_ths_mg = (uint32_t)tmp;
3941 break;
3942
3943 default:
3944 tmp = (float_t)wake_up_ths.wk_ths * 250.0f;
3945 val->wk_ths_mg = (uint32_t)tmp;
3946
3947 tmp = (float_t)inactivity_ths.inact_ths * 250.0f;
3948 val->inact_ths_mg = (uint32_t)tmp;
3949 break;
3950 }
3951
3952 return ret;
3953 }
3954
3955 /**
3956 * @brief Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time. [set]
3957 *
3958 * @param ctx read / write interface definitions
3959 * @param val Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time.
3960 * @retval interface status (MANDATORY: return 0 -> no Error)
3961 *
3962 */
lsm6dsv16b_act_wkup_time_windows_set(const stmdev_ctx_t * ctx,lsm6dsv16b_act_wkup_time_windows_t val)3963 int32_t lsm6dsv16b_act_wkup_time_windows_set(const stmdev_ctx_t *ctx,
3964 lsm6dsv16b_act_wkup_time_windows_t val)
3965 {
3966 lsm6dsv16b_wake_up_dur_t wake_up_dur;
3967 int32_t ret;
3968
3969 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
3970 if (ret == 0)
3971 {
3972 wake_up_dur.wake_dur = val.shock;
3973 wake_up_dur.sleep_dur = val.quiet;
3974 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
3975 }
3976
3977 return ret;
3978 }
3979
3980 /**
3981 * @brief Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time. [get]
3982 *
3983 * @param ctx read / write interface definitions
3984 * @param val Time windows configuration for Wake Up - Activity - Inactivity (SLEEP, WAKE). Duration to go in sleep mode. Default value: 0000 (this corresponds to 16 ODR) 1 LSB = 512/ODR_XL time. Wake up duration event. 1 LSB = 1/ODR_XL time.
3985 * @retval interface status (MANDATORY: return 0 -> no Error)
3986 *
3987 */
lsm6dsv16b_act_wkup_time_windows_get(const stmdev_ctx_t * ctx,lsm6dsv16b_act_wkup_time_windows_t * val)3988 int32_t lsm6dsv16b_act_wkup_time_windows_get(const stmdev_ctx_t *ctx,
3989 lsm6dsv16b_act_wkup_time_windows_t *val)
3990 {
3991 lsm6dsv16b_wake_up_dur_t wake_up_dur;
3992 int32_t ret;
3993
3994 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
3995 val->shock = wake_up_dur.wake_dur;
3996 val->quiet = wake_up_dur.sleep_dur;
3997
3998 return ret;
3999 }
4000
4001 /**
4002 * @}
4003 *
4004 */
4005
4006 /**
4007 * @defgroup Tap Generator
4008 * @brief This section groups all the functions that manage the
4009 * tap and double tap event generation.
4010 * @{
4011 *
4012 */
4013
4014 /**
4015 * @brief Enable axis for Tap - Double Tap detection.[set]
4016 *
4017 * @param ctx read / write interface definitions
4018 * @param val Enable axis for Tap - Double Tap detection.
4019 * @retval interface status (MANDATORY: return 0 -> no Error)
4020 *
4021 */
lsm6dsv16b_tap_detection_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_detection_t val)4022 int32_t lsm6dsv16b_tap_detection_set(const stmdev_ctx_t *ctx,
4023 lsm6dsv16b_tap_detection_t val)
4024 {
4025 lsm6dsv16b_tap_cfg0_t tap_cfg0;
4026 int32_t ret;
4027
4028 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
4029 if (ret == 0)
4030 {
4031 tap_cfg0.tap_x_en = val.tap_x_en;
4032 tap_cfg0.tap_y_en = val.tap_y_en;
4033 tap_cfg0.tap_z_en = val.tap_z_en;
4034 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
4035 }
4036
4037 return ret;
4038 }
4039
4040 /**
4041 * @brief Enable axis for Tap - Double Tap detection.[get]
4042 *
4043 * @param ctx read / write interface definitions
4044 * @param val Enable axis for Tap - Double Tap detection.
4045 * @retval interface status (MANDATORY: return 0 -> no Error)
4046 *
4047 */
lsm6dsv16b_tap_detection_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_detection_t * val)4048 int32_t lsm6dsv16b_tap_detection_get(const stmdev_ctx_t *ctx,
4049 lsm6dsv16b_tap_detection_t *val)
4050 {
4051 lsm6dsv16b_tap_cfg0_t tap_cfg0;
4052 int32_t ret;
4053
4054 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG0, (uint8_t *)&tap_cfg0, 1);
4055 val->tap_x_en = tap_cfg0.tap_x_en;
4056 val->tap_y_en = tap_cfg0.tap_y_en;
4057 val->tap_z_en = tap_cfg0.tap_z_en;
4058
4059 return ret;
4060 }
4061
4062 /**
4063 * @brief axis Tap - Double Tap recognition thresholds.[set]
4064 *
4065 * @param ctx read / write interface definitions
4066 * @param val axis Tap - Double Tap recognition thresholds.
4067 * @retval interface status (MANDATORY: return 0 -> no Error)
4068 *
4069 */
lsm6dsv16b_tap_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_thresholds_t val)4070 int32_t lsm6dsv16b_tap_thresholds_set(const stmdev_ctx_t *ctx,
4071 lsm6dsv16b_tap_thresholds_t val)
4072 {
4073 lsm6dsv16b_tap_ths_6d_t tap_ths_6d;
4074 lsm6dsv16b_tap_cfg2_t tap_cfg2;
4075 lsm6dsv16b_tap_cfg1_t tap_cfg1;
4076 int32_t ret;
4077
4078 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4079 if (ret == 0)
4080 {
4081 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
4082 }
4083 if (ret == 0)
4084 {
4085 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4086 }
4087
4088 tap_cfg1.tap_ths_z = val.z;
4089 tap_cfg2.tap_ths_y = val.y;
4090 tap_ths_6d.tap_ths_x = val.x;
4091
4092 if (ret == 0)
4093 {
4094 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4095 }
4096 if (ret == 0)
4097 {
4098 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
4099 }
4100 if (ret == 0)
4101 {
4102 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4103 }
4104
4105 return ret;
4106 }
4107
4108 /**
4109 * @brief axis Tap - Double Tap recognition thresholds.[get]
4110 *
4111 * @param ctx read / write interface definitions
4112 * @param val axis Tap - Double Tap recognition thresholds.
4113 * @retval interface status (MANDATORY: return 0 -> no Error)
4114 *
4115 */
lsm6dsv16b_tap_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_thresholds_t * val)4116 int32_t lsm6dsv16b_tap_thresholds_get(const stmdev_ctx_t *ctx,
4117 lsm6dsv16b_tap_thresholds_t *val)
4118 {
4119 lsm6dsv16b_tap_ths_6d_t tap_ths_6d;
4120 lsm6dsv16b_tap_cfg2_t tap_cfg2;
4121 lsm6dsv16b_tap_cfg1_t tap_cfg1;
4122 int32_t ret;
4123
4124 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4125 if (ret == 0)
4126 {
4127 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG2, (uint8_t *)&tap_cfg2, 1);
4128 }
4129 if (ret == 0)
4130 {
4131 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4132 }
4133
4134 val->z = tap_cfg1.tap_ths_z;
4135 val->y = tap_cfg2.tap_ths_y;
4136 val->x = tap_ths_6d.tap_ths_x;
4137
4138 return ret;
4139 }
4140
4141 /**
4142 * @brief Selection of axis priority for TAP detection.[set]
4143 *
4144 * @param ctx read / write interface definitions
4145 * @param val XYZ , YXZ , XZY, ZYX , YZX , ZXY ,
4146 * @retval interface status (MANDATORY: return 0 -> no Error)
4147 *
4148 */
lsm6dsv16b_tap_axis_priority_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_axis_priority_t val)4149 int32_t lsm6dsv16b_tap_axis_priority_set(const stmdev_ctx_t *ctx,
4150 lsm6dsv16b_tap_axis_priority_t val)
4151 {
4152 lsm6dsv16b_tap_cfg1_t tap_cfg1;
4153 int32_t ret;
4154
4155 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4156 if (ret == 0)
4157 {
4158 tap_cfg1.tap_priority = (uint8_t)val & 0x07U;
4159 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4160 }
4161
4162 return ret;
4163 }
4164
4165 /**
4166 * @brief Selection of axis priority for TAP detection.[get]
4167 *
4168 * @param ctx read / write interface definitions
4169 * @param val XYZ , YXZ , XZY, ZYX , YZX , ZXY ,
4170 * @retval interface status (MANDATORY: return 0 -> no Error)
4171 *
4172 */
lsm6dsv16b_tap_axis_priority_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_axis_priority_t * val)4173 int32_t lsm6dsv16b_tap_axis_priority_get(const stmdev_ctx_t *ctx,
4174 lsm6dsv16b_tap_axis_priority_t *val)
4175 {
4176 lsm6dsv16b_tap_cfg1_t tap_cfg1;
4177 int32_t ret;
4178
4179 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_CFG1, (uint8_t *)&tap_cfg1, 1);
4180 switch (tap_cfg1.tap_priority)
4181 {
4182 case LSM6DSV16B_XYZ :
4183 *val = LSM6DSV16B_XYZ ;
4184 break;
4185
4186 case LSM6DSV16B_YXZ :
4187 *val = LSM6DSV16B_YXZ ;
4188 break;
4189
4190 case LSM6DSV16B_XZY:
4191 *val = LSM6DSV16B_XZY;
4192 break;
4193
4194 case LSM6DSV16B_ZYX :
4195 *val = LSM6DSV16B_ZYX ;
4196 break;
4197
4198 case LSM6DSV16B_YZX :
4199 *val = LSM6DSV16B_YZX ;
4200 break;
4201
4202 case LSM6DSV16B_ZXY :
4203 *val = LSM6DSV16B_ZXY ;
4204 break;
4205
4206 default:
4207 *val = LSM6DSV16B_XYZ ;
4208 break;
4209 }
4210 return ret;
4211 }
4212
4213
4214 /**
4215 * @brief Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.[set]
4216 *
4217 * @param ctx read / write interface definitions
4218 * @param val Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.
4219 * @retval interface status (MANDATORY: return 0 -> no Error)
4220 *
4221 */
lsm6dsv16b_tap_time_windows_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_time_windows_t val)4222 int32_t lsm6dsv16b_tap_time_windows_set(const stmdev_ctx_t *ctx,
4223 lsm6dsv16b_tap_time_windows_t val)
4224 {
4225 lsm6dsv16b_tap_dur_t tap_dur;
4226 int32_t ret;
4227
4228 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_DUR, (uint8_t *)&tap_dur, 1);
4229 if (ret == 0)
4230 {
4231 tap_dur.shock = val.shock;
4232 tap_dur.quiet = val.quiet;
4233 tap_dur.dur = val.tap_gap;
4234 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_DUR, (uint8_t *)&tap_dur, 1);
4235 }
4236
4237 return ret;
4238 }
4239
4240 /**
4241 * @brief Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.[get]
4242 *
4243 * @param ctx read / write interface definitions
4244 * @param val Time windows configuration for Tap - Double Tap SHOCK, QUIET, DUR : SHOCK Maximum duration is the maximum time of an overthreshold signal detection to be recognized as a tap event. The default value of these bits is 00b which corresponds to 4/ODR_XL time. If the SHOCK bits are set to a different value, 1LSB corresponds to 8/ODR_XL time. QUIET Expected quiet time after a tap detection. Quiet time is the time after the first detected tap in which there must not be any overthreshold event. The default value of these bits is 00b which corresponds to 2/ODR_XL time. If the QUIET bits are set to a different value, 1LSB corresponds to 4/ODR_XL time. DUR Duration of maximum time gap for double tap recognition. When double tap recognition is enabled, this register expresses the maximum time between two consecutive detected taps to determine a double tap event. The default value of these bits is 0000b which corresponds to 16/ODR_XL time. If the DUR_[3:0] bits are set to a different value, 1LSB corresponds to 32/ODR_XL time.
4245 * @retval interface status (MANDATORY: return 0 -> no Error)
4246 *
4247 */
lsm6dsv16b_tap_time_windows_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_time_windows_t * val)4248 int32_t lsm6dsv16b_tap_time_windows_get(const stmdev_ctx_t *ctx,
4249 lsm6dsv16b_tap_time_windows_t *val)
4250 {
4251 lsm6dsv16b_tap_dur_t tap_dur;
4252 int32_t ret;
4253
4254 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_DUR, (uint8_t *)&tap_dur, 1);
4255 val->shock = tap_dur.shock;
4256 val->quiet = tap_dur.quiet;
4257 val->tap_gap = tap_dur.dur;
4258
4259 return ret;
4260 }
4261
4262 /**
4263 * @brief Single/double-tap event enable.[set]
4264 *
4265 * @param ctx read / write interface definitions
4266 * @param val ONLY_SINGLE, BOTH_SINGLE_DOUBLE,
4267 * @retval interface status (MANDATORY: return 0 -> no Error)
4268 *
4269 */
lsm6dsv16b_tap_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_mode_t val)4270 int32_t lsm6dsv16b_tap_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_tap_mode_t val)
4271 {
4272 lsm6dsv16b_wake_up_ths_t wake_up_ths;
4273 int32_t ret;
4274
4275 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
4276 if (ret == 0)
4277 {
4278 wake_up_ths.single_double_tap = (uint8_t)val & 0x01U;
4279 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
4280 }
4281
4282 return ret;
4283 }
4284
4285 /**
4286 * @brief Single/double-tap event enable.[get]
4287 *
4288 * @param ctx read / write interface definitions
4289 * @param val ONLY_SINGLE, BOTH_SINGLE_DOUBLE,
4290 * @retval interface status (MANDATORY: return 0 -> no Error)
4291 *
4292 */
lsm6dsv16b_tap_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tap_mode_t * val)4293 int32_t lsm6dsv16b_tap_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_tap_mode_t *val)
4294 {
4295 lsm6dsv16b_wake_up_ths_t wake_up_ths;
4296 int32_t ret;
4297
4298 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_THS, (uint8_t *)&wake_up_ths, 1);
4299 switch (wake_up_ths.single_double_tap)
4300 {
4301 case LSM6DSV16B_ONLY_SINGLE:
4302 *val = LSM6DSV16B_ONLY_SINGLE;
4303 break;
4304
4305 case LSM6DSV16B_BOTH_SINGLE_DOUBLE:
4306 *val = LSM6DSV16B_BOTH_SINGLE_DOUBLE;
4307 break;
4308
4309 default:
4310 *val = LSM6DSV16B_ONLY_SINGLE;
4311 break;
4312 }
4313 return ret;
4314 }
4315
4316 /**
4317 * @}
4318 *
4319 */
4320
4321 /**
4322 * @defgroup Six position detection (6D)
4323 * @brief This section groups all the functions concerning six position
4324 * detection (6D).
4325 * @{
4326 *
4327 */
4328
4329 /**
4330 * @brief Threshold for 4D/6D function.[set]
4331 *
4332 * @param ctx read / write interface definitions
4333 * @param val DEG_80, DEG_70, DEG_60, DEG_50,
4334 * @retval interface status (MANDATORY: return 0 -> no Error)
4335 *
4336 */
lsm6dsv16b_6d_threshold_set(const stmdev_ctx_t * ctx,lsm6dsv16b_6d_threshold_t val)4337 int32_t lsm6dsv16b_6d_threshold_set(const stmdev_ctx_t *ctx,
4338 lsm6dsv16b_6d_threshold_t val)
4339 {
4340 lsm6dsv16b_tap_ths_6d_t tap_ths_6d;
4341 int32_t ret;
4342
4343 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4344 if (ret == 0)
4345 {
4346 tap_ths_6d.sixd_ths = (uint8_t)val & 0x03U;
4347 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4348 }
4349
4350 return ret;
4351 }
4352
4353 /**
4354 * @brief Threshold for 4D/6D function.[get]
4355 *
4356 * @param ctx read / write interface definitions
4357 * @param val DEG_80, DEG_70, DEG_60, DEG_50,
4358 * @retval interface status (MANDATORY: return 0 -> no Error)
4359 *
4360 */
lsm6dsv16b_6d_threshold_get(const stmdev_ctx_t * ctx,lsm6dsv16b_6d_threshold_t * val)4361 int32_t lsm6dsv16b_6d_threshold_get(const stmdev_ctx_t *ctx,
4362 lsm6dsv16b_6d_threshold_t *val)
4363 {
4364 lsm6dsv16b_tap_ths_6d_t tap_ths_6d;
4365 int32_t ret;
4366
4367 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TAP_THS_6D, (uint8_t *)&tap_ths_6d, 1);
4368 switch (tap_ths_6d.sixd_ths)
4369 {
4370 case LSM6DSV16B_DEG_80:
4371 *val = LSM6DSV16B_DEG_80;
4372 break;
4373
4374 case LSM6DSV16B_DEG_70:
4375 *val = LSM6DSV16B_DEG_70;
4376 break;
4377
4378 case LSM6DSV16B_DEG_60:
4379 *val = LSM6DSV16B_DEG_60;
4380 break;
4381
4382 case LSM6DSV16B_DEG_50:
4383 *val = LSM6DSV16B_DEG_50;
4384 break;
4385
4386 default:
4387 *val = LSM6DSV16B_DEG_80;
4388 break;
4389 }
4390 return ret;
4391 }
4392
4393 /**
4394 * @}
4395 *
4396 */
4397
4398 /**
4399 * @defgroup Free fall
4400 * @brief This section group all the functions concerning the free
4401 * fall detection.
4402 * @{
4403 *
4404 */
4405
4406 /**
4407 * @brief Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time[set]
4408 *
4409 * @param ctx read / write interface definitions
4410 * @param val Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time
4411 * @retval interface status (MANDATORY: return 0 -> no Error)
4412 *
4413 */
lsm6dsv16b_ff_time_windows_set(const stmdev_ctx_t * ctx,uint8_t val)4414 int32_t lsm6dsv16b_ff_time_windows_set(const stmdev_ctx_t *ctx, uint8_t val)
4415 {
4416 lsm6dsv16b_wake_up_dur_t wake_up_dur;
4417 lsm6dsv16b_free_fall_t free_fall;
4418 int32_t ret;
4419
4420 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
4421 if (ret == 0)
4422 {
4423 wake_up_dur.ff_dur = ((uint8_t)val & 0x20U) >> 5;
4424 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
4425 }
4426 if (ret == 0)
4427 {
4428 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4429 }
4430
4431 if (ret == 0)
4432 {
4433 free_fall.ff_dur = (uint8_t)val & 0x1FU;
4434 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4435 }
4436
4437 return ret;
4438 }
4439
4440 /**
4441 * @brief Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time[get]
4442 *
4443 * @param ctx read / write interface definitions
4444 * @param val Time windows configuration for Free Fall detection 1 LSB = 1/ODR_XL time
4445 * @retval interface status (MANDATORY: return 0 -> no Error)
4446 *
4447 */
lsm6dsv16b_ff_time_windows_get(const stmdev_ctx_t * ctx,uint8_t * val)4448 int32_t lsm6dsv16b_ff_time_windows_get(const stmdev_ctx_t *ctx, uint8_t *val)
4449 {
4450 lsm6dsv16b_wake_up_dur_t wake_up_dur;
4451 lsm6dsv16b_free_fall_t free_fall;
4452 int32_t ret;
4453
4454 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_WAKE_UP_DUR, (uint8_t *)&wake_up_dur, 1);
4455 if (ret == 0)
4456 {
4457 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4458 }
4459
4460 *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
4461
4462 return ret;
4463 }
4464
4465 /**
4466 * @brief Free fall threshold setting.[set]
4467 *
4468 * @param ctx read / write interface definitions
4469 * @param val 156_mg, 219_mg, 250_mg, 312_mg, 344_mg, 406_mg, 469_mg, 500_mg,
4470 * @retval interface status (MANDATORY: return 0 -> no Error)
4471 *
4472 */
lsm6dsv16b_ff_thresholds_set(const stmdev_ctx_t * ctx,lsm6dsv16b_ff_thresholds_t val)4473 int32_t lsm6dsv16b_ff_thresholds_set(const stmdev_ctx_t *ctx,
4474 lsm6dsv16b_ff_thresholds_t val)
4475 {
4476 lsm6dsv16b_free_fall_t free_fall;
4477 int32_t ret;
4478
4479 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4480 if (ret == 0)
4481 {
4482 free_fall.ff_ths = (uint8_t)val & 0x7U;
4483 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4484 }
4485
4486 return ret;
4487 }
4488
4489 /**
4490 * @brief Free fall threshold setting.[get]
4491 *
4492 * @param ctx read / write interface definitions
4493 * @param val 156_mg, 219_mg, 250_mg, 312_mg, 344_mg, 406_mg, 469_mg, 500_mg,
4494 * @retval interface status (MANDATORY: return 0 -> no Error)
4495 *
4496 */
lsm6dsv16b_ff_thresholds_get(const stmdev_ctx_t * ctx,lsm6dsv16b_ff_thresholds_t * val)4497 int32_t lsm6dsv16b_ff_thresholds_get(const stmdev_ctx_t *ctx,
4498 lsm6dsv16b_ff_thresholds_t *val)
4499 {
4500 lsm6dsv16b_free_fall_t free_fall;
4501 int32_t ret;
4502
4503 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FREE_FALL, (uint8_t *)&free_fall, 1);
4504
4505 switch (free_fall.ff_ths)
4506 {
4507 case LSM6DSV16B_156_mg:
4508 *val = LSM6DSV16B_156_mg;
4509 break;
4510
4511 case LSM6DSV16B_219_mg:
4512 *val = LSM6DSV16B_219_mg;
4513 break;
4514
4515 case LSM6DSV16B_250_mg:
4516 *val = LSM6DSV16B_250_mg;
4517 break;
4518
4519 case LSM6DSV16B_312_mg:
4520 *val = LSM6DSV16B_312_mg;
4521 break;
4522
4523 case LSM6DSV16B_344_mg:
4524 *val = LSM6DSV16B_344_mg;
4525 break;
4526
4527 case LSM6DSV16B_406_mg:
4528 *val = LSM6DSV16B_406_mg;
4529 break;
4530
4531 case LSM6DSV16B_469_mg:
4532 *val = LSM6DSV16B_469_mg;
4533 break;
4534
4535 case LSM6DSV16B_500_mg:
4536 *val = LSM6DSV16B_500_mg;
4537 break;
4538
4539 default:
4540 *val = LSM6DSV16B_156_mg;
4541 break;
4542 }
4543 return ret;
4544 }
4545
4546 /**
4547 * @}
4548 *
4549 */
4550
4551 /**
4552 * @defgroup FIFO
4553 * @brief This section group all the functions concerning the fifo usage
4554 * @{
4555 *
4556 */
4557
4558 /**
4559 * @brief FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).[set]
4560 *
4561 * @param ctx read / write interface definitions
4562 * @param val FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).
4563 * @retval interface status (MANDATORY: return 0 -> no Error)
4564 *
4565 */
lsm6dsv16b_fifo_watermark_set(const stmdev_ctx_t * ctx,uint8_t val)4566 int32_t lsm6dsv16b_fifo_watermark_set(const stmdev_ctx_t *ctx, uint8_t val)
4567 {
4568 lsm6dsv16b_fifo_ctrl1_t fifo_ctrl1;
4569 int32_t ret;
4570
4571 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
4572
4573 if (ret == 0)
4574 {
4575 fifo_ctrl1.wtm = val;
4576 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
4577 }
4578
4579 return ret;
4580 }
4581
4582 /**
4583 * @brief FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).[get]
4584 *
4585 * @param ctx read / write interface definitions
4586 * @param val FIFO watermark threshold (1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO).
4587 * @retval interface status (MANDATORY: return 0 -> no Error)
4588 *
4589 */
lsm6dsv16b_fifo_watermark_get(const stmdev_ctx_t * ctx,uint8_t * val)4590 int32_t lsm6dsv16b_fifo_watermark_get(const stmdev_ctx_t *ctx, uint8_t *val)
4591 {
4592 lsm6dsv16b_fifo_ctrl1_t fifo_ctrl1;
4593 int32_t ret;
4594
4595 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL1, (uint8_t *)&fifo_ctrl1, 1);
4596 *val = fifo_ctrl1.wtm;
4597
4598 return ret;
4599 }
4600
4601 /**
4602 * @brief When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.[set]
4603 *
4604 * @param ctx read / write interface definitions
4605 * @param val When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.
4606 * @retval interface status (MANDATORY: return 0 -> no Error)
4607 *
4608 */
lsm6dsv16b_fifo_xl_dual_fsm_batch_set(const stmdev_ctx_t * ctx,uint8_t val)4609 int32_t lsm6dsv16b_fifo_xl_dual_fsm_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
4610 {
4611 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4612 int32_t ret;
4613
4614 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4615 if (ret == 0)
4616 {
4617 fifo_ctrl2.xl_dualc_batch_from_fsm = val;
4618 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4619 }
4620
4621 return ret;
4622 }
4623
4624 /**
4625 * @brief When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.[get]
4626 *
4627 * @param ctx read / write interface definitions
4628 * @param val When dual channel mode is enabled, this function enables FSM-triggered batching in FIFO of accelerometer channel 2.
4629 * @retval interface status (MANDATORY: return 0 -> no Error)
4630 *
4631 */
lsm6dsv16b_fifo_xl_dual_fsm_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)4632 int32_t lsm6dsv16b_fifo_xl_dual_fsm_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
4633 {
4634 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4635 int32_t ret;
4636
4637 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4638 *val = fifo_ctrl2.xl_dualc_batch_from_fsm;
4639
4640 return ret;
4641 }
4642
4643 /**
4644 * @brief It configures the compression algorithm to write non-compressed data at each rate.[set]
4645 *
4646 * @param ctx read / write interface definitions
4647 * @param val CMP_DISABLE, CMP_ALWAYS, CMP_8_TO_1, CMP_16_TO_1, CMP_32_TO_1,
4648 * @retval interface status (MANDATORY: return 0 -> no Error)
4649 *
4650 */
lsm6dsv16b_fifo_compress_algo_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_compress_algo_t val)4651 int32_t lsm6dsv16b_fifo_compress_algo_set(const stmdev_ctx_t *ctx,
4652 lsm6dsv16b_fifo_compress_algo_t val)
4653 {
4654 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4655 int32_t ret;
4656
4657 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4658 if (ret == 0)
4659 {
4660 fifo_ctrl2.uncompr_rate = (uint8_t)val & 0x03U;
4661 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4662 }
4663
4664 return ret;
4665 }
4666
4667 /**
4668 * @brief It configures the compression algorithm to write non-compressed data at each rate.[get]
4669 *
4670 * @param ctx read / write interface definitions
4671 * @param val CMP_DISABLE, CMP_ALWAYS, CMP_8_TO_1, CMP_16_TO_1, CMP_32_TO_1,
4672 * @retval interface status (MANDATORY: return 0 -> no Error)
4673 *
4674 */
lsm6dsv16b_fifo_compress_algo_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_compress_algo_t * val)4675 int32_t lsm6dsv16b_fifo_compress_algo_get(const stmdev_ctx_t *ctx,
4676 lsm6dsv16b_fifo_compress_algo_t *val)
4677 {
4678 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4679 int32_t ret;
4680
4681 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4682
4683 switch (fifo_ctrl2.uncompr_rate)
4684 {
4685 case LSM6DSV16B_CMP_DISABLE:
4686 *val = LSM6DSV16B_CMP_DISABLE;
4687 break;
4688
4689 case LSM6DSV16B_CMP_8_TO_1:
4690 *val = LSM6DSV16B_CMP_8_TO_1;
4691 break;
4692
4693 case LSM6DSV16B_CMP_16_TO_1:
4694 *val = LSM6DSV16B_CMP_16_TO_1;
4695 break;
4696
4697 case LSM6DSV16B_CMP_32_TO_1:
4698 *val = LSM6DSV16B_CMP_32_TO_1;
4699 break;
4700
4701 default:
4702 *val = LSM6DSV16B_CMP_DISABLE;
4703 break;
4704 }
4705 return ret;
4706 }
4707
4708 /**
4709 * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[set]
4710 *
4711 * @param ctx read / write interface definitions
4712 * @param val Enables ODR CHANGE virtual sensor to be batched in FIFO.
4713 * @retval interface status (MANDATORY: return 0 -> no Error)
4714 *
4715 */
lsm6dsv16b_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t * ctx,uint8_t val)4716 int32_t lsm6dsv16b_fifo_virtual_sens_odr_chg_set(const stmdev_ctx_t *ctx,
4717 uint8_t val)
4718 {
4719 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4720 int32_t ret;
4721
4722 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4723 if (ret == 0)
4724 {
4725 fifo_ctrl2.odr_chg_en = val;
4726 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4727 }
4728
4729 return ret;
4730 }
4731
4732 /**
4733 * @brief Enables ODR CHANGE virtual sensor to be batched in FIFO.[get]
4734 *
4735 * @param ctx read / write interface definitions
4736 * @param val Enables ODR CHANGE virtual sensor to be batched in FIFO.
4737 * @retval interface status (MANDATORY: return 0 -> no Error)
4738 *
4739 */
lsm6dsv16b_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t * ctx,uint8_t * val)4740 int32_t lsm6dsv16b_fifo_virtual_sens_odr_chg_get(const stmdev_ctx_t *ctx,
4741 uint8_t *val)
4742 {
4743 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4744 int32_t ret;
4745
4746 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4747 *val = fifo_ctrl2.odr_chg_en;
4748
4749 return ret;
4750 }
4751
4752 /**
4753 * @brief Enables/Disables compression algorithm runtime.[set]
4754 *
4755 * @param ctx read / write interface definitions
4756 * @param val Enables/Disables compression algorithm runtime.
4757 * @retval interface status (MANDATORY: return 0 -> no Error)
4758 *
4759 */
lsm6dsv16b_fifo_compress_algo_real_time_set(const stmdev_ctx_t * ctx,uint8_t val)4760 int32_t lsm6dsv16b_fifo_compress_algo_real_time_set(const stmdev_ctx_t *ctx,
4761 uint8_t val)
4762 {
4763 lsm6dsv16b_emb_func_en_b_t emb_func_en_b;
4764 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4765
4766 int32_t ret;
4767
4768 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4769 if (ret == 0)
4770 {
4771 fifo_ctrl2.fifo_compr_rt_en = val;
4772 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4773 }
4774
4775 if (ret == 0)
4776 {
4777 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
4778 }
4779 if (ret == 0)
4780 {
4781 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
4782 }
4783 if (ret == 0)
4784 {
4785 emb_func_en_b.fifo_compr_en = val;
4786 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
4787 }
4788
4789 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
4790
4791 return ret;
4792 }
4793
4794 /**
4795 * @brief Enables/Disables compression algorithm runtime.[get]
4796 *
4797 * @param ctx read / write interface definitions
4798 * @param val Enables/Disables compression algorithm runtime.
4799 * @retval interface status (MANDATORY: return 0 -> no Error)
4800 *
4801 */
lsm6dsv16b_fifo_compress_algo_real_time_get(const stmdev_ctx_t * ctx,uint8_t * val)4802 int32_t lsm6dsv16b_fifo_compress_algo_real_time_get(const stmdev_ctx_t *ctx,
4803 uint8_t *val)
4804 {
4805 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4806 int32_t ret;
4807
4808 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4809
4810 *val = fifo_ctrl2.fifo_compr_rt_en;
4811
4812 return ret;
4813 }
4814
4815 /**
4816 * @brief Sensing chain FIFO stop values memorization at threshold level.[set]
4817 *
4818 * @param ctx read / write interface definitions
4819 * @param val Sensing chain FIFO stop values memorization at threshold level.
4820 * @retval interface status (MANDATORY: return 0 -> no Error)
4821 *
4822 */
lsm6dsv16b_fifo_stop_on_wtm_set(const stmdev_ctx_t * ctx,uint8_t val)4823 int32_t lsm6dsv16b_fifo_stop_on_wtm_set(const stmdev_ctx_t *ctx, uint8_t val)
4824 {
4825 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4826 int32_t ret;
4827
4828 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4829 if (ret == 0)
4830 {
4831 fifo_ctrl2.stop_on_wtm = val;
4832 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4833 }
4834
4835 return ret;
4836 }
4837
4838 /**
4839 * @brief Sensing chain FIFO stop values memorization at threshold level.[get]
4840 *
4841 * @param ctx read / write interface definitions
4842 * @param val Sensing chain FIFO stop values memorization at threshold level.
4843 * @retval interface status (MANDATORY: return 0 -> no Error)
4844 *
4845 */
lsm6dsv16b_fifo_stop_on_wtm_get(const stmdev_ctx_t * ctx,uint8_t * val)4846 int32_t lsm6dsv16b_fifo_stop_on_wtm_get(const stmdev_ctx_t *ctx, uint8_t *val)
4847 {
4848 lsm6dsv16b_fifo_ctrl2_t fifo_ctrl2;
4849 int32_t ret;
4850
4851 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL2, (uint8_t *)&fifo_ctrl2, 1);
4852 *val = fifo_ctrl2.stop_on_wtm;
4853
4854 return ret;
4855 }
4856
4857 /**
4858 * @brief Selects Batch Data Rate (write frequency in FIFO) for accelerometer data.[set]
4859 *
4860 * @param ctx read / write interface definitions
4861 * @param val lsm6dsv16b_fifo_xl_batch_t enum
4862 * @retval interface status (MANDATORY: return 0 -> no Error)
4863 *
4864 */
lsm6dsv16b_fifo_xl_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_xl_batch_t val)4865 int32_t lsm6dsv16b_fifo_xl_batch_set(const stmdev_ctx_t *ctx,
4866 lsm6dsv16b_fifo_xl_batch_t val)
4867 {
4868 lsm6dsv16b_fifo_ctrl3_t fifo_ctrl3;
4869 int32_t ret;
4870
4871 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4872 if (ret == 0)
4873 {
4874 fifo_ctrl3.bdr_xl = (uint8_t)val & 0xFU;
4875 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4876 }
4877
4878 return ret;
4879 }
4880
4881 /**
4882 * @brief Selects Batch Data Rate (write frequency in FIFO) for accelerometer data.[get]
4883 *
4884 * @param ctx read / write interface definitions
4885 * @param val lsm6dsv16b_fifo_xl_batch_t enum
4886 * @retval interface status (MANDATORY: return 0 -> no Error)
4887 *
4888 */
lsm6dsv16b_fifo_xl_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_xl_batch_t * val)4889 int32_t lsm6dsv16b_fifo_xl_batch_get(const stmdev_ctx_t *ctx,
4890 lsm6dsv16b_fifo_xl_batch_t *val)
4891 {
4892 lsm6dsv16b_fifo_ctrl3_t fifo_ctrl3;
4893 int32_t ret;
4894
4895 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4896 switch (fifo_ctrl3.bdr_xl)
4897 {
4898 case LSM6DSV16B_XL_NOT_BATCHED:
4899 *val = LSM6DSV16B_XL_NOT_BATCHED;
4900 break;
4901
4902 case LSM6DSV16B_XL_BATCHED_AT_1Hz875:
4903 *val = LSM6DSV16B_XL_BATCHED_AT_1Hz875;
4904 break;
4905
4906 case LSM6DSV16B_XL_BATCHED_AT_7Hz5:
4907 *val = LSM6DSV16B_XL_BATCHED_AT_7Hz5;
4908 break;
4909
4910 case LSM6DSV16B_XL_BATCHED_AT_15Hz:
4911 *val = LSM6DSV16B_XL_BATCHED_AT_15Hz;
4912 break;
4913
4914 case LSM6DSV16B_XL_BATCHED_AT_30Hz:
4915 *val = LSM6DSV16B_XL_BATCHED_AT_30Hz;
4916 break;
4917
4918 case LSM6DSV16B_XL_BATCHED_AT_60Hz:
4919 *val = LSM6DSV16B_XL_BATCHED_AT_60Hz;
4920 break;
4921
4922 case LSM6DSV16B_XL_BATCHED_AT_120Hz:
4923 *val = LSM6DSV16B_XL_BATCHED_AT_120Hz;
4924 break;
4925
4926 case LSM6DSV16B_XL_BATCHED_AT_240Hz:
4927 *val = LSM6DSV16B_XL_BATCHED_AT_240Hz;
4928 break;
4929
4930 case LSM6DSV16B_XL_BATCHED_AT_480Hz:
4931 *val = LSM6DSV16B_XL_BATCHED_AT_480Hz;
4932 break;
4933
4934 case LSM6DSV16B_XL_BATCHED_AT_960Hz:
4935 *val = LSM6DSV16B_XL_BATCHED_AT_960Hz;
4936 break;
4937
4938 case LSM6DSV16B_XL_BATCHED_AT_1920Hz:
4939 *val = LSM6DSV16B_XL_BATCHED_AT_1920Hz;
4940 break;
4941
4942 case LSM6DSV16B_XL_BATCHED_AT_3840Hz:
4943 *val = LSM6DSV16B_XL_BATCHED_AT_3840Hz;
4944 break;
4945
4946 case LSM6DSV16B_XL_BATCHED_AT_7680Hz:
4947 *val = LSM6DSV16B_XL_BATCHED_AT_7680Hz;
4948 break;
4949
4950 default:
4951 *val = LSM6DSV16B_XL_NOT_BATCHED;
4952 break;
4953 }
4954 return ret;
4955 }
4956
4957 /**
4958 * @brief Selects Batch Data Rate (write frequency in FIFO) for gyroscope data.[set]
4959 *
4960 * @param ctx read / write interface definitions
4961 * @param val lsm6dsv16b_fifo_gy_batch_t enum
4962 * @retval interface status (MANDATORY: return 0 -> no Error)
4963 *
4964 */
lsm6dsv16b_fifo_gy_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_gy_batch_t val)4965 int32_t lsm6dsv16b_fifo_gy_batch_set(const stmdev_ctx_t *ctx,
4966 lsm6dsv16b_fifo_gy_batch_t val)
4967 {
4968 lsm6dsv16b_fifo_ctrl3_t fifo_ctrl3;
4969 int32_t ret;
4970
4971 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4972 if (ret == 0)
4973 {
4974 fifo_ctrl3.bdr_gy = (uint8_t)val & 0xFU;
4975 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4976 }
4977
4978 return ret;
4979 }
4980
4981 /**
4982 * @brief Selects Batch Data Rate (write frequency in FIFO) for gyroscope data.[get]
4983 *
4984 * @param ctx read / write interface definitions
4985 * @param val lsm6dsv16b_fifo_gy_batch_t enum
4986 * @retval interface status (MANDATORY: return 0 -> no Error)
4987 *
4988 */
lsm6dsv16b_fifo_gy_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_gy_batch_t * val)4989 int32_t lsm6dsv16b_fifo_gy_batch_get(const stmdev_ctx_t *ctx,
4990 lsm6dsv16b_fifo_gy_batch_t *val)
4991 {
4992 lsm6dsv16b_fifo_ctrl3_t fifo_ctrl3;
4993 int32_t ret;
4994
4995 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL3, (uint8_t *)&fifo_ctrl3, 1);
4996 switch (fifo_ctrl3.bdr_gy)
4997 {
4998 case LSM6DSV16B_GY_NOT_BATCHED:
4999 *val = LSM6DSV16B_GY_NOT_BATCHED;
5000 break;
5001
5002 case LSM6DSV16B_GY_BATCHED_AT_1Hz875:
5003 *val = LSM6DSV16B_GY_BATCHED_AT_1Hz875;
5004 break;
5005
5006 case LSM6DSV16B_GY_BATCHED_AT_7Hz5:
5007 *val = LSM6DSV16B_GY_BATCHED_AT_7Hz5;
5008 break;
5009
5010 case LSM6DSV16B_GY_BATCHED_AT_15Hz:
5011 *val = LSM6DSV16B_GY_BATCHED_AT_15Hz;
5012 break;
5013
5014 case LSM6DSV16B_GY_BATCHED_AT_30Hz:
5015 *val = LSM6DSV16B_GY_BATCHED_AT_30Hz;
5016 break;
5017
5018 case LSM6DSV16B_GY_BATCHED_AT_60Hz:
5019 *val = LSM6DSV16B_GY_BATCHED_AT_60Hz;
5020 break;
5021
5022 case LSM6DSV16B_GY_BATCHED_AT_120Hz:
5023 *val = LSM6DSV16B_GY_BATCHED_AT_120Hz;
5024 break;
5025
5026 case LSM6DSV16B_GY_BATCHED_AT_240Hz:
5027 *val = LSM6DSV16B_GY_BATCHED_AT_240Hz;
5028 break;
5029
5030 case LSM6DSV16B_GY_BATCHED_AT_480Hz:
5031 *val = LSM6DSV16B_GY_BATCHED_AT_480Hz;
5032 break;
5033
5034 case LSM6DSV16B_GY_BATCHED_AT_960Hz:
5035 *val = LSM6DSV16B_GY_BATCHED_AT_960Hz;
5036 break;
5037
5038 case LSM6DSV16B_GY_BATCHED_AT_1920Hz:
5039 *val = LSM6DSV16B_GY_BATCHED_AT_1920Hz;
5040 break;
5041
5042 case LSM6DSV16B_GY_BATCHED_AT_3840Hz:
5043 *val = LSM6DSV16B_GY_BATCHED_AT_3840Hz;
5044 break;
5045
5046 case LSM6DSV16B_GY_BATCHED_AT_7680Hz:
5047 *val = LSM6DSV16B_GY_BATCHED_AT_7680Hz;
5048 break;
5049
5050 default:
5051 *val = LSM6DSV16B_GY_NOT_BATCHED;
5052 break;
5053 }
5054 return ret;
5055 }
5056
5057 /**
5058 * @brief FIFO mode selection.[set]
5059 *
5060 * @param ctx read / write interface definitions
5061 * @param val BYPASS_MODE, FIFO_MODE, STREAM_WTM_TO_FULL_MODE, STREAM_TO_FIFO_MODE, BYPASS_TO_STREAM_MODE, STREAM_MODE, BYPASS_TO_FIFO_MODE,
5062 * @retval interface status (MANDATORY: return 0 -> no Error)
5063 *
5064 */
lsm6dsv16b_fifo_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_mode_t val)5065 int32_t lsm6dsv16b_fifo_mode_set(const stmdev_ctx_t *ctx,
5066 lsm6dsv16b_fifo_mode_t val)
5067 {
5068 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5069 int32_t ret;
5070
5071 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5072 if (ret == 0)
5073 {
5074 fifo_ctrl4.fifo_mode = (uint8_t)val & 0x07U;
5075 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5076 }
5077
5078 return ret;
5079 }
5080
5081 /**
5082 * @brief FIFO mode selection.[get]
5083 *
5084 * @param ctx read / write interface definitions
5085 * @param val BYPASS_MODE, FIFO_MODE, STREAM_WTM_TO_FULL_MODE, STREAM_TO_FIFO_MODE, BYPASS_TO_STREAM_MODE, STREAM_MODE, BYPASS_TO_FIFO_MODE,
5086 * @retval interface status (MANDATORY: return 0 -> no Error)
5087 *
5088 */
lsm6dsv16b_fifo_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_mode_t * val)5089 int32_t lsm6dsv16b_fifo_mode_get(const stmdev_ctx_t *ctx,
5090 lsm6dsv16b_fifo_mode_t *val)
5091 {
5092 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5093 int32_t ret;
5094
5095 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5096 switch (fifo_ctrl4.fifo_mode)
5097 {
5098 case LSM6DSV16B_BYPASS_MODE:
5099 *val = LSM6DSV16B_BYPASS_MODE;
5100 break;
5101
5102 case LSM6DSV16B_FIFO_MODE:
5103 *val = LSM6DSV16B_FIFO_MODE;
5104 break;
5105
5106 case LSM6DSV16B_STREAM_WTM_TO_FULL_MODE:
5107 *val = LSM6DSV16B_STREAM_WTM_TO_FULL_MODE;
5108 break;
5109
5110 case LSM6DSV16B_STREAM_TO_FIFO_MODE:
5111 *val = LSM6DSV16B_STREAM_TO_FIFO_MODE;
5112 break;
5113
5114 case LSM6DSV16B_BYPASS_TO_STREAM_MODE:
5115 *val = LSM6DSV16B_BYPASS_TO_STREAM_MODE;
5116 break;
5117
5118 case LSM6DSV16B_STREAM_MODE:
5119 *val = LSM6DSV16B_STREAM_MODE;
5120 break;
5121
5122 case LSM6DSV16B_BYPASS_TO_FIFO_MODE:
5123 *val = LSM6DSV16B_BYPASS_TO_FIFO_MODE;
5124 break;
5125
5126 default:
5127 *val = LSM6DSV16B_BYPASS_MODE;
5128 break;
5129 }
5130 return ret;
5131 }
5132
5133 /**
5134 * @brief Selects batch data rate (write frequency in FIFO) for temperature data.[set]
5135 *
5136 * @param ctx read / write interface definitions
5137 * @param val TEMP_NOT_BATCHED, TEMP_BATCHED_AT_1Hz875, TEMP_BATCHED_AT_15Hz, TEMP_BATCHED_AT_60Hz,
5138 * @retval interface status (MANDATORY: return 0 -> no Error)
5139 *
5140 */
lsm6dsv16b_fifo_temp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_temp_batch_t val)5141 int32_t lsm6dsv16b_fifo_temp_batch_set(const stmdev_ctx_t *ctx,
5142 lsm6dsv16b_fifo_temp_batch_t val)
5143 {
5144 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5145 int32_t ret;
5146
5147 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5148 if (ret == 0)
5149 {
5150 fifo_ctrl4.odr_t_batch = (uint8_t)val & 0x03U;
5151 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5152 }
5153
5154 return ret;
5155 }
5156
5157 /**
5158 * @brief Selects batch data rate (write frequency in FIFO) for temperature data.[get]
5159 *
5160 * @param ctx read / write interface definitions
5161 * @param val TEMP_NOT_BATCHED, TEMP_BATCHED_AT_1Hz875, TEMP_BATCHED_AT_15Hz, TEMP_BATCHED_AT_60Hz,
5162 * @retval interface status (MANDATORY: return 0 -> no Error)
5163 *
5164 */
lsm6dsv16b_fifo_temp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_temp_batch_t * val)5165 int32_t lsm6dsv16b_fifo_temp_batch_get(const stmdev_ctx_t *ctx,
5166 lsm6dsv16b_fifo_temp_batch_t *val)
5167 {
5168 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5169 int32_t ret;
5170
5171 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5172 switch (fifo_ctrl4.odr_t_batch)
5173 {
5174 case LSM6DSV16B_TEMP_NOT_BATCHED:
5175 *val = LSM6DSV16B_TEMP_NOT_BATCHED;
5176 break;
5177
5178 case LSM6DSV16B_TEMP_BATCHED_AT_1Hz875:
5179 *val = LSM6DSV16B_TEMP_BATCHED_AT_1Hz875;
5180 break;
5181
5182 case LSM6DSV16B_TEMP_BATCHED_AT_15Hz:
5183 *val = LSM6DSV16B_TEMP_BATCHED_AT_15Hz;
5184 break;
5185
5186 case LSM6DSV16B_TEMP_BATCHED_AT_60Hz:
5187 *val = LSM6DSV16B_TEMP_BATCHED_AT_60Hz;
5188 break;
5189
5190 default:
5191 *val = LSM6DSV16B_TEMP_NOT_BATCHED;
5192 break;
5193 }
5194 return ret;
5195 }
5196
5197 /**
5198 * @brief Selects decimation for timestamp batching in FIFO. Write rate will be the maximum rate between XL and GYRO BDR divided by decimation decoder.[set]
5199 *
5200 * @param ctx read / write interface definitions
5201 * @param val TMSTMP_NOT_BATCHED, TMSTMP_DEC_1, TMSTMP_DEC_8, TMSTMP_DEC_32,
5202 * @retval interface status (MANDATORY: return 0 -> no Error)
5203 *
5204 */
lsm6dsv16b_fifo_timestamp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_timestamp_batch_t val)5205 int32_t lsm6dsv16b_fifo_timestamp_batch_set(const stmdev_ctx_t *ctx,
5206 lsm6dsv16b_fifo_timestamp_batch_t val)
5207 {
5208 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5209 int32_t ret;
5210
5211 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5212 if (ret == 0)
5213 {
5214 fifo_ctrl4.dec_ts_batch = (uint8_t)val & 0x3U;
5215 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5216 }
5217
5218 return ret;
5219 }
5220
5221 /**
5222 * @brief Selects decimation for timestamp batching in FIFO. Write rate will be the maximum rate between XL and GYRO BDR divided by decimation decoder.[get]
5223 *
5224 * @param ctx read / write interface definitions
5225 * @param val TMSTMP_NOT_BATCHED, TMSTMP_DEC_1, TMSTMP_DEC_8, TMSTMP_DEC_32,
5226 * @retval interface status (MANDATORY: return 0 -> no Error)
5227 *
5228 */
lsm6dsv16b_fifo_timestamp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_timestamp_batch_t * val)5229 int32_t lsm6dsv16b_fifo_timestamp_batch_get(const stmdev_ctx_t *ctx,
5230 lsm6dsv16b_fifo_timestamp_batch_t *val)
5231 {
5232 lsm6dsv16b_fifo_ctrl4_t fifo_ctrl4;
5233 int32_t ret;
5234
5235 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_CTRL4, (uint8_t *)&fifo_ctrl4, 1);
5236 switch (fifo_ctrl4.dec_ts_batch)
5237 {
5238 case LSM6DSV16B_TMSTMP_NOT_BATCHED:
5239 *val = LSM6DSV16B_TMSTMP_NOT_BATCHED;
5240 break;
5241
5242 case LSM6DSV16B_TMSTMP_DEC_1:
5243 *val = LSM6DSV16B_TMSTMP_DEC_1;
5244 break;
5245
5246 case LSM6DSV16B_TMSTMP_DEC_8:
5247 *val = LSM6DSV16B_TMSTMP_DEC_8;
5248 break;
5249
5250 case LSM6DSV16B_TMSTMP_DEC_32:
5251 *val = LSM6DSV16B_TMSTMP_DEC_32;
5252 break;
5253
5254 default:
5255 *val = LSM6DSV16B_TMSTMP_NOT_BATCHED;
5256 break;
5257 }
5258 return ret;
5259 }
5260
5261 /**
5262 * @brief The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.[set]
5263 *
5264 * @param ctx read / write interface definitions
5265 * @param val The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.
5266 * @retval interface status (MANDATORY: return 0 -> no Error)
5267 *
5268 */
lsm6dsv16b_fifo_batch_counter_threshold_set(const stmdev_ctx_t * ctx,uint16_t val)5269 int32_t lsm6dsv16b_fifo_batch_counter_threshold_set(const stmdev_ctx_t *ctx,
5270 uint16_t val)
5271 {
5272 lsm6dsv16b_counter_bdr_reg1_t counter_bdr_reg1;
5273 lsm6dsv16b_counter_bdr_reg2_t counter_bdr_reg2;
5274 int32_t ret;
5275
5276 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
5277
5278 if (ret == 0)
5279 {
5280 counter_bdr_reg2.cnt_bdr_th = (uint8_t)val & 0xFFU;
5281 counter_bdr_reg1.cnt_bdr_th = (uint8_t)(val >> 8) & 0x3U;
5282 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
5283 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG2, (uint8_t *)&counter_bdr_reg2, 1);
5284 }
5285
5286 return ret;
5287 }
5288
5289 /**
5290 * @brief The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.[get]
5291 *
5292 * @param ctx read / write interface definitions
5293 * @param val The threshold for the internal counter of batch events. When this counter reaches the threshold, the counter is reset and the interrupt flag is set to 1.
5294 * @retval interface status (MANDATORY: return 0 -> no Error)
5295 *
5296 */
lsm6dsv16b_fifo_batch_counter_threshold_get(const stmdev_ctx_t * ctx,uint16_t * val)5297 int32_t lsm6dsv16b_fifo_batch_counter_threshold_get(const stmdev_ctx_t *ctx,
5298 uint16_t *val)
5299 {
5300 uint8_t buff[2];
5301 int32_t ret;
5302
5303 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, &buff[0], 2);
5304 *val = (uint16_t)buff[0] & 0x3U;
5305 *val = (*val * 256U) + (uint16_t)buff[1];
5306
5307 return ret;
5308 }
5309
5310 /**
5311 * @brief Selects the trigger for the internal counter of batch events between the accelerometer, gyroscope.[set]
5312 *
5313 * @param ctx read / write interface definitions
5314 * @param val XL_BATCH_EVENT, GY_BATCH_EVENT
5315 * @retval interface status (MANDATORY: return 0 -> no Error)
5316 *
5317 */
lsm6dsv16b_fifo_batch_cnt_event_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_batch_cnt_event_t val)5318 int32_t lsm6dsv16b_fifo_batch_cnt_event_set(const stmdev_ctx_t *ctx,
5319 lsm6dsv16b_fifo_batch_cnt_event_t val)
5320 {
5321 lsm6dsv16b_counter_bdr_reg1_t counter_bdr_reg1;
5322 int32_t ret;
5323
5324 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
5325
5326 if (ret == 0)
5327 {
5328 counter_bdr_reg1.trig_counter_bdr = (uint8_t)val & 0x03U;
5329 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
5330 }
5331
5332 return ret;
5333 }
5334
5335 /**
5336 * @brief Selects the trigger for the internal counter of batch events between the accelerometer, gyroscope.[get]
5337 *
5338 * @param ctx read / write interface definitions
5339 * @param val XL_BATCH_EVENT, GY_BATCH_EVENT
5340 * @retval interface status (MANDATORY: return 0 -> no Error)
5341 *
5342 */
lsm6dsv16b_fifo_batch_cnt_event_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_batch_cnt_event_t * val)5343 int32_t lsm6dsv16b_fifo_batch_cnt_event_get(const stmdev_ctx_t *ctx,
5344 lsm6dsv16b_fifo_batch_cnt_event_t *val)
5345 {
5346 lsm6dsv16b_counter_bdr_reg1_t counter_bdr_reg1;
5347 int32_t ret;
5348
5349 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_COUNTER_BDR_REG1, (uint8_t *)&counter_bdr_reg1, 1);
5350 switch (counter_bdr_reg1.trig_counter_bdr)
5351 {
5352 case LSM6DSV16B_XL_BATCH_EVENT:
5353 *val = LSM6DSV16B_XL_BATCH_EVENT;
5354 break;
5355
5356 case LSM6DSV16B_GY_BATCH_EVENT:
5357 *val = LSM6DSV16B_GY_BATCH_EVENT;
5358 break;
5359
5360 default:
5361 *val = LSM6DSV16B_XL_BATCH_EVENT;
5362 break;
5363 }
5364 return ret;
5365 }
5366
5367 /**
5368 * @brief Batching in FIFO buffer of SFLP.[set]
5369 *
5370 * @param ctx read / write interface definitions
5371 * @param val Batching in FIFO buffer of SFLP values.
5372 * @retval interface status (MANDATORY: return 0 -> no Error)
5373 *
5374 */
lsm6dsv16b_fifo_sflp_batch_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_sflp_raw_t val)5375 int32_t lsm6dsv16b_fifo_sflp_batch_set(const stmdev_ctx_t *ctx,
5376 lsm6dsv16b_fifo_sflp_raw_t val)
5377 {
5378 lsm6dsv16b_emb_func_fifo_en_a_t emb_func_fifo_en_a;
5379 int32_t ret;
5380
5381 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5382 if (ret == 0)
5383 {
5384 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
5385 emb_func_fifo_en_a.sflp_game_fifo_en = val.game_rotation;
5386 emb_func_fifo_en_a.sflp_gravity_fifo_en = val.gravity;
5387 emb_func_fifo_en_a.sflp_gbias_fifo_en = val.gbias;
5388 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A,
5389 (uint8_t *)&emb_func_fifo_en_a, 1);
5390 }
5391
5392 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5393
5394 return ret;
5395 }
5396
5397 /**
5398 * @brief Batching in FIFO buffer of SFLP.[get]
5399 *
5400 * @param ctx read / write interface definitions
5401 * @param val Batching in FIFO buffer of SFLP values.
5402 * @retval interface status (MANDATORY: return 0 -> no Error)
5403 *
5404 */
lsm6dsv16b_fifo_sflp_batch_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_sflp_raw_t * val)5405 int32_t lsm6dsv16b_fifo_sflp_batch_get(const stmdev_ctx_t *ctx,
5406 lsm6dsv16b_fifo_sflp_raw_t *val)
5407 {
5408 lsm6dsv16b_emb_func_fifo_en_a_t emb_func_fifo_en_a;
5409 int32_t ret;
5410
5411 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5412 if (ret == 0)
5413 {
5414 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
5415
5416 val->game_rotation = emb_func_fifo_en_a.sflp_game_fifo_en;
5417 val->gravity = emb_func_fifo_en_a.sflp_gravity_fifo_en;
5418 val->gbias = emb_func_fifo_en_a.sflp_gbias_fifo_en;
5419 }
5420
5421 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5422
5423 return ret;
5424 }
5425
5426 /**
5427 * @brief Status of FIFO.[get]
5428 *
5429 * @param ctx read / write interface definitions
5430 * @param val Status of FIFO (level and flags).
5431 * @retval interface status (MANDATORY: return 0 -> no Error)
5432 *
5433 */
lsm6dsv16b_fifo_status_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_status_t * val)5434 int32_t lsm6dsv16b_fifo_status_get(const stmdev_ctx_t *ctx,
5435 lsm6dsv16b_fifo_status_t *val)
5436 {
5437 uint8_t buff[2];
5438 lsm6dsv16b_fifo_status2_t status;
5439 int32_t ret;
5440
5441 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_STATUS1, (uint8_t *)&buff[0], 2);
5442 bytecpy((uint8_t *)&status, &buff[1]);
5443
5444 val->fifo_bdr = status.counter_bdr_ia;
5445 val->fifo_ovr = status.fifo_ovr_ia;
5446 val->fifo_full = status.fifo_full_ia;
5447 val->fifo_th = status.fifo_wtm_ia;
5448
5449 val->fifo_level = (uint16_t)buff[1] & 0x01U;
5450 val->fifo_level = (val->fifo_level * 256U) + buff[0];
5451
5452 return ret;
5453 }
5454
5455 /**
5456 * @brief FIFO data output[get]
5457 *
5458 * @param ctx read / write interface definitions
5459 * @param val lsm6dsv16b_fifo_out_raw_t enum
5460 * @retval interface status (MANDATORY: return 0 -> no Error)
5461 *
5462 */
lsm6dsv16b_fifo_out_raw_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fifo_out_raw_t * val)5463 int32_t lsm6dsv16b_fifo_out_raw_get(const stmdev_ctx_t *ctx,
5464 lsm6dsv16b_fifo_out_raw_t *val)
5465 {
5466 lsm6dsv16b_fifo_data_out_tag_t fifo_data_out_tag;
5467 uint8_t buff[7];
5468 int32_t ret;
5469
5470 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FIFO_DATA_OUT_TAG, buff, 7);
5471 bytecpy((uint8_t *)&fifo_data_out_tag, &buff[0]);
5472
5473 switch (fifo_data_out_tag.tag_sensor)
5474 {
5475 case LSM6DSV16B_FIFO_EMPTY:
5476 val->tag = LSM6DSV16B_FIFO_EMPTY;
5477 break;
5478
5479 case LSM6DSV16B_GY_NC_TAG:
5480 val->tag = LSM6DSV16B_GY_NC_TAG;
5481 break;
5482
5483 case LSM6DSV16B_XL_NC_TAG:
5484 val->tag = LSM6DSV16B_XL_NC_TAG;
5485 break;
5486
5487 case LSM6DSV16B_TIMESTAMP_TAG:
5488 val->tag = LSM6DSV16B_TIMESTAMP_TAG;
5489 break;
5490
5491 case LSM6DSV16B_TEMPERATURE_TAG:
5492 val->tag = LSM6DSV16B_TEMPERATURE_TAG;
5493 break;
5494
5495 case LSM6DSV16B_CFG_CHANGE_TAG:
5496 val->tag = LSM6DSV16B_CFG_CHANGE_TAG;
5497 break;
5498
5499 case LSM6DSV16B_XL_NC_T_2_TAG:
5500 val->tag = LSM6DSV16B_XL_NC_T_2_TAG;
5501 break;
5502
5503 case LSM6DSV16B_XL_NC_T_1_TAG:
5504 val->tag = LSM6DSV16B_XL_NC_T_1_TAG;
5505 break;
5506
5507 case LSM6DSV16B_XL_2XC_TAG:
5508 val->tag = LSM6DSV16B_XL_2XC_TAG;
5509 break;
5510
5511 case LSM6DSV16B_XL_3XC_TAG:
5512 val->tag = LSM6DSV16B_XL_3XC_TAG;
5513 break;
5514
5515 case LSM6DSV16B_GY_NC_T_2_TAG:
5516 val->tag = LSM6DSV16B_GY_NC_T_2_TAG;
5517 break;
5518
5519 case LSM6DSV16B_GY_NC_T_1_TAG:
5520 val->tag = LSM6DSV16B_GY_NC_T_1_TAG;
5521 break;
5522
5523 case LSM6DSV16B_GY_2XC_TAG:
5524 val->tag = LSM6DSV16B_GY_2XC_TAG;
5525 break;
5526
5527 case LSM6DSV16B_GY_3XC_TAG:
5528 val->tag = LSM6DSV16B_GY_3XC_TAG;
5529 break;
5530
5531 case LSM6DSV16B_STEP_COUNTER_TAG:
5532 val->tag = LSM6DSV16B_STEP_COUNTER_TAG;
5533 break;
5534
5535 case LSM6DSV16B_SFLP_GAME_ROTATION_VECTOR_TAG:
5536 val->tag = LSM6DSV16B_SFLP_GAME_ROTATION_VECTOR_TAG;
5537 break;
5538
5539 case LSM6DSV16B_SFLP_GYROSCOPE_BIAS_TAG:
5540 val->tag = LSM6DSV16B_SFLP_GYROSCOPE_BIAS_TAG;
5541 break;
5542
5543 case LSM6DSV16B_SFLP_GRAVITY_VECTOR_TAG:
5544 val->tag = LSM6DSV16B_SFLP_GRAVITY_VECTOR_TAG;
5545 break;
5546
5547 case LSM6DSV16B_XL_DUAL_CORE:
5548 val->tag = LSM6DSV16B_XL_DUAL_CORE;
5549 break;
5550
5551 default:
5552 val->tag = LSM6DSV16B_FIFO_EMPTY;
5553 break;
5554 }
5555
5556 val->cnt = fifo_data_out_tag.tag_cnt;
5557
5558 val->data[0] = buff[1];
5559 val->data[1] = buff[2];
5560 val->data[2] = buff[3];
5561 val->data[3] = buff[4];
5562 val->data[4] = buff[5];
5563 val->data[5] = buff[6];
5564
5565 return ret;
5566 }
5567
5568 /**
5569 * @brief Batching in FIFO buffer of step counter value.[set]
5570 *
5571 * @param ctx read / write interface definitions
5572 * @param val Batching in FIFO buffer of step counter value.
5573 * @retval interface status (MANDATORY: return 0 -> no Error)
5574 *
5575 */
lsm6dsv16b_fifo_stpcnt_batch_set(const stmdev_ctx_t * ctx,uint8_t val)5576 int32_t lsm6dsv16b_fifo_stpcnt_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
5577 {
5578 lsm6dsv16b_emb_func_fifo_en_a_t emb_func_fifo_en_a;
5579 int32_t ret;
5580
5581 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5582 if (ret == 0)
5583 {
5584 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
5585 }
5586
5587 if (ret == 0)
5588 {
5589 emb_func_fifo_en_a.step_counter_fifo_en = val;
5590 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
5591 }
5592
5593 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5594
5595 return ret;
5596 }
5597
5598 /**
5599 * @brief Batching in FIFO buffer of step counter value.[get]
5600 *
5601 * @param ctx read / write interface definitions
5602 * @param val Batching in FIFO buffer of step counter value.
5603 * @retval interface status (MANDATORY: return 0 -> no Error)
5604 *
5605 */
lsm6dsv16b_fifo_stpcnt_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)5606 int32_t lsm6dsv16b_fifo_stpcnt_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
5607 {
5608 lsm6dsv16b_emb_func_fifo_en_a_t emb_func_fifo_en_a;
5609 int32_t ret;
5610
5611 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5612 if (ret == 0)
5613 {
5614 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_FIFO_EN_A, (uint8_t *)&emb_func_fifo_en_a, 1);
5615 }
5616
5617 *val = emb_func_fifo_en_a.step_counter_fifo_en;
5618
5619 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5620
5621
5622 return ret;
5623 }
5624
5625 /**
5626 * @}
5627 *
5628 */
5629
5630 /**
5631 * @defgroup Step Counter
5632 * @brief This section groups all the functions that manage pedometer.
5633 * @{
5634 *
5635 */
5636
5637 /**
5638 * @brief Step counter mode[set]
5639 *
5640 * @param ctx read / write interface definitions
5641 * @param val false_step_rej, step_counter, step_detector,
5642 * @retval interface status (MANDATORY: return 0 -> no Error)
5643 *
5644 */
lsm6dsv16b_stpcnt_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_stpcnt_mode_t val)5645 int32_t lsm6dsv16b_stpcnt_mode_set(const stmdev_ctx_t *ctx,
5646 lsm6dsv16b_stpcnt_mode_t val)
5647 {
5648 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
5649 lsm6dsv16b_emb_func_en_b_t emb_func_en_b;
5650 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
5651 int32_t ret;
5652
5653 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5654 if (ret == 0)
5655 {
5656 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5657 }
5658 if (ret == 0)
5659 {
5660 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
5661 }
5662 if (ret == 0)
5663 {
5664 emb_func_en_a.pedo_en = val.step_counter_enable;
5665 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5666 }
5667
5668 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5669
5670 if (ret == 0)
5671 {
5672 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
5673 }
5674 if (ret == 0)
5675 {
5676 pedo_cmd_reg.fp_rejection_en = val.false_step_rej;
5677 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
5678 }
5679
5680 return ret;
5681 }
5682
5683 /**
5684 * @brief Step counter mode[get]
5685 *
5686 * @param ctx read / write interface definitions
5687 * @param val false_step_rej, step_counter, step_detector,
5688 * @retval interface status (MANDATORY: return 0 -> no Error)
5689 *
5690 */
lsm6dsv16b_stpcnt_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_stpcnt_mode_t * val)5691 int32_t lsm6dsv16b_stpcnt_mode_get(const stmdev_ctx_t *ctx,
5692 lsm6dsv16b_stpcnt_mode_t *val)
5693 {
5694 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
5695 lsm6dsv16b_pedo_cmd_reg_t pedo_cmd_reg;
5696 int32_t ret;
5697
5698 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5699 if (ret == 0)
5700 {
5701 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5702 }
5703
5704 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5705
5706 if (ret == 0)
5707 {
5708 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_CMD_REG, (uint8_t *)&pedo_cmd_reg, 1);
5709 }
5710 val->false_step_rej = pedo_cmd_reg.fp_rejection_en;
5711 val->step_counter_enable = emb_func_en_a.pedo_en;
5712
5713 return ret;
5714 }
5715
5716 /**
5717 * @brief Step counter output, number of detected steps.[get]
5718 *
5719 * @param ctx read / write interface definitions
5720 * @param val Step counter output, number of detected steps.
5721 * @retval interface status (MANDATORY: return 0 -> no Error)
5722 *
5723 */
lsm6dsv16b_stpcnt_steps_get(const stmdev_ctx_t * ctx,uint16_t * val)5724 int32_t lsm6dsv16b_stpcnt_steps_get(const stmdev_ctx_t *ctx, uint16_t *val)
5725 {
5726 uint8_t buff[2];
5727 int32_t ret;
5728
5729 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5730 if (ret == 0)
5731 {
5732 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_STEP_COUNTER_L, &buff[0], 2);
5733 }
5734
5735 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5736
5737 *val = buff[1];
5738 *val = (*val * 256U) + buff[0];
5739
5740 return ret;
5741 }
5742
5743 /**
5744 * @brief Reset step counter.[set]
5745 *
5746 * @param ctx read / write interface definitions
5747 * @param val Reset step counter.
5748 * @retval interface status (MANDATORY: return 0 -> no Error)
5749 *
5750 */
lsm6dsv16b_stpcnt_rst_step_set(const stmdev_ctx_t * ctx,uint8_t val)5751 int32_t lsm6dsv16b_stpcnt_rst_step_set(const stmdev_ctx_t *ctx, uint8_t val)
5752 {
5753 lsm6dsv16b_emb_func_src_t emb_func_src;
5754 int32_t ret;
5755
5756 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5757 if (ret == 0)
5758 {
5759 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
5760 }
5761
5762 if (ret == 0)
5763 {
5764 emb_func_src.pedo_rst_step = val;
5765 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
5766 }
5767
5768 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5769
5770 return ret;
5771 }
5772
5773 /**
5774 * @brief Reset step counter.[get]
5775 *
5776 * @param ctx read / write interface definitions
5777 * @param val Reset step counter.
5778 * @retval interface status (MANDATORY: return 0 -> no Error)
5779 *
5780 */
lsm6dsv16b_stpcnt_rst_step_get(const stmdev_ctx_t * ctx,uint8_t * val)5781 int32_t lsm6dsv16b_stpcnt_rst_step_get(const stmdev_ctx_t *ctx, uint8_t *val)
5782 {
5783 lsm6dsv16b_emb_func_src_t emb_func_src;
5784 int32_t ret;
5785
5786 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5787 if (ret == 0)
5788 {
5789 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_SRC, (uint8_t *)&emb_func_src, 1);
5790 }
5791
5792 *val = emb_func_src.pedo_rst_step;
5793
5794 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5795
5796 return ret;
5797 }
5798
5799 /**
5800 * @brief Pedometer debounce configuration.[set]
5801 *
5802 * @param ctx read / write interface definitions
5803 * @param val Pedometer debounce configuration.
5804 * @retval interface status (MANDATORY: return 0 -> no Error)
5805 *
5806 */
lsm6dsv16b_stpcnt_debounce_set(const stmdev_ctx_t * ctx,uint8_t val)5807 int32_t lsm6dsv16b_stpcnt_debounce_set(const stmdev_ctx_t *ctx, uint8_t val)
5808 {
5809 lsm6dsv16b_pedo_deb_steps_conf_t pedo_deb_steps_conf;
5810 int32_t ret;
5811
5812 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_DEB_STEPS_CONF, (uint8_t *)&pedo_deb_steps_conf,
5813 1);
5814 if (ret == 0)
5815 {
5816 pedo_deb_steps_conf.deb_step = val;
5817 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_PEDO_DEB_STEPS_CONF, (uint8_t *)&pedo_deb_steps_conf,
5818 1);
5819 }
5820
5821 return ret;
5822 }
5823
5824 /**
5825 * @brief Pedometer debounce configuration.[get]
5826 *
5827 * @param ctx read / write interface definitions
5828 * @param val Pedometer debounce configuration.
5829 * @retval interface status (MANDATORY: return 0 -> no Error)
5830 *
5831 */
lsm6dsv16b_stpcnt_debounce_get(const stmdev_ctx_t * ctx,uint8_t * val)5832 int32_t lsm6dsv16b_stpcnt_debounce_get(const stmdev_ctx_t *ctx, uint8_t *val)
5833 {
5834 lsm6dsv16b_pedo_deb_steps_conf_t pedo_deb_steps_conf;
5835 int32_t ret;
5836
5837 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_DEB_STEPS_CONF, (uint8_t *)&pedo_deb_steps_conf,
5838 1);
5839 *val = pedo_deb_steps_conf.deb_step;
5840
5841 return ret;
5842 }
5843
5844 /**
5845 * @brief Time period register for step detection on delta time.[set]
5846 *
5847 * @param ctx read / write interface definitions
5848 * @param val Time period register for step detection on delta time.
5849 * @retval interface status (MANDATORY: return 0 -> no Error)
5850 *
5851 */
lsm6dsv16b_stpcnt_period_set(const stmdev_ctx_t * ctx,uint16_t val)5852 int32_t lsm6dsv16b_stpcnt_period_set(const stmdev_ctx_t *ctx, uint16_t val)
5853 {
5854 uint8_t buff[2];
5855 int32_t ret;
5856
5857 buff[1] = (uint8_t)(val / 256U);
5858 buff[0] = (uint8_t)(val - (buff[1] * 256U));
5859
5860 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_PEDO_SC_DELTAT_L, (uint8_t *)&buff[0], 2);
5861
5862 return ret;
5863 }
5864
5865 /**
5866 * @brief Time period register for step detection on delta time.[get]
5867 *
5868 * @param ctx read / write interface definitions
5869 * @param val Time period register for step detection on delta time.
5870 * @retval interface status (MANDATORY: return 0 -> no Error)
5871 *
5872 */
lsm6dsv16b_stpcnt_period_get(const stmdev_ctx_t * ctx,uint16_t * val)5873 int32_t lsm6dsv16b_stpcnt_period_get(const stmdev_ctx_t *ctx, uint16_t *val)
5874 {
5875 uint8_t buff[2];
5876 int32_t ret;
5877
5878 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_PEDO_SC_DELTAT_L, &buff[0], 2);
5879 *val = buff[1];
5880 *val = (*val * 256U) + buff[0];
5881
5882 return ret;
5883 }
5884
5885 /**
5886 * @}
5887 *
5888 */
5889
5890 /**
5891 * @defgroup Significant motion
5892 * @brief This section groups all the functions that manage the
5893 * significant motion detection.
5894 * @{
5895 *
5896 */
5897
5898 /**
5899 * @brief Enables significant motion detection function.[set]
5900 *
5901 * @param ctx read / write interface definitions
5902 * @param val Enables significant motion detection function.
5903 * @retval interface status (MANDATORY: return 0 -> no Error)
5904 *
5905 */
lsm6dsv16b_sigmot_mode_set(const stmdev_ctx_t * ctx,uint8_t val)5906 int32_t lsm6dsv16b_sigmot_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
5907 {
5908 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
5909 int32_t ret;
5910
5911 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5912 if (ret == 0)
5913 {
5914 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5915 }
5916 if (ret == 0)
5917 {
5918 emb_func_en_a.sign_motion_en = val;
5919 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5920 }
5921
5922 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5923
5924
5925 return ret;
5926 }
5927
5928 /**
5929 * @brief Enables significant motion detection function.[get]
5930 *
5931 * @param ctx read / write interface definitions
5932 * @param val Enables significant motion detection function.
5933 * @retval interface status (MANDATORY: return 0 -> no Error)
5934 *
5935 */
lsm6dsv16b_sigmot_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)5936 int32_t lsm6dsv16b_sigmot_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
5937 {
5938 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
5939 int32_t ret;
5940
5941 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5942 if (ret == 0)
5943 {
5944 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5945 }
5946 *val = emb_func_en_a.sign_motion_en;
5947
5948 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5949
5950
5951 return ret;
5952 }
5953
5954 /**
5955 * @}
5956 *
5957 */
5958
5959 /**
5960 * @defgroup Tilt detection
5961 * @brief This section groups all the functions that manage the tilt
5962 * event detection.
5963 * @{
5964 *
5965 */
5966
5967 /**
5968 * @brief Tilt calculation.[set]
5969 *
5970 * @param ctx read / write interface definitions
5971 * @param val Tilt calculation.
5972 * @retval interface status (MANDATORY: return 0 -> no Error)
5973 *
5974 */
lsm6dsv16b_tilt_mode_set(const stmdev_ctx_t * ctx,uint8_t val)5975 int32_t lsm6dsv16b_tilt_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
5976 {
5977 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
5978 int32_t ret;
5979
5980 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
5981 if (ret == 0)
5982 {
5983 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5984 }
5985 if (ret == 0)
5986 {
5987 emb_func_en_a.tilt_en = val;
5988 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
5989 }
5990
5991 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
5992
5993 return ret;
5994 }
5995
5996 /**
5997 * @brief Tilt calculation.[get]
5998 *
5999 * @param ctx read / write interface definitions
6000 * @param val Tilt calculation.
6001 * @retval interface status (MANDATORY: return 0 -> no Error)
6002 *
6003 */
lsm6dsv16b_tilt_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)6004 int32_t lsm6dsv16b_tilt_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
6005 {
6006 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
6007 int32_t ret;
6008
6009 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6010 if (ret == 0)
6011 {
6012 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
6013 }
6014 *val = emb_func_en_a.tilt_en;
6015
6016 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6017
6018 return ret;
6019 }
6020
6021 /**
6022 * @}
6023 *
6024 */
6025
6026 /**
6027 * @defgroup Sensor Fusion Low Power (SFLP)
6028 * @brief This section groups all the functions that manage pedometer.
6029 * @{
6030 *
6031 */
6032
6033 /**
6034 * @brief Enable SFLP Game Rotation Vector (6x).[set]
6035 *
6036 * @param ctx read / write interface definitions
6037 * @param val Enable/Disable game rotation value (0/1).
6038 * @retval interface status (MANDATORY: return 0 -> no Error)
6039 *
6040 */
lsm6dsv16b_sflp_game_rotation_set(const stmdev_ctx_t * ctx,uint16_t val)6041 int32_t lsm6dsv16b_sflp_game_rotation_set(const stmdev_ctx_t *ctx, uint16_t val)
6042 {
6043 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
6044 int32_t ret;
6045
6046 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6047 if (ret == 0)
6048 {
6049 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
6050 emb_func_en_a.sflp_game_en = val;
6051 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A,
6052 (uint8_t *)&emb_func_en_a, 1);
6053 }
6054
6055 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6056
6057 return ret;
6058 }
6059
6060 /**
6061 * @brief Enable SFLP Game Rotation Vector (6x).[get]
6062 *
6063 * @param ctx read / write interface definitions
6064 * @param val Enable/Disable game rotation value (0/1).
6065 * @retval interface status (MANDATORY: return 0 -> no Error)
6066 *
6067 */
lsm6dsv16b_sflp_game_rotation_get(const stmdev_ctx_t * ctx,uint16_t * val)6068 int32_t lsm6dsv16b_sflp_game_rotation_get(const stmdev_ctx_t *ctx, uint16_t *val)
6069 {
6070 lsm6dsv16b_emb_func_en_a_t emb_func_en_a;
6071 int32_t ret;
6072
6073 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6074 if (ret == 0)
6075 {
6076 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, (uint8_t *)&emb_func_en_a, 1);
6077 *val = emb_func_en_a.sflp_game_en;
6078 }
6079
6080 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6081
6082 return ret;
6083 }
6084
6085 /**
6086 * @brief SFLP Data Rate (ODR) configuration.[set]
6087 *
6088 * @param ctx read / write interface definitions
6089 * @param val SFLP_15Hz, SFLP_30Hz, SFLP_60Hz, SFLP_120Hz, SFLP_240Hz, SFLP_480Hz
6090 * @retval interface status (MANDATORY: return 0 -> no Error)
6091 *
6092 */
lsm6dsv16b_sflp_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16b_sflp_data_rate_t val)6093 int32_t lsm6dsv16b_sflp_data_rate_set(const stmdev_ctx_t *ctx,
6094 lsm6dsv16b_sflp_data_rate_t val)
6095 {
6096 lsm6dsv16b_sflp_odr_t sflp_odr;
6097 int32_t ret;
6098
6099 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6100 if (ret == 0)
6101 {
6102 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_SFLP_ODR, (uint8_t *)&sflp_odr, 1);
6103 sflp_odr.sflp_game_odr = (uint8_t)val & 0x07U;
6104 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_SFLP_ODR, (uint8_t *)&sflp_odr,
6105 1);
6106 }
6107
6108 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6109
6110 return ret;
6111 }
6112
6113 /**
6114 * @brief SFLP Data Rate (ODR) configuration.[get]
6115 *
6116 * @param ctx read / write interface definitions
6117 * @param val SFLP_15Hz, SFLP_30Hz, SFLP_60Hz, SFLP_120Hz, SFLP_240Hz, SFLP_480Hz
6118 * @retval interface status (MANDATORY: return 0 -> no Error)
6119 *
6120 */
lsm6dsv16b_sflp_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16b_sflp_data_rate_t * val)6121 int32_t lsm6dsv16b_sflp_data_rate_get(const stmdev_ctx_t *ctx,
6122 lsm6dsv16b_sflp_data_rate_t *val)
6123 {
6124 lsm6dsv16b_sflp_odr_t sflp_odr;
6125 int32_t ret;
6126
6127 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6128 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_SFLP_ODR, (uint8_t *)&sflp_odr, 1);
6129 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6130
6131 switch (sflp_odr.sflp_game_odr)
6132 {
6133 case LSM6DSV16B_SFLP_15Hz:
6134 *val = LSM6DSV16B_SFLP_15Hz;
6135 break;
6136
6137 case LSM6DSV16B_SFLP_30Hz:
6138 *val = LSM6DSV16B_SFLP_30Hz;
6139 break;
6140
6141 case LSM6DSV16B_SFLP_60Hz:
6142 *val = LSM6DSV16B_SFLP_60Hz;
6143 break;
6144
6145 case LSM6DSV16B_SFLP_120Hz:
6146 *val = LSM6DSV16B_SFLP_120Hz;
6147 break;
6148
6149 case LSM6DSV16B_SFLP_240Hz:
6150 *val = LSM6DSV16B_SFLP_240Hz;
6151 break;
6152
6153 case LSM6DSV16B_SFLP_480Hz:
6154 *val = LSM6DSV16B_SFLP_480Hz;
6155 break;
6156
6157 default:
6158 *val = LSM6DSV16B_SFLP_15Hz;
6159 break;
6160 }
6161 return ret;
6162 }
6163
6164 /*
6165 * Original conversion routines taken from: https://github.com/numpy/numpy
6166 *
6167 * uint16_t npy_floatbits_to_halfbits(uint32_t f);
6168 * uint16_t npy_float_to_half(float_t f);
6169 *
6170 * Released under BSD-3-Clause License
6171 */
6172
6173 #define NPY_HALF_GENERATE_OVERFLOW 0 /* do not trigger FP overflow */
6174 #define NPY_HALF_GENERATE_UNDERFLOW 0 /* do not trigger FP underflow */
6175 #ifndef NPY_HALF_ROUND_TIES_TO_EVEN
6176 #define NPY_HALF_ROUND_TIES_TO_EVEN 1
6177 #endif
6178
npy_floatbits_to_halfbits(uint32_t f)6179 static uint16_t npy_floatbits_to_halfbits(uint32_t f)
6180 {
6181 uint32_t f_exp, f_sig;
6182 uint16_t h_sgn, h_exp, h_sig;
6183
6184 h_sgn = (uint16_t)((f & 0x80000000u) >> 16);
6185 f_exp = (f & 0x7f800000u);
6186
6187 /* Exponent overflow/NaN converts to signed inf/NaN */
6188 if (f_exp >= 0x47800000u)
6189 {
6190 if (f_exp == 0x7f800000u)
6191 {
6192 /* Inf or NaN */
6193 f_sig = (f & 0x007fffffu);
6194 if (f_sig != 0)
6195 {
6196 /* NaN - propagate the flag in the significand... */
6197 uint16_t ret = (uint16_t)(0x7c00u + (f_sig >> 13));
6198 /* ...but make sure it stays a NaN */
6199 if (ret == 0x7c00u)
6200 {
6201 ret++;
6202 }
6203 return h_sgn + ret;
6204 }
6205 else
6206 {
6207 /* signed inf */
6208 return (uint16_t)(h_sgn + 0x7c00u);
6209 }
6210 }
6211 else
6212 {
6213 /* overflow to signed inf */
6214 #if NPY_HALF_GENERATE_OVERFLOW
6215 npy_set_floatstatus_overflow();
6216 #endif
6217 return (uint16_t)(h_sgn + 0x7c00u);
6218 }
6219 }
6220
6221 /* Exponent underflow converts to a subnormal half or signed zero */
6222 if (f_exp <= 0x38000000u)
6223 {
6224 /*
6225 * Signed zeros, subnormal floats, and floats with small
6226 * exponents all convert to signed zero half-floats.
6227 */
6228 if (f_exp < 0x33000000u)
6229 {
6230 #if NPY_HALF_GENERATE_UNDERFLOW
6231 /* If f != 0, it underflowed to 0 */
6232 if ((f & 0x7fffffff) != 0)
6233 {
6234 npy_set_floatstatus_underflow();
6235 }
6236 #endif
6237 return h_sgn;
6238 }
6239 /* Make the subnormal significand */
6240 f_exp >>= 23;
6241 f_sig = (0x00800000u + (f & 0x007fffffu));
6242 #if NPY_HALF_GENERATE_UNDERFLOW
6243 /* If it's not exactly represented, it underflowed */
6244 if ((f_sig & (((uint32_t)1 << (126 - f_exp)) - 1)) != 0)
6245 {
6246 npy_set_floatstatus_underflow();
6247 }
6248 #endif
6249 /*
6250 * Usually the significand is shifted by 13. For subnormals an
6251 * additional shift needs to occur. This shift is one for the largest
6252 * exponent giving a subnormal `f_exp = 0x38000000 >> 23 = 112`, which
6253 * offsets the new first bit. At most the shift can be 1+10 bits.
6254 */
6255 f_sig >>= (113 - f_exp);
6256 /* Handle rounding by adding 1 to the bit beyond half precision */
6257 #if NPY_HALF_ROUND_TIES_TO_EVEN
6258 /*
6259 * If the last bit in the half significand is 0 (already even), and
6260 * the remaining bit pattern is 1000...0, then we do not add one
6261 * to the bit after the half significand. However, the (113 - f_exp)
6262 * shift can lose up to 11 bits, so the || checks them in the original.
6263 * In all other cases, we can just add one.
6264 */
6265 if (((f_sig & 0x00003fffu) != 0x00001000u) || (f & 0x000007ffu))
6266 {
6267 f_sig += 0x00001000u;
6268 }
6269 #else
6270 f_sig += 0x00001000u;
6271 #endif
6272 h_sig = (uint16_t)(f_sig >> 13);
6273 /*
6274 * If the rounding causes a bit to spill into h_exp, it will
6275 * increment h_exp from zero to one and h_sig will be zero.
6276 * This is the correct result.
6277 */
6278 return (uint16_t)(h_sgn + h_sig);
6279 }
6280
6281 /* Regular case with no overflow or underflow */
6282 h_exp = (uint16_t)((f_exp - 0x38000000u) >> 13);
6283 /* Handle rounding by adding 1 to the bit beyond half precision */
6284 f_sig = (f & 0x007fffffu);
6285 #if NPY_HALF_ROUND_TIES_TO_EVEN
6286 /*
6287 * If the last bit in the half significand is 0 (already even), and
6288 * the remaining bit pattern is 1000...0, then we do not add one
6289 * to the bit after the half significand. In all other cases, we do.
6290 */
6291 if ((f_sig & 0x00003fffu) != 0x00001000u)
6292 {
6293 f_sig += 0x00001000u;
6294 }
6295 #else
6296 f_sig += 0x00001000u;
6297 #endif
6298 h_sig = (uint16_t)(f_sig >> 13);
6299 /*
6300 * If the rounding causes a bit to spill into h_exp, it will
6301 * increment h_exp by one and h_sig will be zero. This is the
6302 * correct result. h_exp may increment to 15, at greatest, in
6303 * which case the result overflows to a signed inf.
6304 */
6305 #if NPY_HALF_GENERATE_OVERFLOW
6306 h_sig += h_exp;
6307 if (h_sig == 0x7c00u)
6308 {
6309 npy_set_floatstatus_overflow();
6310 }
6311 return h_sgn + h_sig;
6312 #else
6313 return h_sgn + h_exp + h_sig;
6314 #endif
6315 }
6316
npy_float_to_half(float_t f)6317 static uint16_t npy_float_to_half(float_t f)
6318 {
6319 union
6320 {
6321 float_t f;
6322 uint32_t fbits;
6323 } conv;
6324 conv.f = f;
6325 return npy_floatbits_to_halfbits(conv.fbits);
6326 }
6327
6328 /**
6329 * @brief SFLP GBIAS value. The register value is expressed as half-precision
6330 * floating-point format: SEEEEEFFFFFFFFFF (S: 1 sign bit; E: 5 exponent
6331 * bits; F: 10 fraction bits).[set]
6332 *
6333 * @param ctx read / write interface definitions
6334 * @param val GBIAS x/y/z val.
6335 * @retval interface status (MANDATORY: return 0 -> no Error)
6336 *
6337 */
lsm6dsv16b_sflp_game_gbias_set(const stmdev_ctx_t * ctx,lsm6dsv16b_sflp_gbias_t * val)6338 int32_t lsm6dsv16b_sflp_game_gbias_set(const stmdev_ctx_t *ctx,
6339 lsm6dsv16b_sflp_gbias_t *val)
6340 {
6341 lsm6dsv16b_sflp_data_rate_t sflp_odr;
6342 lsm6dsv16b_emb_func_exec_status_t emb_func_sts;
6343 lsm6dsv16b_data_ready_t drdy;
6344 lsm6dsv16b_xl_full_scale_t xl_fs;
6345 lsm6dsv16b_ctrl10_t ctrl10;
6346 uint8_t master_config;
6347 uint8_t emb_func_en_saved[2];
6348 uint8_t conf_saved[2];
6349 uint8_t reg_zero[2] = {0x0, 0x0};
6350 uint16_t gbias_hf[3];
6351 float_t k = 0.005f;
6352 int16_t xl_data[3];
6353 int32_t data_tmp;
6354 uint8_t *data_ptr = (uint8_t *)&data_tmp;
6355 uint8_t i, j;
6356 int32_t ret;
6357
6358 ret = lsm6dsv16b_sflp_data_rate_get(ctx, &sflp_odr);
6359 if (ret != 0)
6360 {
6361 return ret;
6362 }
6363
6364 /* Calculate k factor */
6365 switch (sflp_odr)
6366 {
6367 case LSM6DSV16B_SFLP_15Hz:
6368 k = 0.04f;
6369 break;
6370 case LSM6DSV16B_SFLP_30Hz:
6371 k = 0.02f;
6372 break;
6373 case LSM6DSV16B_SFLP_60Hz:
6374 k = 0.01f;
6375 break;
6376 case LSM6DSV16B_SFLP_120Hz:
6377 k = 0.005f;
6378 break;
6379 case LSM6DSV16B_SFLP_240Hz:
6380 k = 0.0025f;
6381 break;
6382 case LSM6DSV16B_SFLP_480Hz:
6383 k = 0.00125f;
6384 break;
6385 }
6386
6387 /* compute gbias as half precision float in order to be put in embedded advanced feature register */
6388 gbias_hf[0] = npy_float_to_half(val->gbias_x * (3.14159265358979323846f / 180.0f) / k);
6389 gbias_hf[1] = npy_float_to_half(val->gbias_y * (3.14159265358979323846f / 180.0f) / k);
6390 gbias_hf[2] = npy_float_to_half(val->gbias_z * (3.14159265358979323846f / 180.0f) / k);
6391
6392 /* Save sensor configuration and set high-performance mode (if the sensor is in power-down mode, turn it on) */
6393 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL1, conf_saved, 2);
6394 ret += lsm6dsv16b_xl_mode_set(ctx, LSM6DSV16B_XL_HIGH_PERFORMANCE_MD);
6395 ret += lsm6dsv16b_gy_mode_set(ctx, LSM6DSV16B_GY_HIGH_PERFORMANCE_MD);
6396 if ((conf_saved[0] & 0x0FU) == LSM6DSV16B_XL_ODR_OFF)
6397 {
6398 ret += lsm6dsv16b_xl_data_rate_set(ctx, LSM6DSV16B_XL_ODR_AT_120Hz);
6399 }
6400
6401 /* disable algos */
6402 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6403 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, emb_func_en_saved,
6404 2);
6405 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, reg_zero, 2);
6406 do
6407 {
6408 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EXEC_STATUS,
6409 (uint8_t *)&emb_func_sts, 1);
6410 } while (emb_func_sts.emb_func_endop != 1);
6411 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6412
6413 // enable gbias setting
6414 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
6415 ctrl10.emb_func_debug = 1;
6416 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
6417
6418 /* enable algos */
6419 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6420 emb_func_en_saved[0] |= 0x02; /* force SFLP GAME en */
6421 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_A, emb_func_en_saved,
6422 2);
6423 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6424
6425 ret += lsm6dsv16b_xl_full_scale_get(ctx, &xl_fs);
6426
6427 /* Read XL data */
6428 do
6429 {
6430 ret += lsm6dsv16b_flag_data_ready_get(ctx, &drdy);
6431 } while (drdy.drdy_xl != 1);
6432 ret += lsm6dsv16b_acceleration_raw_get(ctx, xl_data);
6433
6434 /* force sflp initialization */
6435 master_config = 0x40;
6436 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, &master_config,
6437 1);
6438 for (i = 0; i < 3; i++)
6439 {
6440 j = 0;
6441 data_tmp = (int32_t)xl_data[i];
6442 data_tmp <<= xl_fs; // shift based on current fs
6443 ret += lsm6dsv16b_write_reg(ctx, 0x02 + 3 * i, &data_ptr[j++], 1);
6444 ret += lsm6dsv16b_write_reg(ctx, 0x03 + 3 * i, &data_ptr[j++], 1);
6445 ret += lsm6dsv16b_write_reg(ctx, 0x04 + 3 * i, &data_ptr[j], 1);
6446 }
6447 for (i = 0; i < 3; i++)
6448 {
6449 j = 0;
6450 data_tmp = 0;
6451 ret += lsm6dsv16b_write_reg(ctx, 0x0B + 3 * i, &data_ptr[j++], 1);
6452 ret += lsm6dsv16b_write_reg(ctx, 0x0C + 3 * i, &data_ptr[j++], 1);
6453 ret += lsm6dsv16b_write_reg(ctx, 0x0D + 3 * i, &data_ptr[j], 1);
6454 }
6455 master_config = 0x00;
6456 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, &master_config,
6457 1);
6458
6459 // wait end_op (and at least 30 us)
6460 ctx->mdelay(1);
6461 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6462 do
6463 {
6464 ret += lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EXEC_STATUS,
6465 (uint8_t *)&emb_func_sts, 1);
6466 } while (emb_func_sts.emb_func_endop != 1);
6467 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6468
6469 /* write gbias in embedded advanced features registers */
6470 ret += lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_SFLP_GAME_GBIASX_L,
6471 (uint8_t *)gbias_hf, 6);
6472
6473 /* reload previous sensor configuration */
6474 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL1, conf_saved, 2);
6475
6476 // disable gbias setting
6477 ctrl10.emb_func_debug = 0;
6478 ret += lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL10, (uint8_t *)&ctrl10, 1);
6479
6480 return ret;
6481 }
6482
6483 /**
6484 * @brief SFLP initial configuration [set]
6485 *
6486 * @param ctx read / write interface definitions
6487 * @retval interface status (MANDATORY: return 0 -> no Error)
6488 *
6489 */
lsm6dsv16b_sflp_configure(const stmdev_ctx_t * ctx)6490 int32_t lsm6dsv16b_sflp_configure(const stmdev_ctx_t *ctx)
6491 {
6492 uint8_t val = 0x50;
6493 int32_t ret;
6494
6495 ret = lsm6dsv16b_ln_pg_write(ctx, 0xD2, &val, 1);
6496
6497 return ret;
6498 }
6499
6500 /**
6501 * @}
6502 *
6503 */
6504
6505 /**
6506 * @defgroup Finite State Machine (FSM)
6507 * @brief This section groups all the functions that manage the
6508 * state_machine.
6509 * @{
6510 *
6511 */
6512
6513 /**
6514 * @brief Enables the control of the CTRL registers to FSM (FSM can change some configurations of the device autonomously).[set]
6515 *
6516 * @param ctx read / write interface definitions
6517 * @param val PROTECT_CTRL_REGS, WRITE_CTRL_REG,
6518 * @retval interface status (MANDATORY: return 0 -> no Error)
6519 *
6520 */
lsm6dsv16b_fsm_permission_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_permission_t val)6521 int32_t lsm6dsv16b_fsm_permission_set(const stmdev_ctx_t *ctx,
6522 lsm6dsv16b_fsm_permission_t val)
6523 {
6524 lsm6dsv16b_func_cfg_access_t func_cfg_access;
6525 int32_t ret;
6526
6527 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
6528 if (ret == 0)
6529 {
6530 func_cfg_access.fsm_wr_ctrl_en = (uint8_t)val & 0x01U;
6531 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
6532 }
6533
6534 return ret;
6535 }
6536
6537 /**
6538 * @brief Enables the control of the CTRL registers to FSM (FSM can change some configurations of the device autonomously).[get]
6539 *
6540 * @param ctx read / write interface definitions
6541 * @param val PROTECT_CTRL_REGS, WRITE_CTRL_REG,
6542 * @retval interface status (MANDATORY: return 0 -> no Error)
6543 *
6544 */
lsm6dsv16b_fsm_permission_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_permission_t * val)6545 int32_t lsm6dsv16b_fsm_permission_get(const stmdev_ctx_t *ctx,
6546 lsm6dsv16b_fsm_permission_t *val)
6547 {
6548 lsm6dsv16b_func_cfg_access_t func_cfg_access;
6549 int32_t ret;
6550
6551 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);
6552 switch (func_cfg_access.fsm_wr_ctrl_en)
6553 {
6554 case LSM6DSV16B_PROTECT_CTRL_REGS:
6555 *val = LSM6DSV16B_PROTECT_CTRL_REGS;
6556 break;
6557
6558 case LSM6DSV16B_WRITE_CTRL_REG:
6559 *val = LSM6DSV16B_WRITE_CTRL_REG;
6560 break;
6561
6562 default:
6563 *val = LSM6DSV16B_PROTECT_CTRL_REGS;
6564 break;
6565 }
6566 return ret;
6567 }
6568
6569 /**
6570 * @brief Return the status of the CTRL registers permission (standard interface vs FSM).[get]
6571 *
6572 * @param ctx read / write interface definitions
6573 * @param val 0: all FSM regs are under std_if control, 1: some regs are under FSM control.
6574 * @retval interface status (MANDATORY: return 0 -> no Error)
6575 *
6576 */
lsm6dsv16b_fsm_permission_status(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_permission_status_t * val)6577 int32_t lsm6dsv16b_fsm_permission_status(const stmdev_ctx_t *ctx,
6578 lsm6dsv16b_fsm_permission_status_t *val)
6579 {
6580 lsm6dsv16b_ctrl_status_t status;
6581 int32_t ret;
6582
6583 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL_STATUS, (uint8_t *)&status, 1);
6584 *val = (status.fsm_wr_ctrl_status == 0) ? LSM6DSV16B_STD_IF_CONTROL : LSM6DSV16B_FSM_CONTROL;
6585
6586 return ret;
6587 }
6588
6589 /**
6590 * @brief Enable Finite State Machine (FSM) feature.[set]
6591 *
6592 * @param ctx read / write interface definitions
6593 * @param val Enable Finite State Machine (FSM) feature.
6594 * @retval interface status (MANDATORY: return 0 -> no Error)
6595 *
6596 */
lsm6dsv16b_fsm_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_mode_t val)6597 int32_t lsm6dsv16b_fsm_mode_set(const stmdev_ctx_t *ctx, lsm6dsv16b_fsm_mode_t val)
6598 {
6599 lsm6dsv16b_emb_func_en_b_t emb_func_en_b;
6600 lsm6dsv16b_fsm_enable_t fsm_enable;
6601 int32_t ret;
6602
6603 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6604 if (ret == 0)
6605 {
6606 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
6607 }
6608 if (ret == 0)
6609 {
6610 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6611 }
6612 if ((val.fsm1_en | val.fsm2_en | val.fsm1_en | val.fsm1_en
6613 | val.fsm1_en | val.fsm2_en | val.fsm1_en | val.fsm1_en) == PROPERTY_ENABLE)
6614 {
6615 emb_func_en_b.fsm_en = PROPERTY_ENABLE;
6616 }
6617 else
6618 {
6619 emb_func_en_b.fsm_en = PROPERTY_DISABLE;
6620 }
6621 if (ret == 0)
6622 {
6623 fsm_enable.fsm1_en = val.fsm1_en;
6624 fsm_enable.fsm2_en = val.fsm2_en;
6625 fsm_enable.fsm3_en = val.fsm3_en;
6626 fsm_enable.fsm4_en = val.fsm4_en;
6627 fsm_enable.fsm5_en = val.fsm5_en;
6628 fsm_enable.fsm6_en = val.fsm6_en;
6629 fsm_enable.fsm7_en = val.fsm7_en;
6630 fsm_enable.fsm8_en = val.fsm8_en;
6631 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6632 }
6633 if (ret == 0)
6634 {
6635 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_EMB_FUNC_EN_B, (uint8_t *)&emb_func_en_b, 1);
6636 }
6637
6638 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6639
6640 return ret;
6641 }
6642
6643 /**
6644 * @brief Enable Finite State Machine (FSM) feature.[get]
6645 *
6646 * @param ctx read / write interface definitions
6647 * @param val Enable Finite State Machine (FSM) feature.
6648 * @retval interface status (MANDATORY: return 0 -> no Error)
6649 *
6650 */
lsm6dsv16b_fsm_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_mode_t * val)6651 int32_t lsm6dsv16b_fsm_mode_get(const stmdev_ctx_t *ctx, lsm6dsv16b_fsm_mode_t *val)
6652 {
6653 lsm6dsv16b_fsm_enable_t fsm_enable;
6654 int32_t ret;
6655
6656 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6657 if (ret == 0)
6658 {
6659 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_ENABLE, (uint8_t *)&fsm_enable, 1);
6660 }
6661
6662 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6663
6664 val->fsm1_en = fsm_enable.fsm1_en;
6665 val->fsm2_en = fsm_enable.fsm2_en;
6666 val->fsm3_en = fsm_enable.fsm3_en;
6667 val->fsm4_en = fsm_enable.fsm4_en;
6668 val->fsm5_en = fsm_enable.fsm5_en;
6669 val->fsm6_en = fsm_enable.fsm6_en;
6670 val->fsm7_en = fsm_enable.fsm7_en;
6671 val->fsm8_en = fsm_enable.fsm8_en;
6672
6673 return ret;
6674 }
6675
6676 /**
6677 * @brief FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).[set]
6678 *
6679 * @param ctx read / write interface definitions
6680 * @param val FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).
6681 * @retval interface status (MANDATORY: return 0 -> no Error)
6682 *
6683 */
lsm6dsv16b_fsm_long_cnt_set(const stmdev_ctx_t * ctx,uint16_t val)6684 int32_t lsm6dsv16b_fsm_long_cnt_set(const stmdev_ctx_t *ctx, uint16_t val)
6685 {
6686 uint8_t buff[2];
6687 int32_t ret;
6688
6689 buff[1] = (uint8_t)(val / 256U);
6690 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6691
6692 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6693 if (ret == 0)
6694 {
6695 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FSM_LONG_COUNTER_L, (uint8_t *)&buff[0], 2);
6696 }
6697
6698 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6699
6700 return ret;
6701 }
6702
6703 /**
6704 * @brief FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).[get]
6705 *
6706 * @param ctx read / write interface definitions
6707 * @param val FSM long counter status register. Long counter value is an unsigned integer value (16-bit format).
6708 * @retval interface status (MANDATORY: return 0 -> no Error)
6709 *
6710 */
lsm6dsv16b_fsm_long_cnt_get(const stmdev_ctx_t * ctx,uint16_t * val)6711 int32_t lsm6dsv16b_fsm_long_cnt_get(const stmdev_ctx_t *ctx, uint16_t *val)
6712 {
6713 uint8_t buff[2];
6714 int32_t ret;
6715
6716 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6717 if (ret == 0)
6718 {
6719 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_LONG_COUNTER_L, &buff[0], 2);
6720 }
6721
6722 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6723
6724 *val = buff[1];
6725 *val = (*val * 256U) + buff[0];
6726
6727 return ret;
6728 }
6729
6730 /**
6731 * @brief FSM output registers[get]
6732 *
6733 * @param ctx read / write interface definitions
6734 * @param val FSM output registers
6735 * @retval interface status (MANDATORY: return 0 -> no Error)
6736 *
6737 */
lsm6dsv16b_fsm_out_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_out_t * val)6738 int32_t lsm6dsv16b_fsm_out_get(const stmdev_ctx_t *ctx, lsm6dsv16b_fsm_out_t *val)
6739 {
6740 int32_t ret;
6741
6742 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6743 if (ret == 0)
6744 {
6745 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_OUTS1, (uint8_t *)val, 8);
6746 }
6747
6748 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6749
6750 return ret;
6751 }
6752
6753 /**
6754 * @brief Finite State Machine Output Data Rate (ODR) configuration.[set]
6755 *
6756 * @param ctx read / write interface definitions
6757 * @param val FSM_15Hz, FSM_30Hz, FSM_60Hz, FSM_120Hz, FSM_240Hz, FSM_480Hz, FSM_960Hz,
6758 * @retval interface status (MANDATORY: return 0 -> no Error)
6759 *
6760 */
lsm6dsv16b_fsm_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_data_rate_t val)6761 int32_t lsm6dsv16b_fsm_data_rate_set(const stmdev_ctx_t *ctx,
6762 lsm6dsv16b_fsm_data_rate_t val)
6763 {
6764 lsm6dsv16b_fsm_odr_t fsm_odr;
6765 int32_t ret;
6766
6767 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6768 if (ret == 0)
6769 {
6770 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6771 }
6772
6773 if (ret == 0)
6774 {
6775 fsm_odr.fsm_odr = (uint8_t)val & 0x07U;
6776 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6777 }
6778
6779 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6780
6781 return ret;
6782 }
6783
6784 /**
6785 * @brief Finite State Machine Output Data Rate (ODR) configuration.[get]
6786 *
6787 * @param ctx read / write interface definitions
6788 * @param val FSM_15Hz, FSM_30Hz, FSM_60Hz, FSM_120Hz, FSM_240Hz, FSM_480Hz, FSM_960Hz,
6789 * @retval interface status (MANDATORY: return 0 -> no Error)
6790 *
6791 */
lsm6dsv16b_fsm_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsv16b_fsm_data_rate_t * val)6792 int32_t lsm6dsv16b_fsm_data_rate_get(const stmdev_ctx_t *ctx,
6793 lsm6dsv16b_fsm_data_rate_t *val)
6794 {
6795 lsm6dsv16b_fsm_odr_t fsm_odr;
6796 int32_t ret;
6797
6798 ret = lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_EMBED_FUNC_MEM_BANK);
6799 if (ret == 0)
6800 {
6801 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_FSM_ODR, (uint8_t *)&fsm_odr, 1);
6802 }
6803
6804 ret += lsm6dsv16b_mem_bank_set(ctx, LSM6DSV16B_MAIN_MEM_BANK);
6805
6806 switch (fsm_odr.fsm_odr)
6807 {
6808 case LSM6DSV16B_FSM_15Hz:
6809 *val = LSM6DSV16B_FSM_15Hz;
6810 break;
6811
6812 case LSM6DSV16B_FSM_30Hz:
6813 *val = LSM6DSV16B_FSM_30Hz;
6814 break;
6815
6816 case LSM6DSV16B_FSM_60Hz:
6817 *val = LSM6DSV16B_FSM_60Hz;
6818 break;
6819
6820 case LSM6DSV16B_FSM_120Hz:
6821 *val = LSM6DSV16B_FSM_120Hz;
6822 break;
6823
6824 case LSM6DSV16B_FSM_240Hz:
6825 *val = LSM6DSV16B_FSM_240Hz;
6826 break;
6827
6828 case LSM6DSV16B_FSM_480Hz:
6829 *val = LSM6DSV16B_FSM_480Hz;
6830 break;
6831
6832 case LSM6DSV16B_FSM_960Hz:
6833 *val = LSM6DSV16B_FSM_960Hz;
6834 break;
6835
6836 default:
6837 *val = LSM6DSV16B_FSM_15Hz;
6838 break;
6839 }
6840 return ret;
6841 }
6842
6843 /**
6844 * @brief FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.[set]
6845 *
6846 * @param ctx read / write interface definitions
6847 * @param val FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.
6848 * @retval interface status (MANDATORY: return 0 -> no Error)
6849 *
6850 */
lsm6dsv16b_fsm_long_cnt_timeout_set(const stmdev_ctx_t * ctx,uint16_t val)6851 int32_t lsm6dsv16b_fsm_long_cnt_timeout_set(const stmdev_ctx_t *ctx, uint16_t val)
6852 {
6853 uint8_t buff[2];
6854 int32_t ret;
6855
6856 buff[1] = (uint8_t)(val / 256U);
6857 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6858 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_FSM_LC_TIMEOUT_L, (uint8_t *)&buff[0], 2);
6859
6860 return ret;
6861 }
6862
6863 /**
6864 * @brief FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.[get]
6865 *
6866 * @param ctx read / write interface definitions
6867 * @param val FSM long counter timeout. The long counter timeout value is an unsigned integer value (16-bit format). When the long counter value reached this value, the FSM generates an interrupt.
6868 * @retval interface status (MANDATORY: return 0 -> no Error)
6869 *
6870 */
lsm6dsv16b_fsm_long_cnt_timeout_get(const stmdev_ctx_t * ctx,uint16_t * val)6871 int32_t lsm6dsv16b_fsm_long_cnt_timeout_get(const stmdev_ctx_t *ctx, uint16_t *val)
6872 {
6873 uint8_t buff[2];
6874 int32_t ret;
6875
6876 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_FSM_LC_TIMEOUT_L, &buff[0], 2);
6877 *val = buff[1];
6878 *val = (*val * 256U) + buff[0];
6879
6880 return ret;
6881 }
6882
6883 /**
6884 * @brief FSM number of programs.[set]
6885 *
6886 * @param ctx read / write interface definitions
6887 * @param val FSM number of programs.
6888 * @retval interface status (MANDATORY: return 0 -> no Error)
6889 *
6890 */
lsm6dsv16b_fsm_number_of_programs_set(const stmdev_ctx_t * ctx,uint8_t val)6891 int32_t lsm6dsv16b_fsm_number_of_programs_set(const stmdev_ctx_t *ctx, uint8_t val)
6892 {
6893 lsm6dsv16b_fsm_programs_t fsm_programs;
6894 int32_t ret;
6895
6896 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_FSM_PROGRAMS, (uint8_t *)&fsm_programs, 1);
6897 if (ret == 0)
6898 {
6899 fsm_programs.fsm_n_prog = val;
6900 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_FSM_PROGRAMS, (uint8_t *)&fsm_programs, 1);
6901 }
6902
6903 return ret;
6904 }
6905
6906 /**
6907 * @brief FSM number of programs.[get]
6908 *
6909 * @param ctx read / write interface definitions
6910 * @param val FSM number of programs.
6911 * @retval interface status (MANDATORY: return 0 -> no Error)
6912 *
6913 */
lsm6dsv16b_fsm_number_of_programs_get(const stmdev_ctx_t * ctx,uint8_t * val)6914 int32_t lsm6dsv16b_fsm_number_of_programs_get(const stmdev_ctx_t *ctx, uint8_t *val)
6915 {
6916 lsm6dsv16b_fsm_programs_t fsm_programs;
6917 int32_t ret;
6918
6919 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_FSM_PROGRAMS, (uint8_t *)&fsm_programs, 1);
6920 *val = fsm_programs.fsm_n_prog;
6921
6922
6923 return ret;
6924 }
6925
6926 /**
6927 * @brief FSM start address. First available address is 0x35C.[set]
6928 *
6929 * @param ctx read / write interface definitions
6930 * @param val FSM start address. First available address is 0x35C.
6931 * @retval interface status (MANDATORY: return 0 -> no Error)
6932 *
6933 */
lsm6dsv16b_fsm_start_address_set(const stmdev_ctx_t * ctx,uint16_t val)6934 int32_t lsm6dsv16b_fsm_start_address_set(const stmdev_ctx_t *ctx, uint16_t val)
6935 {
6936 uint8_t buff[2];
6937 int32_t ret;
6938
6939 buff[1] = (uint8_t)(val / 256U);
6940 buff[0] = (uint8_t)(val - (buff[1] * 256U));
6941 ret = lsm6dsv16b_ln_pg_write(ctx, LSM6DSV16B_FSM_START_ADD_L, (uint8_t *)&buff[0], 2);
6942
6943 return ret;
6944 }
6945
6946 /**
6947 * @brief FSM start address. First available address is 0x35C.[get]
6948 *
6949 * @param ctx read / write interface definitions
6950 * @param val FSM start address. First available address is 0x35C.
6951 * @retval interface status (MANDATORY: return 0 -> no Error)
6952 *
6953 */
lsm6dsv16b_fsm_start_address_get(const stmdev_ctx_t * ctx,uint16_t * val)6954 int32_t lsm6dsv16b_fsm_start_address_get(const stmdev_ctx_t *ctx, uint16_t *val)
6955 {
6956 uint8_t buff[2];
6957 int32_t ret;
6958
6959 ret = lsm6dsv16b_ln_pg_read(ctx, LSM6DSV16B_FSM_START_ADD_L, &buff[0], 2);
6960 *val = buff[1];
6961 *val = (*val * 256U) + buff[0];
6962
6963 return ret;
6964 }
6965
6966 /**
6967 * @}
6968 *
6969 */
6970
6971 /**
6972 * @addtogroup Accelerometer user offset correction
6973 * @brief This section group all the functions concerning the
6974 * usage of Accelerometer user offset correction
6975 * @{
6976 *
6977 */
6978
6979 /**
6980 * @brief Enables accelerometer user offset correction block; it is valid for the low-pass path.[set]
6981 *
6982 * @param ctx read / write interface definitions
6983 * @param val Enables accelerometer user offset correction block; it is valid for the low-pass path.
6984 * @retval interface status (MANDATORY: return 0 -> no Error)
6985 *
6986 */
lsm6dsv16b_xl_offset_on_out_set(const stmdev_ctx_t * ctx,uint8_t val)6987 int32_t lsm6dsv16b_xl_offset_on_out_set(const stmdev_ctx_t *ctx, uint8_t val)
6988 {
6989 lsm6dsv16b_ctrl9_t ctrl9;
6990 int32_t ret;
6991
6992 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
6993 if (ret == 0)
6994 {
6995 ctrl9.usr_off_on_out = val;
6996 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
6997 }
6998
6999 return ret;
7000 }
7001
7002 /**
7003 * @brief Enables accelerometer user offset correction block; it is valid for the low-pass path.[get]
7004 *
7005 * @param ctx read / write interface definitions
7006 * @param val Enables accelerometer user offset correction block; it is valid for the low-pass path.
7007 * @retval interface status (MANDATORY: return 0 -> no Error)
7008 *
7009 */
lsm6dsv16b_xl_offset_on_out_get(const stmdev_ctx_t * ctx,uint8_t * val)7010 int32_t lsm6dsv16b_xl_offset_on_out_get(const stmdev_ctx_t *ctx, uint8_t *val)
7011 {
7012 lsm6dsv16b_ctrl9_t ctrl9;
7013 int32_t ret;
7014
7015 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
7016 *val = ctrl9.usr_off_on_out;
7017
7018 return ret;
7019 }
7020
7021 /**
7022 * @brief Accelerometer user offset correction values in mg.[set]
7023 *
7024 * @param ctx read / write interface definitions
7025 * @param val Accelerometer user offset correction values in mg.
7026 * @retval interface status (MANDATORY: return 0 -> no Error)
7027 *
7028 */
lsm6dsv16b_xl_offset_mg_set(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_offset_mg_t val)7029 int32_t lsm6dsv16b_xl_offset_mg_set(const stmdev_ctx_t *ctx,
7030 lsm6dsv16b_xl_offset_mg_t val)
7031 {
7032 lsm6dsv16b_z_ofs_usr_t z_ofs_usr;
7033 lsm6dsv16b_y_ofs_usr_t y_ofs_usr;
7034 lsm6dsv16b_x_ofs_usr_t x_ofs_usr;
7035 lsm6dsv16b_ctrl9_t ctrl9;
7036 int32_t ret;
7037 float_t tmp;
7038
7039 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
7040 if (ret == 0)
7041 {
7042 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
7043 }
7044 if (ret == 0)
7045 {
7046 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
7047 }
7048 if (ret == 0)
7049 {
7050 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
7051 }
7052
7053
7054 if ((val.x_mg < (0.0078125f * 127.0f)) && (val.x_mg > (0.0078125f * -127.0f)) &&
7055 (val.y_mg < (0.0078125f * 127.0f)) && (val.y_mg > (0.0078125f * -127.0f)) &&
7056 (val.z_mg < (0.0078125f * 127.0f)) && (val.z_mg > (0.0078125f * -127.0f)))
7057 {
7058 ctrl9.usr_off_w = 0;
7059
7060 tmp = val.z_mg / 0.0078125f;
7061 z_ofs_usr.z_ofs_usr = (uint8_t)tmp;
7062
7063 tmp = val.y_mg / 0.0078125f;
7064 y_ofs_usr.y_ofs_usr = (uint8_t)tmp;
7065
7066 tmp = val.x_mg / 0.0078125f;
7067 x_ofs_usr.x_ofs_usr = (uint8_t)tmp;
7068 }
7069 else if ((val.x_mg < (0.125f * 127.0f)) && (val.x_mg > (0.125f * -127.0f)) &&
7070 (val.y_mg < (0.125f * 127.0f)) && (val.y_mg > (0.125f * -127.0f)) &&
7071 (val.z_mg < (0.125f * 127.0f)) && (val.z_mg > (0.125f * -127.0f)))
7072 {
7073 ctrl9.usr_off_w = 1;
7074
7075 tmp = val.z_mg / 0.125f;
7076 z_ofs_usr.z_ofs_usr = (uint8_t)tmp;
7077
7078 tmp = val.y_mg / 0.125f;
7079 y_ofs_usr.y_ofs_usr = (uint8_t)tmp;
7080
7081 tmp = val.x_mg / 0.125f;
7082 x_ofs_usr.x_ofs_usr = (uint8_t)tmp;
7083 }
7084 else // out of limit
7085 {
7086 ctrl9.usr_off_w = 1;
7087 z_ofs_usr.z_ofs_usr = 0xFFU;
7088 y_ofs_usr.y_ofs_usr = 0xFFU;
7089 x_ofs_usr.x_ofs_usr = 0xFFU;
7090 }
7091
7092 if (ret == 0)
7093 {
7094 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
7095 }
7096 if (ret == 0)
7097 {
7098 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
7099 }
7100 if (ret == 0)
7101 {
7102 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
7103 }
7104 if (ret == 0)
7105 {
7106 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
7107 }
7108 return ret;
7109 }
7110
7111 /**
7112 * @brief Accelerometer user offset correction values in mg.[get]
7113 *
7114 * @param ctx read / write interface definitions
7115 * @param val Accelerometer user offset correction values in mg.
7116 * @retval interface status (MANDATORY: return 0 -> no Error)
7117 *
7118 */
lsm6dsv16b_xl_offset_mg_get(const stmdev_ctx_t * ctx,lsm6dsv16b_xl_offset_mg_t * val)7119 int32_t lsm6dsv16b_xl_offset_mg_get(const stmdev_ctx_t *ctx,
7120 lsm6dsv16b_xl_offset_mg_t *val)
7121 {
7122 lsm6dsv16b_z_ofs_usr_t z_ofs_usr;
7123 lsm6dsv16b_y_ofs_usr_t y_ofs_usr;
7124 lsm6dsv16b_x_ofs_usr_t x_ofs_usr;
7125 lsm6dsv16b_ctrl9_t ctrl9;
7126 int32_t ret;
7127
7128 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_CTRL9, (uint8_t *)&ctrl9, 1);
7129 if (ret == 0)
7130 {
7131 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_Z_OFS_USR, (uint8_t *)&z_ofs_usr, 1);
7132 }
7133 if (ret == 0)
7134 {
7135 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_Y_OFS_USR, (uint8_t *)&y_ofs_usr, 1);
7136 }
7137 if (ret == 0)
7138 {
7139 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_X_OFS_USR, (uint8_t *)&x_ofs_usr, 1);
7140 }
7141
7142 if (ctrl9.usr_off_w == PROPERTY_DISABLE)
7143 {
7144 val->z_mg = ((float_t)z_ofs_usr.z_ofs_usr * 0.0078125f);
7145 val->y_mg = ((float_t)y_ofs_usr.y_ofs_usr * 0.0078125f);
7146 val->x_mg = ((float_t)x_ofs_usr.x_ofs_usr * 0.0078125f);
7147 }
7148 else
7149 {
7150 val->z_mg = ((float_t)z_ofs_usr.z_ofs_usr * 0.125f);
7151 val->y_mg = ((float_t)y_ofs_usr.y_ofs_usr * 0.125f);
7152 val->x_mg = ((float_t)x_ofs_usr.x_ofs_usr * 0.125f);
7153 }
7154
7155 return ret;
7156 }
7157
7158 /**
7159 * @}
7160 *
7161 */
7162
7163 /**
7164 * @addtogroup SenseWire (I3C)
7165 * @brief This section group all the functions concerning the
7166 * usage of SenseWire (I3C)
7167 * @{
7168 *
7169 */
7170
7171 /**
7172 * @brief Selects the action the device will perform after "Reset whole chip" I3C pattern.[set]
7173 *
7174 * @param ctx read / write interface definitions
7175 * @param val SW_RST_DYN_ADDRESS_RST, GLOBAL_RST_,
7176 * @retval interface status (MANDATORY: return 0 -> no Error)
7177 *
7178 */
lsm6dsv16b_i3c_reset_mode_set(const stmdev_ctx_t * ctx,lsm6dsv16b_i3c_reset_mode_t val)7179 int32_t lsm6dsv16b_i3c_reset_mode_set(const stmdev_ctx_t *ctx,
7180 lsm6dsv16b_i3c_reset_mode_t val)
7181 {
7182 lsm6dsv16b_pin_ctrl_t pin_ctrl;
7183 int32_t ret;
7184
7185 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7186 if (ret == 0)
7187 {
7188 pin_ctrl.ibhr_por_en = (uint8_t)val & 0x01U;
7189 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7190 }
7191
7192 return ret;
7193 }
7194
7195 /**
7196 * @brief Selects the action the device will perform after "Reset whole chip" I3C pattern.[get]
7197 *
7198 * @param ctx read / write interface definitions
7199 * @param val SW_RST_DYN_ADDRESS_RST, GLOBAL_RST_,
7200 * @retval interface status (MANDATORY: return 0 -> no Error)
7201 *
7202 */
lsm6dsv16b_i3c_reset_mode_get(const stmdev_ctx_t * ctx,lsm6dsv16b_i3c_reset_mode_t * val)7203 int32_t lsm6dsv16b_i3c_reset_mode_get(const stmdev_ctx_t *ctx,
7204 lsm6dsv16b_i3c_reset_mode_t *val)
7205 {
7206 lsm6dsv16b_pin_ctrl_t pin_ctrl;
7207 int32_t ret;
7208
7209 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7210 switch (pin_ctrl.ibhr_por_en)
7211 {
7212 case LSM6DSV16B_SW_RST_DYN_ADDRESS_RST:
7213 *val = LSM6DSV16B_SW_RST_DYN_ADDRESS_RST;
7214 break;
7215
7216 case LSM6DSV16B_I3C_GLOBAL_RST:
7217 *val = LSM6DSV16B_I3C_GLOBAL_RST;
7218 break;
7219
7220 default:
7221 *val = LSM6DSV16B_SW_RST_DYN_ADDRESS_RST;
7222 break;
7223 }
7224 return ret;
7225 }
7226
7227 /**
7228 * @}
7229 *
7230 */
7231
7232 /**
7233 * @addtogroup Time-Division Multiplexing (TDM)
7234 * @brief This section group all the functions concerning the
7235 * usage of Time-Division Multiplexing (TDM)
7236 * @{
7237 *
7238 */
7239
7240 /**
7241 * @brief Disables pull-up on WCLK pin.[set]
7242 *
7243 * @param ctx read / write interface definitions
7244 * @param val Disables pull-up on WCLK pin.
7245 * @retval interface status (MANDATORY: return 0 -> no Error)
7246 *
7247 */
lsm6dsv16b_tdm_dis_wclk_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)7248 int32_t lsm6dsv16b_tdm_dis_wclk_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
7249 {
7250 lsm6dsv16b_pin_ctrl_t pin_ctrl;
7251 int32_t ret;
7252
7253 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7254 if (ret == 0)
7255 {
7256 pin_ctrl.tdm_wclk_pu_dis = val;
7257 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7258 }
7259
7260 return ret;
7261 }
7262
7263 /**
7264 * @brief Disables pull-up on WCLK pin.[get]
7265 *
7266 * @param ctx read / write interface definitions
7267 * @param val Disables pull-up on WCLK pin.
7268 * @retval interface status (MANDATORY: return 0 -> no Error)
7269 *
7270 */
lsm6dsv16b_tdm_dis_wclk_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)7271 int32_t lsm6dsv16b_tdm_dis_wclk_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
7272 {
7273 lsm6dsv16b_pin_ctrl_t pin_ctrl;
7274 int32_t ret;
7275
7276 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_PIN_CTRL, (uint8_t *)&pin_ctrl, 1);
7277 *val = pin_ctrl.tdm_wclk_pu_dis;
7278
7279 return ret;
7280 }
7281
7282 /**
7283 * @brief Enables pull-up on TDMout pin.[set]
7284 *
7285 * @param ctx read / write interface definitions
7286 * @param val Enables pull-up on TDMout pin.
7287 * @retval interface status (MANDATORY: return 0 -> no Error)
7288 *
7289 */
lsm6dsv16b_tdm_tdmout_pull_up_set(const stmdev_ctx_t * ctx,uint8_t val)7290 int32_t lsm6dsv16b_tdm_tdmout_pull_up_set(const stmdev_ctx_t *ctx, uint8_t val)
7291 {
7292 lsm6dsv16b_if_cfg_t if_cfg;
7293 int32_t ret;
7294
7295 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
7296 if (ret == 0)
7297 {
7298 if_cfg.tdm_out_pu_en = val;
7299 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
7300 }
7301
7302 return ret;
7303 }
7304
7305 /**
7306 * @brief Enables pull-up on TDMout pin.[get]
7307 *
7308 * @param ctx read / write interface definitions
7309 * @param val Enables pull-up on TDMout pin.
7310 * @retval interface status (MANDATORY: return 0 -> no Error)
7311 *
7312 */
lsm6dsv16b_tdm_tdmout_pull_up_get(const stmdev_ctx_t * ctx,uint8_t * val)7313 int32_t lsm6dsv16b_tdm_tdmout_pull_up_get(const stmdev_ctx_t *ctx, uint8_t *val)
7314 {
7315 lsm6dsv16b_if_cfg_t if_cfg;
7316 int32_t ret;
7317
7318 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_IF_CFG, (uint8_t *)&if_cfg, 1);
7319 *val = if_cfg.tdm_out_pu_en;
7320
7321 return ret;
7322 }
7323
7324 /**
7325 * @brief WCLK and BCLK frequencies.[set]
7326 *
7327 * @param ctx read / write interface definitions
7328 * @param val WCLK_8kHZ_1024kHz, WCLK_16kHZ_2048kHz, WCLK_8kHZ_2048kHz, WCLK_16kHZ_1024kHz,
7329 * @retval interface status (MANDATORY: return 0 -> no Error)
7330 *
7331 */
lsm6dsv16b_tdm_wclk_bclk_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_wclk_bclk_t val)7332 int32_t lsm6dsv16b_tdm_wclk_bclk_set(const stmdev_ctx_t *ctx,
7333 lsm6dsv16b_tdm_wclk_bclk_t val)
7334 {
7335 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7336 int32_t ret;
7337
7338 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7339 if (ret == 0)
7340 {
7341 tdm_cfg0.tdm_wclk_bclk_sel = ((uint8_t)val & 0x4U) >> 2;
7342 tdm_cfg0.tdm_wclk = (uint8_t)val & 0x3U;
7343 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7344 }
7345
7346 return ret;
7347 }
7348
7349 /**
7350 * @brief WCLK and BCLK frequencies.[get]
7351 *
7352 * @param ctx read / write interface definitions
7353 * @param val WCLK_8kHZ_1024kHz, WCLK_16kHZ_2048kHz, WCLK_8kHZ_2048kHz, WCLK_16kHZ_1024kHz,
7354 * @retval interface status (MANDATORY: return 0 -> no Error)
7355 *
7356 */
lsm6dsv16b_tdm_wclk_bclk_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_wclk_bclk_t * val)7357 int32_t lsm6dsv16b_tdm_wclk_bclk_get(const stmdev_ctx_t *ctx,
7358 lsm6dsv16b_tdm_wclk_bclk_t *val)
7359 {
7360 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7361 int32_t ret;
7362
7363 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7364 switch ((tdm_cfg0.tdm_wclk_bclk_sel << 2) + tdm_cfg0.tdm_wclk)
7365 {
7366 case LSM6DSV16B_WCLK_16kHZ_BCLK_2048kHz:
7367 *val = LSM6DSV16B_WCLK_16kHZ_BCLK_2048kHz;
7368 break;
7369
7370 case LSM6DSV16B_WCLK_8kHZ_BCLK_2048kHz:
7371 *val = LSM6DSV16B_WCLK_8kHZ_BCLK_2048kHz;
7372 break;
7373
7374 default:
7375 *val = LSM6DSV16B_WCLK_8kHZ_BCLK_2048kHz;
7376 break;
7377 }
7378 return ret;
7379 }
7380
7381 /**
7382 * @brief Selection of TDM slot for transmission.[set]
7383 *
7384 * @param ctx read / write interface definitions
7385 * @param val SLOT_012, SLOT_456,
7386 * @retval interface status (MANDATORY: return 0 -> no Error)
7387 *
7388 */
lsm6dsv16b_tdm_slot_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_slot_t val)7389 int32_t lsm6dsv16b_tdm_slot_set(const stmdev_ctx_t *ctx, lsm6dsv16b_tdm_slot_t val)
7390 {
7391 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7392 int32_t ret;
7393
7394 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7395 if (ret == 0)
7396 {
7397 tdm_cfg0.tdm_slot_sel = (uint8_t)val & 0x01U;
7398 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7399 }
7400
7401 return ret;
7402 }
7403
7404 /**
7405 * @brief Selection of TDM slot for transmission.[get]
7406 *
7407 * @param ctx read / write interface definitions
7408 * @param val SLOT_012, SLOT_456,
7409 * @retval interface status (MANDATORY: return 0 -> no Error)
7410 *
7411 */
lsm6dsv16b_tdm_slot_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_slot_t * val)7412 int32_t lsm6dsv16b_tdm_slot_get(const stmdev_ctx_t *ctx, lsm6dsv16b_tdm_slot_t *val)
7413 {
7414 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7415 int32_t ret;
7416
7417 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7418 switch (tdm_cfg0.tdm_slot_sel)
7419 {
7420 case LSM6DSV16B_SLOT_012:
7421 *val = LSM6DSV16B_SLOT_012;
7422 break;
7423
7424 case LSM6DSV16B_SLOT_456:
7425 *val = LSM6DSV16B_SLOT_456;
7426 break;
7427
7428 default:
7429 *val = LSM6DSV16B_SLOT_012;
7430 break;
7431 }
7432 return ret;
7433 }
7434
7435 /**
7436 * @brief BCLK edge selection for TDM interface.[set]
7437 *
7438 * @param ctx read / write interface definitions
7439 * @param val BCLK_RISING, BCLK_FALLING,
7440 * @retval interface status (MANDATORY: return 0 -> no Error)
7441 *
7442 */
lsm6dsv16b_tdm_bclk_edge_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_bclk_edge_t val)7443 int32_t lsm6dsv16b_tdm_bclk_edge_set(const stmdev_ctx_t *ctx,
7444 lsm6dsv16b_tdm_bclk_edge_t val)
7445 {
7446 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7447 int32_t ret;
7448
7449 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7450 if (ret == 0)
7451 {
7452 tdm_cfg0.tdm_bclk_edge_sel = (uint8_t)val & 0x01U;
7453 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7454 }
7455
7456 return ret;
7457 }
7458
7459 /**
7460 * @brief BCLK edge selection for TDM interface.[get]
7461 *
7462 * @param ctx read / write interface definitions
7463 * @param val BCLK_RISING, BCLK_FALLING,
7464 * @retval interface status (MANDATORY: return 0 -> no Error)
7465 *
7466 */
lsm6dsv16b_tdm_bclk_edge_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_bclk_edge_t * val)7467 int32_t lsm6dsv16b_tdm_bclk_edge_get(const stmdev_ctx_t *ctx,
7468 lsm6dsv16b_tdm_bclk_edge_t *val)
7469 {
7470 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7471 int32_t ret;
7472
7473 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7474 switch (tdm_cfg0.tdm_bclk_edge_sel)
7475 {
7476 case LSM6DSV16B_BCLK_RISING:
7477 *val = LSM6DSV16B_BCLK_RISING;
7478 break;
7479
7480 case LSM6DSV16B_BCLK_FALLING:
7481 *val = LSM6DSV16B_BCLK_FALLING;
7482 break;
7483
7484 default:
7485 *val = LSM6DSV16B_BCLK_RISING;
7486 break;
7487 }
7488 return ret;
7489 }
7490
7491 /**
7492 * @brief Enables TDM delayed configuration.[set]
7493 *
7494 * @param ctx read / write interface definitions
7495 * @param val Enables TDM delayed configuration.
7496 * @retval interface status (MANDATORY: return 0 -> no Error)
7497 *
7498 */
lsm6dsv16b_tdm_delayed_conf_set(const stmdev_ctx_t * ctx,uint8_t val)7499 int32_t lsm6dsv16b_tdm_delayed_conf_set(const stmdev_ctx_t *ctx, uint8_t val)
7500 {
7501 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7502 int32_t ret;
7503
7504 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7505 if (ret == 0)
7506 {
7507 tdm_cfg0.tdm_delayed_cfg = val;
7508 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7509 }
7510
7511 return ret;
7512 }
7513
7514 /**
7515 * @brief Enables TDM delayed configuration.[get]
7516 *
7517 * @param ctx read / write interface definitions
7518 * @param val Enables TDM delayed configuration.
7519 * @retval interface status (MANDATORY: return 0 -> no Error)
7520 *
7521 */
lsm6dsv16b_tdm_delayed_conf_get(const stmdev_ctx_t * ctx,uint8_t * val)7522 int32_t lsm6dsv16b_tdm_delayed_conf_get(const stmdev_ctx_t *ctx, uint8_t *val)
7523 {
7524 lsm6dsv16b_tdm_cfg0_t tdm_cfg0;
7525 int32_t ret;
7526
7527 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG0, (uint8_t *)&tdm_cfg0, 1);
7528 *val = tdm_cfg0.tdm_delayed_cfg;
7529
7530 return ret;
7531 }
7532
7533
7534 /**
7535 * @brief Selects order of transmission of TDM axes.[set]
7536 *
7537 * @param ctx read / write interface definitions
7538 * @param val TDM_ORDER_ZYX, TDM_ORDER_XZY, TDM_ORDER_XYZ,
7539 * @retval interface status (MANDATORY: return 0 -> no Error)
7540 *
7541 */
lsm6dsv16b_tdm_axis_order_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_axis_order_t val)7542 int32_t lsm6dsv16b_tdm_axis_order_set(const stmdev_ctx_t *ctx,
7543 lsm6dsv16b_tdm_axis_order_t val)
7544 {
7545 lsm6dsv16b_tdm_cfg1_t tdm_cfg1;
7546 int32_t ret;
7547
7548 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
7549 if (ret == 0)
7550 {
7551 tdm_cfg1.tdm_axes_ord_sel = (uint8_t)val & 0x03U;
7552 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
7553 }
7554
7555 return ret;
7556 }
7557
7558 /**
7559 * @brief Selects order of transmission of TDM axes.[get]
7560 *
7561 * @param ctx read / write interface definitions
7562 * @param val TDM_ORDER_ZYX, TDM_ORDER_XZY, TDM_ORDER_XYZ,
7563 * @retval interface status (MANDATORY: return 0 -> no Error)
7564 *
7565 */
lsm6dsv16b_tdm_axis_order_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_axis_order_t * val)7566 int32_t lsm6dsv16b_tdm_axis_order_get(const stmdev_ctx_t *ctx,
7567 lsm6dsv16b_tdm_axis_order_t *val)
7568 {
7569 lsm6dsv16b_tdm_cfg1_t tdm_cfg1;
7570 int32_t ret;
7571
7572 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG1, (uint8_t *)&tdm_cfg1, 1);
7573 switch (tdm_cfg1.tdm_axes_ord_sel)
7574 {
7575 case LSM6DSV16B_TDM_ORDER_ZYX:
7576 *val = LSM6DSV16B_TDM_ORDER_ZYX;
7577 break;
7578
7579 case LSM6DSV16B_TDM_ORDER_XZY:
7580 *val = LSM6DSV16B_TDM_ORDER_XZY;
7581 break;
7582
7583 case LSM6DSV16B_TDM_ORDER_XYZ:
7584 *val = LSM6DSV16B_TDM_ORDER_XYZ;
7585 break;
7586
7587 default:
7588 *val = LSM6DSV16B_TDM_ORDER_ZYX;
7589 break;
7590 }
7591 return ret;
7592 }
7593
7594 /**
7595 * @brief TDM channel accelerometer full-scale selection.[set]
7596 *
7597 * @param ctx read / write interface definitions
7598 * @param val TDM_2g, TDM_4g, TDM_8g,
7599 * @retval interface status (MANDATORY: return 0 -> no Error)
7600 *
7601 */
lsm6dsv16b_tdm_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_xl_full_scale_t val)7602 int32_t lsm6dsv16b_tdm_xl_full_scale_set(const stmdev_ctx_t *ctx,
7603 lsm6dsv16b_tdm_xl_full_scale_t val)
7604 {
7605 lsm6dsv16b_tdm_cfg2_t tdm_cfg2;
7606 int32_t ret;
7607
7608 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
7609 if (ret == 0)
7610 {
7611 tdm_cfg2.tdm_fs_xl = (uint8_t)val & 0x3U;
7612 ret = lsm6dsv16b_write_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
7613 }
7614
7615 return ret;
7616 }
7617
7618 /**
7619 * @brief TDM channel accelerometer full-scale selection.[get]
7620 *
7621 * @param ctx read / write interface definitions
7622 * @param val TDM_2g, TDM_4g, TDM_8g,
7623 * @retval interface status (MANDATORY: return 0 -> no Error)
7624 *
7625 */
lsm6dsv16b_tdm_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsv16b_tdm_xl_full_scale_t * val)7626 int32_t lsm6dsv16b_tdm_xl_full_scale_get(const stmdev_ctx_t *ctx,
7627 lsm6dsv16b_tdm_xl_full_scale_t *val)
7628 {
7629 lsm6dsv16b_tdm_cfg2_t tdm_cfg2;
7630 int32_t ret;
7631
7632 ret = lsm6dsv16b_read_reg(ctx, LSM6DSV16B_TDM_CFG2, (uint8_t *)&tdm_cfg2, 1);
7633 switch (tdm_cfg2.tdm_fs_xl)
7634 {
7635 case LSM6DSV16B_TDM_2g:
7636 *val = LSM6DSV16B_TDM_2g;
7637 break;
7638
7639 case LSM6DSV16B_TDM_4g:
7640 *val = LSM6DSV16B_TDM_4g;
7641 break;
7642
7643 case LSM6DSV16B_TDM_8g:
7644 *val = LSM6DSV16B_TDM_8g;
7645 break;
7646
7647 default:
7648 *val = LSM6DSV16B_TDM_2g;
7649 break;
7650 }
7651 return ret;
7652 }
7653
7654 /**
7655 * @}
7656 *
7657 */
7658
7659 /**
7660 * @}
7661 *
7662 */
7663
7664 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
7665