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