1 /**
2 ******************************************************************************
3 * @file lsm6dsm_reg.c
4 * @author Sensors Software Solution Team
5 * @brief LSM6DSM 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 "lsm6dsm_reg.h"
21
22 /**
23 * @defgroup LSM6DSM
24 * @brief This file provides a set of functions needed to drive the
25 * lsm6dsm enanced inertial module.
26 * @{
27 *
28 */
29
30 /**
31 * @defgroup LSM6DSM_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 */
lsm6dsm_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak lsm6dsm_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 */
lsm6dsm_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak lsm6dsm_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 LSM6DSM_Sensitivity
98 * @brief These functions convert raw-data into engineering units.
99 * @{
100 *
101 */
102
lsm6dsm_from_fs2g_to_mg(int16_t lsb)103 float_t lsm6dsm_from_fs2g_to_mg(int16_t lsb)
104 {
105 return ((float_t)lsb * 0.061f);
106 }
107
lsm6dsm_from_fs4g_to_mg(int16_t lsb)108 float_t lsm6dsm_from_fs4g_to_mg(int16_t lsb)
109 {
110 return ((float_t)lsb * 0.122f);
111 }
112
lsm6dsm_from_fs8g_to_mg(int16_t lsb)113 float_t lsm6dsm_from_fs8g_to_mg(int16_t lsb)
114 {
115 return ((float_t)lsb * 0.244f);
116 }
117
lsm6dsm_from_fs16g_to_mg(int16_t lsb)118 float_t lsm6dsm_from_fs16g_to_mg(int16_t lsb)
119 {
120 return ((float_t)lsb * 0.488f);
121 }
122
lsm6dsm_from_fs125dps_to_mdps(int16_t lsb)123 float_t lsm6dsm_from_fs125dps_to_mdps(int16_t lsb)
124 {
125 return ((float_t)lsb * 4.375f);
126 }
127
lsm6dsm_from_fs250dps_to_mdps(int16_t lsb)128 float_t lsm6dsm_from_fs250dps_to_mdps(int16_t lsb)
129 {
130 return ((float_t)lsb * 8.750f);
131 }
132
lsm6dsm_from_fs500dps_to_mdps(int16_t lsb)133 float_t lsm6dsm_from_fs500dps_to_mdps(int16_t lsb)
134 {
135 return ((float_t)lsb * 17.50f);
136 }
137
lsm6dsm_from_fs1000dps_to_mdps(int16_t lsb)138 float_t lsm6dsm_from_fs1000dps_to_mdps(int16_t lsb)
139 {
140 return ((float_t)lsb * 35.0f);
141 }
142
lsm6dsm_from_fs2000dps_to_mdps(int16_t lsb)143 float_t lsm6dsm_from_fs2000dps_to_mdps(int16_t lsb)
144 {
145 return ((float_t)lsb * 70.0f);
146 }
147
lsm6dsm_from_lsb_to_celsius(int16_t lsb)148 float_t lsm6dsm_from_lsb_to_celsius(int16_t lsb)
149 {
150 return (((float_t)lsb / 256.0f) + 25.0f);
151 }
152
153 /**
154 * @}
155 *
156 */
157
158
159 /**
160 * @defgroup LSM6DSM_data_generation
161 * @brief This section groups all the functions concerning data
162 * generation
163 * @{
164 *
165 */
166
167 /**
168 * @brief Accelerometer full-scale selection.[set]
169 *
170 * @param ctx Read / write interface definitions
171 * @param val Change the values of fs_xl in reg CTRL1_XL
172 * @retval Interface status (MANDATORY: return 0 -> no Error).
173 *
174 */
lsm6dsm_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsm_fs_xl_t val)175 int32_t lsm6dsm_xl_full_scale_set(const stmdev_ctx_t *ctx,
176 lsm6dsm_fs_xl_t val)
177 {
178 lsm6dsm_ctrl1_xl_t ctrl1_xl;
179 int32_t ret;
180
181 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
182
183 if (ret == 0)
184 {
185 ctrl1_xl.fs_xl = (uint8_t) val;
186 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
187 }
188
189 return ret;
190 }
191
192 /**
193 * @brief Accelerometer full-scale selection.[get]
194 *
195 * @param ctx Read / write interface definitions
196 * @param val Get the values of fs_xl in reg CTRL1_XL
197 * @retval Interface status (MANDATORY: return 0 -> no Error).
198 *
199 */
lsm6dsm_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsm_fs_xl_t * val)200 int32_t lsm6dsm_xl_full_scale_get(const stmdev_ctx_t *ctx,
201 lsm6dsm_fs_xl_t *val)
202 {
203 lsm6dsm_ctrl1_xl_t ctrl1_xl;
204 int32_t ret;
205
206 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
207
208 switch (ctrl1_xl.fs_xl)
209 {
210 case LSM6DSM_2g:
211 *val = LSM6DSM_2g;
212 break;
213
214 case LSM6DSM_16g:
215 *val = LSM6DSM_16g;
216 break;
217
218 case LSM6DSM_4g:
219 *val = LSM6DSM_4g;
220 break;
221
222 case LSM6DSM_8g:
223 *val = LSM6DSM_8g;
224 break;
225
226 default:
227 *val = LSM6DSM_2g;
228 break;
229 }
230
231 return ret;
232 }
233
234 /**
235 * @brief Accelerometer data rate selection.[set]
236 *
237 * @param ctx Read / write interface definitions
238 * @param val Change the values of odr_xl in reg CTRL1_XL
239 * @retval Interface status (MANDATORY: return 0 -> no Error).
240 *
241 */
lsm6dsm_xl_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsm_odr_xl_t val)242 int32_t lsm6dsm_xl_data_rate_set(const stmdev_ctx_t *ctx,
243 lsm6dsm_odr_xl_t val)
244 {
245 lsm6dsm_ctrl1_xl_t ctrl1_xl;
246 int32_t ret;
247
248 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
249
250 if (ret == 0)
251 {
252 ctrl1_xl.odr_xl = (uint8_t) val;
253 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
254 }
255
256 return ret;
257 }
258
259 /**
260 * @brief Accelerometer data rate selection.[get]
261 *
262 * @param ctx Read / write interface definitions
263 * @param val Get the values of odr_xl in reg CTRL1_XL
264 * @retval Interface status (MANDATORY: return 0 -> no Error).
265 *
266 */
lsm6dsm_xl_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsm_odr_xl_t * val)267 int32_t lsm6dsm_xl_data_rate_get(const stmdev_ctx_t *ctx,
268 lsm6dsm_odr_xl_t *val)
269 {
270 lsm6dsm_ctrl1_xl_t ctrl1_xl;
271 int32_t ret;
272
273 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
274
275 switch (ctrl1_xl.odr_xl)
276 {
277 case LSM6DSM_XL_ODR_OFF:
278 *val = LSM6DSM_XL_ODR_OFF;
279 break;
280
281 case LSM6DSM_XL_ODR_12Hz5:
282 *val = LSM6DSM_XL_ODR_12Hz5;
283 break;
284
285 case LSM6DSM_XL_ODR_26Hz:
286 *val = LSM6DSM_XL_ODR_26Hz;
287 break;
288
289 case LSM6DSM_XL_ODR_52Hz:
290 *val = LSM6DSM_XL_ODR_52Hz;
291 break;
292
293 case LSM6DSM_XL_ODR_104Hz:
294 *val = LSM6DSM_XL_ODR_104Hz;
295 break;
296
297 case LSM6DSM_XL_ODR_208Hz:
298 *val = LSM6DSM_XL_ODR_208Hz;
299 break;
300
301 case LSM6DSM_XL_ODR_416Hz:
302 *val = LSM6DSM_XL_ODR_416Hz;
303 break;
304
305 case LSM6DSM_XL_ODR_833Hz:
306 *val = LSM6DSM_XL_ODR_833Hz;
307 break;
308
309 case LSM6DSM_XL_ODR_1k66Hz:
310 *val = LSM6DSM_XL_ODR_1k66Hz;
311 break;
312
313 case LSM6DSM_XL_ODR_3k33Hz:
314 *val = LSM6DSM_XL_ODR_3k33Hz;
315 break;
316
317 case LSM6DSM_XL_ODR_6k66Hz:
318 *val = LSM6DSM_XL_ODR_6k66Hz;
319 break;
320
321 case LSM6DSM_XL_ODR_1Hz6:
322 *val = LSM6DSM_XL_ODR_1Hz6;
323 break;
324
325 default:
326 *val = LSM6DSM_XL_ODR_OFF;
327 break;
328 }
329
330 return ret;
331 }
332
333 /**
334 * @brief Gyroscope chain full-scale selection.[set]
335 *
336 * @param ctx Read / write interface definitions
337 * @param val Change the values of fs_g in reg CTRL2_G
338 * @retval Interface status (MANDATORY: return 0 -> no Error).
339 *
340 */
lsm6dsm_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsm_fs_g_t val)341 int32_t lsm6dsm_gy_full_scale_set(const stmdev_ctx_t *ctx,
342 lsm6dsm_fs_g_t val)
343 {
344 lsm6dsm_ctrl2_g_t ctrl2_g;
345 int32_t ret;
346
347 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
348
349 if (ret == 0)
350 {
351 ctrl2_g.fs_g = (uint8_t) val;
352 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
353 }
354
355 return ret;
356 }
357
358 /**
359 * @brief Gyroscope chain full-scale selection.[get]
360 *
361 * @param ctx Read / write interface definitions
362 * @param val Get the values of fs_g in reg CTRL2_G
363 * @retval Interface status (MANDATORY: return 0 -> no Error).
364 *
365 */
lsm6dsm_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsm_fs_g_t * val)366 int32_t lsm6dsm_gy_full_scale_get(const stmdev_ctx_t *ctx,
367 lsm6dsm_fs_g_t *val)
368 {
369 lsm6dsm_ctrl2_g_t ctrl2_g;
370 int32_t ret;
371
372 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
373
374 switch (ctrl2_g.fs_g)
375 {
376 case LSM6DSM_250dps:
377 *val = LSM6DSM_250dps;
378 break;
379
380 case LSM6DSM_125dps:
381 *val = LSM6DSM_125dps;
382 break;
383
384 case LSM6DSM_500dps:
385 *val = LSM6DSM_500dps;
386 break;
387
388 case LSM6DSM_1000dps:
389 *val = LSM6DSM_1000dps;
390 break;
391
392 case LSM6DSM_2000dps:
393 *val = LSM6DSM_2000dps;
394 break;
395
396 default:
397 *val = LSM6DSM_250dps;
398 break;
399 }
400
401 return ret;
402 }
403
404 /**
405 * @brief Gyroscope data rate selection.[set]
406 *
407 * @param ctx Read / write interface definitions
408 * @param val Change the values of odr_g in reg CTRL2_G
409 * @retval Interface status (MANDATORY: return 0 -> no Error).
410 *
411 */
lsm6dsm_gy_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsm_odr_g_t val)412 int32_t lsm6dsm_gy_data_rate_set(const stmdev_ctx_t *ctx,
413 lsm6dsm_odr_g_t val)
414 {
415 lsm6dsm_ctrl2_g_t ctrl2_g;
416 int32_t ret;
417
418 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
419
420 if (ret == 0)
421 {
422 ctrl2_g.odr_g = (uint8_t) val;
423 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
424 }
425
426 return ret;
427 }
428
429 /**
430 * @brief Gyroscope data rate selection.[get]
431 *
432 * @param ctx Read / write interface definitions
433 * @param val Get the values of odr_g in reg CTRL2_G
434 * @retval Interface status (MANDATORY: return 0 -> no Error).
435 *
436 */
lsm6dsm_gy_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsm_odr_g_t * val)437 int32_t lsm6dsm_gy_data_rate_get(const stmdev_ctx_t *ctx,
438 lsm6dsm_odr_g_t *val)
439 {
440 lsm6dsm_ctrl2_g_t ctrl2_g;
441 int32_t ret;
442
443 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_G, (uint8_t *)&ctrl2_g, 1);
444
445 switch (ctrl2_g.odr_g)
446 {
447 case LSM6DSM_GY_ODR_OFF:
448 *val = LSM6DSM_GY_ODR_OFF;
449 break;
450
451 case LSM6DSM_GY_ODR_12Hz5:
452 *val = LSM6DSM_GY_ODR_12Hz5;
453 break;
454
455 case LSM6DSM_GY_ODR_26Hz:
456 *val = LSM6DSM_GY_ODR_26Hz;
457 break;
458
459 case LSM6DSM_GY_ODR_52Hz:
460 *val = LSM6DSM_GY_ODR_52Hz;
461 break;
462
463 case LSM6DSM_GY_ODR_104Hz:
464 *val = LSM6DSM_GY_ODR_104Hz;
465 break;
466
467 case LSM6DSM_GY_ODR_208Hz:
468 *val = LSM6DSM_GY_ODR_208Hz;
469 break;
470
471 case LSM6DSM_GY_ODR_416Hz:
472 *val = LSM6DSM_GY_ODR_416Hz;
473 break;
474
475 case LSM6DSM_GY_ODR_833Hz:
476 *val = LSM6DSM_GY_ODR_833Hz;
477 break;
478
479 case LSM6DSM_GY_ODR_1k66Hz:
480 *val = LSM6DSM_GY_ODR_1k66Hz;
481 break;
482
483 case LSM6DSM_GY_ODR_3k33Hz:
484 *val = LSM6DSM_GY_ODR_3k33Hz;
485 break;
486
487 case LSM6DSM_GY_ODR_6k66Hz:
488 *val = LSM6DSM_GY_ODR_6k66Hz;
489 break;
490
491 default:
492 *val = LSM6DSM_GY_ODR_OFF;
493 break;
494 }
495
496 return ret;
497 }
498
499 /**
500 * @brief Block data update.[set]
501 *
502 * @param ctx Read / write interface definitions
503 * @param val Change the values of bdu in reg CTRL3_C
504 * @retval Interface status (MANDATORY: return 0 -> no Error).
505 *
506 */
lsm6dsm_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)507 int32_t lsm6dsm_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
508 {
509 lsm6dsm_ctrl3_c_t ctrl3_c;
510 int32_t ret;
511
512 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
513
514 if (ret == 0)
515 {
516 ctrl3_c.bdu = val;
517 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
518 }
519
520 return ret;
521 }
522
523 /**
524 * @brief Block data update.[get]
525 *
526 * @param ctx Read / write interface definitions
527 * @param val Change the values of bdu in reg CTRL3_C
528 * @retval Interface status (MANDATORY: return 0 -> no Error).
529 *
530 */
lsm6dsm_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)531 int32_t lsm6dsm_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
532 {
533 lsm6dsm_ctrl3_c_t ctrl3_c;
534 int32_t ret;
535
536 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
537 *val = ctrl3_c.bdu;
538
539 return ret;
540 }
541
542 /**
543 * @brief Weight of XL user offset bits of registers
544 * X_OFS_USR(73h), Y_OFS_USR(74h), Z_OFS_USR(75h).[set]
545 *
546 * @param ctx Read / write interface definitions
547 * @param val Change the values of usr_off_w in reg CTRL6_C
548 * @retval Interface status (MANDATORY: return 0 -> no Error).
549 *
550 */
lsm6dsm_xl_offset_weight_set(const stmdev_ctx_t * ctx,lsm6dsm_usr_off_w_t val)551 int32_t lsm6dsm_xl_offset_weight_set(const stmdev_ctx_t *ctx,
552 lsm6dsm_usr_off_w_t val)
553 {
554 lsm6dsm_ctrl6_c_t ctrl6_c;
555 int32_t ret;
556
557 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
558
559 if (ret == 0)
560 {
561 ctrl6_c.usr_off_w = (uint8_t) val;
562 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
563 }
564
565 return ret;
566 }
567
568 /**
569 * @brief Weight of XL user offset bits of registers
570 * X_OFS_USR(73h), Y_OFS_USR(74h), Z_OFS_USR(75h).[get]
571 *
572 * @param ctx Read / write interface definitions
573 * @param val Get the values of usr_off_w in reg CTRL6_C
574 * @retval Interface status (MANDATORY: return 0 -> no Error).
575 *
576 */
lsm6dsm_xl_offset_weight_get(const stmdev_ctx_t * ctx,lsm6dsm_usr_off_w_t * val)577 int32_t lsm6dsm_xl_offset_weight_get(const stmdev_ctx_t *ctx,
578 lsm6dsm_usr_off_w_t *val)
579 {
580 lsm6dsm_ctrl6_c_t ctrl6_c;
581 int32_t ret;
582
583 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
584
585 switch (ctrl6_c.usr_off_w)
586 {
587 case LSM6DSM_LSb_1mg:
588 *val = LSM6DSM_LSb_1mg;
589 break;
590
591 case LSM6DSM_LSb_16mg:
592 *val = LSM6DSM_LSb_16mg;
593 break;
594
595 default:
596 *val = LSM6DSM_LSb_1mg;
597 break;
598 }
599
600 return ret;
601 }
602
603 /**
604 * @brief High-performance operating mode for accelerometer[set]
605 *
606 * @param ctx Read / write interface definitions
607 * @param val Change the values of xl_hm_mode in reg CTRL6_C
608 * @retval Interface status (MANDATORY: return 0 -> no Error).
609 *
610 */
lsm6dsm_xl_power_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_xl_hm_mode_t val)611 int32_t lsm6dsm_xl_power_mode_set(const stmdev_ctx_t *ctx,
612 lsm6dsm_xl_hm_mode_t val)
613 {
614 lsm6dsm_ctrl6_c_t ctrl6_c;
615 int32_t ret;
616
617 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
618
619 if (ret == 0)
620 {
621 ctrl6_c.xl_hm_mode = (uint8_t) val;
622 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
623 }
624
625 return ret;
626 }
627
628 /**
629 * @brief High-performance operating mode for accelerometer.[get]
630 *
631 * @param ctx Read / write interface definitions
632 * @param val Get the values of xl_hm_mode in reg CTRL6_C
633 * @retval Interface status (MANDATORY: return 0 -> no Error).
634 *
635 */
lsm6dsm_xl_power_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_xl_hm_mode_t * val)636 int32_t lsm6dsm_xl_power_mode_get(const stmdev_ctx_t *ctx,
637 lsm6dsm_xl_hm_mode_t *val)
638 {
639 lsm6dsm_ctrl6_c_t ctrl6_c;
640 int32_t ret;
641
642 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
643
644 switch (ctrl6_c.xl_hm_mode)
645 {
646 case LSM6DSM_XL_HIGH_PERFORMANCE:
647 *val = LSM6DSM_XL_HIGH_PERFORMANCE;
648 break;
649
650 case LSM6DSM_XL_NORMAL:
651 *val = LSM6DSM_XL_NORMAL;
652 break;
653
654 default:
655 *val = LSM6DSM_XL_HIGH_PERFORMANCE;
656 break;
657 }
658
659 return ret;
660 }
661
662 /**
663 * @brief Source register rounding function on WAKE_UP_SRC (1Bh),
664 * TAP_SRC (1Ch), D6D_SRC (1Dh), STATUS_REG (1Eh) and
665 * FUNC_SRC1 (53h) registers in the primary interface.[set]
666 *
667 * @param ctx Read / write interface definitions
668 * @param val Change the values of rounding_status in reg CTRL7_G
669 * @retval Interface status (MANDATORY: return 0 -> no Error).
670 *
671 */
lsm6dsm_rounding_on_status_set(const stmdev_ctx_t * ctx,lsm6dsm_rounding_status_t val)672 int32_t lsm6dsm_rounding_on_status_set(const stmdev_ctx_t *ctx,
673 lsm6dsm_rounding_status_t val)
674 {
675 lsm6dsm_ctrl7_g_t ctrl7_g;
676 int32_t ret;
677
678 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
679
680 if (ret == 0)
681 {
682 ctrl7_g.rounding_status = (uint8_t) val;
683 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
684 }
685
686 return ret;
687 }
688
689 /**
690 * @brief Source register rounding function on WAKE_UP_SRC (1Bh),
691 * TAP_SRC (1Ch), D6D_SRC (1Dh), STATUS_REG (1Eh) and
692 * FUNC_SRC1 (53h) registers in the primary interface.[get]
693 *
694 * @param ctx Read / write interface definitions
695 * @param val Get the values of rounding_status in reg CTRL7_G
696 * @retval Interface status (MANDATORY: return 0 -> no Error).
697 *
698 */
lsm6dsm_rounding_on_status_get(const stmdev_ctx_t * ctx,lsm6dsm_rounding_status_t * val)699 int32_t lsm6dsm_rounding_on_status_get(const stmdev_ctx_t *ctx,
700 lsm6dsm_rounding_status_t *val)
701 {
702 lsm6dsm_ctrl7_g_t ctrl7_g;
703 int32_t ret;
704
705 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
706
707 switch (ctrl7_g.rounding_status)
708 {
709 case LSM6DSM_STAT_RND_DISABLE:
710 *val = LSM6DSM_STAT_RND_DISABLE;
711 break;
712
713 case LSM6DSM_STAT_RND_ENABLE:
714 *val = LSM6DSM_STAT_RND_ENABLE;
715 break;
716
717 default:
718 *val = LSM6DSM_STAT_RND_DISABLE;
719 break;
720 }
721
722 return ret;
723 }
724
725 /**
726 * @brief High-performance operating mode disable for gyroscope.[set]
727 *
728 * @param ctx Read / write interface definitions
729 * @param val Change the values of g_hm_mode in reg CTRL7_G
730 * @retval Interface status (MANDATORY: return 0 -> no Error).
731 *
732 */
lsm6dsm_gy_power_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_g_hm_mode_t val)733 int32_t lsm6dsm_gy_power_mode_set(const stmdev_ctx_t *ctx,
734 lsm6dsm_g_hm_mode_t val)
735 {
736 lsm6dsm_ctrl7_g_t ctrl7_g;
737 int32_t ret;
738
739 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
740
741 if (ret == 0)
742 {
743 ctrl7_g.g_hm_mode = (uint8_t) val;
744 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
745 }
746
747 return ret;
748 }
749
750 /**
751 * @brief High-performance operating mode disable for gyroscope.[get]
752 *
753 * @param ctx Read / write interface definitions
754 * @param val Get the values of g_hm_mode in reg CTRL7_G
755 * @retval Interface status (MANDATORY: return 0 -> no Error).
756 *
757 */
lsm6dsm_gy_power_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_g_hm_mode_t * val)758 int32_t lsm6dsm_gy_power_mode_get(const stmdev_ctx_t *ctx,
759 lsm6dsm_g_hm_mode_t *val)
760 {
761 lsm6dsm_ctrl7_g_t ctrl7_g;
762 int32_t ret;
763
764 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
765
766 switch (ctrl7_g.g_hm_mode)
767 {
768 case LSM6DSM_GY_HIGH_PERFORMANCE:
769 *val = LSM6DSM_GY_HIGH_PERFORMANCE;
770 break;
771
772 case LSM6DSM_GY_NORMAL:
773 *val = LSM6DSM_GY_NORMAL;
774 break;
775
776 default:
777 *val = LSM6DSM_GY_HIGH_PERFORMANCE;
778 break;
779 }
780
781 return ret;
782 }
783
784 /**
785 * @brief Read all the interrupt/status flag of the device.[get]
786 *
787 * @param ctx Read / write interface definitions
788 * @param val WAKE_UP_SRC, TAP_SRC, D6D_SRC, STATUS_REG,
789 * FUNC_SRC1, FUNC_SRC2, WRIST_TILT_IA, A_WRIST_TILT_Mask
790 * @retval Interface status (MANDATORY: return 0 -> no Error).
791 *
792 */
lsm6dsm_all_sources_get(const stmdev_ctx_t * ctx,lsm6dsm_all_sources_t * val)793 int32_t lsm6dsm_all_sources_get(const stmdev_ctx_t *ctx,
794 lsm6dsm_all_sources_t *val)
795 {
796 int32_t ret;
797
798 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_SRC,
799 (uint8_t *) & (val->wake_up_src), 1);
800
801 if (ret == 0)
802 {
803 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_SRC,
804 (uint8_t *) & (val->tap_src), 1);
805 }
806
807 if (ret == 0)
808 {
809 ret = lsm6dsm_read_reg(ctx, LSM6DSM_D6D_SRC,
810 (uint8_t *) & (val->d6d_src), 1);
811 }
812
813 if (ret == 0)
814 {
815 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_REG,
816 (uint8_t *) & (val->status_reg), 1);
817 }
818
819 if (ret == 0)
820 {
821 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FUNC_SRC1,
822 (uint8_t *) & (val->func_src1), 1);
823 }
824
825 if (ret == 0)
826 {
827 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FUNC_SRC2,
828 (uint8_t *) & (val->func_src2), 1);
829 }
830
831 if (ret == 0)
832 {
833 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WRIST_TILT_IA,
834 (uint8_t *) & (val->wrist_tilt_ia), 1);
835 }
836
837 if (ret == 0)
838 {
839 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
840 }
841
842 if (ret == 0)
843 {
844 ret = lsm6dsm_read_reg(ctx, LSM6DSM_A_WRIST_TILT_MASK,
845 (uint8_t *) & (val->a_wrist_tilt_mask), 1);
846 }
847
848 if (ret == 0)
849 {
850 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
851 }
852
853 return ret;
854 }
855 /**
856 * @brief The STATUS_REG register is read by the primary interface[get]
857 *
858 * @param ctx Read / write interface definitions
859 * @param val Registers STATUS_REG
860 * @retval Interface status (MANDATORY: return 0 -> no Error).
861 *
862 */
lsm6dsm_status_reg_get(const stmdev_ctx_t * ctx,lsm6dsm_status_reg_t * val)863 int32_t lsm6dsm_status_reg_get(const stmdev_ctx_t *ctx,
864 lsm6dsm_status_reg_t *val)
865 {
866 int32_t ret;
867
868 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_REG, (uint8_t *) val, 1);
869
870 return ret;
871 }
872
873 /**
874 * @brief Accelerometer new data available.[get]
875 *
876 * @param ctx Read / write interface definitions
877 * @param val Change the values of xlda in reg STATUS_REG
878 * @retval Interface status (MANDATORY: return 0 -> no Error).
879 *
880 */
lsm6dsm_xl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)881 int32_t lsm6dsm_xl_flag_data_ready_get(const stmdev_ctx_t *ctx,
882 uint8_t *val)
883 {
884 lsm6dsm_status_reg_t status_reg;
885 int32_t ret;
886
887 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_REG,
888 (uint8_t *)&status_reg, 1);
889 *val = status_reg.xlda;
890
891 return ret;
892 }
893
894 /**
895 * @brief Gyroscope new data available.[get]
896 *
897 * @param ctx Read / write interface definitions
898 * @param val Change the values of gda in reg STATUS_REG
899 * @retval Interface status (MANDATORY: return 0 -> no Error).
900 *
901 */
lsm6dsm_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)902 int32_t lsm6dsm_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
903 uint8_t *val)
904 {
905 lsm6dsm_status_reg_t status_reg;
906 int32_t ret;
907
908 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_REG,
909 (uint8_t *)&status_reg, 1);
910 *val = status_reg.gda;
911
912 return ret;
913 }
914
915 /**
916 * @brief Temperature new data available.[get]
917 *
918 * @param ctx Read / write interface definitions
919 * @param val Change the values of tda in reg STATUS_REG
920 * @retval Interface status (MANDATORY: return 0 -> no Error).
921 *
922 */
lsm6dsm_temp_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)923 int32_t lsm6dsm_temp_flag_data_ready_get(const stmdev_ctx_t *ctx,
924 uint8_t *val)
925 {
926 lsm6dsm_status_reg_t status_reg;
927 int32_t ret;
928
929 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_REG,
930 (uint8_t *)&status_reg, 1);
931 *val = status_reg.tda;
932
933 return ret;
934 }
935
936 /**
937 * @brief Accelerometer axis user offset correction expressed in two’s
938 * complement, weight depends on USR_OFF_W in CTRL6_C.
939 * The value must be in the range [-127 127].[set]
940 *
941 * @param ctx Read / write interface definitions
942 * @param buff Buffer that contains data to write
943 * @retval Interface status (MANDATORY: return 0 -> no Error).
944 *
945 */
lsm6dsm_xl_usr_offset_set(const stmdev_ctx_t * ctx,uint8_t * buff)946 int32_t lsm6dsm_xl_usr_offset_set(const stmdev_ctx_t *ctx, uint8_t *buff)
947 {
948 int32_t ret;
949
950 ret = lsm6dsm_write_reg(ctx, LSM6DSM_X_OFS_USR, buff, 3);
951
952 return ret;
953 }
954
955 /**
956 * @brief Accelerometer axis user offset correction xpressed in two’s
957 * complement, weight depends on USR_OFF_W in CTRL6_C.
958 * The value must be in the range [-127 127].[get]
959 *
960 * @param ctx Read / write interface definitions
961 * @param buff Buffer that stores data read
962 * @retval Interface status (MANDATORY: return 0 -> no Error).
963 *
964 */
lsm6dsm_xl_usr_offset_get(const stmdev_ctx_t * ctx,uint8_t * buff)965 int32_t lsm6dsm_xl_usr_offset_get(const stmdev_ctx_t *ctx, uint8_t *buff)
966 {
967 int32_t ret;
968
969 ret = lsm6dsm_read_reg(ctx, LSM6DSM_X_OFS_USR, buff, 3);
970
971 return ret;
972 }
973
974 /**
975 * @}
976 *
977 */
978
979 /**
980 * @defgroup LSM6DSM_Timestamp
981 * @brief This section groups all the functions that manage the
982 * timestamp generation.
983 * @{
984 *
985 */
986
987 /**
988 * @brief Enable timestamp count. The count is saved in TIMESTAMP0_REG (40h),
989 * TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h).[set]
990 *
991 * @param ctx Read / write interface definitions
992 * @param val Change the values of timer_en in reg CTRL10_C
993 * @retval Interface status (MANDATORY: return 0 -> no Error).
994 *
995 */
lsm6dsm_timestamp_set(const stmdev_ctx_t * ctx,uint8_t val)996 int32_t lsm6dsm_timestamp_set(const stmdev_ctx_t *ctx, uint8_t val)
997 {
998 lsm6dsm_ctrl10_c_t ctrl10_c;
999 int32_t ret;
1000
1001 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1002
1003 if (ret == 0)
1004 {
1005 ctrl10_c.timer_en = val;
1006
1007 if (val != 0x00U)
1008 {
1009 ctrl10_c.func_en = val;
1010 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1011 }
1012 }
1013
1014 return ret;
1015 }
1016
1017 /**
1018 * @brief Enable timestamp count. The count is saved in TIMESTAMP0_REG (40h),
1019 * TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h).[get]
1020 *
1021 * @param ctx Read / write interface definitions
1022 * @param val Change the values of timer_en in reg CTRL10_C
1023 * @retval Interface status (MANDATORY: return 0 -> no Error).
1024 *
1025 */
lsm6dsm_timestamp_get(const stmdev_ctx_t * ctx,uint8_t * val)1026 int32_t lsm6dsm_timestamp_get(const stmdev_ctx_t *ctx, uint8_t *val)
1027 {
1028 lsm6dsm_ctrl10_c_t ctrl10_c;
1029 int32_t ret;
1030
1031 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
1032 *val = ctrl10_c.timer_en;
1033
1034 return ret;
1035 }
1036
1037 /**
1038 * @brief Timestamp register resolution setting.
1039 * Configuration of this bit affects
1040 * TIMESTAMP0_REG(40h), TIMESTAMP1_REG(41h),
1041 * TIMESTAMP2_REG(42h), STEP_TIMESTAMP_L(49h),
1042 * STEP_TIMESTAMP_H(4Ah) and
1043 * STEP_COUNT_DELTA(15h) registers.[set]
1044 *
1045 * @param ctx Read / write interface definitions
1046 * @param val Change the values of timer_hr in reg WAKE_UP_DUR
1047 * @retval Interface status (MANDATORY: return 0 -> no Error).
1048 *
1049 */
lsm6dsm_timestamp_res_set(const stmdev_ctx_t * ctx,lsm6dsm_timer_hr_t val)1050 int32_t lsm6dsm_timestamp_res_set(const stmdev_ctx_t *ctx,
1051 lsm6dsm_timer_hr_t val)
1052 {
1053 lsm6dsm_wake_up_dur_t wake_up_dur;
1054 int32_t ret;
1055
1056 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
1057 (uint8_t *)&wake_up_dur, 1);
1058
1059 if (ret == 0)
1060 {
1061 wake_up_dur.timer_hr = (uint8_t) val;
1062 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_DUR,
1063 (uint8_t *)&wake_up_dur, 1);
1064 }
1065
1066 return ret;
1067 }
1068
1069 /**
1070 * @brief Timestamp register resolution setting.
1071 * Configuration of this bit affects
1072 * TIMESTAMP0_REG(40h), TIMESTAMP1_REG(41h),
1073 * TIMESTAMP2_REG(42h), STEP_TIMESTAMP_L(49h),
1074 * STEP_TIMESTAMP_H(4Ah) and
1075 * STEP_COUNT_DELTA(15h) registers.[get]
1076 *
1077 * @param ctx Read / write interface definitions
1078 * @param val Get the values of timer_hr in reg WAKE_UP_DUR
1079 * @retval Interface status (MANDATORY: return 0 -> no Error).
1080 *
1081 */
lsm6dsm_timestamp_res_get(const stmdev_ctx_t * ctx,lsm6dsm_timer_hr_t * val)1082 int32_t lsm6dsm_timestamp_res_get(const stmdev_ctx_t *ctx,
1083 lsm6dsm_timer_hr_t *val)
1084 {
1085 lsm6dsm_wake_up_dur_t wake_up_dur;
1086 int32_t ret;
1087
1088 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
1089 (uint8_t *)&wake_up_dur, 1);
1090
1091 switch (wake_up_dur.timer_hr)
1092 {
1093 case LSM6DSM_LSB_6ms4:
1094 *val = LSM6DSM_LSB_6ms4;
1095 break;
1096
1097 case LSM6DSM_LSB_25us:
1098 *val = LSM6DSM_LSB_25us;
1099 break;
1100
1101 default:
1102 *val = LSM6DSM_LSB_6ms4;
1103 break;
1104 }
1105
1106 return ret;
1107 }
1108
1109 /**
1110 * @}
1111 *
1112 */
1113
1114 /**
1115 * @defgroup LSM6DSM_Dataoutput
1116 * @brief This section groups all the data output functions.
1117 * @{
1118 *
1119 */
1120
1121 /**
1122 * @brief Circular burst-mode (rounding) read from output registers
1123 * through the primary interface.[set]
1124 *
1125 * @param ctx Read / write interface definitions
1126 * @param val Change the values of rounding in reg CTRL5_C
1127 * @retval Interface status (MANDATORY: return 0 -> no Error).
1128 *
1129 */
lsm6dsm_rounding_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_rounding_t val)1130 int32_t lsm6dsm_rounding_mode_set(const stmdev_ctx_t *ctx,
1131 lsm6dsm_rounding_t val)
1132 {
1133 lsm6dsm_ctrl5_c_t ctrl5_c;
1134 int32_t ret;
1135
1136 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1137
1138 if (ret == 0)
1139 {
1140 ctrl5_c.rounding = (uint8_t) val;
1141 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1142 }
1143
1144 return ret;
1145 }
1146
1147 /**
1148 * @brief Circular burst-mode (rounding) read from output registers
1149 * through the primary interface.[get]
1150 *
1151 * @param ctx Read / write interface definitions
1152 * @param val Get the values of rounding in reg CTRL5_C
1153 * @retval Interface status (MANDATORY: return 0 -> no Error).
1154 *
1155 */
lsm6dsm_rounding_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_rounding_t * val)1156 int32_t lsm6dsm_rounding_mode_get(const stmdev_ctx_t *ctx,
1157 lsm6dsm_rounding_t *val)
1158 {
1159 lsm6dsm_ctrl5_c_t ctrl5_c;
1160 int32_t ret;
1161
1162 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1163
1164 switch (ctrl5_c.rounding)
1165 {
1166 case LSM6DSM_ROUND_DISABLE:
1167 *val = LSM6DSM_ROUND_DISABLE;
1168 break;
1169
1170 case LSM6DSM_ROUND_XL:
1171 *val = LSM6DSM_ROUND_XL;
1172 break;
1173
1174 case LSM6DSM_ROUND_GY:
1175 *val = LSM6DSM_ROUND_GY;
1176 break;
1177
1178 case LSM6DSM_ROUND_GY_XL:
1179 *val = LSM6DSM_ROUND_GY_XL;
1180 break;
1181
1182 case LSM6DSM_ROUND_SH1_TO_SH6:
1183 *val = LSM6DSM_ROUND_SH1_TO_SH6;
1184 break;
1185
1186 case LSM6DSM_ROUND_XL_SH1_TO_SH6:
1187 *val = LSM6DSM_ROUND_XL_SH1_TO_SH6;
1188 break;
1189
1190 case LSM6DSM_ROUND_GY_XL_SH1_TO_SH12:
1191 *val = LSM6DSM_ROUND_GY_XL_SH1_TO_SH12;
1192 break;
1193
1194 case LSM6DSM_ROUND_GY_XL_SH1_TO_SH6:
1195 *val = LSM6DSM_ROUND_GY_XL_SH1_TO_SH6;
1196 break;
1197
1198 default:
1199 *val = LSM6DSM_ROUND_DISABLE;
1200 break;
1201 }
1202
1203 return ret;
1204 }
1205
1206 /**
1207 * @brief Temperature data output register (r). L and H registers together
1208 * express a 16-bit word in two’s complement.[get]
1209 *
1210 * @param ctx Read / write interface definitions
1211 * @param buff Buffer that stores data read
1212 * @retval Interface status (MANDATORY: return 0 -> no Error).
1213 *
1214 */
lsm6dsm_temperature_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1215 int32_t lsm6dsm_temperature_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1216 {
1217 uint8_t buff[2];
1218 int32_t ret;
1219
1220 ret = lsm6dsm_read_reg(ctx, LSM6DSM_OUT_TEMP_L, buff, 2);
1221 val[0] = (int16_t)buff[1];
1222 val[0] = (val[0] * 256) + (int16_t)buff[0];
1223
1224 return ret;
1225 }
1226
1227 /**
1228 * @brief Angular rate sensor. The value is expressed as a 16-bit word in
1229 * two’s complement.[get]
1230 *
1231 * @param ctx Read / write interface definitions
1232 * @param buff Buffer that stores data read
1233 * @retval Interface status (MANDATORY: return 0 -> no Error).
1234 *
1235 */
lsm6dsm_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1236 int32_t lsm6dsm_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1237 {
1238 uint8_t buff[6];
1239 int32_t ret;
1240
1241 ret = lsm6dsm_read_reg(ctx, LSM6DSM_OUTX_L_G, buff, 6);
1242 val[0] = (int16_t)buff[1];
1243 val[0] = (val[0] * 256) + (int16_t)buff[0];
1244 val[1] = (int16_t)buff[3];
1245 val[1] = (val[1] * 256) + (int16_t)buff[2];
1246 val[2] = (int16_t)buff[5];
1247 val[2] = (val[2] * 256) + (int16_t)buff[4];
1248
1249 return ret;
1250 }
1251
1252 /**
1253 * @brief Linear acceleration output register. The value is expressed
1254 * as a 16-bit word in two’s complement.[get]
1255 *
1256 * @param ctx Read / write interface definitions
1257 * @param buff Buffer that stores data read
1258 * @retval Interface status (MANDATORY: return 0 -> no Error).
1259 *
1260 */
lsm6dsm_acceleration_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1261 int32_t lsm6dsm_acceleration_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
1262 {
1263 uint8_t buff[6];
1264 int32_t ret;
1265
1266 ret = lsm6dsm_read_reg(ctx, LSM6DSM_OUTX_L_XL, buff, 6);
1267 val[0] = (int16_t)buff[1];
1268 val[0] = (val[0] * 256) + (int16_t)buff[0];
1269 val[1] = (int16_t)buff[3];
1270 val[1] = (val[1] * 256) + (int16_t)buff[2];
1271 val[2] = (int16_t)buff[5];
1272 val[2] = (val[2] * 256) + (int16_t)buff[4];
1273
1274 return ret;
1275 }
1276
1277 /**
1278 * @brief External magnetometer raw data.[get]
1279 *
1280 * @param ctx Read / write interface definitions
1281 * @param buff Buffer that stores data read
1282 * @retval Interface status (MANDATORY: return 0 -> no Error).
1283 *
1284 */
lsm6dsm_mag_calibrated_raw_get(const stmdev_ctx_t * ctx,int16_t * val)1285 int32_t lsm6dsm_mag_calibrated_raw_get(const stmdev_ctx_t *ctx,
1286 int16_t *val)
1287 {
1288 uint8_t buff[6];
1289 int32_t ret;
1290
1291 ret = lsm6dsm_read_reg(ctx, LSM6DSM_OUT_MAG_RAW_X_L, buff, 6);
1292 val[0] = (int16_t)buff[1];
1293 val[0] = (val[0] * 256) + (int16_t)buff[0];
1294 val[1] = (int16_t)buff[3];
1295 val[1] = (val[1] * 256) + (int16_t)buff[2];
1296 val[2] = (int16_t)buff[5];
1297 val[2] = (val[2] * 256) + (int16_t)buff[4];
1298
1299 return ret;
1300 }
1301
1302 /**
1303 * @brief Read data in FIFO.[get]
1304 *
1305 * @param ctx Read / write interface definitions
1306 * @param buffer Data buffer to store FIFO data.
1307 * @param len Number of data to read from FIFO.
1308 * @retval Interface status (MANDATORY: return 0 -> no Error).
1309 *
1310 */
lsm6dsm_fifo_raw_data_get(const stmdev_ctx_t * ctx,uint8_t * buffer,uint8_t len)1311 int32_t lsm6dsm_fifo_raw_data_get(const stmdev_ctx_t *ctx, uint8_t *buffer,
1312 uint8_t len)
1313 {
1314 int32_t ret;
1315
1316 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_DATA_OUT_L, buffer, len);
1317
1318 return ret;
1319 }
1320
1321 /**
1322 * @}
1323 *
1324 */
1325
1326 /**
1327 * @defgroup LSM6DSM_common
1328 * @brief This section groups common useful functions.
1329 * @{
1330 *
1331 */
1332
1333 /**
1334 * @brief Enable access to the embedded functions/sensor hub
1335 * configuration registers[set]
1336 *
1337 * @param ctx Read / write interface definitions
1338 * @param val Change the values of func_cfg_en in reg FUNC_CFG_ACCESS
1339 * @retval Interface status (MANDATORY: return 0 -> no Error).
1340 *
1341 */
lsm6dsm_mem_bank_set(const stmdev_ctx_t * ctx,lsm6dsm_func_cfg_en_t val)1342 int32_t lsm6dsm_mem_bank_set(const stmdev_ctx_t *ctx,
1343 lsm6dsm_func_cfg_en_t val)
1344 {
1345 lsm6dsm_func_cfg_access_t func_cfg_access;
1346 int32_t ret;
1347
1348 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FUNC_CFG_ACCESS,
1349 (uint8_t *)&func_cfg_access, 1);
1350
1351 if (ret == 0)
1352 {
1353 func_cfg_access.func_cfg_en = (uint8_t) val;
1354 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FUNC_CFG_ACCESS,
1355 (uint8_t *)&func_cfg_access, 1);
1356 }
1357
1358 return ret;
1359 }
1360
1361 /**
1362 * @brief Enable access to the embedded functions/sensor hub configuration
1363 * registers[get]
1364 *
1365 * @param ctx Read / write interface definitions
1366 * @param val Get the values of func_cfg_en in reg FUNC_CFG_ACCESS
1367 * @retval Interface status (MANDATORY: return 0 -> no Error).
1368 *
1369 */
lsm6dsm_mem_bank_get(const stmdev_ctx_t * ctx,lsm6dsm_func_cfg_en_t * val)1370 int32_t lsm6dsm_mem_bank_get(const stmdev_ctx_t *ctx,
1371 lsm6dsm_func_cfg_en_t *val)
1372 {
1373 lsm6dsm_func_cfg_access_t func_cfg_access;
1374 int32_t ret;
1375
1376 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FUNC_CFG_ACCESS,
1377 (uint8_t *)&func_cfg_access, 1);
1378
1379 switch (func_cfg_access.func_cfg_en)
1380 {
1381 case LSM6DSM_USER_BANK:
1382 *val = LSM6DSM_USER_BANK;
1383 break;
1384
1385 case LSM6DSM_BANK_B:
1386 *val = LSM6DSM_BANK_B;
1387 break;
1388
1389 default:
1390 *val = LSM6DSM_USER_BANK;
1391 break;
1392 }
1393
1394 return ret;
1395 }
1396
1397 /**
1398 * @brief Data-ready pulsed / letched mode[set]
1399 *
1400 * @param ctx Read / write interface definitions
1401 * @param val Change the values of drdy_pulsed in reg DRDY_PULSE_CFG
1402 * @retval Interface status (MANDATORY: return 0 -> no Error).
1403 *
1404 */
lsm6dsm_data_ready_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_drdy_pulsed_g_t val)1405 int32_t lsm6dsm_data_ready_mode_set(const stmdev_ctx_t *ctx,
1406 lsm6dsm_drdy_pulsed_g_t val)
1407 {
1408 lsm6dsm_drdy_pulse_cfg_t drdy_pulse_cfg;
1409 int32_t ret;
1410
1411 ret = lsm6dsm_read_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
1412 (uint8_t *)&drdy_pulse_cfg, 1);
1413
1414 if (ret == 0)
1415 {
1416 drdy_pulse_cfg.drdy_pulsed = (uint8_t) val;
1417 ret = lsm6dsm_write_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
1418 (uint8_t *)&drdy_pulse_cfg, 1);
1419 }
1420
1421 return ret;
1422 }
1423
1424 /**
1425 * @brief Data-ready pulsed / letched mode[get]
1426 *
1427 * @param ctx Read / write interface definitions
1428 * @param val Get the values of drdy_pulsed in reg DRDY_PULSE_CFG
1429 * @retval Interface status (MANDATORY: return 0 -> no Error).
1430 *
1431 */
lsm6dsm_data_ready_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_drdy_pulsed_g_t * val)1432 int32_t lsm6dsm_data_ready_mode_get(const stmdev_ctx_t *ctx,
1433 lsm6dsm_drdy_pulsed_g_t *val)
1434 {
1435 lsm6dsm_drdy_pulse_cfg_t drdy_pulse_cfg;
1436 int32_t ret;
1437
1438 ret = lsm6dsm_read_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
1439 (uint8_t *)&drdy_pulse_cfg, 1);
1440
1441 switch (drdy_pulse_cfg.drdy_pulsed)
1442 {
1443 case LSM6DSM_DRDY_LATCHED:
1444 *val = LSM6DSM_DRDY_LATCHED;
1445 break;
1446
1447 case LSM6DSM_DRDY_PULSED:
1448 *val = LSM6DSM_DRDY_PULSED;
1449 break;
1450
1451 default:
1452 *val = LSM6DSM_DRDY_LATCHED;
1453 break;
1454 }
1455
1456 return ret;
1457 }
1458
1459 /**
1460 * @brief DeviceWhoamI.[get]
1461 *
1462 * @param ctx Read / write interface definitions
1463 * @param buff Buffer that stores data read
1464 * @retval Interface status (MANDATORY: return 0 -> no Error).
1465 *
1466 */
lsm6dsm_device_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)1467 int32_t lsm6dsm_device_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
1468 {
1469 int32_t ret;
1470
1471 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WHO_AM_I, buff, 1);
1472
1473 return ret;
1474 }
1475
1476 /**
1477 * @brief Software reset. Restore the default values in user registers[set]
1478 *
1479 * @param ctx Read / write interface definitions
1480 * @param val Change the values of sw_reset in reg CTRL3_C
1481 * @retval Interface status (MANDATORY: return 0 -> no Error).
1482 *
1483 */
lsm6dsm_reset_set(const stmdev_ctx_t * ctx,uint8_t val)1484 int32_t lsm6dsm_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
1485 {
1486 lsm6dsm_ctrl3_c_t ctrl3_c;
1487 int32_t ret;
1488
1489 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1490
1491 if (ret == 0)
1492 {
1493 ctrl3_c.sw_reset = val;
1494 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1495 }
1496
1497 return ret;
1498 }
1499
1500 /**
1501 * @brief Software reset. Restore the default values in user registers[get]
1502 *
1503 * @param ctx Read / write interface definitions
1504 * @param val Change the values of sw_reset in reg CTRL3_C
1505 * @retval Interface status (MANDATORY: return 0 -> no Error).
1506 *
1507 */
lsm6dsm_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)1508 int32_t lsm6dsm_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
1509 {
1510 lsm6dsm_ctrl3_c_t ctrl3_c;
1511 int32_t ret;
1512
1513 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1514 *val = ctrl3_c.sw_reset;
1515
1516 return ret;
1517 }
1518
1519 /**
1520 * @brief Big/Little Endian Data selection.[set]
1521 *
1522 * @param ctx Read / write interface definitions
1523 * @param val Change the values of ble in reg CTRL3_C
1524 * @retval Interface status (MANDATORY: return 0 -> no Error).
1525 *
1526 */
lsm6dsm_data_format_set(const stmdev_ctx_t * ctx,lsm6dsm_ble_t val)1527 int32_t lsm6dsm_data_format_set(const stmdev_ctx_t *ctx, lsm6dsm_ble_t val)
1528 {
1529 lsm6dsm_ctrl3_c_t ctrl3_c;
1530 int32_t ret;
1531
1532 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1533
1534 if (ret == 0)
1535 {
1536 ctrl3_c.ble = (uint8_t) val;
1537 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1538 }
1539
1540 return ret;
1541 }
1542
1543 /**
1544 * @brief Big/Little Endian Data selection.[get]
1545 *
1546 * @param ctx Read / write interface definitions
1547 * @param val Get the values of ble in reg CTRL3_C
1548 * @retval Interface status (MANDATORY: return 0 -> no Error).
1549 *
1550 */
lsm6dsm_data_format_get(const stmdev_ctx_t * ctx,lsm6dsm_ble_t * val)1551 int32_t lsm6dsm_data_format_get(const stmdev_ctx_t *ctx, lsm6dsm_ble_t *val)
1552 {
1553 lsm6dsm_ctrl3_c_t ctrl3_c;
1554 int32_t ret;
1555
1556 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1557
1558 switch (ctrl3_c.ble)
1559 {
1560 case LSM6DSM_LSB_AT_LOW_ADD:
1561 *val = LSM6DSM_LSB_AT_LOW_ADD;
1562 break;
1563
1564 case LSM6DSM_MSB_AT_LOW_ADD:
1565 *val = LSM6DSM_MSB_AT_LOW_ADD;
1566 break;
1567
1568 default:
1569 *val = LSM6DSM_LSB_AT_LOW_ADD;
1570 break;
1571 }
1572
1573 return ret;
1574 }
1575
1576 /**
1577 * @brief Register address automatically incremented during a multiple byte
1578 * access with a serial interface.[set]
1579 *
1580 * @param ctx Read / write interface definitions
1581 * @param val Change the values of if_inc in reg CTRL3_C
1582 * @retval Interface status (MANDATORY: return 0 -> no Error).
1583 *
1584 */
lsm6dsm_auto_increment_set(const stmdev_ctx_t * ctx,uint8_t val)1585 int32_t lsm6dsm_auto_increment_set(const stmdev_ctx_t *ctx, uint8_t val)
1586 {
1587 lsm6dsm_ctrl3_c_t ctrl3_c;
1588 int32_t ret;
1589
1590 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1591
1592 if (ret == 0)
1593 {
1594 ctrl3_c.if_inc = val;
1595 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1596 }
1597
1598 return ret;
1599 }
1600
1601 /**
1602 * @brief Register address automatically incremented during a multiple byte
1603 * access with a serial interface.[get]
1604 *
1605 * @param ctx Read / write interface definitions
1606 * @param val Change the values of if_inc in reg CTRL3_C
1607 * @retval Interface status (MANDATORY: return 0 -> no Error).
1608 *
1609 */
lsm6dsm_auto_increment_get(const stmdev_ctx_t * ctx,uint8_t * val)1610 int32_t lsm6dsm_auto_increment_get(const stmdev_ctx_t *ctx, uint8_t *val)
1611 {
1612 lsm6dsm_ctrl3_c_t ctrl3_c;
1613 int32_t ret;
1614
1615 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1616 *val = ctrl3_c.if_inc;
1617
1618 return ret;
1619 }
1620
1621 /**
1622 * @brief Reboot memory content. Reload the calibration parameters.[set]
1623 *
1624 * @param ctx Read / write interface definitions
1625 * @param val Change the values of boot in reg CTRL3_C
1626 * @retval Interface status (MANDATORY: return 0 -> no Error).
1627 *
1628 */
lsm6dsm_boot_set(const stmdev_ctx_t * ctx,uint8_t val)1629 int32_t lsm6dsm_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
1630 {
1631 lsm6dsm_ctrl3_c_t ctrl3_c;
1632 int32_t ret;
1633
1634 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1635
1636 if (ret == 0)
1637 {
1638 ctrl3_c.boot = val;
1639 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1640 }
1641
1642 return ret;
1643 }
1644
1645 /**
1646 * @brief Reboot memory content. Reload the calibration parameters.[get]
1647 *
1648 * @param ctx Read / write interface definitions
1649 * @param val Change the values of boot in reg CTRL3_C
1650 * @retval Interface status (MANDATORY: return 0 -> no Error).
1651 *
1652 */
lsm6dsm_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)1653 int32_t lsm6dsm_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
1654 {
1655 lsm6dsm_ctrl3_c_t ctrl3_c;
1656 int32_t ret;
1657
1658 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
1659 *val = ctrl3_c.boot;
1660
1661 return ret;
1662 }
1663
1664 /**
1665 * @brief Linear acceleration sensor self-test enable.[set]
1666 *
1667 * @param ctx Read / write interface definitions
1668 * @param val Change the values of st_xl in reg CTRL5_C
1669 * @retval Interface status (MANDATORY: return 0 -> no Error).
1670 *
1671 */
lsm6dsm_xl_self_test_set(const stmdev_ctx_t * ctx,lsm6dsm_st_xl_t val)1672 int32_t lsm6dsm_xl_self_test_set(const stmdev_ctx_t *ctx,
1673 lsm6dsm_st_xl_t val)
1674 {
1675 lsm6dsm_ctrl5_c_t ctrl5_c;
1676 int32_t ret;
1677
1678 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1679
1680 if (ret == 0)
1681 {
1682 ctrl5_c.st_xl = (uint8_t) val;
1683 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1684 }
1685
1686 return ret;
1687 }
1688
1689 /**
1690 * @brief Linear acceleration sensor self-test enable.[get]
1691 *
1692 * @param ctx Read / write interface definitions
1693 * @param val Get the values of st_xl in reg CTRL5_C
1694 * @retval Interface status (MANDATORY: return 0 -> no Error).
1695 *
1696 */
lsm6dsm_xl_self_test_get(const stmdev_ctx_t * ctx,lsm6dsm_st_xl_t * val)1697 int32_t lsm6dsm_xl_self_test_get(const stmdev_ctx_t *ctx,
1698 lsm6dsm_st_xl_t *val)
1699 {
1700 lsm6dsm_ctrl5_c_t ctrl5_c;
1701 int32_t ret;
1702
1703 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1704
1705 switch (ctrl5_c.st_xl)
1706 {
1707 case LSM6DSM_XL_ST_DISABLE:
1708 *val = LSM6DSM_XL_ST_DISABLE;
1709 break;
1710
1711 case LSM6DSM_XL_ST_POSITIVE:
1712 *val = LSM6DSM_XL_ST_POSITIVE;
1713 break;
1714
1715 case LSM6DSM_XL_ST_NEGATIVE:
1716 *val = LSM6DSM_XL_ST_NEGATIVE;
1717 break;
1718
1719 default:
1720 *val = LSM6DSM_XL_ST_DISABLE;
1721 break;
1722 }
1723
1724 return ret;
1725 }
1726
1727 /**
1728 * @brief Angular rate sensor self-test enable.[set]
1729 *
1730 * @param ctx Read / write interface definitions
1731 * @param val Change the values of st_g in reg CTRL5_C
1732 * @retval Interface status (MANDATORY: return 0 -> no Error).
1733 *
1734 */
lsm6dsm_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsm_st_g_t val)1735 int32_t lsm6dsm_gy_self_test_set(const stmdev_ctx_t *ctx,
1736 lsm6dsm_st_g_t val)
1737 {
1738 lsm6dsm_ctrl5_c_t ctrl5_c;
1739 int32_t ret;
1740
1741 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1742
1743 if (ret == 0)
1744 {
1745 ctrl5_c.st_g = (uint8_t) val;
1746 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1747 }
1748
1749 return ret;
1750 }
1751
1752 /**
1753 * @brief Angular rate sensor self-test enable.[get]
1754 *
1755 * @param ctx Read / write interface definitions
1756 * @param val Get the values of st_g in reg CTRL5_C
1757 * @retval Interface status (MANDATORY: return 0 -> no Error).
1758 *
1759 */
lsm6dsm_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsm_st_g_t * val)1760 int32_t lsm6dsm_gy_self_test_get(const stmdev_ctx_t *ctx,
1761 lsm6dsm_st_g_t *val)
1762 {
1763 lsm6dsm_ctrl5_c_t ctrl5_c;
1764 int32_t ret;
1765
1766 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
1767
1768 switch (ctrl5_c.st_g)
1769 {
1770 case LSM6DSM_GY_ST_DISABLE:
1771 *val = LSM6DSM_GY_ST_DISABLE;
1772 break;
1773
1774 case LSM6DSM_GY_ST_POSITIVE:
1775 *val = LSM6DSM_GY_ST_POSITIVE;
1776 break;
1777
1778 case LSM6DSM_GY_ST_NEGATIVE:
1779 *val = LSM6DSM_GY_ST_NEGATIVE;
1780 break;
1781
1782 default:
1783 *val = LSM6DSM_GY_ST_DISABLE;
1784 break;
1785 }
1786
1787 return ret;
1788 }
1789
1790 /**
1791 * @}
1792 *
1793 */
1794
1795 /**
1796 * @defgroup LSM6DSM_filters
1797 * @brief This section group all the functions concerning the filters
1798 * configuration that impact both accelerometer and gyro.
1799 * @{
1800 *
1801 */
1802
1803 /**
1804 * @brief Mask DRDY on pin (both XL & Gyro) until filter settling ends
1805 * (XL and Gyro independently masked).[set]
1806 *
1807 * @param ctx Read / write interface definitions
1808 * @param val Change the values of drdy_mask in reg CTRL4_C
1809 * @retval Interface status (MANDATORY: return 0 -> no Error).
1810 *
1811 */
lsm6dsm_filter_settling_mask_set(const stmdev_ctx_t * ctx,uint8_t val)1812 int32_t lsm6dsm_filter_settling_mask_set(const stmdev_ctx_t *ctx,
1813 uint8_t val)
1814 {
1815 lsm6dsm_ctrl4_c_t ctrl4_c;
1816 int32_t ret;
1817
1818 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1819
1820 if (ret == 0)
1821 {
1822 ctrl4_c.drdy_mask = val;
1823 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1824 }
1825
1826 return ret;
1827 }
1828
1829 /**
1830 * @brief Mask DRDY on pin (both XL & Gyro) until filter settling ends
1831 * (XL and Gyro independently masked).[get]
1832 *
1833 * @param ctx Read / write interface definitions
1834 * @param val Change the values of drdy_mask in reg CTRL4_C
1835 * @retval Interface status (MANDATORY: return 0 -> no Error).
1836 *
1837 */
lsm6dsm_filter_settling_mask_get(const stmdev_ctx_t * ctx,uint8_t * val)1838 int32_t lsm6dsm_filter_settling_mask_get(const stmdev_ctx_t *ctx,
1839 uint8_t *val)
1840 {
1841 lsm6dsm_ctrl4_c_t ctrl4_c;
1842 int32_t ret;
1843
1844 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
1845 *val = ctrl4_c.drdy_mask;
1846
1847 return ret;
1848 }
1849
1850 /**
1851 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity
1852 * functions.[set]
1853 *
1854 * @param ctx Read / write interface definitions
1855 * @param val Change the values of slope_fds in reg TAP_CFG
1856 * @retval Interface status (MANDATORY: return 0 -> no Error).
1857 *
1858 */
lsm6dsm_xl_hp_path_internal_set(const stmdev_ctx_t * ctx,lsm6dsm_slope_fds_t val)1859 int32_t lsm6dsm_xl_hp_path_internal_set(const stmdev_ctx_t *ctx,
1860 lsm6dsm_slope_fds_t val)
1861 {
1862 lsm6dsm_tap_cfg_t tap_cfg;
1863 int32_t ret;
1864
1865 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
1866
1867 if (ret == 0)
1868 {
1869 tap_cfg.slope_fds = (uint8_t) val;
1870 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
1871 }
1872
1873 return ret;
1874 }
1875
1876 /**
1877 * @brief HPF or SLOPE filter selection on wake-up and Activity/Inactivity
1878 * functions.[get]
1879 *
1880 * @param ctx Read / write interface definitions
1881 * @param val Get the values of slope_fds in reg TAP_CFG
1882 * @retval Interface status (MANDATORY: return 0 -> no Error).
1883 *
1884 */
lsm6dsm_xl_hp_path_internal_get(const stmdev_ctx_t * ctx,lsm6dsm_slope_fds_t * val)1885 int32_t lsm6dsm_xl_hp_path_internal_get(const stmdev_ctx_t *ctx,
1886 lsm6dsm_slope_fds_t *val)
1887 {
1888 lsm6dsm_tap_cfg_t tap_cfg;
1889 int32_t ret;
1890
1891 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
1892
1893 switch (tap_cfg.slope_fds)
1894 {
1895 case LSM6DSM_USE_SLOPE:
1896 *val = LSM6DSM_USE_SLOPE;
1897 break;
1898
1899 case LSM6DSM_USE_HPF:
1900 *val = LSM6DSM_USE_HPF;
1901 break;
1902
1903 default:
1904 *val = LSM6DSM_USE_SLOPE;
1905 break;
1906 }
1907
1908 return ret;
1909 }
1910
1911 /**
1912 * @}
1913 *
1914 */
1915
1916 /**
1917 * @defgroup LSM6DSM_accelerometer_filters
1918 * @brief This section group all the functions concerning the filters
1919 * configuration that impact accelerometer in every mode.
1920 * @{
1921 *
1922 */
1923
1924 /**
1925 * @brief Accelerometer analog chain bandwidth selection (only for
1926 * accelerometer ODR ≥ 1.67 kHz).[set]
1927 *
1928 * @param ctx Read / write interface definitions
1929 * @param val Change the values of bw0_xl in reg CTRL1_XL
1930 * @retval Interface status (MANDATORY: return 0 -> no Error).
1931 *
1932 */
lsm6dsm_xl_filter_analog_set(const stmdev_ctx_t * ctx,lsm6dsm_bw0_xl_t val)1933 int32_t lsm6dsm_xl_filter_analog_set(const stmdev_ctx_t *ctx,
1934 lsm6dsm_bw0_xl_t val)
1935 {
1936 lsm6dsm_ctrl1_xl_t ctrl1_xl;
1937 int32_t ret;
1938
1939 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
1940
1941 if (ret == 0)
1942 {
1943 ctrl1_xl.bw0_xl = (uint8_t) val;
1944 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
1945 }
1946
1947 return ret;
1948 }
1949
1950 /**
1951 * @brief Accelerometer analog chain bandwidth selection (only for
1952 * accelerometer ODR ≥ 1.67 kHz).[get]
1953 *
1954 * @param ctx Read / write interface definitions
1955 * @param val Get the values of bw0_xl in reg CTRL1_XL
1956 * @retval Interface status (MANDATORY: return 0 -> no Error).
1957 *
1958 */
lsm6dsm_xl_filter_analog_get(const stmdev_ctx_t * ctx,lsm6dsm_bw0_xl_t * val)1959 int32_t lsm6dsm_xl_filter_analog_get(const stmdev_ctx_t *ctx,
1960 lsm6dsm_bw0_xl_t *val)
1961 {
1962 lsm6dsm_ctrl1_xl_t ctrl1_xl;
1963 int32_t ret;
1964
1965 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
1966
1967 switch (ctrl1_xl.bw0_xl)
1968 {
1969 case LSM6DSM_XL_ANA_BW_1k5Hz:
1970 *val = LSM6DSM_XL_ANA_BW_1k5Hz;
1971 break;
1972
1973 case LSM6DSM_XL_ANA_BW_400Hz:
1974 *val = LSM6DSM_XL_ANA_BW_400Hz;
1975 break;
1976
1977 default:
1978 *val = LSM6DSM_XL_ANA_BW_1k5Hz;
1979 break;
1980 }
1981
1982 return ret;
1983 }
1984
1985 /**
1986 * @}
1987 *
1988 */
1989
1990 /**
1991 * @defgroup LSM6DSM_accelerometer_filters_mode:1,2,3
1992 * @brief This section group all the functions concerning the filters
1993 * configuration that impact accelerometer mode 1, 2, 3
1994 * (accelerometer on aux interface disable).
1995 * @{
1996 *
1997 */
1998
1999 /**
2000 * @brief Accelerometer digital LPF (LPF1) bandwidth selection LPF2 is
2001 * not used.[set]
2002 *
2003 * @param ctx Read / write interface definitions
2004 * @param val Change the values of lpf1_bw_sel in reg CTRL1_XL
2005 * @retval Interface status (MANDATORY: return 0 -> no Error).
2006 *
2007 */
lsm6dsm_xl_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_lpf1_bw_sel_t val)2008 int32_t lsm6dsm_xl_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
2009 lsm6dsm_lpf1_bw_sel_t val)
2010 {
2011 lsm6dsm_ctrl1_xl_t ctrl1_xl;
2012 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2013 int32_t ret;
2014
2015 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2016
2017 if (ret == 0)
2018 {
2019 ctrl1_xl.lpf1_bw_sel = (uint8_t) val;
2020 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2021
2022 if (ret == 0)
2023 {
2024 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2025
2026 if (ret == 0)
2027 {
2028 ctrl8_xl.lpf2_xl_en = 0;
2029 ctrl8_xl.hp_slope_xl_en = 0;
2030 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2031 }
2032 }
2033 }
2034
2035 return ret;
2036 }
2037
2038 /**
2039 * @brief Accelerometer digital LPF (LPF1) bandwidth selection LPF2
2040 * is not used.[get]
2041 *
2042 * @param ctx Read / write interface definitions
2043 * @param val Get the values of lpf1_bw_sel in reg CTRL1_XL
2044 * @retval Interface status (MANDATORY: return 0 -> no Error).
2045 *
2046 */
lsm6dsm_xl_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_lpf1_bw_sel_t * val)2047 int32_t lsm6dsm_xl_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
2048 lsm6dsm_lpf1_bw_sel_t *val)
2049 {
2050 lsm6dsm_ctrl1_xl_t ctrl1_xl;
2051 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2052 int32_t ret;
2053
2054 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2055
2056 if (ret == 0)
2057 {
2058 if ((ctrl8_xl.lpf2_xl_en != 0x00U) ||
2059 (ctrl8_xl.hp_slope_xl_en != 0x00U))
2060 {
2061 *val = LSM6DSM_XL_LP1_NA;
2062 }
2063
2064 else
2065 {
2066 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2067
2068 switch (ctrl1_xl.lpf1_bw_sel)
2069 {
2070 case LSM6DSM_XL_LP1_ODR_DIV_2:
2071 *val = LSM6DSM_XL_LP1_ODR_DIV_2;
2072 break;
2073
2074 case LSM6DSM_XL_LP1_ODR_DIV_4:
2075 *val = LSM6DSM_XL_LP1_ODR_DIV_4;
2076 break;
2077
2078 default:
2079 *val = LSM6DSM_XL_LP1_ODR_DIV_2;
2080 break;
2081 }
2082 }
2083 }
2084
2085 return ret;
2086 }
2087
2088 /**
2089 * @brief LPF2 on outputs[set]
2090 *
2091 * @param ctx Read / write interface definitions
2092 * @param val Change the values of input_composite in reg CTRL8_XL
2093 * @retval Interface status (MANDATORY: return 0 -> no Error).
2094 *
2095 */
lsm6dsm_xl_lp2_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_input_composite_t val)2096 int32_t lsm6dsm_xl_lp2_bandwidth_set(const stmdev_ctx_t *ctx,
2097 lsm6dsm_input_composite_t val)
2098 {
2099 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2100 int32_t ret;
2101
2102 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2103
2104 if (ret == 0)
2105 {
2106 ctrl8_xl.input_composite = ((uint8_t) val & 0x10U) >> 4;
2107 ctrl8_xl.hpcf_xl = (uint8_t) val & 0x03U;
2108 ctrl8_xl.lpf2_xl_en = 1;
2109 ctrl8_xl.hp_slope_xl_en = 0;
2110 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2111 }
2112
2113 return ret;
2114 }
2115
2116 /**
2117 * @brief LPF2 on outputs[get]
2118 *
2119 * @param ctx Read / write interface definitions
2120 * @param val Get the values of input_composite in reg CTRL8_XL
2121 * @retval Interface status (MANDATORY: return 0 -> no Error).
2122 *
2123 */
lsm6dsm_xl_lp2_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_input_composite_t * val)2124 int32_t lsm6dsm_xl_lp2_bandwidth_get(const stmdev_ctx_t *ctx,
2125 lsm6dsm_input_composite_t *val)
2126 {
2127 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2128 int32_t ret;
2129
2130 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2131
2132 if (ret == 0)
2133 {
2134 if ((ctrl8_xl.lpf2_xl_en == 0x00U) ||
2135 (ctrl8_xl.hp_slope_xl_en != 0x00U))
2136 {
2137 *val = LSM6DSM_XL_LP_NA;
2138 }
2139
2140 else
2141 {
2142 switch ((ctrl8_xl.input_composite << 4) + ctrl8_xl.hpcf_xl)
2143 {
2144 case LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_50:
2145 *val = LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_50;
2146 break;
2147
2148 case LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_100:
2149 *val = LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_100;
2150 break;
2151
2152 case LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_9:
2153 *val = LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_9;
2154 break;
2155
2156 case LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_400:
2157 *val = LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_400;
2158 break;
2159
2160 case LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_50:
2161 *val = LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_50;
2162 break;
2163
2164 case LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_100:
2165 *val = LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_100;
2166 break;
2167
2168 case LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_9:
2169 *val = LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_9;
2170 break;
2171
2172 case LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_400:
2173 *val = LSM6DSM_XL_LOW_NOISE_LP_ODR_DIV_400;
2174 break;
2175
2176 default:
2177 *val = LSM6DSM_XL_LOW_LAT_LP_ODR_DIV_50;
2178 break;
2179 }
2180 }
2181 }
2182
2183 return ret;
2184 }
2185
2186 /**
2187 * @brief Enable HP filter reference mode.[set]
2188 *
2189 * @param ctx Read / write interface definitions
2190 * @param val Change the values of hp_ref_mode in reg CTRL8_XL
2191 * @retval Interface status (MANDATORY: return 0 -> no Error).
2192 *
2193 */
lsm6dsm_xl_reference_mode_set(const stmdev_ctx_t * ctx,uint8_t val)2194 int32_t lsm6dsm_xl_reference_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
2195 {
2196 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2197 int32_t ret;
2198
2199 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2200
2201 if (ret == 0)
2202 {
2203 ctrl8_xl.hp_ref_mode = val;
2204 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2205 }
2206
2207 return ret;
2208 }
2209
2210 /**
2211 * @brief Enable HP filter reference mode.[get]
2212 *
2213 * @param ctx Read / write interface definitions
2214 * @param val Change the values of hp_ref_mode in reg CTRL8_XL
2215 * @retval Interface status (MANDATORY: return 0 -> no Error).
2216 *
2217 */
lsm6dsm_xl_reference_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)2218 int32_t lsm6dsm_xl_reference_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
2219 {
2220 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2221 int32_t ret;
2222
2223 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2224 *val = ctrl8_xl.hp_ref_mode;
2225
2226 return ret;
2227 }
2228
2229 /**
2230 * @brief High pass/Slope on outputs.[set]
2231 *
2232 * @param ctx Read / write interface definitions
2233 * @param val Change the values of hpcf_xl in reg CTRL8_XL
2234 * @retval Interface status (MANDATORY: return 0 -> no Error).
2235 *
2236 */
lsm6dsm_xl_hp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_hpcf_xl_t val)2237 int32_t lsm6dsm_xl_hp_bandwidth_set(const stmdev_ctx_t *ctx,
2238 lsm6dsm_hpcf_xl_t val)
2239 {
2240 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2241 int32_t ret;
2242
2243 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2244
2245 if (ret == 0)
2246 {
2247 ctrl8_xl.input_composite = 0;
2248 ctrl8_xl.hpcf_xl = (uint8_t)val & 0x03U;
2249 ctrl8_xl.hp_slope_xl_en = 1;
2250 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2251 }
2252
2253 return ret;
2254 }
2255
2256 /**
2257 * @brief High pass/Slope on outputs.[get]
2258 *
2259 * @param ctx Read / write interface definitions
2260 * @param val Get the values of hpcf_xl in reg CTRL8_XL
2261 * @retval Interface status (MANDATORY: return 0 -> no Error).
2262 *
2263 */
lsm6dsm_xl_hp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_hpcf_xl_t * val)2264 int32_t lsm6dsm_xl_hp_bandwidth_get(const stmdev_ctx_t *ctx,
2265 lsm6dsm_hpcf_xl_t *val)
2266 {
2267 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2268 int32_t ret;
2269
2270 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2271
2272 if (ctrl8_xl.hp_slope_xl_en == 0x00U)
2273 {
2274 *val = LSM6DSM_XL_HP_NA;
2275 }
2276
2277 switch (ctrl8_xl.hpcf_xl)
2278 {
2279 case LSM6DSM_XL_HP_ODR_DIV_4:
2280 *val = LSM6DSM_XL_HP_ODR_DIV_4;
2281 break;
2282
2283 case LSM6DSM_XL_HP_ODR_DIV_100:
2284 *val = LSM6DSM_XL_HP_ODR_DIV_100;
2285 break;
2286
2287 case LSM6DSM_XL_HP_ODR_DIV_9:
2288 *val = LSM6DSM_XL_HP_ODR_DIV_9;
2289 break;
2290
2291 case LSM6DSM_XL_HP_ODR_DIV_400:
2292 *val = LSM6DSM_XL_HP_ODR_DIV_400;
2293 break;
2294
2295 default:
2296 *val = LSM6DSM_XL_HP_ODR_DIV_4;
2297 break;
2298 }
2299
2300 return ret;
2301 }
2302
2303 /**
2304 * @}
2305 *
2306 */
2307
2308 /**
2309 * @defgroup LSM6DSM_accelerometer_filters_mode:4
2310 * @brief This section group all the functions concerning the filters
2311 * configuration that impact accelerometer when mode 4
2312 * (accelerometer on aux interface enable).
2313 * @{
2314 *
2315 */
2316
2317 /**
2318 * @brief Accelerometer digital LPF (LPF1) bandwidth selection.
2319 * Only for mode 4.[set]
2320 *
2321 * @param ctx Read / write interface definitions
2322 * @param val change the values of lpf1_bw_sel in reg CTRL1_XL
2323 * @retval Interface status (MANDATORY: return 0 -> no Error).
2324 *
2325 */
lsm6dsm_xl_ui_lp1_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_ui_lpf1_bw_sel_t val)2326 int32_t lsm6dsm_xl_ui_lp1_bandwidth_set(const stmdev_ctx_t *ctx,
2327 lsm6dsm_ui_lpf1_bw_sel_t val)
2328 {
2329 lsm6dsm_ctrl1_xl_t ctrl1_xl;
2330 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2331 int32_t ret;
2332
2333 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2334
2335 if (ret == 0)
2336 {
2337 ctrl1_xl.lpf1_bw_sel = (uint8_t)val;
2338 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2339 }
2340
2341 if (ret == 0)
2342 {
2343 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2344 }
2345
2346 if (ret == 0)
2347 {
2348 ctrl8_xl.hp_slope_xl_en = 0x00U;
2349 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2350 }
2351
2352 return ret;
2353 }
2354
2355 /**
2356 * @brief Accelerometer digital LPF (LPF1) bandwidth selection.
2357 * Only for mode 4.[get]
2358 *
2359 * @param ctx Read / write interface definitions
2360 * @param val Get the values of lpf1_bw_sel in reg CTRL1_XL
2361 * @retval Interface status (MANDATORY: return 0 -> no Error).
2362 *
2363 */
lsm6dsm_xl_ui_lp1_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_ui_lpf1_bw_sel_t * val)2364 int32_t lsm6dsm_xl_ui_lp1_bandwidth_get(const stmdev_ctx_t *ctx,
2365 lsm6dsm_ui_lpf1_bw_sel_t *val)
2366 {
2367 lsm6dsm_ctrl1_xl_t ctrl1_xl;
2368 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2369 int32_t ret;
2370
2371 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2372
2373 if (ret == 0)
2374 {
2375 if (ctrl8_xl.hp_slope_xl_en != PROPERTY_DISABLE)
2376 {
2377 *val = LSM6DSM_XL_UI_LP1_NA;
2378 }
2379
2380 else
2381 {
2382 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_XL, (uint8_t *)&ctrl1_xl, 1);
2383
2384 switch (ctrl1_xl.lpf1_bw_sel)
2385 {
2386 case LSM6DSM_XL_UI_LP1_ODR_DIV_2:
2387 *val = LSM6DSM_XL_UI_LP1_ODR_DIV_2;
2388 break;
2389
2390 case LSM6DSM_XL_UI_LP1_ODR_DIV_4:
2391 *val = LSM6DSM_XL_UI_LP1_ODR_DIV_4;
2392 break;
2393
2394 default:
2395 *val = LSM6DSM_XL_UI_LP1_ODR_DIV_2;
2396 break;
2397 }
2398 }
2399 }
2400
2401 return ret;
2402 }
2403
2404 /**
2405 * @brief Slope filter on outputs.[set]
2406 *
2407 * @param ctx Read / write interface definitions
2408 * @param val change the values of hp_slope_xl_en in reg CTRL8_XL
2409 * @retval Interface status (MANDATORY: return 0 -> no Error).
2410 *
2411 */
lsm6dsm_xl_ui_slope_set(const stmdev_ctx_t * ctx,uint8_t val)2412 int32_t lsm6dsm_xl_ui_slope_set(const stmdev_ctx_t *ctx, uint8_t val)
2413 {
2414 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2415 int32_t ret;
2416
2417 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2418
2419 if (ret == 0)
2420 {
2421 ctrl8_xl.hp_slope_xl_en = (uint8_t) val;
2422 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2423 }
2424
2425 return ret;
2426 }
2427
2428 /**
2429 * @brief Slope filter on outputs.[get]
2430 *
2431 * @param ctx Read / write interface definitions
2432 * @param val Get the values of hp_slope_xl_en in reg CTRL8_XL
2433 * @retval Interface status (MANDATORY: return 0 -> no Error).
2434 *
2435 */
lsm6dsm_xl_ui_slope_get(const stmdev_ctx_t * ctx,uint8_t * val)2436 int32_t lsm6dsm_xl_ui_slope_get(const stmdev_ctx_t *ctx, uint8_t *val)
2437 {
2438 lsm6dsm_ctrl8_xl_t ctrl8_xl;
2439 int32_t ret;
2440
2441 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
2442 *val = ctrl8_xl.hp_slope_xl_en;
2443
2444 return ret;
2445 }
2446
2447 /**
2448 * @brief accelerometer auxiliary low pass bandwidth.[set]
2449 *
2450 * @param ctx Read / write interface definitions
2451 * @param val change the values of filter_xl_conf_ois in reg CTRL3_OIS
2452 *
2453 * Cut off feq [ODR_UI = 0 / ODR UI ≥ 1600 Hz]
2454 * LIGHT 636 Hz 2.96°
2455 * NORMAL 295 Hz 5.12°
2456 * STRONG 140 Hz 9.39°
2457 * AGGRESSIVE 68.2 Hz 17.6°
2458 *
2459 * Cut off feq [ODR UI ≤ 800 Hz ]
2460 * LIGHT 329 Hz 5.08°
2461 * NORMAL 222 Hz 7.23°
2462 * STRONG 128 Hz 11.5°
2463 * AGGRESSIVE 66.5 Hz 19.7°
2464 *
2465 * @retval Interface status (MANDATORY: return 0 -> no Error).
2466 *
2467 */
lsm6dsm_xl_aux_lp_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_filter_xl_conf_ois_t val)2468 int32_t lsm6dsm_xl_aux_lp_bandwidth_set(const stmdev_ctx_t *ctx,
2469 lsm6dsm_filter_xl_conf_ois_t val)
2470 {
2471 lsm6dsm_ctrl3_ois_t ctrl3_ois;
2472 int32_t ret;
2473
2474 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
2475
2476 if (ret == 0)
2477 {
2478 ctrl3_ois.filter_xl_conf_ois = (uint8_t) val;
2479 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
2480 }
2481
2482 return ret;
2483 }
2484
2485 /**
2486 * @brief accelerometer auxiliary low pass bandwidth.[get]
2487 *
2488 * @param ctx Read / write interface definitions
2489 * @param val Get the values of filter_xl_conf_ois in reg CTRL3_OIS
2490 *
2491 * Cut off feq [ODR_UI = 0 / ODR UI ≥ 1600 Hz]
2492 * LIGHT 636 Hz 2.96°
2493 * NORMAL 295 Hz 5.12°
2494 * STRONG 140 Hz 9.39°
2495 * AGGRESSIVE 68.2 Hz 17.6°
2496 *
2497 * Cut off feq [ODR UI ≤ 800 Hz ]
2498 * LIGHT 329 Hz 5.08°
2499 * NORMAL 222 Hz 7.23°
2500 * STRONG 128 Hz 11.5°
2501 * AGGRESSIVE 66.5 Hz 19.7°
2502 *
2503 * @retval Interface status (MANDATORY: return 0 -> no Error).
2504 *
2505 */
lsm6dsm_xl_aux_lp_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_filter_xl_conf_ois_t * val)2506 int32_t lsm6dsm_xl_aux_lp_bandwidth_get(const stmdev_ctx_t *ctx,
2507 lsm6dsm_filter_xl_conf_ois_t *val)
2508 {
2509 lsm6dsm_ctrl3_ois_t ctrl3_ois;
2510 int32_t ret;
2511
2512 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
2513
2514 switch (ctrl3_ois.filter_xl_conf_ois)
2515 {
2516 case LSM6DSM_AUX_LP_LIGHT:
2517 *val = LSM6DSM_AUX_LP_LIGHT;
2518 break;
2519
2520 case LSM6DSM_AUX_LP_NORMAL:
2521 *val = LSM6DSM_AUX_LP_NORMAL;
2522 break;
2523
2524 case LSM6DSM_AUX_LP_STRONG:
2525 *val = LSM6DSM_AUX_LP_STRONG;
2526 break;
2527
2528 case LSM6DSM_AUX_LP_AGGRESSIVE:
2529 *val = LSM6DSM_AUX_LP_AGGRESSIVE;
2530 break;
2531
2532 default:
2533 *val = LSM6DSM_AUX_LP_LIGHT;
2534 break;
2535 }
2536
2537 return ret;
2538 }
2539
2540 /**
2541 * @}
2542 *
2543 */
2544
2545 /**
2546 * @defgroup LSM6DSM_gyroscope_filters_mode:1,2
2547 * @brief This section group all the functions concerning the filters
2548 * configuration that impact gyroscope mode 1, 2
2549 * (gyroscope on aux interface disable).
2550 * @{
2551 *
2552 */
2553
2554 /**
2555 * @brief Gyroscope low pass path bandwidth.[set]
2556 *
2557 * @param ctx Read / write interface definitions
2558 * @param val gyroscope filtering chain configuration.
2559 * @retval Interface status (MANDATORY: return 0 -> no Error).
2560 *
2561 */
lsm6dsm_gy_band_pass_set(const stmdev_ctx_t * ctx,lsm6dsm_lpf1_sel_g_t val)2562 int32_t lsm6dsm_gy_band_pass_set(const stmdev_ctx_t *ctx,
2563 lsm6dsm_lpf1_sel_g_t val)
2564 {
2565 lsm6dsm_ctrl4_c_t ctrl4_c;
2566 lsm6dsm_ctrl6_c_t ctrl6_c;
2567 lsm6dsm_ctrl7_g_t ctrl7_g;
2568 int32_t ret;
2569
2570 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2571
2572 if (ret == 0)
2573 {
2574 ctrl7_g.hpm_g = ((uint8_t)val & 0x30U) >> 4;
2575 ctrl7_g.hp_en_g = ((uint8_t)val & 0x80U) >> 7;
2576 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2577
2578 if (ret == 0)
2579 {
2580 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
2581
2582 if (ret == 0)
2583 {
2584 ctrl6_c.ftype = (uint8_t)val & 0x03U;
2585 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
2586
2587 if (ret == 0)
2588 {
2589 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C,
2590 (uint8_t *)&ctrl4_c, 1);
2591
2592 if (ret == 0)
2593 {
2594 ctrl4_c.lpf1_sel_g = ((uint8_t)val & 0x08U) >> 3;
2595 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C,
2596 (uint8_t *)&ctrl4_c, 1);
2597 }
2598 }
2599 }
2600 }
2601 }
2602
2603 return ret;
2604 }
2605
2606 /**
2607 * @brief Gyroscope low pass path bandwidth.[get]
2608 *
2609 * @param ctx Read / write interface definitions
2610 * @param val gyroscope filtering chain
2611 * @retval Interface status (MANDATORY: return 0 -> no Error).
2612 *
2613 */
lsm6dsm_gy_band_pass_get(const stmdev_ctx_t * ctx,lsm6dsm_lpf1_sel_g_t * val)2614 int32_t lsm6dsm_gy_band_pass_get(const stmdev_ctx_t *ctx,
2615 lsm6dsm_lpf1_sel_g_t *val)
2616 {
2617 lsm6dsm_ctrl4_c_t ctrl4_c;
2618 lsm6dsm_ctrl6_c_t ctrl6_c;
2619 lsm6dsm_ctrl7_g_t ctrl7_g;
2620 int32_t ret;
2621
2622 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
2623
2624 if (ret == 0)
2625 {
2626 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
2627
2628 if (ret == 0)
2629 {
2630 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2631
2632 switch ((ctrl7_g.hp_en_g << 7) + (ctrl7_g.hpm_g << 4) +
2633 (ctrl4_c.lpf1_sel_g << 3) + ctrl6_c.ftype)
2634 {
2635 case LSM6DSM_HP_16mHz_LP2:
2636 *val = LSM6DSM_HP_16mHz_LP2;
2637 break;
2638
2639 case LSM6DSM_HP_65mHz_LP2:
2640 *val = LSM6DSM_HP_65mHz_LP2;
2641 break;
2642
2643 case LSM6DSM_HP_260mHz_LP2:
2644 *val = LSM6DSM_HP_260mHz_LP2;
2645 break;
2646
2647 case LSM6DSM_HP_1Hz04_LP2:
2648 *val = LSM6DSM_HP_1Hz04_LP2;
2649 break;
2650
2651 case LSM6DSM_HP_DISABLE_LP1_LIGHT:
2652 *val = LSM6DSM_HP_DISABLE_LP1_LIGHT;
2653 break;
2654
2655 case LSM6DSM_HP_DISABLE_LP1_NORMAL:
2656 *val = LSM6DSM_HP_DISABLE_LP1_NORMAL;
2657 break;
2658
2659 case LSM6DSM_HP_DISABLE_LP_STRONG:
2660 *val = LSM6DSM_HP_DISABLE_LP_STRONG;
2661 break;
2662
2663 case LSM6DSM_HP_DISABLE_LP1_AGGRESSIVE:
2664 *val = LSM6DSM_HP_DISABLE_LP1_AGGRESSIVE;
2665 break;
2666
2667 case LSM6DSM_HP_16mHz_LP1_LIGHT:
2668 *val = LSM6DSM_HP_16mHz_LP1_LIGHT;
2669 break;
2670
2671 case LSM6DSM_HP_65mHz_LP1_NORMAL:
2672 *val = LSM6DSM_HP_65mHz_LP1_NORMAL;
2673 break;
2674
2675 case LSM6DSM_HP_260mHz_LP1_STRONG:
2676 *val = LSM6DSM_HP_260mHz_LP1_STRONG;
2677 break;
2678
2679 case LSM6DSM_HP_1Hz04_LP1_AGGRESSIVE:
2680 *val = LSM6DSM_HP_1Hz04_LP1_AGGRESSIVE;
2681 break;
2682
2683 default:
2684 *val = LSM6DSM_HP_65mHz_LP2;
2685 break;
2686 }
2687 }
2688 }
2689
2690 return ret;
2691 }
2692
2693 /**
2694 * @}
2695 *
2696 */
2697
2698 /**
2699 * @defgroup LSM6DSM_gyroscope_filters_mode:3,4
2700 * @brief This section group all the functions concerning the filters
2701 * configuration that impact gyroscope when mode 3, 4
2702 * (gyroscope on aux interface enable).
2703 * @{
2704 *
2705 */
2706
2707 /**
2708 * @brief HPF is available on gyroscope's OIS chain only if HP_EN_G
2709 * in CTRL7_G (16h) is set to '0'.[set]
2710 *
2711 * @param ctx Read / write interface definitions
2712 * @param val gyroscope ui filtering chain configuration in Mode: 3, 4.
2713 * @retval Interface status (MANDATORY: return 0 -> no Error).
2714 *
2715 */
lsm6dsm_gy_ui_high_pass_set(const stmdev_ctx_t * ctx,uint8_t val)2716 int32_t lsm6dsm_gy_ui_high_pass_set(const stmdev_ctx_t *ctx, uint8_t val)
2717 {
2718 lsm6dsm_ctrl7_g_t ctrl7_g;
2719 int32_t ret;
2720
2721 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2722
2723 if (ret == 0)
2724 {
2725 ctrl7_g.hp_en_g = val;
2726 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2727 }
2728
2729 return ret;
2730 }
2731
2732 /**
2733 * @brief HPF is available on gyroscope's OIS chain only if HP_EN_G
2734 * in CTRL7_G (16h) is set to '0'.[get]
2735 *
2736 * @param ctx Read / write interface definitions
2737 * @param val gyroscope ui filtering chain configuration in Mode: 3, 4.
2738 * @retval Interface status (MANDATORY: return 0 -> no Error).
2739 *
2740 */
lsm6dsm_gy_ui_high_pass_get(const stmdev_ctx_t * ctx,uint8_t * val)2741 int32_t lsm6dsm_gy_ui_high_pass_get(const stmdev_ctx_t *ctx, uint8_t *val)
2742 {
2743 lsm6dsm_ctrl7_g_t ctrl7_g;
2744 int32_t ret;
2745
2746 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2747 *val = ctrl7_g.hp_en_g;
2748
2749 return ret;
2750 }
2751
2752
2753 /**
2754 * @brief HPF is available on gyroscope's OIS chain only if HP_EN_G
2755 * in CTRL7_G (16h) is set to '0'.[set]
2756 *
2757 * @param ctx Read / write interface definitions
2758 * @param val gyroscope aux (ois) filtering chain configuration in
2759 * Mode: 3, 4.
2760 * @retval Interface status (MANDATORY: return 0 -> no Error).
2761 *
2762 */
lsm6dsm_gy_aux_bandwidth_set(const stmdev_ctx_t * ctx,lsm6dsm_hp_en_ois_t val)2763 int32_t lsm6dsm_gy_aux_bandwidth_set(const stmdev_ctx_t *ctx,
2764 lsm6dsm_hp_en_ois_t val)
2765 {
2766 lsm6dsm_ctrl7_g_t ctrl7_g;
2767 lsm6dsm_ctrl2_ois_t ctrl2_ois;
2768 int32_t ret;
2769
2770 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2771
2772 if (ret == 0)
2773 {
2774 ctrl7_g.hp_en_g = 0x00U;
2775 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL7_G, (uint8_t *)&ctrl7_g, 1);
2776 }
2777
2778 if (ret == 0)
2779 {
2780 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_OIS, (uint8_t *)&ctrl2_ois, 1);
2781 }
2782
2783 if (ret == 0)
2784 {
2785 ctrl2_ois.ftype_ois = (uint8_t)val & 0x03U;
2786 ctrl2_ois.hp_en_ois = ((uint8_t)val & 0x80U) >> 7;
2787 ctrl2_ois.hpm_ois = ((uint8_t)val & 0x30U) >> 4;
2788 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL2_OIS, (uint8_t *)&ctrl2_ois, 1);
2789 }
2790
2791 return ret;
2792 }
2793
2794 /**
2795 * @brief HPF is available on gyroscope's OIS chain only if HP_EN_G
2796 * in CTRL7_G (16h) is set to '0'.[get]
2797 *
2798 * @param ctx Read / write interface definitions
2799 * @param val gyroscope aux (ois) filtering chain configuration in
2800 * Mode: 3, 4.
2801 * @retval Interface status (MANDATORY: return 0 -> no Error).
2802 *
2803 */
lsm6dsm_gy_aux_bandwidth_get(const stmdev_ctx_t * ctx,lsm6dsm_hp_en_ois_t * val)2804 int32_t lsm6dsm_gy_aux_bandwidth_get(const stmdev_ctx_t *ctx,
2805 lsm6dsm_hp_en_ois_t *val)
2806 {
2807 lsm6dsm_ctrl2_ois_t ctrl2_ois;
2808 int32_t ret;
2809
2810 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL2_OIS, (uint8_t *)&ctrl2_ois, 1);
2811
2812 switch (((ctrl2_ois.hp_en_ois << 7) + (ctrl2_ois.hpm_ois << 4)
2813 + ctrl2_ois.ftype_ois))
2814 {
2815 case LSM6DSM_HP_DISABLE_LP_173Hz:
2816 *val = LSM6DSM_HP_DISABLE_LP_173Hz;
2817 break;
2818
2819 case LSM6DSM_HP_DISABLE_LP_237Hz:
2820 *val = LSM6DSM_HP_DISABLE_LP_237Hz;
2821 break;
2822
2823 case LSM6DSM_HP_DISABLE_LP_351Hz:
2824 *val = LSM6DSM_HP_DISABLE_LP_351Hz;
2825 break;
2826
2827 case LSM6DSM_HP_DISABLE_LP_937Hz:
2828 *val = LSM6DSM_HP_DISABLE_LP_937Hz;
2829 break;
2830
2831 case LSM6DSM_HP_16mHz_LP_173Hz:
2832 *val = LSM6DSM_HP_16mHz_LP_173Hz;
2833 break;
2834
2835 case LSM6DSM_HP_65mHz_LP_237Hz:
2836 *val = LSM6DSM_HP_65mHz_LP_237Hz;
2837 break;
2838
2839 case LSM6DSM_HP_260mHz_LP_351Hz:
2840 *val = LSM6DSM_HP_260mHz_LP_351Hz;
2841 break;
2842
2843 case LSM6DSM_HP_1Hz04_LP_937Hz:
2844 *val = LSM6DSM_HP_1Hz04_LP_937Hz;
2845 break;
2846
2847 default:
2848 *val = LSM6DSM_HP_DISABLE_LP_173Hz;
2849 break;
2850 }
2851
2852 return ret;
2853 }
2854
2855 /**
2856 * @}
2857 *
2858 */
2859
2860 /**
2861 * @defgroup LSM6DSM_Auxiliary_interface
2862 * @brief This section groups all the functions concerning
2863 * auxiliary interface.
2864 * @{
2865 *
2866 */
2867
2868 /**
2869 * @brief The STATUS_SPIAux register is read by the auxiliary SPI.[get]
2870 *
2871 * @param ctx Read / write interface definitions
2872 * @param val registers STATUS_SPIAUX.
2873 * @retval Interface status (MANDATORY: return 0 -> no Error).
2874 *
2875 */
lsm6dsm_aux_status_reg_get(const stmdev_ctx_t * ctx,lsm6dsm_status_spiaux_t * val)2876 int32_t lsm6dsm_aux_status_reg_get(const stmdev_ctx_t *ctx,
2877 lsm6dsm_status_spiaux_t *val)
2878 {
2879 int32_t ret;
2880
2881 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_SPIAUX, (uint8_t *) val, 1);
2882
2883 return ret;
2884 }
2885
2886 /**
2887 * @brief AUX accelerometer data available.[get]
2888 *
2889 * @param ctx Read / write interface definitions
2890 * @param val change the values of xlda in reg STATUS_SPIAUX
2891 * @retval Interface status (MANDATORY: return 0 -> no Error).
2892 *
2893 */
lsm6dsm_aux_xl_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)2894 int32_t lsm6dsm_aux_xl_flag_data_ready_get(const stmdev_ctx_t *ctx,
2895 uint8_t *val)
2896 {
2897 lsm6dsm_status_spiaux_t status_spiaux;
2898 int32_t ret;
2899
2900 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_SPIAUX,
2901 (uint8_t *)&status_spiaux, 1);
2902 *val = status_spiaux.xlda;
2903
2904 return ret;
2905 }
2906
2907 /**
2908 * @brief AUX gyroscope data available.[get]
2909 *
2910 * @param ctx Read / write interface definitions
2911 * @param val change the values of gda in reg STATUS_SPIAUX
2912 * @retval Interface status (MANDATORY: return 0 -> no Error).
2913 *
2914 */
lsm6dsm_aux_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)2915 int32_t lsm6dsm_aux_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
2916 uint8_t *val)
2917 {
2918 lsm6dsm_status_spiaux_t status_spiaux;
2919 int32_t ret;
2920
2921 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_SPIAUX,
2922 (uint8_t *)&status_spiaux, 1);
2923 *val = status_spiaux.gda;
2924
2925 return ret;
2926 }
2927
2928 /**
2929 * @brief High when the gyroscope output is in the settling phase.[get]
2930 *
2931 * @param ctx Read / write interface definitions
2932 * @param val change the values of gyro_settling in reg STATUS_SPIAUX
2933 * @retval Interface status (MANDATORY: return 0 -> no Error).
2934 *
2935 */
lsm6dsm_aux_gy_flag_settling_get(const stmdev_ctx_t * ctx,uint8_t * val)2936 int32_t lsm6dsm_aux_gy_flag_settling_get(const stmdev_ctx_t *ctx,
2937 uint8_t *val)
2938 {
2939 lsm6dsm_status_spiaux_t status_spiaux;
2940 int32_t ret;
2941
2942 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STATUS_SPIAUX,
2943 (uint8_t *)&status_spiaux, 1);
2944 *val = status_spiaux.gyro_settling;
2945
2946 return ret;
2947 }
2948
2949 /**
2950 * @brief Configure DEN mode on the OIS chain.[set]
2951 *
2952 * @param ctx Read / write interface definitions
2953 * @param val change the values of lvl2_ois in reg INT_OIS
2954 * @retval Interface status (MANDATORY: return 0 -> no Error).
2955 *
2956 */
lsm6dsm_aux_den_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_lvl_ois_t val)2957 int32_t lsm6dsm_aux_den_mode_set(const stmdev_ctx_t *ctx,
2958 lsm6dsm_lvl_ois_t val)
2959 {
2960 lsm6dsm_int_ois_t int_ois;
2961 lsm6dsm_ctrl1_ois_t ctrl1_ois;
2962 int32_t ret;
2963
2964 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
2965
2966 if (ret == 0)
2967 {
2968 int_ois.lvl2_ois = (uint8_t)val & 0x01U;
2969 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
2970 }
2971
2972 if (ret == 0)
2973 {
2974 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
2975 ctrl1_ois.lvl1_ois = ((uint8_t)val & 0x02U) >> 1;
2976 }
2977
2978 if (ret == 0)
2979 {
2980 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
2981 }
2982
2983 return ret;
2984 }
2985
2986 /**
2987 * @brief Configure DEN mode on the OIS chain.[get]
2988 *
2989 * @param ctx Read / write interface definitions
2990 * @param val Get the values of lvl2_ois in reg INT_OIS
2991 * @retval Interface status (MANDATORY: return 0 -> no Error).
2992 *
2993 */
lsm6dsm_aux_den_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_lvl_ois_t * val)2994 int32_t lsm6dsm_aux_den_mode_get(const stmdev_ctx_t *ctx,
2995 lsm6dsm_lvl_ois_t *val)
2996 {
2997 lsm6dsm_int_ois_t int_ois;
2998 lsm6dsm_ctrl1_ois_t ctrl1_ois;
2999 int32_t ret;
3000
3001 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
3002
3003 if (ret == 0)
3004 {
3005 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3006
3007 switch ((ctrl1_ois.lvl1_ois << 1) + int_ois.lvl2_ois)
3008 {
3009 case LSM6DSM_AUX_DEN_DISABLE:
3010 *val = LSM6DSM_AUX_DEN_DISABLE;
3011 break;
3012
3013 case LSM6DSM_AUX_DEN_LEVEL_LATCH:
3014 *val = LSM6DSM_AUX_DEN_LEVEL_LATCH;
3015 break;
3016
3017 case LSM6DSM_AUX_DEN_LEVEL_TRIG:
3018 *val = LSM6DSM_AUX_DEN_LEVEL_TRIG;
3019 break;
3020
3021 default:
3022 *val = LSM6DSM_AUX_DEN_DISABLE;
3023 break;
3024 }
3025 }
3026
3027 return ret;
3028 }
3029
3030 /**
3031 * @brief Enables/Disable OIS chain DRDY on INT2 pin. This setting
3032 * has priority over all other INT2 settings.[set]
3033 *
3034 * @param ctx Read / write interface definitions
3035 * @param val change the values of int2_drdy_ois in reg INT_OIS
3036 * @retval Interface status (MANDATORY: return 0 -> no Error).
3037 *
3038 */
lsm6dsm_aux_drdy_on_int2_set(const stmdev_ctx_t * ctx,uint8_t val)3039 int32_t lsm6dsm_aux_drdy_on_int2_set(const stmdev_ctx_t *ctx, uint8_t val)
3040 {
3041 lsm6dsm_int_ois_t int_ois;
3042 int32_t ret;
3043
3044 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
3045
3046 if (ret == 0)
3047 {
3048 int_ois.int2_drdy_ois = val;
3049 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
3050 }
3051
3052 return ret;
3053 }
3054
3055 /**
3056 * @brief Enables/Disable OIS chain DRDY on INT2 pin. This setting
3057 * has priority over all other INT2 settings.[get]
3058 *
3059 * @param ctx Read / write interface definitions
3060 * @param val change the values of int2_drdy_ois in reg INT_OIS
3061 * @retval Interface status (MANDATORY: return 0 -> no Error).
3062 *
3063 */
lsm6dsm_aux_drdy_on_int2_get(const stmdev_ctx_t * ctx,uint8_t * val)3064 int32_t lsm6dsm_aux_drdy_on_int2_get(const stmdev_ctx_t *ctx, uint8_t *val)
3065 {
3066 lsm6dsm_int_ois_t int_ois;
3067 int32_t ret;
3068
3069 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_OIS, (uint8_t *)&int_ois, 1);
3070 *val = int_ois.int2_drdy_ois;
3071
3072 return ret;
3073 }
3074
3075 /**
3076 * @brief Enables OIS chain data processing for gyro
3077 * in Mode 3 and Mode 4 (mode4_en = 1) and
3078 * accelerometer data in and Mode 4 (mode4_en = 1).
3079 * When the OIS chain is enabled, the OIS outputs are
3080 * available through the SPI2 in registers
3081 * OUTX_L_G(22h) through OUTZ_H_G(27h) and
3082 * STATUS_REG(1Eh) / STATUS_SPIAux, and LPF1 is
3083 * dedicated to this chain.[set]
3084 *
3085 * @param ctx Read / write interface definitions
3086 * @param val change the values of ois_en_spi2 in reg CTRL1_OIS
3087 * @retval Interface status (MANDATORY: return 0 -> no Error).
3088 *
3089 */
lsm6dsm_aux_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_ois_en_spi2_t val)3090 int32_t lsm6dsm_aux_mode_set(const stmdev_ctx_t *ctx,
3091 lsm6dsm_ois_en_spi2_t val)
3092 {
3093 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3094 int32_t ret;
3095
3096 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3097
3098 if (ret == 0)
3099 {
3100 ctrl1_ois.ois_en_spi2 = (uint8_t)val & 0x01U;
3101 ctrl1_ois.mode4_en = ((uint8_t)val & 0x02U) >> 1;
3102 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3103 }
3104
3105 return ret;
3106 }
3107
3108 /**
3109 * @brief Enables OIS chain data processing for gyro
3110 * in Mode 3 and Mode 4 (mode4_en = 1) and
3111 * accelerometer data in and Mode 4 (mode4_en = 1).
3112 * When the OIS chain is enabled, the OIS outputs
3113 * are available through the SPI2 in registers
3114 * OUTX_L_G(22h) through OUTZ_H_G(27h) and
3115 * STATUS_REG(1Eh) / STATUS_SPIAux, and LPF1 is
3116 * dedicated to this chain.[get]
3117 *
3118 * @param ctx Read / write interface definitions
3119 * @param val Get the values of ois_en_spi2 in reg CTRL1_OIS
3120 * @retval Interface status (MANDATORY: return 0 -> no Error).
3121 *
3122 */
lsm6dsm_aux_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_ois_en_spi2_t * val)3123 int32_t lsm6dsm_aux_mode_get(const stmdev_ctx_t *ctx,
3124 lsm6dsm_ois_en_spi2_t *val)
3125 {
3126 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3127 int32_t ret;
3128
3129 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3130
3131 switch ((ctrl1_ois.mode4_en << 1) + ctrl1_ois.ois_en_spi2)
3132 {
3133 case LSM6DSM_AUX_DISABLE:
3134 *val = LSM6DSM_AUX_DISABLE;
3135 break;
3136
3137 case LSM6DSM_MODE_3_GY:
3138 *val = LSM6DSM_MODE_3_GY;
3139 break;
3140
3141 case LSM6DSM_MODE_4_GY_XL:
3142 *val = LSM6DSM_MODE_4_GY_XL;
3143 break;
3144
3145 default:
3146 *val = LSM6DSM_AUX_DISABLE;
3147 break;
3148 }
3149
3150 return ret;
3151 }
3152
3153 /**
3154 * @brief Selects gyroscope OIS chain full-scale.[set]
3155 *
3156 * @param ctx Read / write interface definitions
3157 * @param val change the values of fs_g_ois in reg CTRL1_OIS
3158 * @retval Interface status (MANDATORY: return 0 -> no Error).
3159 *
3160 */
lsm6dsm_aux_gy_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsm_fs_g_ois_t val)3161 int32_t lsm6dsm_aux_gy_full_scale_set(const stmdev_ctx_t *ctx,
3162 lsm6dsm_fs_g_ois_t val)
3163 {
3164 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3165 int32_t ret;
3166
3167 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3168
3169 if (ret == 0)
3170 {
3171 ctrl1_ois.fs_g_ois = (uint8_t)val;
3172 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3173 }
3174
3175 return ret;
3176 }
3177
3178 /**
3179 * @brief Selects gyroscope OIS chain full-scale.[get]
3180 *
3181 * @param ctx Read / write interface definitions
3182 * @param val Get the values of fs_g_ois in reg CTRL1_OIS
3183 * @retval Interface status (MANDATORY: return 0 -> no Error).
3184 *
3185 */
lsm6dsm_aux_gy_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsm_fs_g_ois_t * val)3186 int32_t lsm6dsm_aux_gy_full_scale_get(const stmdev_ctx_t *ctx,
3187 lsm6dsm_fs_g_ois_t *val)
3188 {
3189 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3190 int32_t ret;
3191
3192 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3193
3194 switch (ctrl1_ois.fs_g_ois)
3195 {
3196 case LSM6DSM_250dps_AUX:
3197 *val = LSM6DSM_250dps_AUX;
3198 break;
3199
3200 case LSM6DSM_125dps_AUX:
3201 *val = LSM6DSM_125dps_AUX;
3202 break;
3203
3204 case LSM6DSM_500dps_AUX:
3205 *val = LSM6DSM_500dps_AUX;
3206 break;
3207
3208 case LSM6DSM_1000dps_AUX:
3209 *val = LSM6DSM_1000dps_AUX;
3210 break;
3211
3212 case LSM6DSM_2000dps_AUX:
3213 *val = LSM6DSM_2000dps_AUX;
3214 break;
3215
3216 default:
3217 *val = LSM6DSM_250dps_AUX;
3218 break;
3219 }
3220
3221 return ret;
3222 }
3223
3224 /**
3225 * @brief SPI2 3- or 4-wire interface.[set]
3226 *
3227 * @param ctx Read / write interface definitions
3228 * @param val change the values of sim_ois in reg CTRL1_OIS
3229 * @retval Interface status (MANDATORY: return 0 -> no Error).
3230 *
3231 */
lsm6dsm_aux_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_sim_ois_t val)3232 int32_t lsm6dsm_aux_spi_mode_set(const stmdev_ctx_t *ctx,
3233 lsm6dsm_sim_ois_t val)
3234 {
3235 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3236 int32_t ret;
3237
3238 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3239
3240 if (ret == 0)
3241 {
3242 ctrl1_ois.sim_ois = (uint8_t)val;
3243 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3244 }
3245
3246 return ret;
3247 }
3248
3249 /**
3250 * @brief SPI2 3- or 4-wire interface.[get]
3251 *
3252 * @param ctx Read / write interface definitions
3253 * @param val Get the values of sim_ois in reg CTRL1_OIS
3254 * @retval Interface status (MANDATORY: return 0 -> no Error).
3255 *
3256 */
lsm6dsm_aux_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_sim_ois_t * val)3257 int32_t lsm6dsm_aux_spi_mode_get(const stmdev_ctx_t *ctx,
3258 lsm6dsm_sim_ois_t *val)
3259 {
3260 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3261 int32_t ret;
3262
3263 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3264
3265 switch (ctrl1_ois.sim_ois)
3266 {
3267 case LSM6DSM_AUX_SPI_4_WIRE:
3268 *val = LSM6DSM_AUX_SPI_4_WIRE;
3269 break;
3270
3271 case LSM6DSM_AUX_SPI_3_WIRE:
3272 *val = LSM6DSM_AUX_SPI_3_WIRE;
3273 break;
3274
3275 default:
3276 *val = LSM6DSM_AUX_SPI_4_WIRE;
3277 break;
3278 }
3279
3280 return ret;
3281 }
3282
3283 /**
3284 * @brief Big/Little Endian Data selection on aux interface.[set]
3285 *
3286 * @param ctx Read / write interface definitions
3287 * @param val change the values of ble_ois in reg CTRL1_OIS
3288 * @retval Interface status (MANDATORY: return 0 -> no Error).
3289 *
3290 */
lsm6dsm_aux_data_format_set(const stmdev_ctx_t * ctx,lsm6dsm_ble_ois_t val)3291 int32_t lsm6dsm_aux_data_format_set(const stmdev_ctx_t *ctx,
3292 lsm6dsm_ble_ois_t val)
3293 {
3294 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3295 int32_t ret;
3296
3297 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3298
3299 if (ret == 0)
3300 {
3301 ctrl1_ois.ble_ois = (uint8_t)val;
3302 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3303 }
3304
3305 return ret;
3306 }
3307
3308 /**
3309 * @brief Big/Little Endian Data selection on aux interface.[get]
3310 *
3311 * @param ctx Read / write interface definitions
3312 * @param val Get the values of ble_ois in reg CTRL1_OIS
3313 * @retval Interface status (MANDATORY: return 0 -> no Error).
3314 *
3315 */
lsm6dsm_aux_data_format_get(const stmdev_ctx_t * ctx,lsm6dsm_ble_ois_t * val)3316 int32_t lsm6dsm_aux_data_format_get(const stmdev_ctx_t *ctx,
3317 lsm6dsm_ble_ois_t *val)
3318 {
3319 lsm6dsm_ctrl1_ois_t ctrl1_ois;
3320 int32_t ret;
3321
3322 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL1_OIS, (uint8_t *)&ctrl1_ois, 1);
3323
3324 switch (ctrl1_ois.ble_ois)
3325 {
3326 case LSM6DSM_AUX_LSB_AT_LOW_ADD:
3327 *val = LSM6DSM_AUX_LSB_AT_LOW_ADD;
3328 break;
3329
3330 case LSM6DSM_AUX_MSB_AT_LOW_ADD:
3331 *val = LSM6DSM_AUX_MSB_AT_LOW_ADD;
3332 break;
3333
3334 default:
3335 *val = LSM6DSM_AUX_LSB_AT_LOW_ADD;
3336 break;
3337 }
3338
3339 return ret;
3340 }
3341
3342 /**
3343 * @brief Enable / Disables OIS chain clamp.
3344 * Enable: All OIS chain outputs = 8000h
3345 * during self-test; Disable: OIS chain
3346 * self-test outputs dependent from the aux
3347 * gyro full scale selected.[set]
3348 *
3349 * @param ctx Read / write interface definitions
3350 * @param val change the values of st_ois_clampdis in reg CTRL3_OIS
3351 * @retval Interface status (MANDATORY: return 0 -> no Error).
3352 *
3353 */
lsm6dsm_aux_gy_clamp_set(const stmdev_ctx_t * ctx,lsm6dsm_st_ois_clampdis_t val)3354 int32_t lsm6dsm_aux_gy_clamp_set(const stmdev_ctx_t *ctx,
3355 lsm6dsm_st_ois_clampdis_t val)
3356 {
3357 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3358 int32_t ret;
3359
3360 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3361
3362 if (ret == 0)
3363 {
3364 ctrl3_ois.st_ois_clampdis = (uint8_t)val;
3365 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3366 }
3367
3368 return ret;
3369 }
3370
3371 /**
3372 * @brief Enable / Disables OIS chain clamp.
3373 * Enable: All OIS chain outputs = 8000h
3374 * during self-test; Disable: OIS chain self-test
3375 * outputs dependent from the aux gyro full
3376 * scale selected.[get]
3377 *
3378 * @param ctx Read / write interface definitions
3379 * @param val Get the values of st_ois_clampdis in reg CTRL3_OIS
3380 * @retval Interface status (MANDATORY: return 0 -> no Error).
3381 *
3382 */
lsm6dsm_aux_gy_clamp_get(const stmdev_ctx_t * ctx,lsm6dsm_st_ois_clampdis_t * val)3383 int32_t lsm6dsm_aux_gy_clamp_get(const stmdev_ctx_t *ctx,
3384 lsm6dsm_st_ois_clampdis_t *val)
3385 {
3386 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3387 int32_t ret;
3388
3389 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3390
3391 switch (ctrl3_ois.st_ois_clampdis)
3392 {
3393 case LSM6DSM_ENABLE_CLAMP:
3394 *val = LSM6DSM_ENABLE_CLAMP;
3395 break;
3396
3397 case LSM6DSM_DISABLE_CLAMP:
3398 *val = LSM6DSM_DISABLE_CLAMP;
3399 break;
3400
3401 default:
3402 *val = LSM6DSM_ENABLE_CLAMP;
3403 break;
3404 }
3405
3406 return ret;
3407 }
3408
3409 /**
3410 * @brief Selects gyroscope OIS chain self-test.[set]
3411 *
3412 * @param ctx Read / write interface definitions
3413 * @param val change the values of st_ois in reg CTRL3_OIS
3414 * @retval Interface status (MANDATORY: return 0 -> no Error).
3415 *
3416 */
lsm6dsm_aux_gy_self_test_set(const stmdev_ctx_t * ctx,lsm6dsm_st_ois_t val)3417 int32_t lsm6dsm_aux_gy_self_test_set(const stmdev_ctx_t *ctx,
3418 lsm6dsm_st_ois_t val)
3419 {
3420 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3421 int32_t ret;
3422
3423 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3424
3425 if (ret == 0)
3426 {
3427 ctrl3_ois.st_ois = (uint8_t)val;
3428 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3429 }
3430
3431 return ret;
3432 }
3433
3434 /**
3435 * @brief Selects gyroscope OIS chain self-test.[get]
3436 *
3437 * @param ctx Read / write interface definitions
3438 * @param val Get the values of st_ois in reg CTRL3_OIS
3439 * @retval Interface status (MANDATORY: return 0 -> no Error).
3440 *
3441 */
lsm6dsm_aux_gy_self_test_get(const stmdev_ctx_t * ctx,lsm6dsm_st_ois_t * val)3442 int32_t lsm6dsm_aux_gy_self_test_get(const stmdev_ctx_t *ctx,
3443 lsm6dsm_st_ois_t *val)
3444 {
3445 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3446 int32_t ret;
3447
3448 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3449
3450 switch (ctrl3_ois.st_ois)
3451 {
3452 case LSM6DSM_AUX_GY_DISABLE:
3453 *val = LSM6DSM_AUX_GY_DISABLE;
3454 break;
3455
3456 case LSM6DSM_AUX_GY_POS:
3457 *val = LSM6DSM_AUX_GY_POS;
3458 break;
3459
3460 case LSM6DSM_AUX_GY_NEG:
3461 *val = LSM6DSM_AUX_GY_NEG;
3462 break;
3463
3464 default:
3465 *val = LSM6DSM_AUX_GY_DISABLE;
3466 break;
3467 }
3468
3469 return ret;
3470 }
3471
3472 /**
3473 * @brief Selects accelerometer OIS channel full-scale.[set]
3474 *
3475 * @param ctx Read / write interface definitions
3476 * @param val change the values of fs_xl_ois in reg CTRL3_OIS
3477 * @retval Interface status (MANDATORY: return 0 -> no Error).
3478 *
3479 */
lsm6dsm_aux_xl_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsm_fs_xl_ois_t val)3480 int32_t lsm6dsm_aux_xl_full_scale_set(const stmdev_ctx_t *ctx,
3481 lsm6dsm_fs_xl_ois_t val)
3482 {
3483 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3484 int32_t ret;
3485
3486 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3487
3488 if (ret == 0)
3489 {
3490 ctrl3_ois.fs_xl_ois = (uint8_t)val;
3491 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3492 }
3493
3494 return ret;
3495 }
3496
3497 /**
3498 * @brief Selects accelerometer OIS channel full-scale.[get]
3499 *
3500 * @param ctx Read / write interface definitions
3501 * @param val Get the values of fs_xl_ois in reg CTRL3_OIS
3502 * @retval Interface status (MANDATORY: return 0 -> no Error).
3503 *
3504 */
lsm6dsm_aux_xl_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsm_fs_xl_ois_t * val)3505 int32_t lsm6dsm_aux_xl_full_scale_get(const stmdev_ctx_t *ctx,
3506 lsm6dsm_fs_xl_ois_t *val)
3507 {
3508 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3509 int32_t ret;
3510
3511 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3512
3513 switch (ctrl3_ois.fs_xl_ois)
3514 {
3515 case LSM6DSM_AUX_2g:
3516 *val = LSM6DSM_AUX_2g;
3517 break;
3518
3519 case LSM6DSM_AUX_16g:
3520 *val = LSM6DSM_AUX_16g;
3521 break;
3522
3523 case LSM6DSM_AUX_4g:
3524 *val = LSM6DSM_AUX_4g;
3525 break;
3526
3527 case LSM6DSM_AUX_8g:
3528 *val = LSM6DSM_AUX_8g;
3529 break;
3530
3531 default:
3532 *val = LSM6DSM_AUX_2g;
3533 break;
3534 }
3535
3536 return ret;
3537 }
3538
3539 /**
3540 * @brief Indicates polarity of DEN signal on OIS chain.[set]
3541 *
3542 * @param ctx Read / write interface definitions
3543 * @param val change the values of den_lh_ois in reg CTRL3_OIS
3544 * @retval Interface status (MANDATORY: return 0 -> no Error).
3545 *
3546 */
lsm6dsm_aux_den_polarity_set(const stmdev_ctx_t * ctx,lsm6dsm_den_lh_ois_t val)3547 int32_t lsm6dsm_aux_den_polarity_set(const stmdev_ctx_t *ctx,
3548 lsm6dsm_den_lh_ois_t val)
3549 {
3550 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3551 int32_t ret;
3552
3553 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3554
3555 if (ret == 0)
3556 {
3557 ctrl3_ois.den_lh_ois = (uint8_t)val;
3558 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3559 }
3560
3561 return ret;
3562 }
3563
3564 /**
3565 * @brief Indicates polarity of DEN signal on OIS chain.[get]
3566 *
3567 * @param ctx Read / write interface definitions
3568 * @param val Get the values of den_lh_ois in reg CTRL3_OIS
3569 * @retval Interface status (MANDATORY: return 0 -> no Error).
3570 *
3571 */
lsm6dsm_aux_den_polarity_get(const stmdev_ctx_t * ctx,lsm6dsm_den_lh_ois_t * val)3572 int32_t lsm6dsm_aux_den_polarity_get(const stmdev_ctx_t *ctx,
3573 lsm6dsm_den_lh_ois_t *val)
3574 {
3575 lsm6dsm_ctrl3_ois_t ctrl3_ois;
3576 int32_t ret;
3577
3578 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_OIS, (uint8_t *)&ctrl3_ois, 1);
3579
3580 switch (ctrl3_ois.den_lh_ois)
3581 {
3582 case LSM6DSM_AUX_DEN_ACTIVE_LOW:
3583 *val = LSM6DSM_AUX_DEN_ACTIVE_LOW;
3584 break;
3585
3586 case LSM6DSM_AUX_DEN_ACTIVE_HIGH:
3587 *val = LSM6DSM_AUX_DEN_ACTIVE_HIGH;
3588 break;
3589
3590 default:
3591 *val = LSM6DSM_AUX_DEN_ACTIVE_LOW;
3592 break;
3593 }
3594
3595 return ret;
3596 }
3597
3598 /**
3599 * @}
3600 *
3601 */
3602
3603 /**
3604 * @defgroup LSM6DSM main serial_interface
3605 * @brief This section groups all the functions concerning serial
3606 * interface management
3607 * @{
3608 *
3609 */
3610
3611 /**
3612 * @brief SPI Serial Interface Mode selection.[set]
3613 *
3614 * @param ctx Read / write interface definitions
3615 * @param val Change the values of sim in reg CTRL3_C
3616 * @retval Interface status (MANDATORY: return 0 -> no Error).
3617 *
3618 */
lsm6dsm_spi_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_sim_t val)3619 int32_t lsm6dsm_spi_mode_set(const stmdev_ctx_t *ctx, lsm6dsm_sim_t val)
3620 {
3621 lsm6dsm_ctrl3_c_t ctrl3_c;
3622 int32_t ret;
3623
3624 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
3625
3626 if (ret == 0)
3627 {
3628 ctrl3_c.sim = (uint8_t)val;
3629 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
3630 }
3631
3632 return ret;
3633 }
3634
3635 /**
3636 * @brief SPI Serial Interface Mode selection.[get]
3637 *
3638 * @param ctx Read / write interface definitions
3639 * @param val Get the values of sim in reg CTRL3_C
3640 * @retval Interface status (MANDATORY: return 0 -> no Error).
3641 *
3642 */
lsm6dsm_spi_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_sim_t * val)3643 int32_t lsm6dsm_spi_mode_get(const stmdev_ctx_t *ctx, lsm6dsm_sim_t *val)
3644 {
3645 lsm6dsm_ctrl3_c_t ctrl3_c;
3646 int32_t ret;
3647
3648 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
3649
3650 switch (ctrl3_c.sim)
3651 {
3652 case LSM6DSM_SPI_4_WIRE:
3653 *val = LSM6DSM_SPI_4_WIRE;
3654 break;
3655
3656 case LSM6DSM_SPI_3_WIRE:
3657 *val = LSM6DSM_SPI_3_WIRE;
3658 break;
3659
3660 default:
3661 *val = LSM6DSM_SPI_4_WIRE;
3662 break;
3663 }
3664
3665 return ret;
3666 }
3667
3668 /**
3669 * @brief Disable / Enable I2C interface.[set]
3670 *
3671 * @param ctx Read / write interface definitions
3672 * @param val Change the values of i2c_disable in reg CTRL4_C
3673 * @retval Interface status (MANDATORY: return 0 -> no Error).
3674 *
3675 */
lsm6dsm_i2c_interface_set(const stmdev_ctx_t * ctx,lsm6dsm_i2c_disable_t val)3676 int32_t lsm6dsm_i2c_interface_set(const stmdev_ctx_t *ctx,
3677 lsm6dsm_i2c_disable_t val)
3678 {
3679 lsm6dsm_ctrl4_c_t ctrl4_c;
3680 int32_t ret;
3681
3682 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3683
3684 if (ret == 0)
3685 {
3686 ctrl4_c.i2c_disable = (uint8_t)val;
3687 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3688 }
3689
3690 return ret;
3691 }
3692
3693 /**
3694 * @brief Disable / Enable I2C interface.[get]
3695 *
3696 * @param ctx Read / write interface definitions
3697 * @param val Get the values of i2c_disable in reg CTRL4_C
3698 * @retval Interface status (MANDATORY: return 0 -> no Error).
3699 *
3700 */
lsm6dsm_i2c_interface_get(const stmdev_ctx_t * ctx,lsm6dsm_i2c_disable_t * val)3701 int32_t lsm6dsm_i2c_interface_get(const stmdev_ctx_t *ctx,
3702 lsm6dsm_i2c_disable_t *val)
3703 {
3704 lsm6dsm_ctrl4_c_t ctrl4_c;
3705 int32_t ret;
3706
3707 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3708
3709 switch (ctrl4_c.i2c_disable)
3710 {
3711 case LSM6DSM_I2C_ENABLE:
3712 *val = LSM6DSM_I2C_ENABLE;
3713 break;
3714
3715 case LSM6DSM_I2C_DISABLE:
3716 *val = LSM6DSM_I2C_DISABLE;
3717 break;
3718
3719 default:
3720 *val = LSM6DSM_I2C_ENABLE;
3721 break;
3722 }
3723
3724 return ret;
3725 }
3726
3727 /**
3728 * @}
3729 *
3730 */
3731
3732 /**
3733 * @defgroup LSM6DSM_interrupt_pins
3734 * @brief This section groups all the functions that manage
3735 * interrupt pins
3736 * @{
3737 *
3738 */
3739
3740 /**
3741 * @brief Select the signal that need to route on int1 pad[set]
3742 *
3743 * @param ctx Read / write interface definitions
3744 * @param val configure INT1_CTRL, MD1_CFG, CTRL4_C(den_drdy_int1),
3745 * MASTER_CONFIG(drdy_on_int1)
3746 * @retval Interface status (MANDATORY: return 0 -> no Error).
3747 *
3748 */
lsm6dsm_pin_int1_route_set(const stmdev_ctx_t * ctx,lsm6dsm_int1_route_t val)3749 int32_t lsm6dsm_pin_int1_route_set(const stmdev_ctx_t *ctx,
3750 lsm6dsm_int1_route_t val)
3751 {
3752 lsm6dsm_master_config_t master_config;
3753 lsm6dsm_int1_ctrl_t int1_ctrl;
3754 lsm6dsm_md1_cfg_t md1_cfg;
3755 lsm6dsm_md2_cfg_t md2_cfg;
3756 lsm6dsm_ctrl4_c_t ctrl4_c;
3757 lsm6dsm_tap_cfg_t tap_cfg;
3758 int32_t ret;
3759
3760 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
3761
3762 if (ret == 0)
3763 {
3764 int1_ctrl.int1_drdy_xl = val.int1_drdy_xl;
3765 int1_ctrl.int1_drdy_g = val.int1_drdy_g;
3766 int1_ctrl.int1_boot = val.int1_boot;
3767 int1_ctrl.int1_fth = val.int1_fth;
3768 int1_ctrl.int1_fifo_ovr = val.int1_fifo_ovr;
3769 int1_ctrl.int1_full_flag = val.int1_full_flag;
3770 int1_ctrl.int1_sign_mot = val.int1_sign_mot;
3771 int1_ctrl.int1_step_detector = val.int1_step_detector;
3772 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
3773 }
3774
3775 if (ret == 0)
3776 {
3777 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD1_CFG, (uint8_t *)&md1_cfg, 1);
3778 }
3779
3780 if (ret == 0)
3781 {
3782 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3783 }
3784
3785 if (ret == 0)
3786 {
3787 md1_cfg.int1_timer = val.int1_timer;
3788 md1_cfg.int1_tilt = val.int1_tilt;
3789 md1_cfg.int1_6d = val.int1_6d;
3790 md1_cfg.int1_double_tap = val.int1_double_tap;
3791 md1_cfg.int1_ff = val.int1_ff;
3792 md1_cfg.int1_wu = val.int1_wu;
3793 md1_cfg.int1_single_tap = val.int1_single_tap;
3794 md1_cfg.int1_inact_state = val.int1_inact_state;
3795 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MD1_CFG, (uint8_t *)&md1_cfg, 1);
3796 }
3797
3798 if (ret == 0)
3799 {
3800 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3801 }
3802
3803 if (ret == 0)
3804 {
3805 ctrl4_c.den_drdy_int1 = val.den_drdy_int1;
3806 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3807 }
3808
3809 if (ret == 0)
3810 {
3811 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
3812 (uint8_t *)&master_config, 1);
3813 }
3814
3815 if (ret == 0)
3816 {
3817 master_config.drdy_on_int1 = val.den_drdy_int1;
3818 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
3819 (uint8_t *)&master_config, 1);
3820 }
3821
3822 if (ret == 0)
3823 {
3824 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
3825
3826 if ((val.int1_6d != 0x00U) ||
3827 (val.int1_ff != 0x00U) ||
3828 (val.int1_wu != 0x00U) ||
3829 (val.int1_single_tap != 0x00U) ||
3830 (val.int1_double_tap != 0x00U) ||
3831 (val.int1_inact_state != 0x00U) ||
3832 (md2_cfg.int2_6d != 0x00U) ||
3833 (md2_cfg.int2_ff != 0x00U) ||
3834 (md2_cfg.int2_wu != 0x00U) ||
3835 (md2_cfg.int2_single_tap != 0x00U) ||
3836 (md2_cfg.int2_double_tap != 0x00U) ||
3837 (md2_cfg.int2_inact_state != 0x00U))
3838 {
3839 tap_cfg.interrupts_enable = PROPERTY_ENABLE;
3840 }
3841
3842 else
3843 {
3844 tap_cfg.interrupts_enable = PROPERTY_DISABLE;
3845 }
3846 }
3847
3848 if (ret == 0)
3849 {
3850 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
3851 }
3852
3853 return ret;
3854 }
3855
3856 /**
3857 * @brief Select the signal that need to route on int1 pad[get]
3858 *
3859 * @param ctx Read / write interface definitions
3860 * @param val read INT1_CTRL, MD1_CFG, CTRL4_C(den_drdy_int1),
3861 * MASTER_CONFIG(drdy_on_int1)
3862 * @retval Interface status (MANDATORY: return 0 -> no Error).
3863 *
3864 */
lsm6dsm_pin_int1_route_get(const stmdev_ctx_t * ctx,lsm6dsm_int1_route_t * val)3865 int32_t lsm6dsm_pin_int1_route_get(const stmdev_ctx_t *ctx,
3866 lsm6dsm_int1_route_t *val)
3867 {
3868 lsm6dsm_master_config_t master_config;
3869 lsm6dsm_int1_ctrl_t int1_ctrl;
3870 lsm6dsm_md1_cfg_t md1_cfg;
3871 lsm6dsm_ctrl4_c_t ctrl4_c;
3872 int32_t ret;
3873
3874 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT1_CTRL, (uint8_t *)&int1_ctrl, 1);
3875
3876 if (ret == 0)
3877 {
3878 val->int1_drdy_xl = int1_ctrl.int1_drdy_xl;
3879 val->int1_drdy_g = int1_ctrl.int1_drdy_g;
3880 val->int1_boot = int1_ctrl.int1_boot;
3881 val->int1_fth = int1_ctrl.int1_fth;
3882 val->int1_fifo_ovr = int1_ctrl.int1_fifo_ovr;
3883 val->int1_full_flag = int1_ctrl.int1_full_flag;
3884 val->int1_sign_mot = int1_ctrl.int1_sign_mot;
3885 val->int1_step_detector = int1_ctrl.int1_step_detector ;
3886 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD1_CFG, (uint8_t *)&md1_cfg, 1);
3887
3888 if (ret == 0)
3889 {
3890 val->int1_timer = md1_cfg.int1_timer;
3891 val->int1_tilt = md1_cfg.int1_tilt;
3892 val->int1_6d = md1_cfg.int1_6d;
3893 val->int1_double_tap = md1_cfg.int1_double_tap;
3894 val->int1_ff = md1_cfg.int1_ff;
3895 val->int1_wu = md1_cfg.int1_wu;
3896 val->int1_single_tap = md1_cfg.int1_single_tap;
3897 val->int1_inact_state = md1_cfg.int1_inact_state;
3898 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
3899
3900 if (ret == 0)
3901 {
3902 val->den_drdy_int1 = ctrl4_c.den_drdy_int1;
3903 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
3904 (uint8_t *)&master_config, 1);
3905 val->den_drdy_int1 = master_config.drdy_on_int1;
3906 }
3907 }
3908 }
3909
3910 return ret;
3911 }
3912
3913 /**
3914 * @brief Select the signal that need to route on int2 pad[set]
3915 *
3916 * @param ctx Read / write interface definitions
3917 * @param val INT2_CTRL, DRDY_PULSE_CFG(int2_wrist_tilt), MD2_CFG
3918 * @retval Interface status (MANDATORY: return 0 -> no Error).
3919 *
3920 */
lsm6dsm_pin_int2_route_set(const stmdev_ctx_t * ctx,lsm6dsm_int2_route_t val)3921 int32_t lsm6dsm_pin_int2_route_set(const stmdev_ctx_t *ctx,
3922 lsm6dsm_int2_route_t val)
3923 {
3924 lsm6dsm_int2_ctrl_t int2_ctrl;
3925 lsm6dsm_md1_cfg_t md1_cfg;
3926 lsm6dsm_md2_cfg_t md2_cfg;
3927 lsm6dsm_drdy_pulse_cfg_t drdy_pulse_cfg;
3928 lsm6dsm_tap_cfg_t tap_cfg;
3929 int32_t ret;
3930
3931 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3932
3933 if (ret == 0)
3934 {
3935 int2_ctrl.int2_drdy_xl = val.int2_drdy_xl;
3936 int2_ctrl.int2_drdy_g = val.int2_drdy_g;
3937 int2_ctrl.int2_drdy_temp = val.int2_drdy_temp;
3938 int2_ctrl.int2_fth = val.int2_fth;
3939 int2_ctrl.int2_fifo_ovr = val.int2_fifo_ovr;
3940 int2_ctrl.int2_full_flag = val.int2_full_flag;
3941 int2_ctrl.int2_step_count_ov = val.int2_step_count_ov;
3942 int2_ctrl.int2_step_delta = val.int2_step_delta;
3943 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
3944 }
3945
3946 if (ret == 0)
3947 {
3948 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD1_CFG, (uint8_t *)&md1_cfg, 1);
3949 }
3950
3951 if (ret == 0)
3952 {
3953 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3954 }
3955
3956 if (ret == 0)
3957 {
3958 md2_cfg.int2_iron = val.int2_iron;
3959 md2_cfg.int2_tilt = val.int2_tilt;
3960 md2_cfg.int2_6d = val.int2_6d;
3961 md2_cfg.int2_double_tap = val.int2_double_tap;
3962 md2_cfg.int2_ff = val.int2_ff;
3963 md2_cfg.int2_wu = val.int2_wu;
3964 md2_cfg.int2_single_tap = val.int2_single_tap;
3965 md2_cfg.int2_inact_state = val.int2_inact_state;
3966 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MD2_CFG, (uint8_t *)&md2_cfg, 1);
3967 }
3968
3969 if (ret == 0)
3970 {
3971 ret = lsm6dsm_read_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
3972 (uint8_t *)&drdy_pulse_cfg, 1);
3973 }
3974
3975 if (ret == 0)
3976 {
3977 drdy_pulse_cfg.int2_wrist_tilt = val.int2_wrist_tilt;
3978 ret = lsm6dsm_write_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
3979 (uint8_t *)&drdy_pulse_cfg, 1);
3980 }
3981
3982 if (ret == 0)
3983 {
3984 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
3985
3986 if ((md1_cfg.int1_6d != 0x00U) ||
3987 (md1_cfg.int1_ff != 0x00U) ||
3988 (md1_cfg.int1_wu != 0x00U) ||
3989 (md1_cfg.int1_single_tap != 0x00U) ||
3990 (md1_cfg.int1_double_tap != 0x00U) ||
3991 (md1_cfg.int1_inact_state != 0x00U) ||
3992 (val.int2_6d != 0x00U) ||
3993 (val.int2_ff != 0x00U) ||
3994 (val.int2_wu != 0x00U) ||
3995 (val.int2_single_tap != 0x00U) ||
3996 (val.int2_double_tap != 0x00U) ||
3997 (val.int2_inact_state != 0x00U))
3998 {
3999 tap_cfg.interrupts_enable = PROPERTY_ENABLE;
4000 }
4001
4002 else
4003 {
4004 tap_cfg.interrupts_enable = PROPERTY_DISABLE;
4005 }
4006 }
4007
4008 if (ret == 0)
4009 {
4010 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4011 }
4012
4013 return ret;
4014 }
4015
4016 /**
4017 * @brief Select the signal that need to route on int2 pad[get]
4018 *
4019 * @param ctx Read / write interface definitions
4020 * @param val INT2_CTRL, DRDY_PULSE_CFG(int2_wrist_tilt), MD2_CFG
4021 * @retval Interface status (MANDATORY: return 0 -> no Error).
4022 *
4023 */
lsm6dsm_pin_int2_route_get(const stmdev_ctx_t * ctx,lsm6dsm_int2_route_t * val)4024 int32_t lsm6dsm_pin_int2_route_get(const stmdev_ctx_t *ctx,
4025 lsm6dsm_int2_route_t *val)
4026 {
4027 lsm6dsm_int2_ctrl_t int2_ctrl;
4028 lsm6dsm_md2_cfg_t md2_cfg;
4029 lsm6dsm_drdy_pulse_cfg_t drdy_pulse_cfg;
4030 int32_t ret;
4031
4032 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT2_CTRL, (uint8_t *)&int2_ctrl, 1);
4033
4034 if (ret == 0)
4035 {
4036 val->int2_drdy_xl = int2_ctrl.int2_drdy_xl;
4037 val->int2_drdy_g = int2_ctrl.int2_drdy_g;
4038 val->int2_drdy_temp = int2_ctrl.int2_drdy_temp;
4039 val->int2_fth = int2_ctrl.int2_fth;
4040 val->int2_fifo_ovr = int2_ctrl.int2_fifo_ovr;
4041 val->int2_full_flag = int2_ctrl.int2_full_flag;
4042 val->int2_step_count_ov = int2_ctrl.int2_step_count_ov;
4043 val->int2_step_delta = int2_ctrl.int2_step_delta;
4044 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MD2_CFG, (uint8_t *)&md2_cfg, 1);
4045
4046 if (ret == 0)
4047 {
4048 val->int2_iron = md2_cfg.int2_iron;
4049 val->int2_tilt = md2_cfg.int2_tilt;
4050 val->int2_6d = md2_cfg.int2_6d;
4051 val->int2_double_tap = md2_cfg.int2_double_tap;
4052 val->int2_ff = md2_cfg.int2_ff;
4053 val->int2_wu = md2_cfg.int2_wu;
4054 val->int2_single_tap = md2_cfg.int2_single_tap;
4055 val->int2_inact_state = md2_cfg.int2_inact_state;
4056 ret = lsm6dsm_read_reg(ctx, LSM6DSM_DRDY_PULSE_CFG,
4057 (uint8_t *)&drdy_pulse_cfg, 1);
4058 val->int2_wrist_tilt = drdy_pulse_cfg.int2_wrist_tilt;
4059 }
4060 }
4061
4062 return ret;
4063 }
4064
4065 /**
4066 * @brief Push-pull/open drain selection on interrupt pads.[set]
4067 *
4068 * @param ctx Read / write interface definitions
4069 * @param val Change the values of pp_od in reg CTRL3_C
4070 * @retval Interface status (MANDATORY: return 0 -> no Error).
4071 *
4072 */
lsm6dsm_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_pp_od_t val)4073 int32_t lsm6dsm_pin_mode_set(const stmdev_ctx_t *ctx, lsm6dsm_pp_od_t val)
4074 {
4075 lsm6dsm_ctrl3_c_t ctrl3_c;
4076 int32_t ret;
4077
4078 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4079
4080 if (ret == 0)
4081 {
4082 ctrl3_c.pp_od = (uint8_t) val;
4083 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4084 }
4085
4086 return ret;
4087 }
4088
4089 /**
4090 * @brief Push-pull/open drain selection on interrupt pads.[get]
4091 *
4092 * @param ctx Read / write interface definitions
4093 * @param val Get the values of pp_od in reg CTRL3_C
4094 * @retval Interface status (MANDATORY: return 0 -> no Error).
4095 *
4096 */
lsm6dsm_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_pp_od_t * val)4097 int32_t lsm6dsm_pin_mode_get(const stmdev_ctx_t *ctx, lsm6dsm_pp_od_t *val)
4098 {
4099 lsm6dsm_ctrl3_c_t ctrl3_c;
4100 int32_t ret;
4101
4102 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4103
4104 switch (ctrl3_c.pp_od)
4105 {
4106 case LSM6DSM_PUSH_PULL:
4107 *val = LSM6DSM_PUSH_PULL;
4108 break;
4109
4110 case LSM6DSM_OPEN_DRAIN:
4111 *val = LSM6DSM_OPEN_DRAIN;
4112 break;
4113
4114 default:
4115 *val = LSM6DSM_PUSH_PULL;
4116 break;
4117 }
4118
4119 return ret;
4120 }
4121
4122 /**
4123 * @brief Interrupt active-high/low.[set]
4124 *
4125 * @param ctx Read / write interface definitions
4126 * @param val Change the values of h_lactive in reg CTRL3_C
4127 * @retval Interface status (MANDATORY: return 0 -> no Error).
4128 *
4129 */
lsm6dsm_pin_polarity_set(const stmdev_ctx_t * ctx,lsm6dsm_h_lactive_t val)4130 int32_t lsm6dsm_pin_polarity_set(const stmdev_ctx_t *ctx,
4131 lsm6dsm_h_lactive_t val)
4132 {
4133 lsm6dsm_ctrl3_c_t ctrl3_c;
4134 int32_t ret;
4135
4136 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4137
4138 if (ret == 0)
4139 {
4140 ctrl3_c.h_lactive = (uint8_t) val;
4141 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4142 }
4143
4144 return ret;
4145 }
4146
4147 /**
4148 * @brief Interrupt active-high/low.[get]
4149 *
4150 * @param ctx Read / write interface definitions
4151 * @param val Get the values of h_lactive in reg CTRL3_C
4152 * @retval Interface status (MANDATORY: return 0 -> no Error).
4153 *
4154 */
lsm6dsm_pin_polarity_get(const stmdev_ctx_t * ctx,lsm6dsm_h_lactive_t * val)4155 int32_t lsm6dsm_pin_polarity_get(const stmdev_ctx_t *ctx,
4156 lsm6dsm_h_lactive_t *val)
4157 {
4158 lsm6dsm_ctrl3_c_t ctrl3_c;
4159 int32_t ret;
4160
4161 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
4162
4163 switch (ctrl3_c.h_lactive)
4164 {
4165 case LSM6DSM_ACTIVE_HIGH:
4166 *val = LSM6DSM_ACTIVE_HIGH;
4167 break;
4168
4169 case LSM6DSM_ACTIVE_LOW:
4170 *val = LSM6DSM_ACTIVE_LOW;
4171 break;
4172
4173 default:
4174 *val = LSM6DSM_ACTIVE_HIGH;
4175 break;
4176 }
4177
4178 return ret;
4179 }
4180
4181 /**
4182 * @brief All interrupt signals become available on INT1 pin.[set]
4183 *
4184 * @param ctx Read / write interface definitions
4185 * @param val Change the values of int2_on_int1 in reg CTRL4_C
4186 * @retval Interface status (MANDATORY: return 0 -> no Error).
4187 *
4188 */
lsm6dsm_all_on_int1_set(const stmdev_ctx_t * ctx,uint8_t val)4189 int32_t lsm6dsm_all_on_int1_set(const stmdev_ctx_t *ctx, uint8_t val)
4190 {
4191 lsm6dsm_ctrl4_c_t ctrl4_c;
4192 int32_t ret;
4193
4194 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4195
4196 if (ret == 0)
4197 {
4198 ctrl4_c.int2_on_int1 = val;
4199 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4200 }
4201
4202 return ret;
4203 }
4204
4205 /**
4206 * @brief All interrupt signals become available on INT1 pin.[get]
4207 *
4208 * @param ctx Read / write interface definitions
4209 * @param val Change the values of int2_on_int1 in reg CTRL4_C
4210 * @retval Interface status (MANDATORY: return 0 -> no Error).
4211 *
4212 */
lsm6dsm_all_on_int1_get(const stmdev_ctx_t * ctx,uint8_t * val)4213 int32_t lsm6dsm_all_on_int1_get(const stmdev_ctx_t *ctx, uint8_t *val)
4214 {
4215 lsm6dsm_ctrl4_c_t ctrl4_c;
4216 int32_t ret;
4217
4218 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4219 *val = ctrl4_c.int2_on_int1;
4220
4221 return ret;
4222 }
4223
4224 /**
4225 * @brief Latched/pulsed interrupt.[set]
4226 *
4227 * @param ctx Read / write interface definitions
4228 * @param val Change the values of lir in reg TAP_CFG
4229 * @retval Interface status (MANDATORY: return 0 -> no Error).
4230 *
4231 */
lsm6dsm_int_notification_set(const stmdev_ctx_t * ctx,lsm6dsm_lir_t val)4232 int32_t lsm6dsm_int_notification_set(const stmdev_ctx_t *ctx,
4233 lsm6dsm_lir_t val)
4234 {
4235 lsm6dsm_tap_cfg_t tap_cfg;
4236 int32_t ret;
4237
4238 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4239
4240 if (ret == 0)
4241 {
4242 tap_cfg.lir = (uint8_t) val;
4243 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4244 }
4245
4246 return ret;
4247 }
4248
4249 /**
4250 * @brief Latched/pulsed interrupt.[get]
4251 *
4252 * @param ctx Read / write interface definitions
4253 * @param val Get the values of lir in reg TAP_CFG
4254 * @retval Interface status (MANDATORY: return 0 -> no Error).
4255 *
4256 */
lsm6dsm_int_notification_get(const stmdev_ctx_t * ctx,lsm6dsm_lir_t * val)4257 int32_t lsm6dsm_int_notification_get(const stmdev_ctx_t *ctx,
4258 lsm6dsm_lir_t *val)
4259 {
4260 lsm6dsm_tap_cfg_t tap_cfg;
4261 int32_t ret;
4262
4263 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4264
4265 switch (tap_cfg.lir)
4266 {
4267 case LSM6DSM_INT_PULSED:
4268 *val = LSM6DSM_INT_PULSED;
4269 break;
4270
4271 case LSM6DSM_INT_LATCHED:
4272 *val = LSM6DSM_INT_LATCHED;
4273 break;
4274
4275 default:
4276 *val = LSM6DSM_INT_PULSED;
4277 break;
4278 }
4279
4280 return ret;
4281 }
4282
4283 /**
4284 * @}
4285 *
4286 */
4287
4288 /**
4289 * @defgroup LSM6DSM_Wake_Up_event
4290 * @brief This section groups all the functions that manage the
4291 * Wake Up event generation.
4292 * @{
4293 *
4294 */
4295
4296 /**
4297 * @brief Threshold for wakeup.1 LSB = FS_XL / 64.[set]
4298 *
4299 * @param ctx Read / write interface definitions
4300 * @param val Change the values of wk_ths in reg WAKE_UP_THS
4301 * @retval Interface status (MANDATORY: return 0 -> no Error).
4302 *
4303 */
lsm6dsm_wkup_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)4304 int32_t lsm6dsm_wkup_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
4305 {
4306 lsm6dsm_wake_up_ths_t wake_up_ths;
4307 int32_t ret;
4308
4309 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_THS,
4310 (uint8_t *)&wake_up_ths, 1);
4311
4312 if (ret == 0)
4313 {
4314 wake_up_ths.wk_ths = val;
4315 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_THS,
4316 (uint8_t *)&wake_up_ths, 1);
4317 }
4318
4319 return ret;
4320 }
4321
4322 /**
4323 * @brief Threshold for wakeup.1 LSB = FS_XL / 64.[get]
4324 *
4325 * @param ctx Read / write interface definitions
4326 * @param val Change the values of wk_ths in reg WAKE_UP_THS
4327 * @retval Interface status (MANDATORY: return 0 -> no Error).
4328 *
4329 */
lsm6dsm_wkup_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)4330 int32_t lsm6dsm_wkup_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
4331 {
4332 lsm6dsm_wake_up_ths_t wake_up_ths;
4333 int32_t ret;
4334
4335 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_THS,
4336 (uint8_t *)&wake_up_ths, 1);
4337 *val = wake_up_ths.wk_ths;
4338
4339 return ret;
4340 }
4341
4342 /**
4343 * @brief Wake up duration event.1LSb = 1 / ODR[set]
4344 *
4345 * @param ctx Read / write interface definitions
4346 * @param val Change the values of wake_dur in reg WAKE_UP_DUR
4347 * @retval Interface status (MANDATORY: return 0 -> no Error).
4348 *
4349 */
lsm6dsm_wkup_dur_set(const stmdev_ctx_t * ctx,uint8_t val)4350 int32_t lsm6dsm_wkup_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
4351 {
4352 lsm6dsm_wake_up_dur_t wake_up_dur;
4353 int32_t ret;
4354
4355 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4356 (uint8_t *)&wake_up_dur, 1);
4357
4358 if (ret == 0)
4359 {
4360 wake_up_dur.wake_dur = val;
4361 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4362 (uint8_t *)&wake_up_dur, 1);
4363 }
4364
4365 return ret;
4366 }
4367
4368 /**
4369 * @brief Wake up duration event.1LSb = 1 / ODR[get]
4370 *
4371 * @param ctx Read / write interface definitions
4372 * @param val Change the values of wake_dur in reg WAKE_UP_DUR
4373 * @retval Interface status (MANDATORY: return 0 -> no Error).
4374 *
4375 */
lsm6dsm_wkup_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)4376 int32_t lsm6dsm_wkup_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
4377 {
4378 lsm6dsm_wake_up_dur_t wake_up_dur;
4379 int32_t ret;
4380
4381 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4382 (uint8_t *)&wake_up_dur, 1);
4383 *val = wake_up_dur.wake_dur;
4384
4385 return ret;
4386 }
4387
4388 /**
4389 * @}
4390 *
4391 */
4392
4393 /**
4394 * @defgroup LSM6DSM_Activity/Inactivity_detection
4395 * @brief This section groups all the functions concerning
4396 * activity/inactivity detection.
4397 * @{
4398 *
4399 */
4400
4401 /**
4402 * @brief Enables gyroscope Sleep mode.[set]
4403 *
4404 * @param ctx Read / write interface definitions
4405 * @param val Change the values of sleep in reg CTRL4_C
4406 * @retval Interface status (MANDATORY: return 0 -> no Error).
4407 *
4408 */
lsm6dsm_gy_sleep_mode_set(const stmdev_ctx_t * ctx,uint8_t val)4409 int32_t lsm6dsm_gy_sleep_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
4410 {
4411 lsm6dsm_ctrl4_c_t ctrl4_c;
4412 int32_t ret;
4413
4414 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4415
4416 if (ret == 0)
4417 {
4418 ctrl4_c.sleep = val;
4419 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4420 }
4421
4422 return ret;
4423 }
4424
4425 /**
4426 * @brief Enables gyroscope Sleep mode.[get]
4427 *
4428 * @param ctx Read / write interface definitions
4429 * @param val Change the values of sleep in reg CTRL4_C
4430 * @retval Interface status (MANDATORY: return 0 -> no Error).
4431 *
4432 */
lsm6dsm_gy_sleep_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)4433 int32_t lsm6dsm_gy_sleep_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
4434 {
4435 lsm6dsm_ctrl4_c_t ctrl4_c;
4436 int32_t ret;
4437
4438 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
4439 *val = ctrl4_c.sleep;
4440
4441 return ret;
4442 }
4443
4444 /**
4445 * @brief Enable inactivity function.[set]
4446 *
4447 * @param ctx Read / write interface definitions
4448 * @param val Change the values of inact_en in reg TAP_CFG
4449 * @retval Interface status (MANDATORY: return 0 -> no Error).
4450 *
4451 */
lsm6dsm_act_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_inact_en_t val)4452 int32_t lsm6dsm_act_mode_set(const stmdev_ctx_t *ctx,
4453 lsm6dsm_inact_en_t val)
4454 {
4455 lsm6dsm_tap_cfg_t tap_cfg;
4456 int32_t ret;
4457
4458 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4459
4460 if (ret == 0)
4461 {
4462 tap_cfg.inact_en = (uint8_t) val;
4463 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4464 }
4465
4466 return ret;
4467 }
4468
4469 /**
4470 * @brief Enable inactivity function.[get]
4471 *
4472 * @param ctx Read / write interface definitions
4473 * @param val Get the values of inact_en in reg TAP_CFG
4474 * @retval Interface status (MANDATORY: return 0 -> no Error).
4475 *
4476 */
lsm6dsm_act_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_inact_en_t * val)4477 int32_t lsm6dsm_act_mode_get(const stmdev_ctx_t *ctx,
4478 lsm6dsm_inact_en_t *val)
4479 {
4480 lsm6dsm_tap_cfg_t tap_cfg;
4481 int32_t ret;
4482
4483 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4484
4485 switch (tap_cfg.inact_en)
4486 {
4487 case LSM6DSM_PROPERTY_DISABLE:
4488 *val = LSM6DSM_PROPERTY_DISABLE;
4489 break;
4490
4491 case LSM6DSM_XL_12Hz5_GY_NOT_AFFECTED:
4492 *val = LSM6DSM_XL_12Hz5_GY_NOT_AFFECTED;
4493 break;
4494
4495 case LSM6DSM_XL_12Hz5_GY_SLEEP:
4496 *val = LSM6DSM_XL_12Hz5_GY_SLEEP;
4497 break;
4498
4499 case LSM6DSM_XL_12Hz5_GY_PD:
4500 *val = LSM6DSM_XL_12Hz5_GY_PD;
4501 break;
4502
4503 default:
4504 *val = LSM6DSM_PROPERTY_DISABLE;
4505 break;
4506 }
4507
4508 return ret;
4509 }
4510
4511 /**
4512 * @brief Duration to go in sleep mode.1 LSb = 512 / ODR[set]
4513 *
4514 * @param ctx Read / write interface definitions
4515 * @param val Change the values of sleep_dur in reg WAKE_UP_DUR
4516 * @retval Interface status (MANDATORY: return 0 -> no Error).
4517 *
4518 */
lsm6dsm_act_sleep_dur_set(const stmdev_ctx_t * ctx,uint8_t val)4519 int32_t lsm6dsm_act_sleep_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
4520 {
4521 lsm6dsm_wake_up_dur_t wake_up_dur;
4522 int32_t ret;
4523
4524 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4525 (uint8_t *)&wake_up_dur, 1);
4526
4527 if (ret == 0)
4528 {
4529 wake_up_dur.sleep_dur = val;
4530 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4531 (uint8_t *)&wake_up_dur, 1);
4532 }
4533
4534 return ret;
4535 }
4536
4537 /**
4538 * @brief Duration to go in sleep mode. 1 LSb = 512 / ODR[get]
4539 *
4540 * @param ctx Read / write interface definitions
4541 * @param val Change the values of sleep_dur in reg WAKE_UP_DUR
4542 * @retval Interface status (MANDATORY: return 0 -> no Error).
4543 *
4544 */
lsm6dsm_act_sleep_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)4545 int32_t lsm6dsm_act_sleep_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
4546 {
4547 lsm6dsm_wake_up_dur_t wake_up_dur;
4548 int32_t ret;
4549
4550 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
4551 (uint8_t *)&wake_up_dur, 1);
4552 *val = wake_up_dur.sleep_dur;
4553
4554 return ret;
4555 }
4556
4557 /**
4558 * @}
4559 *
4560 */
4561
4562 /**
4563 * @defgroup LSM6DSM_tap_generator
4564 * @brief This section groups all the functions that manage the
4565 * tap and double tap event generation.
4566 * @{
4567 *
4568 */
4569
4570 /**
4571 * @brief Read the tap / double tap source register.[get]
4572 *
4573 * @param ctx Read / write interface definitions
4574 * @param val Structure of registers from TAP_SRC
4575 * @retval Interface status (MANDATORY: return 0 -> no Error).
4576 *
4577 */
lsm6dsm_tap_src_get(const stmdev_ctx_t * ctx,lsm6dsm_tap_src_t * val)4578 int32_t lsm6dsm_tap_src_get(const stmdev_ctx_t *ctx, lsm6dsm_tap_src_t *val)
4579 {
4580 int32_t ret;
4581
4582 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_SRC, (uint8_t *) val, 1);
4583
4584 return ret;
4585 }
4586
4587 /**
4588 * @brief Enable Z direction in tap recognition.[set]
4589 *
4590 * @param ctx Read / write interface definitions
4591 * @param val Change the values of tap_z_en in reg TAP_CFG
4592 *
4593 */
lsm6dsm_tap_detection_on_z_set(const stmdev_ctx_t * ctx,uint8_t val)4594 int32_t lsm6dsm_tap_detection_on_z_set(const stmdev_ctx_t *ctx, uint8_t val)
4595 {
4596 lsm6dsm_tap_cfg_t tap_cfg;
4597 int32_t ret;
4598
4599 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4600
4601 if (ret == 0)
4602 {
4603 tap_cfg.tap_z_en = val;
4604 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4605 }
4606
4607 return ret;
4608 }
4609
4610 /**
4611 * @brief Enable Z direction in tap recognition.[get]
4612 *
4613 * @param ctx Read / write interface definitions
4614 * @param val Change the values of tap_z_en in reg TAP_CFG
4615 * @retval Interface status (MANDATORY: return 0 -> no Error).
4616 *
4617 */
lsm6dsm_tap_detection_on_z_get(const stmdev_ctx_t * ctx,uint8_t * val)4618 int32_t lsm6dsm_tap_detection_on_z_get(const stmdev_ctx_t *ctx,
4619 uint8_t *val)
4620 {
4621 lsm6dsm_tap_cfg_t tap_cfg;
4622 int32_t ret;
4623
4624 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4625 *val = tap_cfg.tap_z_en;
4626
4627 return ret;
4628 }
4629
4630 /**
4631 * @brief Enable Y direction in tap recognition.[set]
4632 *
4633 * @param ctx Read / write interface definitions
4634 * @param val Change the values of tap_y_en in reg TAP_CFG
4635 * @retval Interface status (MANDATORY: return 0 -> no Error).
4636 *
4637 */
lsm6dsm_tap_detection_on_y_set(const stmdev_ctx_t * ctx,uint8_t val)4638 int32_t lsm6dsm_tap_detection_on_y_set(const stmdev_ctx_t *ctx, uint8_t val)
4639 {
4640 lsm6dsm_tap_cfg_t tap_cfg;
4641 int32_t ret;
4642
4643 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4644
4645 if (ret == 0)
4646 {
4647 tap_cfg.tap_y_en = val;
4648 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4649 }
4650
4651 return ret;
4652 }
4653
4654 /**
4655 * @brief Enable Y direction in tap recognition.[get]
4656 *
4657 * @param ctx Read / write interface definitions
4658 * @param val Change the values of tap_y_en in reg TAP_CFG
4659 * @retval Interface status (MANDATORY: return 0 -> no Error).
4660 *
4661 */
lsm6dsm_tap_detection_on_y_get(const stmdev_ctx_t * ctx,uint8_t * val)4662 int32_t lsm6dsm_tap_detection_on_y_get(const stmdev_ctx_t *ctx,
4663 uint8_t *val)
4664 {
4665 lsm6dsm_tap_cfg_t tap_cfg;
4666 int32_t ret;
4667
4668 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4669 *val = tap_cfg.tap_y_en;
4670
4671 return ret;
4672 }
4673
4674 /**
4675 * @brief Enable X direction in tap recognition.[set]
4676 *
4677 * @param ctx Read / write interface definitions
4678 * @param val Change the values of tap_x_en in reg TAP_CFG
4679 * @retval Interface status (MANDATORY: return 0 -> no Error).
4680 *
4681 */
lsm6dsm_tap_detection_on_x_set(const stmdev_ctx_t * ctx,uint8_t val)4682 int32_t lsm6dsm_tap_detection_on_x_set(const stmdev_ctx_t *ctx, uint8_t val)
4683 {
4684 lsm6dsm_tap_cfg_t tap_cfg;
4685 int32_t ret;
4686
4687 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4688
4689 if (ret == 0)
4690 {
4691 tap_cfg.tap_x_en = val;
4692 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4693 }
4694
4695 return ret;
4696 }
4697
4698 /**
4699 * @brief Enable X direction in tap recognition.[get]
4700 *
4701 * @param ctx Read / write interface definitions
4702 * @param val Change the values of tap_x_en in reg TAP_CFG
4703 * @retval Interface status (MANDATORY: return 0 -> no Error).
4704 *
4705 */
lsm6dsm_tap_detection_on_x_get(const stmdev_ctx_t * ctx,uint8_t * val)4706 int32_t lsm6dsm_tap_detection_on_x_get(const stmdev_ctx_t *ctx,
4707 uint8_t *val)
4708 {
4709 lsm6dsm_tap_cfg_t tap_cfg;
4710 int32_t ret;
4711
4712 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_CFG, (uint8_t *)&tap_cfg, 1);
4713 *val = tap_cfg.tap_x_en;
4714
4715 return ret;
4716 }
4717
4718 /**
4719 * @brief Threshold for tap recognition.[set]
4720 *
4721 * @param ctx Read / write interface definitions
4722 * @param val Change the values of tap_ths in reg TAP_THS_6D
4723 * @retval Interface status (MANDATORY: return 0 -> no Error).
4724 *
4725 */
lsm6dsm_tap_threshold_x_set(const stmdev_ctx_t * ctx,uint8_t val)4726 int32_t lsm6dsm_tap_threshold_x_set(const stmdev_ctx_t *ctx, uint8_t val)
4727 {
4728 lsm6dsm_tap_ths_6d_t tap_ths_6d;
4729 int32_t ret;
4730
4731 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
4732 (uint8_t *)&tap_ths_6d, 1);
4733
4734 if (ret == 0)
4735 {
4736 tap_ths_6d.tap_ths = val;
4737 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_THS_6D,
4738 (uint8_t *)&tap_ths_6d, 1);
4739 }
4740
4741 return ret;
4742 }
4743
4744 /**
4745 * @brief Threshold for tap recognition.[get]
4746 *
4747 * @param ctx Read / write interface definitions
4748 * @param val Change the values of tap_ths in reg TAP_THS_6D
4749 * @retval Interface status (MANDATORY: return 0 -> no Error).
4750 *
4751 */
lsm6dsm_tap_threshold_x_get(const stmdev_ctx_t * ctx,uint8_t * val)4752 int32_t lsm6dsm_tap_threshold_x_get(const stmdev_ctx_t *ctx, uint8_t *val)
4753 {
4754 lsm6dsm_tap_ths_6d_t tap_ths_6d;
4755 int32_t ret;
4756
4757 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
4758 (uint8_t *)&tap_ths_6d, 1);
4759 *val = tap_ths_6d.tap_ths;
4760
4761 return ret;
4762 }
4763
4764 /**
4765 * @brief Maximum duration is the maximum time of an overthreshold signal
4766 * detection to be recognized as a tap event.
4767 * The default value of these bits is 00b which corresponds to
4768 * 4*ODR_XL time.
4769 * If the SHOCK[1:0] bits are set to a different
4770 * value, 1LSB corresponds to 8*ODR_XL time.[set]
4771 *
4772 * @param ctx Read / write interface definitions
4773 * @param val Change the values of shock in reg INT_DUR2
4774 * @retval Interface status (MANDATORY: return 0 -> no Error).
4775 *
4776 */
lsm6dsm_tap_shock_set(const stmdev_ctx_t * ctx,uint8_t val)4777 int32_t lsm6dsm_tap_shock_set(const stmdev_ctx_t *ctx, uint8_t val)
4778 {
4779 lsm6dsm_int_dur2_t int_dur2;
4780 int32_t ret;
4781
4782 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4783
4784 if (ret == 0)
4785 {
4786 int_dur2.shock = val;
4787 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4788 }
4789
4790 return ret;
4791 }
4792
4793 /**
4794 * @brief Maximum duration is the maximum time of an overthreshold signal
4795 * detection to be recognized as a tap event.
4796 * The default value of these bits is 00b which corresponds to
4797 * 4*ODR_XL time.
4798 * If the SHOCK[1:0] bits are set to a different value, 1LSB
4799 * corresponds to 8*ODR_XL time.[get]
4800 *
4801 * @param ctx Read / write interface definitions
4802 * @param val Change the values of shock in reg INT_DUR2
4803 * @retval Interface status (MANDATORY: return 0 -> no Error).
4804 *
4805 */
lsm6dsm_tap_shock_get(const stmdev_ctx_t * ctx,uint8_t * val)4806 int32_t lsm6dsm_tap_shock_get(const stmdev_ctx_t *ctx, uint8_t *val)
4807 {
4808 lsm6dsm_int_dur2_t int_dur2;
4809 int32_t ret;
4810
4811 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4812 *val = int_dur2.shock;
4813
4814 return ret;
4815 }
4816
4817 /**
4818 * @brief Quiet time is the time after the first detected tap in which there
4819 * must not be any overthreshold event.
4820 * The default value of these bits is 00b which corresponds to
4821 * 2*ODR_XL time.
4822 * If the QUIET[1:0] bits are set to a different value, 1LSB
4823 * corresponds to 4*ODR_XL time.[set]
4824 *
4825 * @param ctx Read / write interface definitions
4826 * @param val Change the values of quiet in reg INT_DUR2
4827 * @retval Interface status (MANDATORY: return 0 -> no Error).
4828 *
4829 */
lsm6dsm_tap_quiet_set(const stmdev_ctx_t * ctx,uint8_t val)4830 int32_t lsm6dsm_tap_quiet_set(const stmdev_ctx_t *ctx, uint8_t val)
4831 {
4832 lsm6dsm_int_dur2_t int_dur2;
4833 int32_t ret;
4834
4835 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4836
4837 if (ret == 0)
4838 {
4839 int_dur2.quiet = val;
4840 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4841 }
4842
4843 return ret;
4844 }
4845
4846 /**
4847 * @brief Quiet time is the time after the first detected tap in which there
4848 * must not be any overthreshold event.
4849 * The default value of these bits is 00b which corresponds to
4850 * 2*ODR_XL time.
4851 * If the QUIET[1:0] bits are set to a different value, 1LSB
4852 * corresponds to 4*ODR_XL time.[get]
4853 *
4854 * @param ctx Read / write interface definitions
4855 * @param val Change the values of quiet in reg INT_DUR2
4856 * @retval Interface status (MANDATORY: return 0 -> no Error).
4857 *
4858 */
lsm6dsm_tap_quiet_get(const stmdev_ctx_t * ctx,uint8_t * val)4859 int32_t lsm6dsm_tap_quiet_get(const stmdev_ctx_t *ctx, uint8_t *val)
4860 {
4861 lsm6dsm_int_dur2_t int_dur2;
4862 int32_t ret;
4863
4864 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4865 *val = int_dur2.quiet;
4866
4867 return ret;
4868 }
4869
4870 /**
4871 * @brief When double tap recognition is enabled, this register expresses the
4872 * maximum time between two consecutive detected taps to determine a
4873 * double tap event.
4874 * The default value of these bits is 0000b which corresponds to
4875 * 16*ODR_XL time.
4876 * If the DUR[3:0] bits are set to a different value,1LSB corresponds
4877 * to 32*ODR_XL time.[set]
4878 *
4879 * @param ctx Read / write interface definitions
4880 * @param val Change the values of dur in reg INT_DUR2
4881 * @retval Interface status (MANDATORY: return 0 -> no Error).
4882 *
4883 */
lsm6dsm_tap_dur_set(const stmdev_ctx_t * ctx,uint8_t val)4884 int32_t lsm6dsm_tap_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
4885 {
4886 lsm6dsm_int_dur2_t int_dur2;
4887 int32_t ret;
4888
4889 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4890
4891 if (ret == 0)
4892 {
4893 int_dur2.dur = val;
4894 ret = lsm6dsm_write_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4895 }
4896
4897 return ret;
4898 }
4899
4900 /**
4901 * @brief When double tap recognition is enabled, this register expresses the
4902 * maximum time between two consecutive detected taps to determine a
4903 * double tap event.
4904 * The default value of these bits is 0000b which corresponds to
4905 * 16*ODR_XL time.
4906 * If the DUR[3:0] bits are set to a different value,1LSB corresponds
4907 * to 32*ODR_XL time.[get]
4908 *
4909 * @param ctx Read / write interface definitions
4910 * @param val Change the values of dur in reg INT_DUR2
4911 * @retval Interface status (MANDATORY: return 0 -> no Error).
4912 *
4913 */
lsm6dsm_tap_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)4914 int32_t lsm6dsm_tap_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
4915 {
4916 lsm6dsm_int_dur2_t int_dur2;
4917 int32_t ret;
4918
4919 ret = lsm6dsm_read_reg(ctx, LSM6DSM_INT_DUR2, (uint8_t *)&int_dur2, 1);
4920 *val = int_dur2.dur;
4921
4922 return ret;
4923 }
4924
4925 /**
4926 * @brief Single/double-tap event enable/disable.[set]
4927 *
4928 * @param ctx Read / write interface definitions
4929 * @param val Change the values of
4930 * single_double_tap in reg WAKE_UP_THS
4931 * @retval Interface status (MANDATORY: return 0 -> no Error).
4932 *
4933 */
lsm6dsm_tap_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_single_double_tap_t val)4934 int32_t lsm6dsm_tap_mode_set(const stmdev_ctx_t *ctx,
4935 lsm6dsm_single_double_tap_t val)
4936 {
4937 lsm6dsm_wake_up_ths_t wake_up_ths;
4938 int32_t ret;
4939
4940 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_THS,
4941 (uint8_t *)&wake_up_ths, 1);
4942
4943 if (ret == 0)
4944 {
4945 wake_up_ths.single_double_tap = (uint8_t) val;
4946 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_THS,
4947 (uint8_t *)&wake_up_ths, 1);
4948 }
4949
4950 return ret;
4951 }
4952
4953 /**
4954 * @brief Single/double-tap event enable/disable.[get]
4955 *
4956 * @param ctx Read / write interface definitions
4957 * @param val Get the values of single_double_tap
4958 * in reg WAKE_UP_THS
4959 * @retval Interface status (MANDATORY: return 0 -> no Error).
4960 *
4961 */
lsm6dsm_tap_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_single_double_tap_t * val)4962 int32_t lsm6dsm_tap_mode_get(const stmdev_ctx_t *ctx,
4963 lsm6dsm_single_double_tap_t *val)
4964 {
4965 lsm6dsm_wake_up_ths_t wake_up_ths;
4966 int32_t ret;
4967
4968 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_THS,
4969 (uint8_t *)&wake_up_ths, 1);
4970
4971 switch (wake_up_ths.single_double_tap)
4972 {
4973 case LSM6DSM_ONLY_SINGLE:
4974 *val = LSM6DSM_ONLY_SINGLE;
4975 break;
4976
4977 case LSM6DSM_BOTH_SINGLE_DOUBLE:
4978 *val = LSM6DSM_BOTH_SINGLE_DOUBLE;
4979 break;
4980
4981 default:
4982 *val = LSM6DSM_ONLY_SINGLE;
4983 break;
4984 }
4985
4986 return ret;
4987 }
4988
4989 /**
4990 * @}
4991 *
4992 */
4993
4994 /**
4995 * @defgroup LSM6DSM_ Six_position_detection(6D/4D)
4996 * @brief This section groups all the functions concerning six
4997 * position detection (6D).
4998 * @{
4999 *
5000 */
5001
5002 /**
5003 * @brief LPF2 feed 6D function selection.[set]
5004 *
5005 * @param ctx Read / write interface definitions
5006 * @param val Change the values of low_pass_on_6d in
5007 * reg CTRL8_XL
5008 * @retval Interface status (MANDATORY: return 0 -> no Error).
5009 *
5010 */
lsm6dsm_6d_feed_data_set(const stmdev_ctx_t * ctx,lsm6dsm_low_pass_on_6d_t val)5011 int32_t lsm6dsm_6d_feed_data_set(const stmdev_ctx_t *ctx,
5012 lsm6dsm_low_pass_on_6d_t val)
5013 {
5014 lsm6dsm_ctrl8_xl_t ctrl8_xl;
5015 int32_t ret;
5016
5017 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
5018
5019 if (ret == 0)
5020 {
5021 ctrl8_xl.low_pass_on_6d = (uint8_t) val;
5022 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
5023 }
5024
5025 return ret;
5026 }
5027
5028 /**
5029 * @brief LPF2 feed 6D function selection.[get]
5030 *
5031 * @param ctx Read / write interface definitions
5032 * @param val Get the values of low_pass_on_6d in reg CTRL8_XL
5033 * @retval Interface status (MANDATORY: return 0 -> no Error).
5034 *
5035 */
lsm6dsm_6d_feed_data_get(const stmdev_ctx_t * ctx,lsm6dsm_low_pass_on_6d_t * val)5036 int32_t lsm6dsm_6d_feed_data_get(const stmdev_ctx_t *ctx,
5037 lsm6dsm_low_pass_on_6d_t *val)
5038 {
5039 lsm6dsm_ctrl8_xl_t ctrl8_xl;
5040 int32_t ret;
5041
5042 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL8_XL, (uint8_t *)&ctrl8_xl, 1);
5043
5044 switch (ctrl8_xl.low_pass_on_6d)
5045 {
5046 case LSM6DSM_ODR_DIV_2_FEED:
5047 *val = LSM6DSM_ODR_DIV_2_FEED;
5048 break;
5049
5050 case LSM6DSM_LPF2_FEED:
5051 *val = LSM6DSM_LPF2_FEED;
5052 break;
5053
5054 default:
5055 *val = LSM6DSM_ODR_DIV_2_FEED;
5056 break;
5057 }
5058
5059 return ret;
5060 }
5061
5062 /**
5063 * @brief Threshold for 4D/6D function.[set]
5064 *
5065 * @param ctx Read / write interface definitions
5066 * @param val Change the values of sixd_ths in reg TAP_THS_6D
5067 * @retval Interface status (MANDATORY: return 0 -> no Error).
5068 *
5069 */
lsm6dsm_6d_threshold_set(const stmdev_ctx_t * ctx,lsm6dsm_sixd_ths_t val)5070 int32_t lsm6dsm_6d_threshold_set(const stmdev_ctx_t *ctx,
5071 lsm6dsm_sixd_ths_t val)
5072 {
5073 lsm6dsm_tap_ths_6d_t tap_ths_6d;
5074 int32_t ret;
5075
5076 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
5077 (uint8_t *)&tap_ths_6d, 1);
5078
5079 if (ret == 0)
5080 {
5081 tap_ths_6d.sixd_ths = (uint8_t) val;
5082 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_THS_6D,
5083 (uint8_t *)&tap_ths_6d, 1);
5084 }
5085
5086 return ret;
5087 }
5088
5089 /**
5090 * @brief Threshold for 4D/6D function.[get]
5091 *
5092 * @param ctx Read / write interface definitions
5093 * @param val Get the values of sixd_ths in reg TAP_THS_6D
5094 * @retval Interface status (MANDATORY: return 0 -> no Error).
5095 *
5096 */
lsm6dsm_6d_threshold_get(const stmdev_ctx_t * ctx,lsm6dsm_sixd_ths_t * val)5097 int32_t lsm6dsm_6d_threshold_get(const stmdev_ctx_t *ctx,
5098 lsm6dsm_sixd_ths_t *val)
5099 {
5100 lsm6dsm_tap_ths_6d_t tap_ths_6d;
5101 int32_t ret;
5102
5103 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
5104 (uint8_t *)&tap_ths_6d, 1);
5105
5106 switch (tap_ths_6d.sixd_ths)
5107 {
5108 case LSM6DSM_DEG_80:
5109 *val = LSM6DSM_DEG_80;
5110 break;
5111
5112 case LSM6DSM_DEG_70:
5113 *val = LSM6DSM_DEG_70;
5114 break;
5115
5116 case LSM6DSM_DEG_60:
5117 *val = LSM6DSM_DEG_60;
5118 break;
5119
5120 case LSM6DSM_DEG_50:
5121 *val = LSM6DSM_DEG_50;
5122 break;
5123
5124 default:
5125 *val = LSM6DSM_DEG_80;
5126 break;
5127 }
5128
5129 return ret;
5130 }
5131
5132 /**
5133 * @brief 4D orientation detection enable.[set]
5134 *
5135 * @param ctx Read / write interface definitions
5136 * @param val Change the values of d4d_en in reg TAP_THS_6D
5137 * @retval Interface status (MANDATORY: return 0 -> no Error).
5138 *
5139 */
lsm6dsm_4d_mode_set(const stmdev_ctx_t * ctx,uint8_t val)5140 int32_t lsm6dsm_4d_mode_set(const stmdev_ctx_t *ctx, uint8_t val)
5141 {
5142 lsm6dsm_tap_ths_6d_t tap_ths_6d;
5143 int32_t ret;
5144
5145 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
5146 (uint8_t *)&tap_ths_6d, 1);
5147
5148 if (ret == 0)
5149 {
5150 tap_ths_6d.d4d_en = val;
5151 ret = lsm6dsm_write_reg(ctx, LSM6DSM_TAP_THS_6D,
5152 (uint8_t *)&tap_ths_6d, 1);
5153 }
5154
5155 return ret;
5156 }
5157
5158 /**
5159 * @brief 4D orientation detection enable.[get]
5160 *
5161 * @param ctx Read / write interface definitions
5162 * @param val Change the values of d4d_en in reg TAP_THS_6D
5163 * @retval Interface status (MANDATORY: return 0 -> no Error).
5164 *
5165 */
lsm6dsm_4d_mode_get(const stmdev_ctx_t * ctx,uint8_t * val)5166 int32_t lsm6dsm_4d_mode_get(const stmdev_ctx_t *ctx, uint8_t *val)
5167 {
5168 lsm6dsm_tap_ths_6d_t tap_ths_6d;
5169 int32_t ret;
5170
5171 ret = lsm6dsm_read_reg(ctx, LSM6DSM_TAP_THS_6D,
5172 (uint8_t *)&tap_ths_6d, 1);
5173 *val = tap_ths_6d.d4d_en;
5174
5175 return ret;
5176 }
5177
5178 /**
5179 * @}
5180 *
5181 */
5182
5183 /**
5184 * @defgroup LSM6DSM_free_fall
5185 * @brief This section group all the functions concerning the free
5186 * fall detection.
5187 * @{
5188 *
5189 */
5190
5191 /**
5192 * @brief Free-fall duration event. 1LSb = 1 / ODR[set]
5193 *
5194 * @param ctx Read / write interface definitions
5195 * @param val Change the values of ff_dur in reg WAKE_UP_DUR
5196 * @retval Interface status (MANDATORY: return 0 -> no Error).
5197 *
5198 */
lsm6dsm_ff_dur_set(const stmdev_ctx_t * ctx,uint8_t val)5199 int32_t lsm6dsm_ff_dur_set(const stmdev_ctx_t *ctx, uint8_t val)
5200 {
5201 lsm6dsm_wake_up_dur_t wake_up_dur;
5202 lsm6dsm_free_fall_t free_fall;
5203 int32_t ret;
5204
5205 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5206
5207 if (ret == 0)
5208 {
5209 free_fall.ff_dur = (val & 0x1FU);
5210 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5211
5212 if (ret == 0)
5213 {
5214 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
5215 (uint8_t *)&wake_up_dur, 1);
5216
5217 if (ret == 0)
5218 {
5219 wake_up_dur.ff_dur = (val & 0x20U) >> 5;
5220 ret = lsm6dsm_write_reg(ctx, LSM6DSM_WAKE_UP_DUR,
5221 (uint8_t *)&wake_up_dur, 1);
5222 }
5223 }
5224 }
5225
5226 return ret;
5227 }
5228
5229 /**
5230 * @brief Free-fall duration event. 1LSb = 1 / ODR[get]
5231 *
5232 * @param ctx Read / write interface definitions
5233 * @param val Change the values of ff_dur in reg WAKE_UP_DUR
5234 * @retval Interface status (MANDATORY: return 0 -> no Error).
5235 *
5236 */
lsm6dsm_ff_dur_get(const stmdev_ctx_t * ctx,uint8_t * val)5237 int32_t lsm6dsm_ff_dur_get(const stmdev_ctx_t *ctx, uint8_t *val)
5238 {
5239 lsm6dsm_wake_up_dur_t wake_up_dur;
5240 lsm6dsm_free_fall_t free_fall;
5241 int32_t ret;
5242
5243 ret = lsm6dsm_read_reg(ctx, LSM6DSM_WAKE_UP_DUR,
5244 (uint8_t *)&wake_up_dur, 1);
5245
5246 if (ret == 0)
5247 {
5248 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5249 }
5250
5251 *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
5252
5253 return ret;
5254 }
5255
5256 /**
5257 * @brief Free fall threshold setting.[set]
5258 *
5259 * @param ctx Read / write interface definitions
5260 * @param val Change the values of ff_ths in reg FREE_FALL
5261 * @retval Interface status (MANDATORY: return 0 -> no Error).
5262 *
5263 */
lsm6dsm_ff_threshold_set(const stmdev_ctx_t * ctx,lsm6dsm_ff_ths_t val)5264 int32_t lsm6dsm_ff_threshold_set(const stmdev_ctx_t *ctx,
5265 lsm6dsm_ff_ths_t val)
5266 {
5267 lsm6dsm_free_fall_t free_fall;
5268 int32_t ret;
5269
5270 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5271
5272 if (ret == 0)
5273 {
5274 free_fall.ff_ths = (uint8_t) val;
5275 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5276 }
5277
5278 return ret;
5279 }
5280
5281 /**
5282 * @brief Free fall threshold setting.[get]
5283 *
5284 * @param ctx Read / write interface definitions
5285 * @param val Get the values of ff_ths in reg FREE_FALL
5286 * @retval Interface status (MANDATORY: return 0 -> no Error).
5287 *
5288 */
lsm6dsm_ff_threshold_get(const stmdev_ctx_t * ctx,lsm6dsm_ff_ths_t * val)5289 int32_t lsm6dsm_ff_threshold_get(const stmdev_ctx_t *ctx,
5290 lsm6dsm_ff_ths_t *val)
5291 {
5292 lsm6dsm_free_fall_t free_fall;
5293 int32_t ret;
5294
5295 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FREE_FALL, (uint8_t *)&free_fall, 1);
5296
5297 switch (free_fall.ff_ths)
5298 {
5299 case LSM6DSM_FF_TSH_156mg:
5300 *val = LSM6DSM_FF_TSH_156mg;
5301 break;
5302
5303 case LSM6DSM_FF_TSH_219mg:
5304 *val = LSM6DSM_FF_TSH_219mg;
5305 break;
5306
5307 case LSM6DSM_FF_TSH_250mg:
5308 *val = LSM6DSM_FF_TSH_250mg;
5309 break;
5310
5311 case LSM6DSM_FF_TSH_312mg:
5312 *val = LSM6DSM_FF_TSH_312mg;
5313 break;
5314
5315 case LSM6DSM_FF_TSH_344mg:
5316 *val = LSM6DSM_FF_TSH_344mg;
5317 break;
5318
5319 case LSM6DSM_FF_TSH_406mg:
5320 *val = LSM6DSM_FF_TSH_406mg;
5321 break;
5322
5323 case LSM6DSM_FF_TSH_469mg:
5324 *val = LSM6DSM_FF_TSH_469mg;
5325 break;
5326
5327 case LSM6DSM_FF_TSH_500mg:
5328 *val = LSM6DSM_FF_TSH_500mg;
5329 break;
5330
5331 default:
5332 *val = LSM6DSM_FF_TSH_156mg;
5333 break;
5334 }
5335
5336 return ret;
5337 }
5338
5339 /**
5340 * @}
5341 *
5342 */
5343
5344 /**
5345 * @defgroup LSM6DSM_fifo
5346 * @brief This section group all the functions concerning the
5347 * fifo usage
5348 * @{
5349 *
5350 */
5351
5352 /**
5353 * @brief FIFO watermark level selection.[set]
5354 *
5355 * @param ctx Read / write interface definitions
5356 * @param val Change the values of fth in reg FIFO_CTRL1
5357 * @retval Interface status (MANDATORY: return 0 -> no Error).
5358 *
5359 */
lsm6dsm_fifo_watermark_set(const stmdev_ctx_t * ctx,uint16_t val)5360 int32_t lsm6dsm_fifo_watermark_set(const stmdev_ctx_t *ctx, uint16_t val)
5361 {
5362 lsm6dsm_fifo_ctrl1_t fifo_ctrl1;
5363 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5364 int32_t ret;
5365
5366 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5367 (uint8_t *)&fifo_ctrl2, 1);
5368
5369 if (ret == 0)
5370 {
5371 fifo_ctrl1.fth = (uint8_t)(0x00FFU & val);
5372 fifo_ctrl2.fth = (uint8_t)((0x0700U & val) >> 8);
5373 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL1,
5374 (uint8_t *)&fifo_ctrl1, 1);
5375
5376 if (ret == 0)
5377 {
5378 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL2,
5379 (uint8_t *)&fifo_ctrl2, 1);
5380 }
5381 }
5382
5383 return ret;
5384 }
5385
5386 /**
5387 * @brief FIFO watermark level selection.[get]
5388 *
5389 * @param ctx Read / write interface definitions
5390 * @param val Change the values of fth in reg FIFO_CTRL1
5391 * @retval Interface status (MANDATORY: return 0 -> no Error).
5392 *
5393 */
lsm6dsm_fifo_watermark_get(const stmdev_ctx_t * ctx,uint16_t * val)5394 int32_t lsm6dsm_fifo_watermark_get(const stmdev_ctx_t *ctx, uint16_t *val)
5395 {
5396 lsm6dsm_fifo_ctrl1_t fifo_ctrl1;
5397 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5398 int32_t ret;
5399
5400 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL1,
5401 (uint8_t *)&fifo_ctrl1, 1);
5402
5403 if (ret == 0)
5404 {
5405 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5406 (uint8_t *)&fifo_ctrl2, 1);
5407 }
5408
5409 *val = ((uint16_t)fifo_ctrl2.fth << 8) + (uint16_t)fifo_ctrl1.fth;
5410
5411 return ret;
5412 }
5413
5414 /**
5415 * @brief FIFO data level.[get]
5416 *
5417 * @param ctx Read / write interface definitions
5418 * @param val get the values of diff_fifo in reg FIFO_STATUS1 and
5419 * FIFO_STATUS2(diff_fifo), it is recommended to set the
5420 * BDU bit.
5421 * @retval Interface status (MANDATORY: return 0 -> no Error).
5422 *
5423 */
lsm6dsm_fifo_data_level_get(const stmdev_ctx_t * ctx,uint16_t * val)5424 int32_t lsm6dsm_fifo_data_level_get(const stmdev_ctx_t *ctx, uint16_t *val)
5425 {
5426 lsm6dsm_fifo_status1_t fifo_status1;
5427 lsm6dsm_fifo_status2_t fifo_status2;
5428 int32_t ret;
5429
5430 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS1,
5431 (uint8_t *)&fifo_status1, 1);
5432
5433 if (ret == 0)
5434 {
5435 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS2,
5436 (uint8_t *)&fifo_status2, 1);
5437 *val = ((uint16_t) fifo_status2.diff_fifo << 8) +
5438 (uint16_t) fifo_status1.diff_fifo;
5439 }
5440
5441 return ret;
5442 }
5443
5444 /**
5445 * @brief FIFO watermark.[get]
5446 *
5447 * @param ctx Read / write interface definitions
5448 * @param val get the values of watermark in reg FIFO_STATUS2 and
5449 * @retval Interface status (MANDATORY: return 0 -> no Error).
5450 *
5451 */
lsm6dsm_fifo_wtm_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)5452 int32_t lsm6dsm_fifo_wtm_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
5453 {
5454 lsm6dsm_fifo_status2_t fifo_status2;
5455 int32_t ret;
5456
5457 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS2,
5458 (uint8_t *)&fifo_status2, 1);
5459 *val = fifo_status2.waterm;
5460
5461 return ret;
5462 }
5463
5464 /**
5465 * @brief FIFO over run.[get]
5466 *
5467 * @param ctx Read / write interface definitions
5468 * @param val get the value of over run in reg FIFO_STATUS2
5469 * @retval Interface status (MANDATORY: return 0 -> no Error).
5470 *
5471 */
lsm6dsm_fifo_over_run_get(const stmdev_ctx_t * ctx,uint8_t * val)5472 int32_t lsm6dsm_fifo_over_run_get(const stmdev_ctx_t *ctx, uint8_t *val)
5473 {
5474 lsm6dsm_fifo_status2_t fifo_status2;
5475 int32_t ret;
5476
5477 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS2,
5478 (uint8_t *)&fifo_status2, 1);
5479 *val = fifo_status2.over_run;
5480
5481 return ret;
5482 }
5483
5484 /**
5485 * @brief FIFO pattern.[get]
5486 *
5487 * @param ctx Read / write interface definitions
5488 * @param val get the values of fifo_pattern in reg FIFO_STATUS3 and
5489 * FIFO_STATUS4, it is recommended to set the BDU bit
5490 * @retval Interface status (MANDATORY: return 0 -> no Error).
5491 *
5492 */
lsm6dsm_fifo_pattern_get(const stmdev_ctx_t * ctx,uint16_t * val)5493 int32_t lsm6dsm_fifo_pattern_get(const stmdev_ctx_t *ctx, uint16_t *val)
5494 {
5495 lsm6dsm_fifo_status3_t fifo_status3;
5496 lsm6dsm_fifo_status4_t fifo_status4;
5497 int32_t ret;
5498
5499 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS3,
5500 (uint8_t *)&fifo_status3, 1);
5501
5502 if (ret == 0)
5503 {
5504 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_STATUS4,
5505 (uint8_t *)&fifo_status4, 1);
5506 *val = ((uint16_t)fifo_status4.fifo_pattern << 8) +
5507 fifo_status3.fifo_pattern;
5508 }
5509
5510 return ret;
5511 }
5512
5513 /**
5514 * @brief Batching of temperature data[set]
5515 *
5516 * @param ctx Read / write interface definitions
5517 * @param val Change the values of fifo_temp_en in reg FIFO_CTRL2
5518 * @retval Interface status (MANDATORY: return 0 -> no Error).
5519 *
5520 */
lsm6dsm_fifo_temp_batch_set(const stmdev_ctx_t * ctx,uint8_t val)5521 int32_t lsm6dsm_fifo_temp_batch_set(const stmdev_ctx_t *ctx, uint8_t val)
5522 {
5523 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5524 int32_t ret;
5525
5526 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5527 (uint8_t *)&fifo_ctrl2, 1);
5528
5529 if (ret == 0)
5530 {
5531 fifo_ctrl2.fifo_temp_en = val;
5532 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL2,
5533 (uint8_t *)&fifo_ctrl2, 1);
5534 }
5535
5536 return ret;
5537 }
5538
5539 /**
5540 * @brief Batching of temperature data[get]
5541 *
5542 * @param ctx Read / write interface definitions
5543 * @param val Change the values of fifo_temp_en in reg FIFO_CTRL2
5544 * @retval Interface status (MANDATORY: return 0 -> no Error).
5545 *
5546 */
lsm6dsm_fifo_temp_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)5547 int32_t lsm6dsm_fifo_temp_batch_get(const stmdev_ctx_t *ctx, uint8_t *val)
5548 {
5549 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5550 int32_t ret;
5551
5552 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5553 (uint8_t *)&fifo_ctrl2, 1);
5554 *val = fifo_ctrl2.fifo_temp_en;
5555
5556 return ret;
5557 }
5558
5559 /**
5560 * @brief Trigger signal for FIFO write operation.[set]
5561 *
5562 * @param ctx Read / write interface definitions
5563 * @param val act on FIFO_CTRL2(timer_pedo_fifo_drdy)
5564 * and MASTER_CONFIG(data_valid_sel_fifo)
5565 * @retval Interface status (MANDATORY: return 0 -> no Error).
5566 *
5567 */
lsm6dsm_fifo_write_trigger_set(const stmdev_ctx_t * ctx,lsm6dsm_trigger_fifo_t val)5568 int32_t lsm6dsm_fifo_write_trigger_set(const stmdev_ctx_t *ctx,
5569 lsm6dsm_trigger_fifo_t val)
5570 {
5571 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5572 lsm6dsm_master_config_t master_config;
5573 int32_t ret;
5574
5575 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5576 (uint8_t *)&fifo_ctrl2, 1);
5577
5578 if (ret == 0)
5579 {
5580 fifo_ctrl2.timer_pedo_fifo_drdy = (uint8_t)val & 0x01U;
5581 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL2,
5582 (uint8_t *)&fifo_ctrl2, 1);
5583
5584 if (ret == 0)
5585 {
5586 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
5587 (uint8_t *)&master_config, 1);
5588
5589 if (ret == 0)
5590 {
5591 master_config.data_valid_sel_fifo = (((uint8_t)val & 0x02U) >> 1);
5592 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
5593 (uint8_t *)&master_config, 1);
5594 }
5595 }
5596 }
5597
5598 return ret;
5599 }
5600
5601 /**
5602 * @brief Trigger signal for FIFO write operation.[get]
5603 *
5604 * @param ctx Read / write interface definitions
5605 * @param val act on FIFO_CTRL2(timer_pedo_fifo_drdy)
5606 * and MASTER_CONFIG(data_valid_sel_fifo)
5607 * @retval Interface status (MANDATORY: return 0 -> no Error).
5608 *
5609 */
lsm6dsm_fifo_write_trigger_get(const stmdev_ctx_t * ctx,lsm6dsm_trigger_fifo_t * val)5610 int32_t lsm6dsm_fifo_write_trigger_get(const stmdev_ctx_t *ctx,
5611 lsm6dsm_trigger_fifo_t *val)
5612 {
5613 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5614 lsm6dsm_master_config_t master_config;
5615 int32_t ret;
5616
5617 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5618 (uint8_t *)&fifo_ctrl2, 1);
5619
5620 if (ret == 0)
5621 {
5622 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
5623 (uint8_t *)&master_config, 1);
5624
5625 switch ((master_config.data_valid_sel_fifo << 1) +
5626 fifo_ctrl2.timer_pedo_fifo_drdy)
5627 {
5628 case LSM6DSM_TRG_XL_GY_DRDY:
5629 *val = LSM6DSM_TRG_XL_GY_DRDY;
5630 break;
5631
5632 case LSM6DSM_TRG_STEP_DETECT:
5633 *val = LSM6DSM_TRG_STEP_DETECT;
5634 break;
5635
5636 case LSM6DSM_TRG_SH_DRDY:
5637 *val = LSM6DSM_TRG_SH_DRDY;
5638 break;
5639
5640 default:
5641 *val = LSM6DSM_TRG_XL_GY_DRDY;
5642 break;
5643 }
5644 }
5645
5646 return ret;
5647 }
5648
5649 /**
5650 * @brief Enable pedometer step counter and timestamp as 4th
5651 * FIFO data set.[set]
5652 *
5653 * @param ctx Read / write interface definitions
5654 * @param val Change the values of timer_pedo_fifo_en in reg FIFO_CTRL2
5655 * @retval Interface status (MANDATORY: return 0 -> no Error).
5656 *
5657 */
lsm6dsm_fifo_pedo_and_timestamp_batch_set(const stmdev_ctx_t * ctx,uint8_t val)5658 int32_t lsm6dsm_fifo_pedo_and_timestamp_batch_set(const stmdev_ctx_t *ctx,
5659 uint8_t val)
5660 {
5661 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5662 int32_t ret;
5663
5664 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5665 (uint8_t *)&fifo_ctrl2, 1);
5666
5667 if (ret == 0)
5668 {
5669 fifo_ctrl2.timer_pedo_fifo_en = val;
5670 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL2,
5671 (uint8_t *)&fifo_ctrl2, 1);
5672 }
5673
5674 return ret;
5675 }
5676
5677 /**
5678 * @brief Enable pedometer step counter and timestamp as 4th
5679 * FIFO data set.[get]
5680 *
5681 * @param ctx Read / write interface definitions
5682 * @param val Change the values of timer_pedo_fifo_en in reg FIFO_CTRL2
5683 * @retval Interface status (MANDATORY: return 0 -> no Error).
5684 *
5685 */
lsm6dsm_fifo_pedo_and_timestamp_batch_get(const stmdev_ctx_t * ctx,uint8_t * val)5686 int32_t lsm6dsm_fifo_pedo_and_timestamp_batch_get(const stmdev_ctx_t *ctx,
5687 uint8_t *val)
5688 {
5689 lsm6dsm_fifo_ctrl2_t fifo_ctrl2;
5690 int32_t ret;
5691
5692 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL2,
5693 (uint8_t *)&fifo_ctrl2, 1);
5694 *val = fifo_ctrl2.timer_pedo_fifo_en;
5695
5696 return ret;
5697 }
5698
5699 /**
5700 * @brief Selects Batching Data Rate (writing frequency in FIFO) for
5701 * accelerometer data.[set]
5702 *
5703 * @param ctx Read / write interface definitions
5704 * @param val Change the values of dec_fifo_xl in reg FIFO_CTRL3
5705 * @retval Interface status (MANDATORY: return 0 -> no Error).
5706 *
5707 */
lsm6dsm_fifo_xl_batch_set(const stmdev_ctx_t * ctx,lsm6dsm_dec_fifo_xl_t val)5708 int32_t lsm6dsm_fifo_xl_batch_set(const stmdev_ctx_t *ctx,
5709 lsm6dsm_dec_fifo_xl_t val)
5710 {
5711 lsm6dsm_fifo_ctrl3_t fifo_ctrl3;
5712 int32_t ret;
5713
5714 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL3,
5715 (uint8_t *)&fifo_ctrl3, 1);
5716
5717 if (ret == 0)
5718 {
5719 fifo_ctrl3.dec_fifo_xl = (uint8_t)val;
5720 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL3,
5721 (uint8_t *)&fifo_ctrl3, 1);
5722 }
5723
5724 return ret;
5725 }
5726
5727 /**
5728 * @brief Selects Batching Data Rate (writing frequency in FIFO) for
5729 * accelerometer data.[get]
5730 *
5731 * @param ctx Read / write interface definitions
5732 * @param val Get the values of dec_fifo_xl in reg FIFO_CTRL3
5733 * @retval Interface status (MANDATORY: return 0 -> no Error).
5734 *
5735 */
lsm6dsm_fifo_xl_batch_get(const stmdev_ctx_t * ctx,lsm6dsm_dec_fifo_xl_t * val)5736 int32_t lsm6dsm_fifo_xl_batch_get(const stmdev_ctx_t *ctx,
5737 lsm6dsm_dec_fifo_xl_t *val)
5738 {
5739 lsm6dsm_fifo_ctrl3_t fifo_ctrl3;
5740 int32_t ret;
5741
5742 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL3,
5743 (uint8_t *)&fifo_ctrl3, 1);
5744
5745 switch (fifo_ctrl3.dec_fifo_xl)
5746 {
5747 case LSM6DSM_FIFO_XL_DISABLE:
5748 *val = LSM6DSM_FIFO_XL_DISABLE;
5749 break;
5750
5751 case LSM6DSM_FIFO_XL_NO_DEC:
5752 *val = LSM6DSM_FIFO_XL_NO_DEC;
5753 break;
5754
5755 case LSM6DSM_FIFO_XL_DEC_2:
5756 *val = LSM6DSM_FIFO_XL_DEC_2;
5757 break;
5758
5759 case LSM6DSM_FIFO_XL_DEC_3:
5760 *val = LSM6DSM_FIFO_XL_DEC_3;
5761 break;
5762
5763 case LSM6DSM_FIFO_XL_DEC_4:
5764 *val = LSM6DSM_FIFO_XL_DEC_4;
5765 break;
5766
5767 case LSM6DSM_FIFO_XL_DEC_8:
5768 *val = LSM6DSM_FIFO_XL_DEC_8;
5769 break;
5770
5771 case LSM6DSM_FIFO_XL_DEC_16:
5772 *val = LSM6DSM_FIFO_XL_DEC_16;
5773 break;
5774
5775 case LSM6DSM_FIFO_XL_DEC_32:
5776 *val = LSM6DSM_FIFO_XL_DEC_32;
5777 break;
5778
5779 default:
5780 *val = LSM6DSM_FIFO_XL_DISABLE;
5781 break;
5782 }
5783
5784 return ret;
5785 }
5786
5787 /**
5788 * @brief Selects Batching Data Rate (writing frequency in FIFO)
5789 * for gyroscope data.[set]
5790 *
5791 * @param ctx Read / write interface definitions
5792 * @param val Change the values of dec_fifo_gyro in reg FIFO_CTRL3
5793 * @retval Interface status (MANDATORY: return 0 -> no Error).
5794 *
5795 */
lsm6dsm_fifo_gy_batch_set(const stmdev_ctx_t * ctx,lsm6dsm_dec_fifo_gyro_t val)5796 int32_t lsm6dsm_fifo_gy_batch_set(const stmdev_ctx_t *ctx,
5797 lsm6dsm_dec_fifo_gyro_t val)
5798 {
5799 lsm6dsm_fifo_ctrl3_t fifo_ctrl3;
5800 int32_t ret;
5801
5802 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL3,
5803 (uint8_t *)&fifo_ctrl3, 1);
5804
5805 if (ret == 0)
5806 {
5807 fifo_ctrl3.dec_fifo_gyro = (uint8_t)val;
5808 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL3,
5809 (uint8_t *)&fifo_ctrl3, 1);
5810 }
5811
5812 return ret;
5813 }
5814
5815 /**
5816 * @brief Selects Batching Data Rate (writing frequency in FIFO)
5817 * for gyroscope data.[get]
5818 *
5819 * @param ctx Read / write interface definitions
5820 * @param val Get the values of dec_fifo_gyro in reg FIFO_CTRL3
5821 * @retval Interface status (MANDATORY: return 0 -> no Error).
5822 *
5823 */
lsm6dsm_fifo_gy_batch_get(const stmdev_ctx_t * ctx,lsm6dsm_dec_fifo_gyro_t * val)5824 int32_t lsm6dsm_fifo_gy_batch_get(const stmdev_ctx_t *ctx,
5825 lsm6dsm_dec_fifo_gyro_t *val)
5826 {
5827 lsm6dsm_fifo_ctrl3_t fifo_ctrl3;
5828 int32_t ret;
5829
5830 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL3,
5831 (uint8_t *)&fifo_ctrl3, 1);
5832
5833 switch (fifo_ctrl3.dec_fifo_gyro)
5834 {
5835 case LSM6DSM_FIFO_GY_DISABLE:
5836 *val = LSM6DSM_FIFO_GY_DISABLE;
5837 break;
5838
5839 case LSM6DSM_FIFO_GY_NO_DEC:
5840 *val = LSM6DSM_FIFO_GY_NO_DEC;
5841 break;
5842
5843 case LSM6DSM_FIFO_GY_DEC_2:
5844 *val = LSM6DSM_FIFO_GY_DEC_2;
5845 break;
5846
5847 case LSM6DSM_FIFO_GY_DEC_3:
5848 *val = LSM6DSM_FIFO_GY_DEC_3;
5849 break;
5850
5851 case LSM6DSM_FIFO_GY_DEC_4:
5852 *val = LSM6DSM_FIFO_GY_DEC_4;
5853 break;
5854
5855 case LSM6DSM_FIFO_GY_DEC_8:
5856 *val = LSM6DSM_FIFO_GY_DEC_8;
5857 break;
5858
5859 case LSM6DSM_FIFO_GY_DEC_16:
5860 *val = LSM6DSM_FIFO_GY_DEC_16;
5861 break;
5862
5863 case LSM6DSM_FIFO_GY_DEC_32:
5864 *val = LSM6DSM_FIFO_GY_DEC_32;
5865 break;
5866
5867 default:
5868 *val = LSM6DSM_FIFO_GY_DISABLE;
5869 break;
5870 }
5871
5872 return ret;
5873 }
5874
5875 /**
5876 * @brief Selects Batching Data Rate (writing frequency in FIFO)
5877 * for third data set.[set]
5878 *
5879 * @param ctx Read / write interface definitions
5880 * @param val Change the values of dec_ds3_fifo in reg FIFO_CTRL4
5881 * @retval Interface status (MANDATORY: return 0 -> no Error).
5882 *
5883 */
lsm6dsm_fifo_dataset_3_batch_set(const stmdev_ctx_t * ctx,lsm6dsm_dec_ds3_fifo_t val)5884 int32_t lsm6dsm_fifo_dataset_3_batch_set(const stmdev_ctx_t *ctx,
5885 lsm6dsm_dec_ds3_fifo_t val)
5886 {
5887 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
5888 int32_t ret;
5889
5890 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
5891 (uint8_t *)&fifo_ctrl4, 1);
5892
5893 if (ret == 0)
5894 {
5895 fifo_ctrl4.dec_ds3_fifo = (uint8_t)val;
5896 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL4,
5897 (uint8_t *)&fifo_ctrl4, 1);
5898 }
5899
5900 return ret;
5901 }
5902
5903 /**
5904 * @brief Selects Batching Data Rate (writing frequency in FIFO)
5905 * for third data set.[get]
5906 *
5907 * @param ctx Read / write interface definitions
5908 * @param val Get the values of dec_ds3_fifo in reg FIFO_CTRL4
5909 * @retval Interface status (MANDATORY: return 0 -> no Error).
5910 *
5911 */
lsm6dsm_fifo_dataset_3_batch_get(const stmdev_ctx_t * ctx,lsm6dsm_dec_ds3_fifo_t * val)5912 int32_t lsm6dsm_fifo_dataset_3_batch_get(const stmdev_ctx_t *ctx,
5913 lsm6dsm_dec_ds3_fifo_t *val)
5914 {
5915 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
5916 int32_t ret;
5917
5918 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
5919 (uint8_t *)&fifo_ctrl4, 1);
5920
5921 switch (fifo_ctrl4.dec_ds3_fifo)
5922 {
5923 case LSM6DSM_FIFO_DS3_DISABLE:
5924 *val = LSM6DSM_FIFO_DS3_DISABLE;
5925 break;
5926
5927 case LSM6DSM_FIFO_DS3_NO_DEC:
5928 *val = LSM6DSM_FIFO_DS3_NO_DEC;
5929 break;
5930
5931 case LSM6DSM_FIFO_DS3_DEC_2:
5932 *val = LSM6DSM_FIFO_DS3_DEC_2;
5933 break;
5934
5935 case LSM6DSM_FIFO_DS3_DEC_3:
5936 *val = LSM6DSM_FIFO_DS3_DEC_3;
5937 break;
5938
5939 case LSM6DSM_FIFO_DS3_DEC_4:
5940 *val = LSM6DSM_FIFO_DS3_DEC_4;
5941 break;
5942
5943 case LSM6DSM_FIFO_DS3_DEC_8:
5944 *val = LSM6DSM_FIFO_DS3_DEC_8;
5945 break;
5946
5947 case LSM6DSM_FIFO_DS3_DEC_16:
5948 *val = LSM6DSM_FIFO_DS3_DEC_16;
5949 break;
5950
5951 case LSM6DSM_FIFO_DS3_DEC_32:
5952 *val = LSM6DSM_FIFO_DS3_DEC_32;
5953 break;
5954
5955 default:
5956 *val = LSM6DSM_FIFO_DS3_DISABLE;
5957 break;
5958 }
5959
5960 return ret;
5961 }
5962
5963 /**
5964 * @brief Selects Batching Data Rate (writing frequency in FIFO)
5965 * for fourth data set.[set]
5966 *
5967 * @param ctx Read / write interface definitions
5968 * @param val Change the values of dec_ds4_fifo in reg FIFO_CTRL4
5969 * @retval Interface status (MANDATORY: return 0 -> no Error).
5970 *
5971 */
lsm6dsm_fifo_dataset_4_batch_set(const stmdev_ctx_t * ctx,lsm6dsm_dec_ds4_fifo_t val)5972 int32_t lsm6dsm_fifo_dataset_4_batch_set(const stmdev_ctx_t *ctx,
5973 lsm6dsm_dec_ds4_fifo_t val)
5974 {
5975 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
5976 int32_t ret;
5977
5978 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
5979 (uint8_t *)&fifo_ctrl4, 1);
5980
5981 if (ret == 0)
5982 {
5983 fifo_ctrl4.dec_ds4_fifo = (uint8_t)val;
5984 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL4,
5985 (uint8_t *)&fifo_ctrl4, 1);
5986 }
5987
5988 return ret;
5989 }
5990
5991 /**
5992 * @brief Selects Batching Data Rate (writing frequency in FIFO) for
5993 * fourth data set.[get]
5994 *
5995 * @param ctx Read / write interface definitions
5996 * @param val Get the values of dec_ds4_fifo in reg FIFO_CTRL4
5997 * @retval Interface status (MANDATORY: return 0 -> no Error).
5998 *
5999 */
lsm6dsm_fifo_dataset_4_batch_get(const stmdev_ctx_t * ctx,lsm6dsm_dec_ds4_fifo_t * val)6000 int32_t lsm6dsm_fifo_dataset_4_batch_get(const stmdev_ctx_t *ctx,
6001 lsm6dsm_dec_ds4_fifo_t *val)
6002 {
6003 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
6004 int32_t ret;
6005
6006 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
6007 (uint8_t *)&fifo_ctrl4, 1);
6008
6009 switch (fifo_ctrl4.dec_ds4_fifo)
6010 {
6011 case LSM6DSM_FIFO_DS4_DISABLE:
6012 *val = LSM6DSM_FIFO_DS4_DISABLE;
6013 break;
6014
6015 case LSM6DSM_FIFO_DS4_NO_DEC:
6016 *val = LSM6DSM_FIFO_DS4_NO_DEC;
6017 break;
6018
6019 case LSM6DSM_FIFO_DS4_DEC_2:
6020 *val = LSM6DSM_FIFO_DS4_DEC_2;
6021 break;
6022
6023 case LSM6DSM_FIFO_DS4_DEC_3:
6024 *val = LSM6DSM_FIFO_DS4_DEC_3;
6025 break;
6026
6027 case LSM6DSM_FIFO_DS4_DEC_4:
6028 *val = LSM6DSM_FIFO_DS4_DEC_4;
6029 break;
6030
6031 case LSM6DSM_FIFO_DS4_DEC_8:
6032 *val = LSM6DSM_FIFO_DS4_DEC_8;
6033 break;
6034
6035 case LSM6DSM_FIFO_DS4_DEC_16:
6036 *val = LSM6DSM_FIFO_DS4_DEC_16;
6037 break;
6038
6039 case LSM6DSM_FIFO_DS4_DEC_32:
6040 *val = LSM6DSM_FIFO_DS4_DEC_32;
6041 break;
6042
6043 default:
6044 *val = LSM6DSM_FIFO_DS4_DISABLE;
6045 break;
6046 }
6047
6048 return ret;
6049 }
6050
6051 /**
6052 * @brief 8-bit data storage in FIFO.[set]
6053 *
6054 * @param ctx Read / write interface definitions
6055 * @param val Change the values of only_high_data in reg FIFO_CTRL4
6056 * @retval Interface status (MANDATORY: return 0 -> no Error).
6057 *
6058 */
lsm6dsm_fifo_xl_gy_8bit_format_set(const stmdev_ctx_t * ctx,uint8_t val)6059 int32_t lsm6dsm_fifo_xl_gy_8bit_format_set(const stmdev_ctx_t *ctx,
6060 uint8_t val)
6061 {
6062 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
6063 int32_t ret;
6064
6065 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
6066 (uint8_t *)&fifo_ctrl4, 1);
6067
6068 if (ret == 0)
6069 {
6070 fifo_ctrl4.only_high_data = val;
6071 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL4,
6072 (uint8_t *)&fifo_ctrl4, 1);
6073 }
6074
6075 return ret;
6076 }
6077
6078 /**
6079 * @brief 8-bit data storage in FIFO.[get]
6080 *
6081 * @param ctx Read / write interface definitions
6082 * @param val Change the values of only_high_data in reg FIFO_CTRL4
6083 * @retval Interface status (MANDATORY: return 0 -> no Error).
6084 *
6085 */
lsm6dsm_fifo_xl_gy_8bit_format_get(const stmdev_ctx_t * ctx,uint8_t * val)6086 int32_t lsm6dsm_fifo_xl_gy_8bit_format_get(const stmdev_ctx_t *ctx,
6087 uint8_t *val)
6088 {
6089 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
6090 int32_t ret;
6091
6092 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
6093 (uint8_t *)&fifo_ctrl4, 1);
6094 *val = fifo_ctrl4.only_high_data;
6095
6096 return ret;
6097 }
6098
6099 /**
6100 * @brief Sensing chain FIFO stop values memorization at threshold
6101 * level.[set]
6102 *
6103 * @param ctx Read / write interface definitions
6104 * @param val Change the values of stop_on_fth in reg FIFO_CTRL4
6105 * @retval Interface status (MANDATORY: return 0 -> no Error).
6106 *
6107 */
lsm6dsm_fifo_stop_on_wtm_set(const stmdev_ctx_t * ctx,uint8_t val)6108 int32_t lsm6dsm_fifo_stop_on_wtm_set(const stmdev_ctx_t *ctx, uint8_t val)
6109 {
6110 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
6111 int32_t ret;
6112
6113 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
6114 (uint8_t *)&fifo_ctrl4, 1);
6115
6116 if (ret == 0)
6117 {
6118 fifo_ctrl4.stop_on_fth = val;
6119 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL4,
6120 (uint8_t *)&fifo_ctrl4, 1);
6121 }
6122
6123 return ret;
6124 }
6125
6126 /**
6127 * @brief Sensing chain FIFO stop values memorization at threshold
6128 * level.[get]
6129 *
6130 * @param ctx Read / write interface definitions
6131 * @param val Change the values of stop_on_fth in reg FIFO_CTRL4
6132 * @retval Interface status (MANDATORY: return 0 -> no Error).
6133 *
6134 */
lsm6dsm_fifo_stop_on_wtm_get(const stmdev_ctx_t * ctx,uint8_t * val)6135 int32_t lsm6dsm_fifo_stop_on_wtm_get(const stmdev_ctx_t *ctx, uint8_t *val)
6136 {
6137 lsm6dsm_fifo_ctrl4_t fifo_ctrl4;
6138 int32_t ret;
6139
6140 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL4,
6141 (uint8_t *)&fifo_ctrl4, 1);
6142 *val = fifo_ctrl4.stop_on_fth;
6143
6144 return ret;
6145 }
6146
6147 /**
6148 * @brief FIFO mode selection.[set]
6149 *
6150 * @param ctx Read / write interface definitions
6151 * @param val Change the values of fifo_mode in reg FIFO_CTRL5
6152 * @retval Interface status (MANDATORY: return 0 -> no Error).
6153 *
6154 */
lsm6dsm_fifo_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_fifo_mode_t val)6155 int32_t lsm6dsm_fifo_mode_set(const stmdev_ctx_t *ctx,
6156 lsm6dsm_fifo_mode_t val)
6157 {
6158 lsm6dsm_fifo_ctrl5_t fifo_ctrl5;
6159 int32_t ret;
6160
6161 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL5,
6162 (uint8_t *)&fifo_ctrl5, 1);
6163
6164 if (ret == 0)
6165 {
6166 fifo_ctrl5.fifo_mode = (uint8_t)val;
6167 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL5,
6168 (uint8_t *)&fifo_ctrl5, 1);
6169 }
6170
6171 return ret;
6172 }
6173
6174 /**
6175 * @brief FIFO mode selection.[get]
6176 *
6177 * @param ctx Read / write interface definitions
6178 * @param val Get the values of fifo_mode in reg FIFO_CTRL5
6179 * @retval Interface status (MANDATORY: return 0 -> no Error).
6180 *
6181 */
lsm6dsm_fifo_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_fifo_mode_t * val)6182 int32_t lsm6dsm_fifo_mode_get(const stmdev_ctx_t *ctx,
6183 lsm6dsm_fifo_mode_t *val)
6184 {
6185 lsm6dsm_fifo_ctrl5_t fifo_ctrl5;
6186 int32_t ret;
6187
6188 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL5,
6189 (uint8_t *)&fifo_ctrl5, 1);
6190
6191 switch (fifo_ctrl5.fifo_mode)
6192 {
6193 case LSM6DSM_BYPASS_MODE:
6194 *val = LSM6DSM_BYPASS_MODE;
6195 break;
6196
6197 case LSM6DSM_FIFO_MODE:
6198 *val = LSM6DSM_FIFO_MODE;
6199 break;
6200
6201 case LSM6DSM_STREAM_TO_FIFO_MODE:
6202 *val = LSM6DSM_STREAM_TO_FIFO_MODE;
6203 break;
6204
6205 case LSM6DSM_BYPASS_TO_STREAM_MODE:
6206 *val = LSM6DSM_BYPASS_TO_STREAM_MODE;
6207 break;
6208
6209 case LSM6DSM_STREAM_MODE:
6210 *val = LSM6DSM_STREAM_MODE;
6211 break;
6212
6213 default:
6214 *val = LSM6DSM_BYPASS_MODE;
6215 break;
6216 }
6217
6218 return ret;
6219 }
6220
6221 /**
6222 * @brief FIFO ODR selection, setting FIFO_MODE also.[set]
6223 *
6224 * @param ctx Read / write interface definitions
6225 * @param val Change the values of odr_fifo in reg FIFO_CTRL5
6226 * @retval Interface status (MANDATORY: return 0 -> no Error).
6227 *
6228 */
lsm6dsm_fifo_data_rate_set(const stmdev_ctx_t * ctx,lsm6dsm_odr_fifo_t val)6229 int32_t lsm6dsm_fifo_data_rate_set(const stmdev_ctx_t *ctx,
6230 lsm6dsm_odr_fifo_t val)
6231 {
6232 lsm6dsm_fifo_ctrl5_t fifo_ctrl5;
6233 int32_t ret;
6234
6235 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL5,
6236 (uint8_t *)&fifo_ctrl5, 1);
6237
6238 if (ret == 0)
6239 {
6240 fifo_ctrl5.odr_fifo = (uint8_t)val;
6241 ret = lsm6dsm_write_reg(ctx, LSM6DSM_FIFO_CTRL5,
6242 (uint8_t *)&fifo_ctrl5, 1);
6243 }
6244
6245 return ret;
6246 }
6247
6248 /**
6249 * @brief FIFO ODR selection, setting FIFO_MODE also.[get]
6250 *
6251 * @param ctx Read / write interface definitions
6252 * @param val Get the values of odr_fifo in reg FIFO_CTRL5
6253 * @retval Interface status (MANDATORY: return 0 -> no Error).
6254 *
6255 */
lsm6dsm_fifo_data_rate_get(const stmdev_ctx_t * ctx,lsm6dsm_odr_fifo_t * val)6256 int32_t lsm6dsm_fifo_data_rate_get(const stmdev_ctx_t *ctx,
6257 lsm6dsm_odr_fifo_t *val)
6258 {
6259 lsm6dsm_fifo_ctrl5_t fifo_ctrl5;
6260 int32_t ret;
6261
6262 ret = lsm6dsm_read_reg(ctx, LSM6DSM_FIFO_CTRL5,
6263 (uint8_t *)&fifo_ctrl5, 1);
6264
6265 switch (fifo_ctrl5.odr_fifo)
6266 {
6267 case LSM6DSM_FIFO_DISABLE:
6268 *val = LSM6DSM_FIFO_DISABLE;
6269 break;
6270
6271 case LSM6DSM_FIFO_12Hz5:
6272 *val = LSM6DSM_FIFO_12Hz5;
6273 break;
6274
6275 case LSM6DSM_FIFO_26Hz:
6276 *val = LSM6DSM_FIFO_26Hz;
6277 break;
6278
6279 case LSM6DSM_FIFO_52Hz:
6280 *val = LSM6DSM_FIFO_52Hz;
6281 break;
6282
6283 case LSM6DSM_FIFO_104Hz:
6284 *val = LSM6DSM_FIFO_104Hz;
6285 break;
6286
6287 case LSM6DSM_FIFO_208Hz:
6288 *val = LSM6DSM_FIFO_208Hz;
6289 break;
6290
6291 case LSM6DSM_FIFO_416Hz:
6292 *val = LSM6DSM_FIFO_416Hz;
6293 break;
6294
6295 case LSM6DSM_FIFO_833Hz:
6296 *val = LSM6DSM_FIFO_833Hz;
6297 break;
6298
6299 case LSM6DSM_FIFO_1k66Hz:
6300 *val = LSM6DSM_FIFO_1k66Hz;
6301 break;
6302
6303 case LSM6DSM_FIFO_3k33Hz:
6304 *val = LSM6DSM_FIFO_3k33Hz;
6305 break;
6306
6307 case LSM6DSM_FIFO_6k66Hz:
6308 *val = LSM6DSM_FIFO_6k66Hz;
6309 break;
6310
6311 default:
6312 *val = LSM6DSM_FIFO_DISABLE;
6313 break;
6314 }
6315
6316 return ret;
6317 }
6318
6319 /**
6320 * @}
6321 *
6322 */
6323
6324 /**
6325 * @defgroup LSM6DSM_DEN_functionality
6326 * @brief This section groups all the functions concerning DEN
6327 * functionality.
6328 * @{
6329 *
6330 */
6331
6332 /**
6333 * @brief DEN active level configuration.[set]
6334 *
6335 * @param ctx Read / write interface definitions
6336 * @param val Change the values of den_lh in reg CTRL5_C
6337 * @retval Interface status (MANDATORY: return 0 -> no Error).
6338 *
6339 */
lsm6dsm_den_polarity_set(const stmdev_ctx_t * ctx,lsm6dsm_den_lh_t val)6340 int32_t lsm6dsm_den_polarity_set(const stmdev_ctx_t *ctx,
6341 lsm6dsm_den_lh_t val)
6342 {
6343 lsm6dsm_ctrl5_c_t ctrl5_c;
6344 int32_t ret;
6345
6346 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
6347
6348 if (ret == 0)
6349 {
6350 ctrl5_c.den_lh = (uint8_t)val;
6351 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
6352 }
6353
6354 return ret;
6355 }
6356
6357 /**
6358 * @brief DEN active level configuration.[get]
6359 *
6360 * @param ctx Read / write interface definitions
6361 * @param val Get the values of den_lh in reg CTRL5_C
6362 * @retval Interface status (MANDATORY: return 0 -> no Error).
6363 *
6364 */
lsm6dsm_den_polarity_get(const stmdev_ctx_t * ctx,lsm6dsm_den_lh_t * val)6365 int32_t lsm6dsm_den_polarity_get(const stmdev_ctx_t *ctx,
6366 lsm6dsm_den_lh_t *val)
6367 {
6368 lsm6dsm_ctrl5_c_t ctrl5_c;
6369 int32_t ret;
6370
6371 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL5_C, (uint8_t *)&ctrl5_c, 1);
6372
6373 switch (ctrl5_c.den_lh)
6374 {
6375 case LSM6DSM_DEN_ACT_LOW:
6376 *val = LSM6DSM_DEN_ACT_LOW;
6377 break;
6378
6379 case LSM6DSM_DEN_ACT_HIGH:
6380 *val = LSM6DSM_DEN_ACT_HIGH;
6381 break;
6382
6383 default:
6384 *val = LSM6DSM_DEN_ACT_LOW;
6385 break;
6386 }
6387
6388 return ret;
6389 }
6390
6391 /**
6392 * @brief DEN functionality marking mode[set]
6393 *
6394 * @param ctx Read / write interface definitions
6395 * @param val Change the values of den_mode in reg CTRL6_C
6396 * @retval Interface status (MANDATORY: return 0 -> no Error).
6397 *
6398 */
lsm6dsm_den_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_den_mode_t val)6399 int32_t lsm6dsm_den_mode_set(const stmdev_ctx_t *ctx,
6400 lsm6dsm_den_mode_t val)
6401 {
6402 lsm6dsm_ctrl6_c_t ctrl6_c;
6403 int32_t ret;
6404
6405 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
6406
6407 if (ret == 0)
6408 {
6409 ctrl6_c.den_mode = (uint8_t)val;
6410 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
6411 }
6412
6413 return ret;
6414 }
6415
6416 /**
6417 * @brief DEN functionality marking mode[get]
6418 *
6419 * @param ctx Read / write interface definitions
6420 * @param val Change the values of den_mode in reg CTRL6_C
6421 * @retval Interface status (MANDATORY: return 0 -> no Error).
6422 *
6423 */
lsm6dsm_den_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_den_mode_t * val)6424 int32_t lsm6dsm_den_mode_get(const stmdev_ctx_t *ctx,
6425 lsm6dsm_den_mode_t *val)
6426 {
6427 lsm6dsm_ctrl6_c_t ctrl6_c;
6428 int32_t ret;
6429
6430 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL6_C, (uint8_t *)&ctrl6_c, 1);
6431
6432 switch (ctrl6_c.den_mode)
6433 {
6434 case LSM6DSM_DEN_DISABLE:
6435 *val = LSM6DSM_DEN_DISABLE;
6436 break;
6437
6438 case LSM6DSM_LEVEL_LETCHED:
6439 *val = LSM6DSM_LEVEL_LETCHED;
6440 break;
6441
6442 case LSM6DSM_LEVEL_TRIGGER:
6443 *val = LSM6DSM_LEVEL_TRIGGER;
6444 break;
6445
6446 case LSM6DSM_EDGE_TRIGGER:
6447 *val = LSM6DSM_EDGE_TRIGGER;
6448 break;
6449
6450 default:
6451 *val = LSM6DSM_DEN_DISABLE;
6452 break;
6453 }
6454
6455 return ret;
6456 }
6457
6458 /**
6459 * @brief Extend DEN functionality to accelerometer sensor.[set]
6460 *
6461 * @param ctx Read / write interface definitions
6462 * @param val Change the values of den_xl_g in reg CTRL9_XL
6463 * and den_xl_en in CTRL4_C.
6464 * @retval Interface status (MANDATORY: return 0 -> no Error).
6465 *
6466 */
lsm6dsm_den_enable_set(const stmdev_ctx_t * ctx,lsm6dsm_den_xl_en_t val)6467 int32_t lsm6dsm_den_enable_set(const stmdev_ctx_t *ctx,
6468 lsm6dsm_den_xl_en_t val)
6469 {
6470 lsm6dsm_ctrl4_c_t ctrl4_c;
6471 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6472 int32_t ret;
6473
6474 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6475
6476 if (ret == 0)
6477 {
6478 ctrl9_xl.den_xl_g = (uint8_t)val & 0x01U;
6479 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6480
6481 if (ret == 0)
6482 {
6483 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
6484
6485 if (ret == 0)
6486 {
6487 ctrl4_c.den_xl_en = (uint8_t)val & 0x02U;
6488 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
6489 }
6490 }
6491 }
6492
6493 return ret;
6494 }
6495
6496 /**
6497 * @brief Extend DEN functionality to accelerometer sensor. [get]
6498 *
6499 * @param ctx Read / write interface definitions
6500 * @param val Get the values of den_xl_g in reg CTRL9_XL
6501 * and den_xl_en in CTRL4_C.
6502 * @retval Interface status (MANDATORY: return 0 -> no Error).
6503 *
6504 */
lsm6dsm_den_enable_get(const stmdev_ctx_t * ctx,lsm6dsm_den_xl_en_t * val)6505 int32_t lsm6dsm_den_enable_get(const stmdev_ctx_t *ctx,
6506 lsm6dsm_den_xl_en_t *val)
6507 {
6508 lsm6dsm_ctrl4_c_t ctrl4_c;
6509 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6510 int32_t ret;
6511
6512 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL4_C, (uint8_t *)&ctrl4_c, 1);
6513
6514 if (ret == 0)
6515 {
6516 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6517
6518 switch ((ctrl4_c.den_xl_en << 1) + ctrl9_xl.den_xl_g)
6519 {
6520 case LSM6DSM_STAMP_IN_GY_DATA:
6521 *val = LSM6DSM_STAMP_IN_GY_DATA;
6522 break;
6523
6524 case LSM6DSM_STAMP_IN_XL_DATA:
6525 *val = LSM6DSM_STAMP_IN_XL_DATA;
6526 break;
6527
6528 case LSM6DSM_STAMP_IN_GY_XL_DATA:
6529 *val = LSM6DSM_STAMP_IN_GY_XL_DATA;
6530 break;
6531
6532 default:
6533 *val = LSM6DSM_STAMP_IN_GY_DATA;
6534 break;
6535 }
6536 }
6537
6538 return ret;
6539 }
6540
6541 /**
6542 * @brief DEN value stored in LSB of Z-axis.[set]
6543 *
6544 * @param ctx Read / write interface definitions
6545 * @param val Change the values of den_z in reg CTRL9_XL
6546 * @retval Interface status (MANDATORY: return 0 -> no Error).
6547 *
6548 */
lsm6dsm_den_mark_axis_z_set(const stmdev_ctx_t * ctx,uint8_t val)6549 int32_t lsm6dsm_den_mark_axis_z_set(const stmdev_ctx_t *ctx, uint8_t val)
6550 {
6551 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6552 int32_t ret;
6553
6554 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6555
6556 if (ret == 0)
6557 {
6558 ctrl9_xl.den_z = val;
6559 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6560 }
6561
6562 return ret;
6563 }
6564
6565 /**
6566 * @brief DEN value stored in LSB of Z-axis.[get]
6567 *
6568 * @param ctx Read / write interface definitions
6569 * @param val Change the values of den_z in reg CTRL9_XL
6570 * @retval Interface status (MANDATORY: return 0 -> no Error).
6571 *
6572 */
lsm6dsm_den_mark_axis_z_get(const stmdev_ctx_t * ctx,uint8_t * val)6573 int32_t lsm6dsm_den_mark_axis_z_get(const stmdev_ctx_t *ctx, uint8_t *val)
6574 {
6575 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6576 int32_t ret;
6577
6578 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6579 *val = ctrl9_xl.den_z;
6580
6581 return ret;
6582 }
6583
6584 /**
6585 * @brief DEN value stored in LSB of Y-axis.[set]
6586 *
6587 * @param ctx Read / write interface definitions
6588 * @param val Change the values of den_y in reg CTRL9_XL
6589 * @retval Interface status (MANDATORY: return 0 -> no Error).
6590 *
6591 */
lsm6dsm_den_mark_axis_y_set(const stmdev_ctx_t * ctx,uint8_t val)6592 int32_t lsm6dsm_den_mark_axis_y_set(const stmdev_ctx_t *ctx, uint8_t val)
6593 {
6594 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6595 int32_t ret;
6596
6597 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6598
6599 if (ret == 0)
6600 {
6601 ctrl9_xl.den_y = val;
6602 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6603 }
6604
6605 return ret;
6606 }
6607
6608 /**
6609 * @brief DEN value stored in LSB of Y-axis.[get]
6610 *
6611 * @param ctx Read / write interface definitions
6612 * @param val Change the values of den_y in reg CTRL9_XL
6613 * @retval Interface status (MANDATORY: return 0 -> no Error).
6614 *
6615 */
lsm6dsm_den_mark_axis_y_get(const stmdev_ctx_t * ctx,uint8_t * val)6616 int32_t lsm6dsm_den_mark_axis_y_get(const stmdev_ctx_t *ctx, uint8_t *val)
6617 {
6618 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6619 int32_t ret;
6620
6621 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6622 *val = ctrl9_xl.den_y;
6623
6624 return ret;
6625 }
6626
6627 /**
6628 * @brief DEN value stored in LSB of X-axis.[set]
6629 *
6630 * @param ctx Read / write interface definitions
6631 * @param val Change the values of den_x in reg CTRL9_XL
6632 * @retval Interface status (MANDATORY: return 0 -> no Error).
6633 *
6634 */
lsm6dsm_den_mark_axis_x_set(const stmdev_ctx_t * ctx,uint8_t val)6635 int32_t lsm6dsm_den_mark_axis_x_set(const stmdev_ctx_t *ctx, uint8_t val)
6636 {
6637 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6638 int32_t ret;
6639
6640 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6641
6642 if (ret == 0)
6643 {
6644 ctrl9_xl.den_x = val;
6645 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6646 }
6647
6648 return ret;
6649 }
6650
6651 /**
6652 * @brief DEN value stored in LSB of X-axis.[get]
6653 *
6654 * @param ctx Read / write interface definitions
6655 * @param val Change the values of den_x in reg CTRL9_XL
6656 * @retval Interface status (MANDATORY: return 0 -> no Error).
6657 *
6658 */
lsm6dsm_den_mark_axis_x_get(const stmdev_ctx_t * ctx,uint8_t * val)6659 int32_t lsm6dsm_den_mark_axis_x_get(const stmdev_ctx_t *ctx, uint8_t *val)
6660 {
6661 lsm6dsm_ctrl9_xl_t ctrl9_xl;
6662 int32_t ret;
6663
6664 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
6665 *val = ctrl9_xl.den_x;
6666
6667 return ret;
6668 }
6669
6670 /**
6671 * @}
6672 *
6673 */
6674
6675 /**
6676 * @defgroup LSM6DSM_Pedometer
6677 * @brief This section groups all the functions that manage pedometer.
6678 * @{
6679 *
6680 */
6681
6682 /**
6683 * @brief Reset pedometer step counter.[set]
6684 *
6685 * @param ctx Read / write interface definitions
6686 * @param val Change the values of pedo_rst_step in reg CTRL10_C
6687 * @retval Interface status (MANDATORY: return 0 -> no Error).
6688 *
6689 */
lsm6dsm_pedo_step_reset_set(const stmdev_ctx_t * ctx,uint8_t val)6690 int32_t lsm6dsm_pedo_step_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
6691 {
6692 lsm6dsm_ctrl10_c_t ctrl10_c;
6693 int32_t ret;
6694
6695 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6696
6697 if (ret == 0)
6698 {
6699 ctrl10_c.pedo_rst_step = val;
6700 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6701 }
6702
6703 return ret;
6704 }
6705
6706 /**
6707 * @brief Reset pedometer step counter.[get]
6708 *
6709 * @param ctx Read / write interface definitions
6710 * @param val Change the values of pedo_rst_step in reg CTRL10_C
6711 * @retval Interface status (MANDATORY: return 0 -> no Error).
6712 *
6713 */
lsm6dsm_pedo_step_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)6714 int32_t lsm6dsm_pedo_step_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
6715 {
6716 lsm6dsm_ctrl10_c_t ctrl10_c;
6717 int32_t ret;
6718
6719 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6720 *val = ctrl10_c.pedo_rst_step;
6721
6722 return ret;
6723 }
6724
6725 /**
6726 * @brief Enable pedometer algorithm.[set]
6727 *
6728 * @param ctx Read / write interface definitions
6729 * @param val Change the values of pedo_en in reg CTRL10_C
6730 * @retval Interface status (MANDATORY: return 0 -> no Error).
6731 *
6732 */
lsm6dsm_pedo_sens_set(const stmdev_ctx_t * ctx,uint8_t val)6733 int32_t lsm6dsm_pedo_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
6734 {
6735 lsm6dsm_ctrl10_c_t ctrl10_c;
6736 int32_t ret;
6737
6738 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6739
6740 if (ret == 0)
6741 {
6742 ctrl10_c.pedo_en = val;
6743
6744 if (val != 0x00U)
6745 {
6746 ctrl10_c.func_en = val;
6747 }
6748
6749 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6750 }
6751
6752 return ret;
6753 }
6754
6755 /**
6756 * @brief pedo_sens: Enable pedometer algorithm.[get]
6757 *
6758 * @param ctx Read / write interface definitions
6759 * @param val Change the values of pedo_en in reg CTRL10_C
6760 * @retval Interface status (MANDATORY: return 0 -> no Error).
6761 *
6762 */
lsm6dsm_pedo_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)6763 int32_t lsm6dsm_pedo_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
6764 {
6765 lsm6dsm_ctrl10_c_t ctrl10_c;
6766 int32_t ret;
6767
6768 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
6769 *val = ctrl10_c.pedo_en;
6770
6771 return ret;
6772 }
6773
6774 /**
6775 * @brief Minimum threshold to detect a peak. Default is 10h.[set]
6776 *
6777 * @param ctx Read / write interface definitions
6778 * @param val Change the values of ths_min in reg
6779 * CONFIG_PEDO_THS_MIN
6780 * @retval Interface status (MANDATORY: return 0 -> no Error).
6781 *
6782 */
lsm6dsm_pedo_threshold_set(const stmdev_ctx_t * ctx,uint8_t val)6783 int32_t lsm6dsm_pedo_threshold_set(const stmdev_ctx_t *ctx, uint8_t val)
6784 {
6785 lsm6dsm_config_pedo_ths_min_t config_pedo_ths_min;
6786 int32_t ret;
6787
6788 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6789
6790 if (ret == 0)
6791 {
6792 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6793 (uint8_t *)&config_pedo_ths_min, 1);
6794
6795 if (ret == 0)
6796 {
6797 config_pedo_ths_min.ths_min = val;
6798 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6799 (uint8_t *)&config_pedo_ths_min, 1);
6800
6801 if (ret == 0)
6802 {
6803 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6804 }
6805 }
6806 }
6807
6808 return ret;
6809 }
6810
6811 /**
6812 * @brief Minimum threshold to detect a peak. Default is 10h.[get]
6813 *
6814 * @param ctx Read / write interface definitions
6815 * @param val Change the values of ths_min in reg CONFIG_PEDO_THS_MIN
6816 * @retval Interface status (MANDATORY: return 0 -> no Error).
6817 *
6818 */
lsm6dsm_pedo_threshold_get(const stmdev_ctx_t * ctx,uint8_t * val)6819 int32_t lsm6dsm_pedo_threshold_get(const stmdev_ctx_t *ctx, uint8_t *val)
6820 {
6821 lsm6dsm_config_pedo_ths_min_t config_pedo_ths_min;
6822 int32_t ret;
6823
6824 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6825
6826 if (ret == 0)
6827 {
6828 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6829 (uint8_t *)&config_pedo_ths_min, 1);
6830
6831 if (ret == 0)
6832 {
6833 *val = config_pedo_ths_min.ths_min;
6834 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6835 }
6836 }
6837
6838 return ret;
6839 }
6840
6841 /**
6842 * @brief pedo_full_scale: Pedometer data range.[set]
6843 *
6844 * @param ctx Read / write interface definitions
6845 * @param val Change the values of pedo_fs in
6846 * reg CONFIG_PEDO_THS_MIN
6847 * @retval Interface status (MANDATORY: return 0 -> no Error).
6848 *
6849 */
lsm6dsm_pedo_full_scale_set(const stmdev_ctx_t * ctx,lsm6dsm_pedo_fs_t val)6850 int32_t lsm6dsm_pedo_full_scale_set(const stmdev_ctx_t *ctx,
6851 lsm6dsm_pedo_fs_t val)
6852 {
6853 lsm6dsm_config_pedo_ths_min_t config_pedo_ths_min;
6854 int32_t ret;
6855
6856 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6857
6858 if (ret == 0)
6859 {
6860 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6861 (uint8_t *)&config_pedo_ths_min, 1);
6862
6863 if (ret == 0)
6864 {
6865 config_pedo_ths_min.pedo_fs = (uint8_t) val;
6866 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6867 (uint8_t *)&config_pedo_ths_min, 1);
6868
6869 if (ret == 0)
6870 {
6871 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6872 }
6873 }
6874 }
6875
6876 return ret;
6877 }
6878
6879 /**
6880 * @brief Pedometer data range.[get]
6881 *
6882 * @param ctx Read / write interface definitions
6883 * @param val Get the values of pedo_fs in
6884 * reg CONFIG_PEDO_THS_MIN
6885 * @retval Interface status (MANDATORY: return 0 -> no Error).
6886 *
6887 */
lsm6dsm_pedo_full_scale_get(const stmdev_ctx_t * ctx,lsm6dsm_pedo_fs_t * val)6888 int32_t lsm6dsm_pedo_full_scale_get(const stmdev_ctx_t *ctx,
6889 lsm6dsm_pedo_fs_t *val)
6890 {
6891 lsm6dsm_config_pedo_ths_min_t config_pedo_ths_min;
6892 int32_t ret;
6893
6894 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6895
6896 if (ret == 0)
6897 {
6898 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CONFIG_PEDO_THS_MIN,
6899 (uint8_t *)&config_pedo_ths_min, 1);
6900
6901 if (ret == 0)
6902 {
6903 switch (config_pedo_ths_min.pedo_fs)
6904 {
6905 case LSM6DSM_PEDO_AT_2g:
6906 *val = LSM6DSM_PEDO_AT_2g;
6907 break;
6908
6909 case LSM6DSM_PEDO_AT_4g:
6910 *val = LSM6DSM_PEDO_AT_4g;
6911 break;
6912
6913 default:
6914 *val = LSM6DSM_PEDO_AT_2g;
6915 break;
6916 }
6917
6918 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6919 }
6920 }
6921
6922 return ret;
6923 }
6924
6925 /**
6926 * @brief Pedometer debounce configuration register (r/w).[set]
6927 *
6928 * @param ctx Read / write interface definitions
6929 * @param val Change the values of deb_step in reg PEDO_DEB_REG
6930 * @retval Interface status (MANDATORY: return 0 -> no Error).
6931 *
6932 */
lsm6dsm_pedo_debounce_steps_set(const stmdev_ctx_t * ctx,uint8_t val)6933 int32_t lsm6dsm_pedo_debounce_steps_set(const stmdev_ctx_t *ctx,
6934 uint8_t val)
6935 {
6936 lsm6dsm_pedo_deb_reg_t pedo_deb_reg;
6937 int32_t ret;
6938
6939 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6940
6941 if (ret == 0)
6942 {
6943 ret = lsm6dsm_read_reg(ctx, LSM6DSM_PEDO_DEB_REG,
6944 (uint8_t *)&pedo_deb_reg, 1);
6945
6946 if (ret == 0)
6947 {
6948 pedo_deb_reg.deb_step = val;
6949 ret = lsm6dsm_write_reg(ctx, LSM6DSM_PEDO_DEB_REG,
6950 (uint8_t *)&pedo_deb_reg, 1);
6951
6952 if (ret == 0)
6953 {
6954 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6955 }
6956 }
6957 }
6958
6959 return ret;
6960 }
6961
6962 /**
6963 * @brief Pedometer debounce configuration register (r/w).[get]
6964 *
6965 * @param ctx Read / write interface definitions
6966 * @param val Change the values of deb_step in reg PEDO_DEB_REG
6967 * @retval Interface status (MANDATORY: return 0 -> no Error).
6968 *
6969 */
lsm6dsm_pedo_debounce_steps_get(const stmdev_ctx_t * ctx,uint8_t * val)6970 int32_t lsm6dsm_pedo_debounce_steps_get(const stmdev_ctx_t *ctx,
6971 uint8_t *val)
6972 {
6973 lsm6dsm_pedo_deb_reg_t pedo_deb_reg;
6974 int32_t ret;
6975
6976 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
6977
6978 if (ret == 0)
6979 {
6980 ret = lsm6dsm_read_reg(ctx, LSM6DSM_PEDO_DEB_REG,
6981 (uint8_t *)&pedo_deb_reg, 1);
6982
6983 if (ret == 0)
6984 {
6985 *val = pedo_deb_reg.deb_step;
6986 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
6987 }
6988 }
6989
6990 return ret;
6991 }
6992
6993 /**
6994 * @brief Debounce time. If the time between two consecutive steps is
6995 * greater than DEB_TIME*80ms, the debouncer is reactivated.
6996 * Default value: 01101[set]
6997 *
6998 * @param ctx Read / write interface definitions
6999 * @param val Change the values of deb_time in reg PEDO_DEB_REG
7000 * @retval Interface status (MANDATORY: return 0 -> no Error).
7001 *
7002 */
lsm6dsm_pedo_timeout_set(const stmdev_ctx_t * ctx,uint8_t val)7003 int32_t lsm6dsm_pedo_timeout_set(const stmdev_ctx_t *ctx, uint8_t val)
7004 {
7005 lsm6dsm_pedo_deb_reg_t pedo_deb_reg;
7006 int32_t ret;
7007
7008 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7009
7010 if (ret == 0)
7011 {
7012 ret = lsm6dsm_read_reg(ctx, LSM6DSM_PEDO_DEB_REG,
7013 (uint8_t *)&pedo_deb_reg, 1);
7014
7015 if (ret == 0)
7016 {
7017 pedo_deb_reg.deb_time = val;
7018 ret = lsm6dsm_write_reg(ctx, LSM6DSM_PEDO_DEB_REG,
7019 (uint8_t *)&pedo_deb_reg, 1);
7020
7021 if (ret == 0)
7022 {
7023 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7024 }
7025 }
7026 }
7027
7028 return ret;
7029 }
7030
7031 /**
7032 * @brief Debounce time. If the time between two consecutive steps is
7033 * greater than DEB_TIME*80ms, the debouncer is reactivated.
7034 * Default value: 01101[get]
7035 *
7036 * @param ctx Read / write interface definitions
7037 * @param val Change the values of deb_time in reg PEDO_DEB_REG
7038 * @retval Interface status (MANDATORY: return 0 -> no Error).
7039 *
7040 */
lsm6dsm_pedo_timeout_get(const stmdev_ctx_t * ctx,uint8_t * val)7041 int32_t lsm6dsm_pedo_timeout_get(const stmdev_ctx_t *ctx, uint8_t *val)
7042 {
7043 lsm6dsm_pedo_deb_reg_t pedo_deb_reg;
7044 int32_t ret;
7045
7046 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7047
7048 if (ret == 0)
7049 {
7050 ret = lsm6dsm_read_reg(ctx, LSM6DSM_PEDO_DEB_REG,
7051 (uint8_t *)&pedo_deb_reg, 1);
7052
7053 if (ret == 0)
7054 {
7055 *val = pedo_deb_reg.deb_time;
7056 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7057 }
7058 }
7059
7060 return ret;
7061 }
7062
7063 /**
7064 * @brief Time period register for step detection on delta time (r/w).[set]
7065 *
7066 * @param ctx Read / write interface definitions
7067 * @param buff Buffer that contains data to write
7068 * @retval Interface status (MANDATORY: return 0 -> no Error).
7069 *
7070 */
lsm6dsm_pedo_steps_period_set(const stmdev_ctx_t * ctx,uint8_t * buff)7071 int32_t lsm6dsm_pedo_steps_period_set(const stmdev_ctx_t *ctx,
7072 uint8_t *buff)
7073 {
7074 int32_t ret;
7075
7076 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7077
7078 if (ret == 0)
7079 {
7080 ret = lsm6dsm_write_reg(ctx, LSM6DSM_STEP_COUNT_DELTA, buff, 1);
7081
7082 if (ret == 0)
7083 {
7084 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7085 }
7086 }
7087
7088 return ret;
7089 }
7090
7091 /**
7092 * @brief Time period register for step detection on delta time (r/w).[get]
7093 *
7094 * @param ctx Read / write interface definitions
7095 * @param buff Buffer that stores data read
7096 * @retval Interface status (MANDATORY: return 0 -> no Error).
7097 *
7098 */
lsm6dsm_pedo_steps_period_get(const stmdev_ctx_t * ctx,uint8_t * buff)7099 int32_t lsm6dsm_pedo_steps_period_get(const stmdev_ctx_t *ctx,
7100 uint8_t *buff)
7101 {
7102 int32_t ret;
7103
7104 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7105
7106 if (ret == 0)
7107 {
7108 ret = lsm6dsm_read_reg(ctx, LSM6DSM_STEP_COUNT_DELTA, buff, 1);
7109
7110 if (ret == 0)
7111 {
7112 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7113 }
7114 }
7115
7116 return ret;
7117 }
7118
7119 /**
7120 * @}
7121 *
7122 */
7123
7124 /**
7125 * @defgroup LSM6DSM_significant_motion
7126 * @brief This section groups all the functions that manage the
7127 * significant motion detection.
7128 * @{
7129 *
7130 */
7131
7132 /**
7133 * @brief Enable significant motion detection function.[set]
7134 *
7135 * @param ctx Read / write interface definitions
7136 * @param val Change the values of sign_motion_en in reg CTRL10_C
7137 * @retval Interface status (MANDATORY: return 0 -> no Error).
7138 *
7139 */
lsm6dsm_motion_sens_set(const stmdev_ctx_t * ctx,uint8_t val)7140 int32_t lsm6dsm_motion_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
7141 {
7142 lsm6dsm_ctrl10_c_t ctrl10_c;
7143 int32_t ret;
7144
7145 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7146
7147 if (ret == 0)
7148 {
7149 ctrl10_c.sign_motion_en = val;
7150
7151 if (val != 0x00U)
7152 {
7153 ctrl10_c.func_en = val;
7154 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7155 }
7156 }
7157
7158 return ret;
7159 }
7160
7161 /**
7162 * @brief Enable significant motion detection function.[get]
7163 *
7164 * @param ctx Read / write interface definitions
7165 * @param val Change the values of sign_motion_en in reg CTRL10_C
7166 * @retval Interface status (MANDATORY: return 0 -> no Error).
7167 *
7168 */
lsm6dsm_motion_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)7169 int32_t lsm6dsm_motion_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
7170 {
7171 lsm6dsm_ctrl10_c_t ctrl10_c;
7172 int32_t ret;
7173
7174 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7175 *val = ctrl10_c.sign_motion_en;
7176
7177 return ret;
7178 }
7179
7180 /**
7181 * @brief Significant motion threshold.[set]
7182 *
7183 * @param ctx Read / write interface definitions
7184 * @param buff Buffer that store significant motion threshold.
7185 * @retval Interface status (MANDATORY: return 0 -> no Error).
7186 *
7187 */
lsm6dsm_motion_threshold_set(const stmdev_ctx_t * ctx,uint8_t * buff)7188 int32_t lsm6dsm_motion_threshold_set(const stmdev_ctx_t *ctx, uint8_t *buff)
7189 {
7190 int32_t ret;
7191
7192 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7193
7194 if (ret == 0)
7195 {
7196 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SM_THS, buff, 1);
7197
7198 if (ret == 0)
7199 {
7200 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7201 }
7202 }
7203
7204 return ret;
7205 }
7206
7207 /**
7208 * @brief Significant motion threshold.[get]
7209 *
7210 * @param ctx Read / write interface definitions
7211 * @param buff Buffer that store significant motion threshold.
7212 * @retval Interface status (MANDATORY: return 0 -> no Error).
7213 *
7214 */
lsm6dsm_motion_threshold_get(const stmdev_ctx_t * ctx,uint8_t * buff)7215 int32_t lsm6dsm_motion_threshold_get(const stmdev_ctx_t *ctx, uint8_t *buff)
7216 {
7217 int32_t ret;
7218
7219 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7220
7221 if (ret == 0)
7222 {
7223 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SM_THS, buff, 1);
7224
7225 if (ret == 0)
7226 {
7227 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7228 }
7229 }
7230
7231 return ret;
7232 }
7233
7234 /**
7235 * @}
7236 *
7237 */
7238
7239 /**
7240 * @defgroup LSM6DSM_tilt_detection
7241 * @brief This section groups all the functions that manage the tilt
7242 * event detection.
7243 * @{
7244 *
7245 */
7246
7247 /**
7248 * @brief Enable tilt calculation.[set]
7249 *
7250 * @param ctx Read / write interface definitions
7251 * @param val Change the values of tilt_en in reg CTRL10_C
7252 * @retval Interface status (MANDATORY: return 0 -> no Error).
7253 *
7254 */
lsm6dsm_tilt_sens_set(const stmdev_ctx_t * ctx,uint8_t val)7255 int32_t lsm6dsm_tilt_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
7256 {
7257 lsm6dsm_ctrl10_c_t ctrl10_c;
7258 int32_t ret;
7259
7260 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7261
7262 if (ret == 0)
7263 {
7264 ctrl10_c.tilt_en = val;
7265
7266 if (val != 0x00U)
7267 {
7268 ctrl10_c.func_en = val;
7269 }
7270
7271 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7272 }
7273
7274 return ret;
7275 }
7276
7277 /**
7278 * @brief Enable tilt calculation.[get]
7279 *
7280 * @param ctx Read / write interface definitions
7281 * @param val Change the values of tilt_en in reg CTRL10_C
7282 * @retval Interface status (MANDATORY: return 0 -> no Error).
7283 *
7284 */
lsm6dsm_tilt_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)7285 int32_t lsm6dsm_tilt_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
7286 {
7287 lsm6dsm_ctrl10_c_t ctrl10_c;
7288 int32_t ret;
7289
7290 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7291 *val = ctrl10_c.tilt_en;
7292
7293 return ret;
7294 }
7295
7296 /**
7297 * @brief Enable tilt calculation.[set]
7298 *
7299 * @param ctx Read / write interface definitions
7300 * @param val Change the values of tilt_en in reg CTRL10_C
7301 * @retval Interface status (MANDATORY: return 0 -> no Error).
7302 *
7303 */
lsm6dsm_wrist_tilt_sens_set(const stmdev_ctx_t * ctx,uint8_t val)7304 int32_t lsm6dsm_wrist_tilt_sens_set(const stmdev_ctx_t *ctx, uint8_t val)
7305 {
7306 lsm6dsm_ctrl10_c_t ctrl10_c;
7307 int32_t ret;
7308
7309 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7310
7311 if (ret == 0)
7312 {
7313 ctrl10_c.wrist_tilt_en = val;
7314
7315 if (val != 0x00U)
7316 {
7317 ctrl10_c.func_en = val;
7318 }
7319
7320 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7321 }
7322
7323 return ret;
7324 }
7325
7326 /**
7327 * @brief Enable tilt calculation.[get]
7328 *
7329 * @param ctx Read / write interface definitions
7330 * @param val Change the values of tilt_en in reg CTRL10_C
7331 * @retval Interface status (MANDATORY: return 0 -> no Error).
7332 *
7333 */
lsm6dsm_wrist_tilt_sens_get(const stmdev_ctx_t * ctx,uint8_t * val)7334 int32_t lsm6dsm_wrist_tilt_sens_get(const stmdev_ctx_t *ctx, uint8_t *val)
7335 {
7336 lsm6dsm_ctrl10_c_t ctrl10_c;
7337 int32_t ret;
7338
7339 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7340 *val = ctrl10_c.wrist_tilt_en;
7341
7342 return ret;
7343 }
7344
7345 /**
7346 * @brief Absolute Wrist Tilt latency register (r/w).
7347 * Absolute wrist tilt latency parameters.
7348 * 1 LSB = 40 ms. Default value: 0Fh (600 ms).[set]
7349 *
7350 * @param ctx Read / write interface definitions
7351 * @param buff Buffer that contains data to write
7352 * @retval Interface status (MANDATORY: return 0 -> no Error).
7353 *
7354 */
lsm6dsm_tilt_latency_set(const stmdev_ctx_t * ctx,uint8_t * buff)7355 int32_t lsm6dsm_tilt_latency_set(const stmdev_ctx_t *ctx, uint8_t *buff)
7356 {
7357 int32_t ret;
7358
7359 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7360
7361 if (ret == 0)
7362 {
7363 ret = lsm6dsm_write_reg(ctx, LSM6DSM_A_WRIST_TILT_LAT, buff, 1);
7364
7365 if (ret == 0)
7366 {
7367 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7368 }
7369 }
7370
7371 return ret;
7372 }
7373
7374 /**
7375 * @brief Absolute Wrist Tilt latency register (r/w).
7376 * Absolute wrist tilt latency parameters.
7377 * 1 LSB = 40 ms. Default value: 0Fh (600 ms).[get]
7378 *
7379 * @param ctx Read / write interface definitions
7380 * @param buff Buffer that stores data read
7381 * @retval Interface status (MANDATORY: return 0 -> no Error).
7382 *
7383 */
lsm6dsm_tilt_latency_get(const stmdev_ctx_t * ctx,uint8_t * buff)7384 int32_t lsm6dsm_tilt_latency_get(const stmdev_ctx_t *ctx, uint8_t *buff)
7385 {
7386 int32_t ret;
7387
7388 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7389
7390 if (ret == 0)
7391 {
7392 ret = lsm6dsm_read_reg(ctx, LSM6DSM_A_WRIST_TILT_LAT, buff, 1);
7393
7394 if (ret == 0)
7395 {
7396 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7397 }
7398 }
7399
7400 return ret;
7401 }
7402
7403 /**
7404 * @brief Absolute Wrist Tilt threshold register(r/w).
7405 * Absolute wrist tilt threshold parameters.
7406 * 1 LSB = 15.625 mg.Default value: 20h (500 mg).[set]
7407 *
7408 * @param ctx Read / write interface definitions
7409 * @param buff Buffer that contains data to write
7410 * @retval Interface status (MANDATORY: return 0 -> no Error).
7411 *
7412 */
lsm6dsm_tilt_threshold_set(const stmdev_ctx_t * ctx,uint8_t * buff)7413 int32_t lsm6dsm_tilt_threshold_set(const stmdev_ctx_t *ctx, uint8_t *buff)
7414 {
7415 int32_t ret;
7416
7417 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7418
7419 if (ret == 0)
7420 {
7421 ret = lsm6dsm_write_reg(ctx, LSM6DSM_A_WRIST_TILT_THS, buff, 1);
7422
7423 if (ret == 0)
7424 {
7425 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7426 }
7427 }
7428
7429 return ret;
7430 }
7431
7432 /**
7433 * @brief Absolute Wrist Tilt threshold register(r/w).
7434 * Absolute wrist tilt threshold parameters.
7435 * 1 LSB = 15.625 mg.Default value: 20h (500 mg).[get]
7436 *
7437 * @param ctx Read / write interface definitions
7438 * @param buff Buffer that stores data read
7439 * @retval Interface status (MANDATORY: return 0 -> no Error).
7440 *
7441 */
lsm6dsm_tilt_threshold_get(const stmdev_ctx_t * ctx,uint8_t * buff)7442 int32_t lsm6dsm_tilt_threshold_get(const stmdev_ctx_t *ctx, uint8_t *buff)
7443 {
7444 int32_t ret;
7445
7446 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7447
7448 if (ret == 0)
7449 {
7450 ret = lsm6dsm_read_reg(ctx, LSM6DSM_A_WRIST_TILT_THS, buff, 1);
7451
7452 if (ret == 0)
7453 {
7454 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7455 }
7456 }
7457
7458 return ret;
7459 }
7460
7461 /**
7462 * @brief Absolute Wrist Tilt mask register (r/w).[set]
7463 *
7464 * @param ctx Read / write interface definitions
7465 * @param val Registers A_WRIST_TILT_MASK
7466 * @retval Interface status (MANDATORY: return 0 -> no Error).
7467 *
7468 */
lsm6dsm_tilt_src_set(const stmdev_ctx_t * ctx,lsm6dsm_a_wrist_tilt_mask_t * val)7469 int32_t lsm6dsm_tilt_src_set(const stmdev_ctx_t *ctx,
7470 lsm6dsm_a_wrist_tilt_mask_t *val)
7471 {
7472 int32_t ret;
7473
7474 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7475
7476 if (ret == 0)
7477 {
7478 ret = lsm6dsm_write_reg(ctx, LSM6DSM_A_WRIST_TILT_MASK,
7479 (uint8_t *) val, 1);
7480
7481 if (ret == 0)
7482 {
7483 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7484 }
7485 }
7486
7487 return ret;
7488 }
7489
7490 /**
7491 * @brief Absolute Wrist Tilt mask register (r/w).[get]
7492 *
7493 * @param ctx Read / write interface definitions
7494 * @param val Registers A_WRIST_TILT_MASK
7495 * @retval Interface status (MANDATORY: return 0 -> no Error).
7496 *
7497 */
lsm6dsm_tilt_src_get(const stmdev_ctx_t * ctx,lsm6dsm_a_wrist_tilt_mask_t * val)7498 int32_t lsm6dsm_tilt_src_get(const stmdev_ctx_t *ctx,
7499 lsm6dsm_a_wrist_tilt_mask_t *val)
7500 {
7501 int32_t ret;
7502
7503 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_B);
7504
7505 if (ret == 0)
7506 {
7507 ret = lsm6dsm_read_reg(ctx, LSM6DSM_A_WRIST_TILT_MASK,
7508 (uint8_t *) val, 1);
7509
7510 if (ret == 0)
7511 {
7512 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7513 }
7514 }
7515
7516 return ret;
7517 }
7518
7519 /**
7520 * @}
7521 *
7522 */
7523
7524 /**
7525 * @defgroup LSM6DSM_ magnetometer_sensor
7526 * @brief This section groups all the functions that manage additional
7527 * magnetometer sensor.
7528 * @{
7529 *
7530 */
7531
7532 /**
7533 * @brief Enable soft-iron correction algorithm for magnetometer.[set]
7534 *
7535 * @param ctx Read / write interface definitions
7536 * @param val Change the values of soft_en in reg CTRL9_XL
7537 * @retval Interface status (MANDATORY: return 0 -> no Error).
7538 *
7539 */
lsm6dsm_mag_soft_iron_set(const stmdev_ctx_t * ctx,uint8_t val)7540 int32_t lsm6dsm_mag_soft_iron_set(const stmdev_ctx_t *ctx, uint8_t val)
7541 {
7542 lsm6dsm_ctrl9_xl_t ctrl9_xl;
7543 int32_t ret;
7544
7545 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
7546
7547 if (ret == 0)
7548 {
7549 ctrl9_xl.soft_en = val;
7550 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
7551 }
7552
7553 return ret;
7554 }
7555
7556 /**
7557 * @brief Enable soft-iron correction algorithm for magnetometer.[get]
7558 *
7559 * @param ctx Read / write interface definitions
7560 * @param val Change the values of soft_en in reg CTRL9_XL
7561 * @retval Interface status (MANDATORY: return 0 -> no Error).
7562 *
7563 */
lsm6dsm_mag_soft_iron_get(const stmdev_ctx_t * ctx,uint8_t * val)7564 int32_t lsm6dsm_mag_soft_iron_get(const stmdev_ctx_t *ctx, uint8_t *val)
7565 {
7566 lsm6dsm_ctrl9_xl_t ctrl9_xl;
7567 int32_t ret;
7568
7569 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL9_XL, (uint8_t *)&ctrl9_xl, 1);
7570 *val = ctrl9_xl.soft_en;
7571
7572 return ret;
7573 }
7574
7575 /**
7576 * @brief Enable hard-iron correction algorithm for magnetometer.[set]
7577 *
7578 * @param ctx Read / write interface definitions
7579 * @param val Change the values of iron_en in reg MASTER_CONFIG
7580 * @retval Interface status (MANDATORY: return 0 -> no Error).
7581 *
7582 */
lsm6dsm_mag_hard_iron_set(const stmdev_ctx_t * ctx,uint8_t val)7583 int32_t lsm6dsm_mag_hard_iron_set(const stmdev_ctx_t *ctx, uint8_t val)
7584 {
7585 lsm6dsm_master_config_t master_config;
7586 lsm6dsm_ctrl10_c_t ctrl10_c;
7587 int32_t ret;
7588
7589 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
7590 (uint8_t *)&master_config, 1);
7591
7592 if (ret == 0)
7593 {
7594 master_config.iron_en = val;
7595 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
7596 (uint8_t *)&master_config, 1);
7597
7598 if (ret == 0)
7599 {
7600 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7601
7602 if (ret == 0)
7603 {
7604 if (val != 0x00U)
7605 {
7606 ctrl10_c.func_en = val;
7607 }
7608
7609 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C,
7610 (uint8_t *)&ctrl10_c, 1);
7611 }
7612 }
7613 }
7614
7615 return ret;
7616 }
7617
7618 /**
7619 * @brief Enable hard-iron correction algorithm for magnetometer.[get]
7620 *
7621 * @param ctx Read / write interface definitions
7622 * @param val Change the values of iron_en in reg MASTER_CONFIG
7623 * @retval Interface status (MANDATORY: return 0 -> no Error).
7624 *
7625 */
lsm6dsm_mag_hard_iron_get(const stmdev_ctx_t * ctx,uint8_t * val)7626 int32_t lsm6dsm_mag_hard_iron_get(const stmdev_ctx_t *ctx, uint8_t *val)
7627 {
7628 lsm6dsm_master_config_t master_config;
7629 int32_t ret;
7630
7631 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
7632 (uint8_t *)&master_config, 1);
7633 *val = master_config.iron_en;
7634
7635 return ret;
7636 }
7637
7638 /**
7639 * @brief Soft iron 3x3 matrix. Value are expressed in sign-module format.
7640 * (Es. SVVVVVVVb where S is the sign 0/+1/- and V is the value).[set]
7641 *
7642 * @param ctx Read / write interface definitions
7643 * @param buff Buffer that contains data to write
7644 * @retval Interface status (MANDATORY: return 0 -> no Error).
7645 *
7646 */
lsm6dsm_mag_soft_iron_mat_set(const stmdev_ctx_t * ctx,uint8_t * buff)7647 int32_t lsm6dsm_mag_soft_iron_mat_set(const stmdev_ctx_t *ctx,
7648 uint8_t *buff)
7649 {
7650 int32_t ret;
7651
7652 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7653
7654 if (ret == 0)
7655 {
7656 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MAG_SI_XX, buff, 9);
7657
7658 if (ret == 0)
7659 {
7660 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7661 }
7662 }
7663
7664 return ret;
7665 }
7666
7667 /**
7668 * @brief Soft iron 3x3 matrix. Value are expressed in sign-module format.
7669 * (Es. SVVVVVVVb where S is the sign 0/+1/- and V is the value).[get]
7670 *
7671 * @param ctx Read / write interface definitions
7672 * @param buff Buffer that stores data read
7673 * @retval Interface status (MANDATORY: return 0 -> no Error).
7674 *
7675 */
lsm6dsm_mag_soft_iron_mat_get(const stmdev_ctx_t * ctx,uint8_t * buff)7676 int32_t lsm6dsm_mag_soft_iron_mat_get(const stmdev_ctx_t *ctx,
7677 uint8_t *buff)
7678 {
7679 int32_t ret;
7680
7681 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7682
7683 if (ret == 0)
7684 {
7685 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MAG_SI_XX, buff, 9);
7686
7687 if (ret == 0)
7688 {
7689 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7690 }
7691 }
7692
7693 return ret;
7694 }
7695
7696 /**
7697 * @brief Offset for hard-iron compensation register (r/w). The value is
7698 * expressed as a 16-bit word in two’s complement.[set]
7699 *
7700 * @param ctx Read / write interface definitions
7701 * @param buff Buffer that contains data to write
7702 * @retval Interface status (MANDATORY: return 0 -> no Error).
7703 *
7704 */
lsm6dsm_mag_offset_set(const stmdev_ctx_t * ctx,int16_t * val)7705 int32_t lsm6dsm_mag_offset_set(const stmdev_ctx_t *ctx, int16_t *val)
7706 {
7707 uint8_t buff[6];
7708 int32_t ret;
7709
7710 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7711
7712 if (ret == 0)
7713 {
7714 buff[1] = (uint8_t)((uint16_t)val[0] / 256U);
7715 buff[0] = (uint8_t)((uint16_t)val[0] - (buff[1] * 256U));
7716 buff[3] = (uint8_t)((uint16_t)val[1] / 256U);
7717 buff[2] = (uint8_t)((uint16_t)val[1] - (buff[3] * 256U));
7718 buff[5] = (uint8_t)((uint16_t)val[2] / 256U);
7719 buff[4] = (uint8_t)((uint16_t)val[2] - (buff[5] * 256U));
7720 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MAG_OFFX_L, buff, 6);
7721
7722 if (ret == 0)
7723 {
7724 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7725 }
7726 }
7727
7728 return ret;
7729 }
7730
7731 /**
7732 * @brief Offset for hard-iron compensation register(r/w).
7733 * The value is expressed as a 16-bit word in two’s complement.[get]
7734 *
7735 * @param ctx Read / write interface definitions
7736 * @param buff Buffer that stores data read
7737 * @retval Interface status (MANDATORY: return 0 -> no Error).
7738 *
7739 */
lsm6dsm_mag_offset_get(const stmdev_ctx_t * ctx,int16_t * val)7740 int32_t lsm6dsm_mag_offset_get(const stmdev_ctx_t *ctx, int16_t *val)
7741 {
7742 uint8_t buff[6];
7743 int32_t ret;
7744
7745 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
7746
7747 if (ret == 0)
7748 {
7749 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MAG_OFFX_L, buff, 6);
7750
7751 if (ret == 0)
7752 {
7753 val[0] = (int16_t)buff[1];
7754 val[0] = (val[0] * 256) + (int16_t)buff[0];
7755 val[1] = (int16_t)buff[3];
7756 val[1] = (val[1] * 256) + (int16_t)buff[2];
7757 val[2] = (int16_t)buff[5];
7758 val[2] = (val[2] * 256) + (int16_t)buff[4];
7759 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
7760 }
7761 }
7762
7763 return ret;
7764 }
7765
7766 /**
7767 * @}
7768 *
7769 */
7770
7771 /**
7772 * @defgroup LSM6DSM_Sensor_hub
7773 * @brief This section groups all the functions that manage the sensor
7774 * hub functionality.
7775 * @{
7776 *
7777 */
7778
7779 /**
7780 * @brief Enable function.[set]
7781 *
7782 * @param ctx Read / write interface definitions
7783 * @param val Change the values func_en
7784 * @retval Interface status (MANDATORY: return 0 -> no Error).
7785 *
7786 */
lsm6dsm_func_en_set(const stmdev_ctx_t * ctx,uint8_t val)7787 int32_t lsm6dsm_func_en_set(const stmdev_ctx_t *ctx, uint8_t val)
7788 {
7789 lsm6dsm_ctrl10_c_t ctrl10_c;
7790 int32_t ret;
7791
7792 ret = lsm6dsm_read_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7793
7794 if (ret == 0)
7795 {
7796 ctrl10_c.func_en = val;
7797 ret = lsm6dsm_write_reg(ctx, LSM6DSM_CTRL10_C, (uint8_t *)&ctrl10_c, 1);
7798 }
7799
7800 return ret;
7801 }
7802
7803 /**
7804 * @brief Sensor synchronization time frame with the step of 500 ms and
7805 * full range of 5s. Unsigned 8-bit.[set]
7806 *
7807 * @param ctx Read / write interface definitions
7808 * @param val Change the values of tph in reg SENSOR_SYNC_TIME_FRAME
7809 * @retval Interface status (MANDATORY: return 0 -> no Error).
7810 *
7811 */
lsm6dsm_sh_sync_sens_frame_set(const stmdev_ctx_t * ctx,uint8_t val)7812 int32_t lsm6dsm_sh_sync_sens_frame_set(const stmdev_ctx_t *ctx, uint8_t val)
7813 {
7814 lsm6dsm_sensor_sync_time_frame_t sensor_sync_time_frame;
7815 int32_t ret;
7816
7817 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSOR_SYNC_TIME_FRAME,
7818 (uint8_t *)&sensor_sync_time_frame, 1);
7819
7820 if (ret == 0)
7821 {
7822 sensor_sync_time_frame.tph = val;
7823 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SENSOR_SYNC_TIME_FRAME,
7824 (uint8_t *)&sensor_sync_time_frame, 1);
7825 }
7826
7827 return ret;
7828 }
7829
7830 /**
7831 * @brief Sensor synchronization time frame with the step of 500 ms and
7832 * full range of 5s. Unsigned 8-bit.[get]
7833 *
7834 * @param ctx Read / write interface definitions
7835 * @param val Change the values of tph in reg SENSOR_SYNC_TIME_FRAME
7836 * @retval Interface status (MANDATORY: return 0 -> no Error).
7837 *
7838 */
lsm6dsm_sh_sync_sens_frame_get(const stmdev_ctx_t * ctx,uint8_t * val)7839 int32_t lsm6dsm_sh_sync_sens_frame_get(const stmdev_ctx_t *ctx,
7840 uint8_t *val)
7841 {
7842 lsm6dsm_sensor_sync_time_frame_t sensor_sync_time_frame;
7843 int32_t ret;
7844
7845 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSOR_SYNC_TIME_FRAME,
7846 (uint8_t *)&sensor_sync_time_frame, 1);
7847 *val = sensor_sync_time_frame.tph;
7848
7849 return ret;
7850 }
7851
7852 /**
7853 * @brief Resolution ratio of error code for sensor synchronization.[set]
7854 *
7855 * @param ctx Read / write interface definitions
7856 * @param val Change the values of rr in reg SENSOR_SYNC_RES_RATIO
7857 * @retval Interface status (MANDATORY: return 0 -> no Error).
7858 *
7859 */
lsm6dsm_sh_sync_sens_ratio_set(const stmdev_ctx_t * ctx,lsm6dsm_rr_t val)7860 int32_t lsm6dsm_sh_sync_sens_ratio_set(const stmdev_ctx_t *ctx,
7861 lsm6dsm_rr_t val)
7862 {
7863 lsm6dsm_sensor_sync_res_ratio_t sensor_sync_res_ratio;
7864 int32_t ret;
7865
7866 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSOR_SYNC_RES_RATIO,
7867 (uint8_t *)&sensor_sync_res_ratio, 1);
7868
7869 if (ret == 0)
7870 {
7871 sensor_sync_res_ratio.rr = (uint8_t) val;
7872 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SENSOR_SYNC_RES_RATIO,
7873 (uint8_t *)&sensor_sync_res_ratio, 1);
7874 }
7875
7876 return ret;
7877 }
7878
7879 /**
7880 * @brief Resolution ratio of error code for sensor synchronization.[get]
7881 *
7882 * @param ctx Read / write interface definitions
7883 * @param val Get the values of rr in reg SENSOR_SYNC_RES_RATIO
7884 * @retval Interface status (MANDATORY: return 0 -> no Error).
7885 *
7886 */
lsm6dsm_sh_sync_sens_ratio_get(const stmdev_ctx_t * ctx,lsm6dsm_rr_t * val)7887 int32_t lsm6dsm_sh_sync_sens_ratio_get(const stmdev_ctx_t *ctx,
7888 lsm6dsm_rr_t *val)
7889 {
7890 lsm6dsm_sensor_sync_res_ratio_t sensor_sync_res_ratio;
7891 int32_t ret;
7892
7893 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSOR_SYNC_RES_RATIO,
7894 (uint8_t *)&sensor_sync_res_ratio, 1);
7895
7896 switch (sensor_sync_res_ratio.rr)
7897 {
7898 case LSM6DSM_RES_RATIO_2_11:
7899 *val = LSM6DSM_RES_RATIO_2_11;
7900 break;
7901
7902 case LSM6DSM_RES_RATIO_2_12:
7903 *val = LSM6DSM_RES_RATIO_2_12;
7904 break;
7905
7906 case LSM6DSM_RES_RATIO_2_13:
7907 *val = LSM6DSM_RES_RATIO_2_13;
7908 break;
7909
7910 case LSM6DSM_RES_RATIO_2_14:
7911 *val = LSM6DSM_RES_RATIO_2_14;
7912 break;
7913
7914 default:
7915 *val = LSM6DSM_RES_RATIO_2_11;
7916 break;
7917 }
7918
7919 return ret;
7920 }
7921
7922 /**
7923 * @brief Sensor hub I2C master enable.[set]
7924 *
7925 * @param ctx Read / write interface definitions
7926 * @param val Change the values of master_on in reg MASTER_CONFIG
7927 * @retval Interface status (MANDATORY: return 0 -> no Error).
7928 *
7929 */
lsm6dsm_sh_master_set(const stmdev_ctx_t * ctx,uint8_t val)7930 int32_t lsm6dsm_sh_master_set(const stmdev_ctx_t *ctx, uint8_t val)
7931 {
7932 lsm6dsm_master_config_t master_config;
7933 int32_t ret;
7934
7935 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
7936 (uint8_t *)&master_config, 1);
7937
7938 if (ret == 0)
7939 {
7940 master_config.master_on = val;
7941 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
7942 (uint8_t *)&master_config, 1);
7943 }
7944
7945 return ret;
7946 }
7947
7948 /**
7949 * @brief Sensor hub I2C master enable.[get]
7950 *
7951 * @param ctx Read / write interface definitions
7952 * @param val Change the values of master_on in reg MASTER_CONFIG
7953 * @retval Interface status (MANDATORY: return 0 -> no Error).
7954 *
7955 */
lsm6dsm_sh_master_get(const stmdev_ctx_t * ctx,uint8_t * val)7956 int32_t lsm6dsm_sh_master_get(const stmdev_ctx_t *ctx, uint8_t *val)
7957 {
7958 lsm6dsm_master_config_t master_config;
7959 int32_t ret;
7960
7961 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
7962 (uint8_t *)&master_config, 1);
7963 *val = master_config.master_on;
7964
7965 return ret;
7966 }
7967
7968 /**
7969 * @brief I2C interface pass-through.[set]
7970 *
7971 * @param ctx Read / write interface definitions
7972 * @param val Change the values of pass_through_mode in reg MASTER_CONFIG
7973 * @retval Interface status (MANDATORY: return 0 -> no Error).
7974 *
7975 */
lsm6dsm_sh_pass_through_set(const stmdev_ctx_t * ctx,uint8_t val)7976 int32_t lsm6dsm_sh_pass_through_set(const stmdev_ctx_t *ctx, uint8_t val)
7977 {
7978 lsm6dsm_master_config_t master_config;
7979 int32_t ret;
7980
7981 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
7982 (uint8_t *)&master_config, 1);
7983
7984 if (ret == 0)
7985 {
7986 master_config.pass_through_mode = val;
7987 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
7988 (uint8_t *)&master_config, 1);
7989 }
7990
7991 return ret;
7992 }
7993
7994 /**
7995 * @brief I2C interface pass-through.[get]
7996 *
7997 * @param ctx Read / write interface definitions
7998 * @param val Change the values of pass_through_mode in reg MASTER_CONFIG
7999 * @retval Interface status (MANDATORY: return 0 -> no Error).
8000 *
8001 */
lsm6dsm_sh_pass_through_get(const stmdev_ctx_t * ctx,uint8_t * val)8002 int32_t lsm6dsm_sh_pass_through_get(const stmdev_ctx_t *ctx, uint8_t *val)
8003 {
8004 lsm6dsm_master_config_t master_config;
8005 int32_t ret;
8006
8007 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8008 (uint8_t *)&master_config, 1);
8009 *val = master_config.pass_through_mode;
8010
8011 return ret;
8012 }
8013
8014 /**
8015 * @brief Master I2C pull-up enable/disable.[set]
8016 *
8017 * @param ctx Read / write interface definitions
8018 * @param val Change the values of pull_up_en in reg MASTER_CONFIG
8019 * @retval Interface status (MANDATORY: return 0 -> no Error).
8020 *
8021 */
lsm6dsm_sh_pin_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_pull_up_en_t val)8022 int32_t lsm6dsm_sh_pin_mode_set(const stmdev_ctx_t *ctx,
8023 lsm6dsm_pull_up_en_t val)
8024 {
8025 lsm6dsm_master_config_t master_config;
8026 int32_t ret;
8027
8028 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8029 (uint8_t *)&master_config, 1);
8030
8031 if (ret == 0)
8032 {
8033 master_config.pull_up_en = (uint8_t) val;
8034 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
8035 (uint8_t *)&master_config, 1);
8036 }
8037
8038 return ret;
8039 }
8040
8041 /**
8042 * @brief Master I2C pull-up enable/disable.[get]
8043 *
8044 * @param ctx Read / write interface definitions
8045 * @param val Get the values of pull_up_en in reg MASTER_CONFIG
8046 * @retval Interface status (MANDATORY: return 0 -> no Error).
8047 *
8048 */
lsm6dsm_sh_pin_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_pull_up_en_t * val)8049 int32_t lsm6dsm_sh_pin_mode_get(const stmdev_ctx_t *ctx,
8050 lsm6dsm_pull_up_en_t *val)
8051 {
8052 lsm6dsm_master_config_t master_config;
8053 int32_t ret;
8054
8055 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8056 (uint8_t *)&master_config, 1);
8057
8058 switch (master_config.pull_up_en)
8059 {
8060 case LSM6DSM_EXT_PULL_UP:
8061 *val = LSM6DSM_EXT_PULL_UP;
8062 break;
8063
8064 case LSM6DSM_INTERNAL_PULL_UP:
8065 *val = LSM6DSM_INTERNAL_PULL_UP;
8066 break;
8067
8068 default:
8069 *val = LSM6DSM_SH_PIN_MODE;
8070 break;
8071 }
8072
8073 return ret;
8074 }
8075
8076 /**
8077 * @brief Sensor hub trigger signal selection.[set]
8078 *
8079 * @param ctx Read / write interface definitions
8080 * @param val Change the values of start_config in reg MASTER_CONFIG
8081 * @retval Interface status (MANDATORY: return 0 -> no Error).
8082 *
8083 */
lsm6dsm_sh_syncro_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_start_config_t val)8084 int32_t lsm6dsm_sh_syncro_mode_set(const stmdev_ctx_t *ctx,
8085 lsm6dsm_start_config_t val)
8086 {
8087 lsm6dsm_master_config_t master_config;
8088 int32_t ret;
8089
8090 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8091 (uint8_t *)&master_config, 1);
8092
8093 if (ret == 0)
8094 {
8095 master_config.start_config = (uint8_t)val;
8096 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
8097 (uint8_t *)&master_config, 1);
8098 }
8099
8100 return ret;
8101 }
8102
8103 /**
8104 * @brief Sensor hub trigger signal selection.[get]
8105 *
8106 * @param ctx Read / write interface definitions
8107 * @param val Get the values of start_config in reg MASTER_CONFIG
8108 * @retval Interface status (MANDATORY: return 0 -> no Error).
8109 *
8110 */
lsm6dsm_sh_syncro_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_start_config_t * val)8111 int32_t lsm6dsm_sh_syncro_mode_get(const stmdev_ctx_t *ctx,
8112 lsm6dsm_start_config_t *val)
8113 {
8114 lsm6dsm_master_config_t master_config;
8115 int32_t ret;
8116
8117 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8118 (uint8_t *)&master_config, 1);
8119
8120 switch (master_config.start_config)
8121 {
8122 case LSM6DSM_XL_GY_DRDY:
8123 *val = LSM6DSM_XL_GY_DRDY;
8124 break;
8125
8126 case LSM6DSM_EXT_ON_INT2_PIN:
8127 *val = LSM6DSM_EXT_ON_INT2_PIN;
8128 break;
8129
8130 default:
8131 *val = LSM6DSM_XL_GY_DRDY;
8132 break;
8133 }
8134
8135 return ret;
8136 }
8137
8138 /**
8139 * @brief Manage the Master DRDY signal on INT1 pad.[set]
8140 *
8141 * @param ctx Read / write interface definitions
8142 * @param val Change the values of drdy_on_int1 in reg MASTER_CONFIG
8143 * @retval Interface status (MANDATORY: return 0 -> no Error).
8144 *
8145 */
lsm6dsm_sh_drdy_on_int1_set(const stmdev_ctx_t * ctx,uint8_t val)8146 int32_t lsm6dsm_sh_drdy_on_int1_set(const stmdev_ctx_t *ctx, uint8_t val)
8147 {
8148 lsm6dsm_master_config_t master_config;
8149 int32_t ret;
8150
8151 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8152 (uint8_t *)&master_config, 1);
8153
8154 if (ret == 0)
8155 {
8156 master_config.drdy_on_int1 = val;
8157 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CONFIG,
8158 (uint8_t *)&master_config, 1);
8159 }
8160
8161 return ret;
8162 }
8163
8164 /**
8165 * @brief Manage the Master DRDY signal on INT1 pad.[get]
8166 *
8167 * @param ctx Read / write interface definitions
8168 * @param val Change the values of drdy_on_int1 in reg MASTER_CONFIG
8169 * @retval Interface status (MANDATORY: return 0 -> no Error).
8170 *
8171 */
lsm6dsm_sh_drdy_on_int1_get(const stmdev_ctx_t * ctx,uint8_t * val)8172 int32_t lsm6dsm_sh_drdy_on_int1_get(const stmdev_ctx_t *ctx, uint8_t *val)
8173 {
8174 lsm6dsm_master_config_t master_config;
8175 int32_t ret;
8176
8177 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CONFIG,
8178 (uint8_t *)&master_config, 1);
8179 *val = master_config.drdy_on_int1;
8180
8181 return ret;
8182 }
8183
8184 /**
8185 * @brief Sensor hub output registers.[get]
8186 *
8187 * @param ctx Read / write interface definitions
8188 * @param val Structure of registers from SENSORHUB1_REG
8189 * @retval Interface status (MANDATORY: return 0 -> no Error).
8190 *
8191 */
lsm6dsm_sh_read_data_raw_get(const stmdev_ctx_t * ctx,lsm6dsm_emb_sh_read_t * val)8192 int32_t lsm6dsm_sh_read_data_raw_get(const stmdev_ctx_t *ctx,
8193 lsm6dsm_emb_sh_read_t *val)
8194 {
8195 int32_t ret;
8196
8197 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSORHUB1_REG,
8198 (uint8_t *) & (val->sh_byte_1), 12);
8199
8200 if (ret == 0)
8201 {
8202 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENSORHUB13_REG,
8203 (uint8_t *) & (val->sh_byte_13), 6);
8204 }
8205
8206 return ret;
8207 }
8208
8209 /**
8210 * @brief Master command code used for stamping for sensor sync.[set]
8211 *
8212 * @param ctx Read / write interface definitions
8213 * @param val Change the values of master_cmd_code in
8214 * reg MASTER_CMD_CODE
8215 * @retval Interface status (MANDATORY: return 0 -> no Error).
8216 *
8217 */
lsm6dsm_sh_cmd_sens_sync_set(const stmdev_ctx_t * ctx,uint8_t val)8218 int32_t lsm6dsm_sh_cmd_sens_sync_set(const stmdev_ctx_t *ctx, uint8_t val)
8219 {
8220 lsm6dsm_master_cmd_code_t master_cmd_code;
8221 int32_t ret;
8222
8223 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CMD_CODE,
8224 (uint8_t *)&master_cmd_code, 1);
8225
8226 if (ret == 0)
8227 {
8228 master_cmd_code.master_cmd_code = val;
8229 ret = lsm6dsm_write_reg(ctx, LSM6DSM_MASTER_CMD_CODE,
8230 (uint8_t *)&master_cmd_code, 1);
8231 }
8232
8233 return ret;
8234 }
8235
8236 /**
8237 * @brief Master command code used for stamping for sensor sync.[get]
8238 *
8239 * @param ctx Read / write interface definitions
8240 * @param val Change the values of master_cmd_code in
8241 * reg MASTER_CMD_CODE
8242 * @retval Interface status (MANDATORY: return 0 -> no Error).
8243 *
8244 */
lsm6dsm_sh_cmd_sens_sync_get(const stmdev_ctx_t * ctx,uint8_t * val)8245 int32_t lsm6dsm_sh_cmd_sens_sync_get(const stmdev_ctx_t *ctx, uint8_t *val)
8246 {
8247 lsm6dsm_master_cmd_code_t master_cmd_code;
8248 int32_t ret;
8249
8250 ret = lsm6dsm_read_reg(ctx, LSM6DSM_MASTER_CMD_CODE,
8251 (uint8_t *)&master_cmd_code, 1);
8252 *val = master_cmd_code.master_cmd_code;
8253
8254 return ret;
8255 }
8256
8257 /**
8258 * @brief Error code used for sensor synchronization.[set]
8259 *
8260 * @param ctx Read / write interface definitions
8261 * @param val Change the values of error_code in
8262 * reg SENS_SYNC_SPI_ERROR_CODE.
8263 * @retval Interface status (MANDATORY: return 0 -> no Error).
8264 *
8265 */
lsm6dsm_sh_spi_sync_error_set(const stmdev_ctx_t * ctx,uint8_t val)8266 int32_t lsm6dsm_sh_spi_sync_error_set(const stmdev_ctx_t *ctx, uint8_t val)
8267 {
8268 lsm6dsm_sens_sync_spi_error_code_t sens_sync_spi_error_code;
8269 int32_t ret;
8270
8271 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENS_SYNC_SPI_ERROR_CODE,
8272 (uint8_t *)&sens_sync_spi_error_code, 1);
8273
8274 if (ret == 0)
8275 {
8276 sens_sync_spi_error_code.error_code = val;
8277 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SENS_SYNC_SPI_ERROR_CODE,
8278 (uint8_t *)&sens_sync_spi_error_code, 1);
8279 }
8280
8281 return ret;
8282 }
8283
8284 /**
8285 * @brief Error code used for sensor synchronization.[get]
8286 *
8287 * @param ctx Read / write interface definitions
8288 * @param val Change the values of error_code in
8289 * reg SENS_SYNC_SPI_ERROR_CODE.
8290 * @retval Interface status (MANDATORY: return 0 -> no Error).
8291 *
8292 */
lsm6dsm_sh_spi_sync_error_get(const stmdev_ctx_t * ctx,uint8_t * val)8293 int32_t lsm6dsm_sh_spi_sync_error_get(const stmdev_ctx_t *ctx, uint8_t *val)
8294 {
8295 lsm6dsm_sens_sync_spi_error_code_t sens_sync_spi_error_code;
8296 int32_t ret;
8297
8298 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SENS_SYNC_SPI_ERROR_CODE,
8299 (uint8_t *)&sens_sync_spi_error_code, 1);
8300 *val = sens_sync_spi_error_code.error_code;
8301
8302 return ret;
8303 }
8304
8305 /**
8306 * @brief Number of external sensors to be read by the sensor hub.[set]
8307 *
8308 * @param ctx Read / write interface definitions
8309 * @param val Change the values of aux_sens_on in reg SLAVE0_CONFIG.
8310 * @retval Interface status (MANDATORY: return 0 -> no Error).
8311 *
8312 */
lsm6dsm_sh_num_of_dev_connected_set(const stmdev_ctx_t * ctx,lsm6dsm_aux_sens_on_t val)8313 int32_t lsm6dsm_sh_num_of_dev_connected_set(const stmdev_ctx_t *ctx,
8314 lsm6dsm_aux_sens_on_t val)
8315 {
8316 lsm6dsm_slave0_config_t slave0_config;
8317 int32_t ret;
8318
8319 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8320
8321 if (ret == 0)
8322 {
8323 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8324 (uint8_t *)&slave0_config, 1);
8325
8326 if (ret == 0)
8327 {
8328 slave0_config.aux_sens_on = (uint8_t) val;
8329 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8330 (uint8_t *)&slave0_config, 1);
8331
8332 if (ret == 0)
8333 {
8334 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8335 }
8336 }
8337 }
8338
8339 return ret;
8340 }
8341
8342 /**
8343 * @brief Number of external sensors to be read by the sensor hub.[get]
8344 *
8345 * @param ctx Read / write interface definitions
8346 * @param val Get the values of aux_sens_on in reg SLAVE0_CONFIG.
8347 * @retval Interface status (MANDATORY: return 0 -> no Error).
8348 *
8349 */
lsm6dsm_sh_num_of_dev_connected_get(const stmdev_ctx_t * ctx,lsm6dsm_aux_sens_on_t * val)8350 int32_t lsm6dsm_sh_num_of_dev_connected_get(const stmdev_ctx_t *ctx,
8351 lsm6dsm_aux_sens_on_t *val)
8352 {
8353 lsm6dsm_slave0_config_t slave0_config;
8354 int32_t ret;
8355
8356 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8357
8358 if (ret == 0)
8359 {
8360 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8361 (uint8_t *)&slave0_config, 1);
8362
8363 if (ret == 0)
8364 {
8365 switch (slave0_config.aux_sens_on)
8366 {
8367 case LSM6DSM_SLV_0:
8368 *val = LSM6DSM_SLV_0;
8369 break;
8370
8371 case LSM6DSM_SLV_0_1:
8372 *val = LSM6DSM_SLV_0_1;
8373 break;
8374
8375 case LSM6DSM_SLV_0_1_2:
8376 *val = LSM6DSM_SLV_0_1_2;
8377 break;
8378
8379 case LSM6DSM_SLV_0_1_2_3:
8380 *val = LSM6DSM_SLV_0_1_2_3;
8381 break;
8382
8383 default:
8384 *val = LSM6DSM_SLV_0;
8385 break;
8386 }
8387
8388 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8389 }
8390 }
8391
8392 return ret;
8393 }
8394
8395 /**
8396 * @brief Configure slave 0 for perform a write.[set]
8397 *
8398 * @param ctx Read / write interface definitions
8399 * @param val Structure that contain:
8400 * - uint8_t slv_add; 8 bit i2c device address
8401 * - uint8_t slv_subadd; 8 bit register device address
8402 * - uint8_t slv_data; 8 bit data to write
8403 * @retval Interface status (MANDATORY: return 0 -> no Error).
8404 *
8405 */
lsm6dsm_sh_cfg_write(const stmdev_ctx_t * ctx,lsm6dsm_sh_cfg_write_t * val)8406 int32_t lsm6dsm_sh_cfg_write(const stmdev_ctx_t *ctx,
8407 lsm6dsm_sh_cfg_write_t *val)
8408 {
8409 lsm6dsm_slv0_add_t slv0_add;
8410 int32_t ret;
8411
8412 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8413
8414 if (ret == 0)
8415 {
8416 slv0_add.slave0_add = val->slv0_add;
8417 slv0_add.rw_0 = 0;
8418 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV0_ADD, (uint8_t *)&slv0_add, 1);
8419
8420 if (ret == 0)
8421 {
8422 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV0_SUBADD,
8423 &(val->slv0_subadd), 1);
8424
8425 if (ret == 0)
8426 {
8427 ret = lsm6dsm_write_reg(ctx, LSM6DSM_DATAWRITE_SRC_MODE_SUB_SLV0,
8428 &(val->slv0_data), 1);
8429
8430 if (ret == 0)
8431 {
8432 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8433 }
8434 }
8435 }
8436 }
8437
8438 return ret;
8439 }
8440
8441 /**
8442 * @brief Configure slave 0 for perform a read.[get]
8443 *
8444 * @param ctx Read / write interface definitions
8445 * @param val Structure that contain:
8446 * - uint8_t slv_add; 8 bit i2c device address
8447 * - uint8_t slv_subadd; 8 bit register device address
8448 * - uint8_t slv_len; num of bit to read
8449 * @retval Interface status (MANDATORY: return 0 -> no Error).
8450 *
8451 */
lsm6dsm_sh_slv0_cfg_read(const stmdev_ctx_t * ctx,lsm6dsm_sh_cfg_read_t * val)8452 int32_t lsm6dsm_sh_slv0_cfg_read(const stmdev_ctx_t *ctx,
8453 lsm6dsm_sh_cfg_read_t *val)
8454 {
8455 lsm6dsm_slave0_config_t slave0_config;
8456 lsm6dsm_slv0_add_t slv0_add;
8457 int32_t ret;
8458
8459 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8460
8461 if (ret == 0)
8462 {
8463 slv0_add.slave0_add = val->slv_add;
8464 slv0_add.rw_0 = 1;
8465 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV0_ADD, (uint8_t *)&slv0_add, 1);
8466
8467 if (ret == 0)
8468 {
8469 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV0_SUBADD,
8470 &(val->slv_subadd), 1);
8471
8472 if (ret == 0)
8473 {
8474 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8475 (uint8_t *)&slave0_config, 1);
8476 slave0_config.slave0_numop = val->slv_len;
8477
8478 if (ret == 0)
8479 {
8480 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8481 (uint8_t *)&slave0_config, 1);
8482
8483 if (ret == 0)
8484 {
8485 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8486 }
8487 }
8488 }
8489 }
8490 }
8491
8492 return ret;
8493 }
8494
8495 /**
8496 * @brief Configure slave 1 for perform a read.[get]
8497 *
8498 * @param ctx Read / write interface definitions
8499 * @param val Structure that contain:
8500 * - uint8_t slv_add; 8 bit i2c device address
8501 * - uint8_t slv_subadd; 8 bit register device address
8502 * - uint8_t slv_len; num of bit to read
8503 * @retval Interface status (MANDATORY: return 0 -> no Error).
8504 *
8505 */
lsm6dsm_sh_slv1_cfg_read(const stmdev_ctx_t * ctx,lsm6dsm_sh_cfg_read_t * val)8506 int32_t lsm6dsm_sh_slv1_cfg_read(const stmdev_ctx_t *ctx,
8507 lsm6dsm_sh_cfg_read_t *val)
8508 {
8509 lsm6dsm_slave1_config_t slave1_config;
8510 lsm6dsm_slv1_add_t slv1_add;
8511 int32_t ret;
8512
8513 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8514
8515 if (ret == 0)
8516 {
8517 slv1_add.slave1_add = val->slv_add;
8518 slv1_add.r_1 = 1;
8519 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV1_ADD, (uint8_t *)&slv1_add, 1);
8520
8521 if (ret == 0)
8522 {
8523 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV1_SUBADD,
8524 &(val->slv_subadd), 1);
8525
8526 if (ret == 0)
8527 {
8528 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8529 (uint8_t *)&slave1_config, 1);
8530 slave1_config.slave1_numop = val->slv_len;
8531
8532 if (ret == 0)
8533 {
8534 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8535 (uint8_t *)&slave1_config, 1);
8536
8537 if (ret == 0)
8538 {
8539 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8540 }
8541 }
8542 }
8543 }
8544 }
8545
8546 return ret;
8547 }
8548
8549 /**
8550 * @brief Configure slave 2 for perform a read.[get]
8551 *
8552 * @param ctx Read / write interface definitions
8553 * @param val Structure that contain:
8554 * - uint8_t slv_add; 8 bit i2c device address
8555 * - uint8_t slv_subadd; 8 bit register device address
8556 * - uint8_t slv_len; num of bit to read
8557 * @retval Interface status (MANDATORY: return 0 -> no Error).
8558 *
8559 */
lsm6dsm_sh_slv2_cfg_read(const stmdev_ctx_t * ctx,lsm6dsm_sh_cfg_read_t * val)8560 int32_t lsm6dsm_sh_slv2_cfg_read(const stmdev_ctx_t *ctx,
8561 lsm6dsm_sh_cfg_read_t *val)
8562 {
8563 lsm6dsm_slv2_add_t slv2_add;
8564 lsm6dsm_slave2_config_t slave2_config;
8565 int32_t ret;
8566
8567 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8568
8569 if (ret == 0)
8570 {
8571 slv2_add.slave2_add = val->slv_add;
8572 slv2_add.r_2 = 1;
8573 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV2_ADD, (uint8_t *)&slv2_add, 1);
8574
8575 if (ret == 0)
8576 {
8577 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV2_SUBADD,
8578 &(val->slv_subadd), 1);
8579
8580 if (ret == 0)
8581 {
8582 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE2_CONFIG,
8583 (uint8_t *)&slave2_config, 1);
8584
8585 if (ret == 0)
8586 {
8587 slave2_config.slave2_numop = val->slv_len;
8588 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE2_CONFIG,
8589 (uint8_t *)&slave2_config, 1);
8590
8591 if (ret == 0)
8592 {
8593 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8594 }
8595 }
8596 }
8597 }
8598 }
8599
8600 return ret;
8601 }
8602
8603 /**
8604 * @brief Configure slave 3 for perform a read.[get]
8605 *
8606 * @param ctx Read / write interface definitions
8607 * @param val Structure that contain:
8608 * - uint8_t slv_add; 8 bit i2c device address
8609 * - uint8_t slv_subadd; 8 bit register device address
8610 * - uint8_t slv_len; num of bit to read
8611 * @retval Interface status (MANDATORY: return 0 -> no Error).
8612 *
8613 */
lsm6dsm_sh_slv3_cfg_read(const stmdev_ctx_t * ctx,lsm6dsm_sh_cfg_read_t * val)8614 int32_t lsm6dsm_sh_slv3_cfg_read(const stmdev_ctx_t *ctx,
8615 lsm6dsm_sh_cfg_read_t *val)
8616 {
8617 lsm6dsm_slave3_config_t slave3_config;
8618 lsm6dsm_slv3_add_t slv3_add;
8619 int32_t ret;
8620
8621 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8622
8623 if (ret == 0)
8624 {
8625 slv3_add.slave3_add = val->slv_add;
8626 slv3_add.r_3 = 1;
8627 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV3_ADD, (uint8_t *)&slv3_add, 1);
8628
8629 if (ret == 0)
8630 {
8631 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLV3_SUBADD,
8632 (uint8_t *) & (val->slv_subadd), 1);
8633
8634 if (ret == 0)
8635 {
8636 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE3_CONFIG,
8637 (uint8_t *)&slave3_config, 1);
8638
8639 if (ret == 0)
8640 {
8641 slave3_config.slave3_numop = val->slv_len;
8642 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE3_CONFIG,
8643 (uint8_t *)&slave3_config, 1);
8644
8645 if (ret == 0)
8646 {
8647 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8648 }
8649 }
8650 }
8651 }
8652 }
8653
8654 return ret;
8655 }
8656
8657 /**
8658 * @brief Decimation of read operation on Slave 0 starting from the
8659 * sensor hub trigger.[set]
8660 *
8661 * @param ctx Read / write interface definitions
8662 * @param val Change the values of slave0_rate in reg SLAVE0_CONFIG
8663 * @retval Interface status (MANDATORY: return 0 -> no Error).
8664 *
8665 */
lsm6dsm_sh_slave_0_dec_set(const stmdev_ctx_t * ctx,lsm6dsm_slave0_rate_t val)8666 int32_t lsm6dsm_sh_slave_0_dec_set(const stmdev_ctx_t *ctx,
8667 lsm6dsm_slave0_rate_t val)
8668 {
8669 lsm6dsm_slave0_config_t slave0_config;
8670 int32_t ret;
8671
8672 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8673
8674 if (ret == 0)
8675 {
8676 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8677 (uint8_t *)&slave0_config, 1);
8678
8679 if (ret == 0)
8680 {
8681 slave0_config.slave0_rate = (uint8_t) val;
8682 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8683 (uint8_t *)&slave0_config, 1);
8684
8685 if (ret == 0)
8686 {
8687 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8688 }
8689 }
8690 }
8691
8692 return ret;
8693 }
8694
8695 /**
8696 * @brief Decimation of read operation on Slave 0 starting from the
8697 * sensor hub trigger.[get]
8698 *
8699 * @param ctx Read / write interface definitions
8700 * @param val Get the values of slave0_rate in reg SLAVE0_CONFIG
8701 * @retval Interface status (MANDATORY: return 0 -> no Error).
8702 *
8703 */
lsm6dsm_sh_slave_0_dec_get(const stmdev_ctx_t * ctx,lsm6dsm_slave0_rate_t * val)8704 int32_t lsm6dsm_sh_slave_0_dec_get(const stmdev_ctx_t *ctx,
8705 lsm6dsm_slave0_rate_t *val)
8706 {
8707 lsm6dsm_slave0_config_t slave0_config;
8708 int32_t ret;
8709
8710 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8711
8712 if (ret == 0)
8713 {
8714 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE0_CONFIG,
8715 (uint8_t *)&slave0_config, 1);
8716
8717 if (ret == 0)
8718 {
8719 switch (slave0_config.slave0_rate)
8720 {
8721 case LSM6DSM_SL0_NO_DEC:
8722 *val = LSM6DSM_SL0_NO_DEC;
8723 break;
8724
8725 case LSM6DSM_SL0_DEC_2:
8726 *val = LSM6DSM_SL0_DEC_2;
8727 break;
8728
8729 case LSM6DSM_SL0_DEC_4:
8730 *val = LSM6DSM_SL0_DEC_4;
8731 break;
8732
8733 case LSM6DSM_SL0_DEC_8:
8734 *val = LSM6DSM_SL0_DEC_8;
8735 break;
8736
8737 default:
8738 *val = LSM6DSM_SL0_NO_DEC;
8739 break;
8740 }
8741
8742 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8743 }
8744 }
8745
8746 return ret;
8747 }
8748
8749 /**
8750 * @brief Slave 0 write operation is performed only at the first sensor
8751 * hub cycle.
8752 * This is effective if the Aux_sens_on[1:0] field in
8753 * SLAVE0_CONFIG(04h) is set to a value other than 00.[set]
8754 *
8755 * @param ctx Read / write interface definitions
8756 * @param val Change the values of write_once in reg SLAVE1_CONFIG
8757 * @retval Interface status (MANDATORY: return 0 -> no Error).
8758 *
8759 */
lsm6dsm_sh_write_mode_set(const stmdev_ctx_t * ctx,lsm6dsm_write_once_t val)8760 int32_t lsm6dsm_sh_write_mode_set(const stmdev_ctx_t *ctx,
8761 lsm6dsm_write_once_t val)
8762 {
8763 lsm6dsm_slave1_config_t slave1_config;
8764 int32_t ret;
8765
8766 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8767
8768 if (ret == 0)
8769 {
8770 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8771 (uint8_t *)&slave1_config, 1);
8772 slave1_config.write_once = (uint8_t) val;
8773
8774 if (ret == 0)
8775 {
8776 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8777 (uint8_t *)&slave1_config, 1);
8778
8779 if (ret == 0)
8780 {
8781 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8782 }
8783 }
8784 }
8785
8786 return ret;
8787 }
8788
8789 /**
8790 * @brief Slave 0 write operation is performed only at the first sensor
8791 * hub cycle.
8792 * This is effective if the Aux_sens_on[1:0] field in
8793 * SLAVE0_CONFIG(04h) is set to a value other than 00.[get]
8794 *
8795 * @param ctx Read / write interface definitions
8796 * @param val Get the values of write_once in reg SLAVE1_CONFIG
8797 * @retval Interface status (MANDATORY: return 0 -> no Error).
8798 *
8799 */
lsm6dsm_sh_write_mode_get(const stmdev_ctx_t * ctx,lsm6dsm_write_once_t * val)8800 int32_t lsm6dsm_sh_write_mode_get(const stmdev_ctx_t *ctx,
8801 lsm6dsm_write_once_t *val)
8802 {
8803 lsm6dsm_slave1_config_t slave1_config;
8804 int32_t ret;
8805
8806 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8807
8808 if (ret == 0)
8809 {
8810 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8811 (uint8_t *)&slave1_config, 1);
8812
8813 if (ret == 0)
8814 {
8815 switch (slave1_config.write_once)
8816 {
8817 case LSM6DSM_EACH_SH_CYCLE:
8818 *val = LSM6DSM_EACH_SH_CYCLE;
8819 break;
8820
8821 case LSM6DSM_ONLY_FIRST_CYCLE:
8822 *val = LSM6DSM_ONLY_FIRST_CYCLE;
8823 break;
8824
8825 default:
8826 *val = LSM6DSM_EACH_SH_CYCLE;
8827 break;
8828 }
8829
8830 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8831 }
8832 }
8833
8834 return ret;
8835 }
8836
8837 /**
8838 * @brief Decimation of read operation on Slave 1 starting from the
8839 * sensor hub trigger.[set]
8840 *
8841 * @param ctx Read / write interface definitions
8842 * @param val Change the values of slave1_rate in reg SLAVE1_CONFIG
8843 * @retval Interface status (MANDATORY: return 0 -> no Error).
8844 *
8845 */
lsm6dsm_sh_slave_1_dec_set(const stmdev_ctx_t * ctx,lsm6dsm_slave1_rate_t val)8846 int32_t lsm6dsm_sh_slave_1_dec_set(const stmdev_ctx_t *ctx,
8847 lsm6dsm_slave1_rate_t val)
8848 {
8849 lsm6dsm_slave1_config_t slave1_config;
8850 int32_t ret;
8851
8852 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8853
8854 if (ret == 0)
8855 {
8856 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8857 (uint8_t *)&slave1_config, 1);
8858
8859 if (ret == 0)
8860 {
8861 slave1_config.slave1_rate = (uint8_t) val;
8862 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8863 (uint8_t *)&slave1_config, 1);
8864
8865 if (ret == 0)
8866 {
8867 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8868 }
8869 }
8870 }
8871
8872 return ret;
8873 }
8874
8875 /**
8876 * @brief Decimation of read operation on Slave 1 starting from the
8877 * sensor hub trigger.[get]
8878 *
8879 * @param ctx Read / write interface definitions reg SLAVE1_CONFIG
8880 * @retval Interface status (MANDATORY: return 0 -> no Error).
8881 *
8882 */
lsm6dsm_sh_slave_1_dec_get(const stmdev_ctx_t * ctx,lsm6dsm_slave1_rate_t * val)8883 int32_t lsm6dsm_sh_slave_1_dec_get(const stmdev_ctx_t *ctx,
8884 lsm6dsm_slave1_rate_t *val)
8885 {
8886 lsm6dsm_slave1_config_t slave1_config;
8887 int32_t ret;
8888
8889 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8890
8891 if (ret == 0)
8892 {
8893 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE1_CONFIG,
8894 (uint8_t *)&slave1_config, 1);
8895
8896 if (ret == 0)
8897 {
8898 switch (slave1_config.slave1_rate)
8899 {
8900 case LSM6DSM_SL1_NO_DEC:
8901 *val = LSM6DSM_SL1_NO_DEC;
8902 break;
8903
8904 case LSM6DSM_SL1_DEC_2:
8905 *val = LSM6DSM_SL1_DEC_2;
8906 break;
8907
8908 case LSM6DSM_SL1_DEC_4:
8909 *val = LSM6DSM_SL1_DEC_4;
8910 break;
8911
8912 case LSM6DSM_SL1_DEC_8:
8913 *val = LSM6DSM_SL1_DEC_8;
8914 break;
8915
8916 default:
8917 *val = LSM6DSM_SL1_NO_DEC;
8918 break;
8919 }
8920
8921 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8922 }
8923 }
8924
8925 return ret;
8926 }
8927
8928 /**
8929 * @brief Decimation of read operation on Slave 2 starting from the
8930 * sensor hub trigger.[set]
8931 *
8932 * @param ctx Read / write interface definitions
8933 * @param val Change the values of slave2_rate in reg SLAVE2_CONFIG
8934 * @retval Interface status (MANDATORY: return 0 -> no Error).
8935 *
8936 */
lsm6dsm_sh_slave_2_dec_set(const stmdev_ctx_t * ctx,lsm6dsm_slave2_rate_t val)8937 int32_t lsm6dsm_sh_slave_2_dec_set(const stmdev_ctx_t *ctx,
8938 lsm6dsm_slave2_rate_t val)
8939 {
8940 lsm6dsm_slave2_config_t slave2_config;
8941 int32_t ret;
8942
8943 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8944
8945 if (ret == 0)
8946 {
8947 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE2_CONFIG,
8948 (uint8_t *)&slave2_config, 1);
8949
8950 if (ret == 0)
8951 {
8952 slave2_config.slave2_rate = (uint8_t) val;
8953 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE2_CONFIG,
8954 (uint8_t *)&slave2_config, 1);
8955
8956 if (ret == 0)
8957 {
8958 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
8959 }
8960 }
8961 }
8962
8963 return ret;
8964 }
8965
8966 /**
8967 * @brief Decimation of read operation on Slave 2 starting from the
8968 * sensor hub trigger.[get]
8969 *
8970 * @param ctx Read / write interface definitions
8971 * @param val Get the values of slave2_rate in reg SLAVE2_CONFIG
8972 * @retval Interface status (MANDATORY: return 0 -> no Error).
8973 *
8974 */
lsm6dsm_sh_slave_2_dec_get(const stmdev_ctx_t * ctx,lsm6dsm_slave2_rate_t * val)8975 int32_t lsm6dsm_sh_slave_2_dec_get(const stmdev_ctx_t *ctx,
8976 lsm6dsm_slave2_rate_t *val)
8977 {
8978 lsm6dsm_slave2_config_t slave2_config;
8979 int32_t ret;
8980
8981 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
8982
8983 if (ret == 0)
8984 {
8985 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE2_CONFIG,
8986 (uint8_t *)&slave2_config, 1);
8987
8988 if (ret == 0)
8989 {
8990 switch (slave2_config.slave2_rate)
8991 {
8992 case LSM6DSM_SL2_NO_DEC:
8993 *val = LSM6DSM_SL2_NO_DEC;
8994 break;
8995
8996 case LSM6DSM_SL2_DEC_2:
8997 *val = LSM6DSM_SL2_DEC_2;
8998 break;
8999
9000 case LSM6DSM_SL2_DEC_4:
9001 *val = LSM6DSM_SL2_DEC_4;
9002 break;
9003
9004 case LSM6DSM_SL2_DEC_8:
9005 *val = LSM6DSM_SL2_DEC_8;
9006 break;
9007
9008 default:
9009 *val = LSM6DSM_SL2_NO_DEC;
9010 break;
9011 }
9012
9013 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
9014 }
9015 }
9016
9017 return ret;
9018 }
9019
9020 /**
9021 * @brief Decimation of read operation on Slave 3 starting from the
9022 * sensor hub trigger.[set]
9023 *
9024 * @param ctx Read / write interface definitions
9025 * @param val Change the values of slave3_rate in reg SLAVE3_CONFIG
9026 * @retval Interface status (MANDATORY: return 0 -> no Error).
9027 *
9028 */
lsm6dsm_sh_slave_3_dec_set(const stmdev_ctx_t * ctx,lsm6dsm_slave3_rate_t val)9029 int32_t lsm6dsm_sh_slave_3_dec_set(const stmdev_ctx_t *ctx,
9030 lsm6dsm_slave3_rate_t val)
9031 {
9032 lsm6dsm_slave3_config_t slave3_config;
9033 int32_t ret;
9034
9035 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
9036
9037 if (ret == 0)
9038 {
9039 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE3_CONFIG,
9040 (uint8_t *)&slave3_config, 1);
9041 slave3_config.slave3_rate = (uint8_t)val;
9042
9043 if (ret == 0)
9044 {
9045 ret = lsm6dsm_write_reg(ctx, LSM6DSM_SLAVE3_CONFIG,
9046 (uint8_t *)&slave3_config, 1);
9047
9048 if (ret == 0)
9049 {
9050 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
9051 }
9052 }
9053 }
9054
9055 return ret;
9056 }
9057
9058 /**
9059 * @brief Decimation of read operation on Slave 3 starting from the
9060 * sensor hub trigger.[get]
9061 *
9062 * @param ctx Read / write interface definitions
9063 * @param val Get the values of slave3_rate in reg SLAVE3_CONFIG.
9064 * @retval Interface status (MANDATORY: return 0 -> no Error).
9065 *
9066 */
lsm6dsm_sh_slave_3_dec_get(const stmdev_ctx_t * ctx,lsm6dsm_slave3_rate_t * val)9067 int32_t lsm6dsm_sh_slave_3_dec_get(const stmdev_ctx_t *ctx,
9068 lsm6dsm_slave3_rate_t *val)
9069 {
9070 lsm6dsm_slave3_config_t slave3_config;
9071 int32_t ret;
9072
9073 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_BANK_A);
9074
9075 if (ret == 0)
9076 {
9077 ret = lsm6dsm_read_reg(ctx, LSM6DSM_SLAVE3_CONFIG,
9078 (uint8_t *)&slave3_config, 1);
9079
9080 if (ret == 0)
9081 {
9082 switch (slave3_config.slave3_rate)
9083 {
9084 case LSM6DSM_SL3_NO_DEC:
9085 *val = LSM6DSM_SL3_NO_DEC;
9086 break;
9087
9088 case LSM6DSM_SL3_DEC_2:
9089 *val = LSM6DSM_SL3_DEC_2;
9090 break;
9091
9092 case LSM6DSM_SL3_DEC_4:
9093 *val = LSM6DSM_SL3_DEC_4;
9094 break;
9095
9096 case LSM6DSM_SL3_DEC_8:
9097 *val = LSM6DSM_SL3_DEC_8;
9098 break;
9099
9100 default:
9101 *val = LSM6DSM_SL3_NO_DEC;
9102 break;
9103 }
9104
9105 ret = lsm6dsm_mem_bank_set(ctx, LSM6DSM_USER_BANK);
9106 }
9107 }
9108
9109 return ret;
9110 }
9111
9112 /**
9113 * @}
9114 *
9115 */
9116
9117 /**
9118 * @}
9119 *
9120 */
9121
9122 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
9123