1 /**
2 ******************************************************************************
3 * @file l3gd20h_reg.c
4 * @author Sensors Software Solution Team
5 * @brief L3GD20H 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 "l3gd20h_reg.h"
21
22 /**
23 * @defgroup L3GD20H
24 * @brief This file provides a set of functions needed to drive the
25 * l3gd20h enhanced inertial module.
26 * @{
27 *
28 */
29
30 /**
31 * @defgroup L3GD20H_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 */
l3gd20h_read_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)49 int32_t __weak l3gd20h_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 */
l3gd20h_write_reg(const stmdev_ctx_t * ctx,uint8_t reg,uint8_t * data,uint16_t len)75 int32_t __weak l3gd20h_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 L3GD20H_Sensitivity
98 * @brief These functions convert raw-data into engineering units.
99 * @{
100 *
101 */
102
l3gd20h_from_fs245_to_mdps(int16_t lsb)103 float_t l3gd20h_from_fs245_to_mdps(int16_t lsb)
104 {
105 return ((float_t)lsb * 8.75f);
106 }
107
l3gd20h_from_fs500_to_mdps(int16_t lsb)108 float_t l3gd20h_from_fs500_to_mdps(int16_t lsb)
109 {
110 return ((float_t)lsb * 17.50f);
111 }
112
l3gd20h_from_fs2000_to_mdps(int16_t lsb)113 float_t l3gd20h_from_fs2000_to_mdps(int16_t lsb)
114 {
115 return ((float_t)lsb * 70.0f);
116 }
117
l3gd20h_from_lsb_to_celsius(int16_t lsb)118 float_t l3gd20h_from_lsb_to_celsius(int16_t lsb)
119 {
120 return ((float_t)lsb + 25.0f);
121 }
122 /**
123 * @}
124 *
125 */
126
127 /**
128 * @defgroup L3GD20H_Datageneration
129 * @brief This section groups all the functions concerning data generation.
130 * @{
131 *
132 */
133
134 /**
135 * @brief Enable gyroscope axis.[set]
136 *
137 * @param ctx Read / write interface definitions.(ptr)
138 * @param val Gyroscope’s pitch axis (X) output enable..
139 * @retval Interface status (MANDATORY: return 0 -> no Error).
140 *
141 */
l3gd20h_gy_axis_set(const stmdev_ctx_t * ctx,l3gd20h_gy_axis_t val)142 int32_t l3gd20h_gy_axis_set(const stmdev_ctx_t *ctx, l3gd20h_gy_axis_t val)
143 {
144 l3gd20h_ctrl1_t ctrl1;
145 int32_t ret;
146 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
147
148 if (ret == 0)
149 {
150 ctrl1.xen = val.xen;
151 ctrl1.yen = val.yen;
152 ctrl1.zen = val.zen;
153 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
154 }
155
156 return ret;
157 }
158
159 /**
160 * @brief Enable gyroscope axis.[get]
161 *
162 * @param ctx Read / write interface definitions.(ptr)
163 * @param val Gyroscope’s pitch axis (X) output enable..(ptr)
164 * @retval Interface status (MANDATORY: return 0 -> no Error).
165 *
166 */
l3gd20h_gy_axis_get(const stmdev_ctx_t * ctx,l3gd20h_gy_axis_t * val)167 int32_t l3gd20h_gy_axis_get(const stmdev_ctx_t *ctx, l3gd20h_gy_axis_t *val)
168 {
169 l3gd20h_ctrl1_t ctrl1;
170 int32_t ret;
171 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
172 val->xen = ctrl1.xen;
173 val->yen = ctrl1.yen;
174 val->zen = ctrl1.zen;
175
176 return ret;
177 }
178
179 /**
180 * @brief Gyroscope data rate selection..[set]
181 *
182 * @param ctx Read / write interface definitions.(ptr)
183 * @param val Change the values of "pd" in reg L3GD20H.
184 * @retval Interface status (MANDATORY: return 0 -> no Error).
185 *
186 */
l3gd20h_gy_data_rate_set(const stmdev_ctx_t * ctx,l3gd20h_gy_data_rate_t val)187 int32_t l3gd20h_gy_data_rate_set(const stmdev_ctx_t *ctx,
188 l3gd20h_gy_data_rate_t val)
189 {
190 l3gd20h_low_odr_t low_odr;
191 l3gd20h_ctrl1_t ctrl1;
192 int32_t ret;
193 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
194
195 if (ret == 0)
196 {
197 ctrl1.pd = ((uint8_t)val & 0x80U) >> 7;
198 ctrl1.dr = (uint8_t)val & 0x07U;
199 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
200 }
201
202 if (ret == 0)
203 {
204 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
205 }
206
207 if (ret == 0)
208 {
209 low_odr.low_odr = ((uint8_t)val & 0x10U) >> 4;
210 ret = l3gd20h_write_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
211 }
212
213 return ret;
214 }
215
216 /**
217 * @brief Gyroscope data rate selection..[get]
218 *
219 * @param ctx Read / write interface definitions.(ptr)
220 * @param val Get the values of pd in reg CTRL1.(ptr)
221 * @retval Interface status (MANDATORY: return 0 -> no Error).
222 *
223 */
l3gd20h_gy_data_rate_get(const stmdev_ctx_t * ctx,l3gd20h_gy_data_rate_t * val)224 int32_t l3gd20h_gy_data_rate_get(const stmdev_ctx_t *ctx,
225 l3gd20h_gy_data_rate_t *val)
226 {
227 l3gd20h_low_odr_t low_odr;
228 l3gd20h_ctrl1_t ctrl1;
229 int32_t ret;
230 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
231
232 if (ret == 0)
233 {
234 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
235 }
236
237 switch ((ctrl1.pd << 7) + (low_odr.low_odr << 4) + ctrl1.dr)
238 {
239 case L3GD20H_POWER_DOWN:
240 *val = L3GD20H_POWER_DOWN;
241 break;
242
243 case L3GD20H_12Hz5:
244 *val = L3GD20H_12Hz5;
245 break;
246
247 case L3GD20H_25Hz:
248 *val = L3GD20H_25Hz;
249 break;
250
251 case L3GD20H_50Hz:
252 *val = L3GD20H_50Hz;
253 break;
254
255 case L3GD20H_100Hz:
256 *val = L3GD20H_100Hz;
257 break;
258
259 case L3GD20H_200Hz:
260 *val = L3GD20H_200Hz;
261 break;
262
263 case L3GD20H_400Hz:
264 *val = L3GD20H_400Hz;
265 break;
266
267 case L3GD20H_800Hz:
268 *val = L3GD20H_800Hz;
269 break;
270
271 default:
272 *val = L3GD20H_POWER_DOWN;
273 break;
274 }
275
276 return ret;
277 }
278
279 /**
280 * @brief Gyroscope full-scale selection..[set]
281 *
282 * @param ctx Read / write interface definitions.(ptr)
283 * @param val Change the values of "fs" in reg L3GD20H.
284 * @retval Interface status (MANDATORY: return 0 -> no Error).
285 *
286 */
l3gd20h_gy_full_scale_set(const stmdev_ctx_t * ctx,l3gd20h_gy_fs_t val)287 int32_t l3gd20h_gy_full_scale_set(const stmdev_ctx_t *ctx,
288 l3gd20h_gy_fs_t val)
289 {
290 l3gd20h_ctrl4_t ctrl4;
291 int32_t ret;
292 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
293
294 if (ret == 0)
295 {
296 ctrl4.fs = (uint8_t)val;
297 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
298 }
299
300 return ret;
301 }
302
303 /**
304 * @brief Gyroscope full-scale selection..[get]
305 *
306 * @param ctx Read / write interface definitions.(ptr)
307 * @param val Get the values of fs in reg CTRL4.(ptr)
308 * @retval Interface status (MANDATORY: return 0 -> no Error).
309 *
310 */
l3gd20h_gy_full_scale_get(const stmdev_ctx_t * ctx,l3gd20h_gy_fs_t * val)311 int32_t l3gd20h_gy_full_scale_get(const stmdev_ctx_t *ctx,
312 l3gd20h_gy_fs_t *val)
313 {
314 l3gd20h_ctrl4_t ctrl4;
315 int32_t ret;
316 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
317
318 switch (ctrl4.fs)
319 {
320 case L3GD20H_245dps:
321 *val = L3GD20H_245dps;
322 break;
323
324 case L3GD20H_500dps:
325 *val = L3GD20H_500dps;
326 break;
327
328 default:
329 *val = L3GD20H_245dps;
330 break;
331 }
332
333 return ret;
334 }
335 /**
336 * @brief Block data update.[set]
337 *
338 * @param ctx Read / write interface definitions.(ptr)
339 * @param val Change the values of bdu in reg CTRL4.
340 * @retval Interface status (MANDATORY: return 0 -> no Error).
341 *
342 */
l3gd20h_block_data_update_set(const stmdev_ctx_t * ctx,uint8_t val)343 int32_t l3gd20h_block_data_update_set(const stmdev_ctx_t *ctx, uint8_t val)
344 {
345 l3gd20h_ctrl4_t ctrl4;
346 int32_t ret;
347 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
348
349 if (ret == 0)
350 {
351 ctrl4.bdu = val;
352 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
353 }
354
355 return ret;
356 }
357
358 /**
359 * @brief Blockdataupdate.[get]
360 *
361 * @param ctx Read / write interface definitions.(ptr)
362 * @param val Get the values of bdu in reg CTRL4.(ptr)
363 * @retval Interface status (MANDATORY: return 0 -> no Error).
364 *
365 */
l3gd20h_block_data_update_get(const stmdev_ctx_t * ctx,uint8_t * val)366 int32_t l3gd20h_block_data_update_get(const stmdev_ctx_t *ctx, uint8_t *val)
367 {
368 l3gd20h_ctrl4_t ctrl4;
369 int32_t ret;
370 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
371 *val = ctrl4.bdu;
372
373 return ret;
374 }
375 /**
376 * @brief Gyroscope new data available..[get]
377 *
378 * @param ctx Read / write interface definitions.(ptr)
379 * @param val Iet the values of "zyxda" in reg STATUS.(ptr)
380 * @retval Interface status (MANDATORY: return 0 -> no Error).
381 *
382 */
l3gd20h_gy_flag_data_ready_get(const stmdev_ctx_t * ctx,uint8_t * val)383 int32_t l3gd20h_gy_flag_data_ready_get(const stmdev_ctx_t *ctx,
384 uint8_t *val)
385 {
386 l3gd20h_status_t status;
387 int32_t ret;
388 ret = l3gd20h_read_reg(ctx, L3GD20H_STATUS, (uint8_t *)&status, 1);
389 *val = status.zyxda;
390
391 return ret;
392 }
393
394 /**
395 * @}
396 *
397 */
398
399 /**
400 * @defgroup L3GD20H_Dataoutput
401 * @brief This section groups all the data output functions.
402 * @{
403 *
404 */
405
406 /**
407 * @brief Temperature data output register (r). L and H registers together
408 * express a 16-bit word in two’s complement..[get]
409 *
410 * @param ctx Read / write interface definitions.(ptr)
411 * @param buff Buffer that stores the data read.(ptr)
412 * @retval Interface status (MANDATORY: return 0 -> no Error).
413 *
414 */
l3gd20h_temperature_raw_get(const stmdev_ctx_t * ctx,uint8_t * buff)415 int32_t l3gd20h_temperature_raw_get(const stmdev_ctx_t *ctx, uint8_t *buff)
416 {
417 int32_t ret;
418 ret = l3gd20h_read_reg(ctx, L3GD20H_OUT_TEMP, buff, 1);
419
420 return ret;
421 }
422
423 /**
424 * @brief Angular rate sensor. The value is expressed as a 16-bit
425 * word in two’s complement..[get]
426 *
427 * @param ctx Read / write interface definitions.(ptr)
428 * @param buff Buffer that stores the data read.(ptr)
429 * @retval Interface status (MANDATORY: return 0 -> no Error).
430 *
431 */
l3gd20h_angular_rate_raw_get(const stmdev_ctx_t * ctx,int16_t * val)432 int32_t l3gd20h_angular_rate_raw_get(const stmdev_ctx_t *ctx, int16_t *val)
433 {
434 uint8_t buff[6];
435 int32_t ret;
436 ret = l3gd20h_read_reg(ctx, L3GD20H_OUT_X_L, buff, 6);
437 val[0] = (int16_t)buff[1];
438 val[0] = (val[0] * 256) + (int16_t)buff[0];
439 val[1] = (int16_t)buff[3];
440 val[1] = (val[1] * 256) + (int16_t)buff[2];
441 val[2] = (int16_t)buff[5];
442 val[2] = (val[2] * 256) + (int16_t)buff[4];
443
444 return ret;
445 }
446
447 /**
448 * @}
449 *
450 */
451
452 /**
453 * @defgroup L3GD20H_Common
454 * @brief This section groups common useful functions.
455 * @{
456 *
457 */
458
459 /**
460 * @brief DeviceWhoamI..[get]
461 *
462 * @param ctx Read / write interface definitions.(ptr)
463 * @param buff Buffer that stores the data read.(ptr)
464 * @retval Interface status (MANDATORY: return 0 -> no Error).
465 *
466 */
l3gd20h_dev_id_get(const stmdev_ctx_t * ctx,uint8_t * buff)467 int32_t l3gd20h_dev_id_get(const stmdev_ctx_t *ctx, uint8_t *buff)
468 {
469 int32_t ret;
470 ret = l3gd20h_read_reg(ctx, L3GD20H_WHO_AM_I, buff, 1);
471
472 return ret;
473 }
474
475 /**
476 * @brief Big/Little Endian data selection..[set]
477 *
478 * @param ctx Read / write interface definitions.(ptr)
479 * @param val Change the values of "ble" in reg L3GD20H.
480 * @retval Interface status (MANDATORY: return 0 -> no Error).
481 *
482 */
l3gd20h_dev_data_format_set(const stmdev_ctx_t * ctx,l3gd20h_ble_t val)483 int32_t l3gd20h_dev_data_format_set(const stmdev_ctx_t *ctx,
484 l3gd20h_ble_t val)
485 {
486 l3gd20h_ctrl4_t ctrl4;
487 int32_t ret;
488 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
489
490 if (ret == 0)
491 {
492 ctrl4.ble = (uint8_t)val;
493 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
494 }
495
496 return ret;
497 }
498
499 /**
500 * @brief Big/Little Endian data selection..[get]
501 *
502 * @param ctx Read / write interface definitions.(ptr)
503 * @param val Get the values of ble in reg CTRL4.(ptr)
504 * @retval Interface status (MANDATORY: return 0 -> no Error).
505 *
506 */
l3gd20h_dev_data_format_get(const stmdev_ctx_t * ctx,l3gd20h_ble_t * val)507 int32_t l3gd20h_dev_data_format_get(const stmdev_ctx_t *ctx,
508 l3gd20h_ble_t *val)
509 {
510 l3gd20h_ctrl4_t ctrl4;
511 int32_t ret;
512 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
513
514 switch (ctrl4.ble)
515 {
516 case L3GD20H_LSB_LOW_ADDRESS:
517 *val = L3GD20H_LSB_LOW_ADDRESS;
518 break;
519
520 case L3GD20H_MSB_LOW_ADDRESS:
521 *val = L3GD20H_MSB_LOW_ADDRESS;
522 break;
523
524 default:
525 *val = L3GD20H_LSB_LOW_ADDRESS;
526 break;
527 }
528
529 return ret;
530 }
531
532 /**
533 * @brief Reboot memory content. Reload the calibration parameters..[set]
534 *
535 * @param ctx Read / write interface definitions.(ptr)
536 * @param val Change the values of boot in reg CTRL5.
537 * @retval Interface status (MANDATORY: return 0 -> no Error).
538 *
539 */
l3gd20h_dev_boot_set(const stmdev_ctx_t * ctx,uint8_t val)540 int32_t l3gd20h_dev_boot_set(const stmdev_ctx_t *ctx, uint8_t val)
541 {
542 l3gd20h_ctrl5_t ctrl5;
543 int32_t ret;
544 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
545
546 if (ret == 0)
547 {
548 ctrl5.boot = val;
549 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
550 }
551
552 return ret;
553 }
554
555 /**
556 * @brief Reboot memory content. Reload the calibration parameters..[get]
557 *
558 * @param ctx Read / write interface definitions.(ptr)
559 * @param val Get the values of boot in reg CTRL5.(ptr)
560 * @retval Interface status (MANDATORY: return 0 -> no Error).
561 *
562 */
l3gd20h_dev_boot_get(const stmdev_ctx_t * ctx,uint8_t * val)563 int32_t l3gd20h_dev_boot_get(const stmdev_ctx_t *ctx, uint8_t *val)
564 {
565 l3gd20h_ctrl5_t ctrl5;
566 int32_t ret;
567 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
568 *val = ctrl5.boot;
569
570 return ret;
571 }
572 /**
573 * @brief Device status register.[get]
574 *
575 * @param ctx Read / write interface definitions.(ptr)
576 * @param val X axis new data available..(ptr)
577 * @retval Interface status (MANDATORY: return 0 -> no Error).
578 *
579 */
l3gd20h_dev_status_get(const stmdev_ctx_t * ctx,l3gd20h_status_reg_t * val)580 int32_t l3gd20h_dev_status_get(const stmdev_ctx_t *ctx,
581 l3gd20h_status_reg_t *val)
582 {
583 l3gd20h_status_t status;
584 int32_t ret;
585 ret = l3gd20h_read_reg(ctx, L3GD20H_STATUS, (uint8_t *)&status, 1);
586 val->xda = status.xda;
587 val->yda = status.yda;
588 val->zda = status.zda;
589 val->zyxda = status.zyxda;
590 val->_xor = status._xor;
591 val->yor = status.yor;
592 val->zor = status.zor;
593 val->zyxor = status.zyxor;
594
595 return ret;
596 }
597
598 /**
599 * @brief Software reset. Restore the default values in user registers.[set]
600 *
601 * @param ctx Read / write interface definitions.(ptr)
602 * @param val Change the values of sw_res in reg LOW_ODR.
603 * @retval Interface status (MANDATORY: return 0 -> no Error).
604 *
605 */
l3gd20h_dev_reset_set(const stmdev_ctx_t * ctx,uint8_t val)606 int32_t l3gd20h_dev_reset_set(const stmdev_ctx_t *ctx, uint8_t val)
607 {
608 l3gd20h_low_odr_t low_odr;
609 int32_t ret;
610 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
611
612 if (ret == 0)
613 {
614 low_odr.sw_res = val;
615 ret = l3gd20h_write_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
616 }
617
618 return ret;
619 }
620
621 /**
622 * @brief Software reset. Restore the default values in user registers.get]
623 *
624 * @param ctx Read / write interface definitions.(ptr)
625 * @param val Get the values of sw_res in reg LOW_ODR.(ptr)
626 * @retval Interface status (MANDATORY: return 0 -> no Error).
627 *
628 */
l3gd20h_dev_reset_get(const stmdev_ctx_t * ctx,uint8_t * val)629 int32_t l3gd20h_dev_reset_get(const stmdev_ctx_t *ctx, uint8_t *val)
630 {
631 l3gd20h_low_odr_t low_odr;
632 int32_t ret;
633 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
634 *val = low_odr.sw_res;
635
636 return ret;
637 }
638
639 /**
640 * @}
641 *
642 */
643
644 /**
645 * @defgroup L3GD20H_Filters
646 * @brief This section group all the functions concerning the
647 * filters configuration.
648 * @{
649 *
650 */
651
652 /**
653 * @brief Low pass filter cutoff frequency.[set]
654 *
655 * @param ctx Read / write interface definitions.(ptr)
656 * @param val Change the values of "bw" in reg L3GD20H.
657 * @retval Interface status (MANDATORY: return 0 -> no Error).
658 *
659 */
l3gd20h_gy_filter_lp_bandwidth_set(const stmdev_ctx_t * ctx,l3gd20h_lpbw_t val)660 int32_t l3gd20h_gy_filter_lp_bandwidth_set(const stmdev_ctx_t *ctx,
661 l3gd20h_lpbw_t val)
662 {
663 l3gd20h_ctrl1_t ctrl1;
664 int32_t ret;
665 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
666
667 if (ret == 0)
668 {
669 ctrl1.bw = (uint8_t)val;
670 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
671 }
672
673 return ret;
674 }
675
676 /**
677 * @brief Low pass filter cutoff frequency.[get]
678 *
679 * @param ctx Read / write interface definitions.(ptr)
680 * @param val Get the values of bw in reg CTRL1.(ptr)
681 * @retval Interface status (MANDATORY: return 0 -> no Error).
682 *
683 */
l3gd20h_gy_filter_lp_bandwidth_get(const stmdev_ctx_t * ctx,l3gd20h_lpbw_t * val)684 int32_t l3gd20h_gy_filter_lp_bandwidth_get(const stmdev_ctx_t *ctx,
685 l3gd20h_lpbw_t *val)
686 {
687 l3gd20h_low_odr_t low_odr;
688 l3gd20h_ctrl1_t ctrl1;
689 int32_t ret;
690 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL1, (uint8_t *)&ctrl1, 1);
691
692 if (ret == 0)
693 {
694 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
695 }
696
697 switch ((low_odr.low_odr << 7) + (ctrl1.dr << 4) + ctrl1.bw)
698 {
699 case L3GD20H_16Hz6_USE_ODR_50Hz:
700 *val = L3GD20H_16Hz6_USE_ODR_50Hz;
701 break;
702
703 case L3GD20H_12Hz5_USE_ODR_100Hz:
704 *val = L3GD20H_12Hz5_USE_ODR_100Hz;
705 break;
706
707 case L3GD20H_25Hz_USE_ODR_100Hz:
708 *val = L3GD20H_25Hz_USE_ODR_100Hz;
709 break;
710
711 case L3GD20H_12Hz5_USE_ODR_200Hz:
712 *val = L3GD20H_12Hz5_USE_ODR_200Hz;
713 break;
714
715 case L3GD20H_70Hz_USE_ODR_200Hz:
716 *val = L3GD20H_70Hz_USE_ODR_200Hz;
717 break;
718
719 case L3GD20H_20Hz_USE_ODR_400Hz:
720 *val = L3GD20H_20Hz_USE_ODR_400Hz;
721 break;
722
723 case L3GD20H_25Hz_USE_ODR_400Hz:
724 *val = L3GD20H_25Hz_USE_ODR_400Hz;
725 break;
726
727 case L3GD20H_50Hz_USE_ODR_400Hz:
728 *val = L3GD20H_50Hz_USE_ODR_400Hz;
729 break;
730
731 case L3GD20H_110Hz_USE_ODR_400Hz:
732 *val = L3GD20H_110Hz_USE_ODR_400Hz;
733 break;
734
735 case L3GD20H_30Hz_USE_ODR_800Hz:
736 *val = L3GD20H_30Hz_USE_ODR_800Hz;
737 break;
738
739 case L3GD20H_35Hz_USE_ODR_800Hz:
740 *val = L3GD20H_35Hz_USE_ODR_800Hz;
741 break;
742
743 case L3GD20H_100Hz_USE_ODR_800Hz:
744 *val = L3GD20H_100Hz_USE_ODR_800Hz;
745 break;
746
747 default:
748 *val = L3GD20H_16Hz6_USE_ODR_50Hz;
749 break;
750 }
751
752 return ret;
753 }
754
755 /**
756 * @brief Gyroscope high-pass filter bandwidth selection..[set]
757 *
758 * @param ctx Read / write interface definitions.(ptr)
759 * @param val Change the values of "hpcf" in reg L3GD20H.
760 * @retval Interface status (MANDATORY: return 0 -> no Error).
761 *
762 */
l3gd20h_gy_filter_hp_bandwidth_set(const stmdev_ctx_t * ctx,l3gd20h_gy_hp_bw_t val)763 int32_t l3gd20h_gy_filter_hp_bandwidth_set(const stmdev_ctx_t *ctx,
764 l3gd20h_gy_hp_bw_t val)
765 {
766 l3gd20h_ctrl2_t ctrl2;
767 int32_t ret;
768 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
769
770 if (ret == 0)
771 {
772 ctrl2.hpcf = (uint8_t)val & 0x03U;
773 ctrl2.hpm = ((uint8_t)val & 0x30U) >> 4;
774 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
775 }
776
777 return ret;
778 }
779
780 /**
781 * @brief Gyroscope high-pass filter bandwidth selection..[get]
782 *
783 * @param ctx Read / write interface definitions.(ptr)
784 * @param val Get the values of hpcf in reg CTRL2.(ptr)
785 * @retval Interface status (MANDATORY: return 0 -> no Error).
786 *
787 */
l3gd20h_gy_filter_hp_bandwidth_get(const stmdev_ctx_t * ctx,l3gd20h_gy_hp_bw_t * val)788 int32_t l3gd20h_gy_filter_hp_bandwidth_get(const stmdev_ctx_t *ctx,
789 l3gd20h_gy_hp_bw_t *val)
790 {
791 l3gd20h_ctrl2_t ctrl2;
792 int32_t ret;
793 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
794
795 if (ret == 0)
796 {
797 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
798 }
799
800 switch ((ctrl2.hpm << 4) + ctrl2.hpcf)
801 {
802 case L3GD20H_NORMAL_MODE_LIGHT:
803 *val = L3GD20H_NORMAL_MODE_LIGHT;
804 break;
805
806 case L3GD20H_NORMAL_MODE_NORMAL:
807 *val = L3GD20H_NORMAL_MODE_NORMAL;
808 break;
809
810 case L3GD20H_NORMAL_MODE_STRONG:
811 *val = L3GD20H_NORMAL_MODE_STRONG;
812 break;
813
814 case L3GD20H_NORMAL_MODE_EXTREME:
815 *val = L3GD20H_NORMAL_MODE_EXTREME;
816 break;
817
818 case L3GD20H_USE_REFERENCE_LIGHT:
819 *val = L3GD20H_USE_REFERENCE_LIGHT;
820 break;
821
822 case L3GD20H_USE_REFERENCE_NORMAL:
823 *val = L3GD20H_USE_REFERENCE_NORMAL;
824 break;
825
826 case L3GD20H_USE_REFERENCE_STRONG:
827 *val = L3GD20H_USE_REFERENCE_STRONG;
828 break;
829
830 case L3GD20H_USE_REFERENCE_EXTREME:
831 *val = L3GD20H_USE_REFERENCE_EXTREME;
832 break;
833
834 case L3GD20H_AUTORESET_LIGHT:
835 *val = L3GD20H_AUTORESET_LIGHT;
836 break;
837
838 case L3GD20H_AUTORESET_NORMAL:
839 *val = L3GD20H_AUTORESET_NORMAL;
840 break;
841
842 case L3GD20H_AUTORESET_STRONG:
843 *val = L3GD20H_AUTORESET_STRONG;
844 break;
845
846 case L3GD20H_AUTORESET_EXTREME:
847 *val = L3GD20H_AUTORESET_EXTREME;
848 break;
849
850 default:
851 *val = L3GD20H_NORMAL_MODE_LIGHT;
852 break;
853 }
854
855 return ret;
856 }
857
858 /**
859 * @brief Gyro output filter path configuration..[set]
860 *
861 * @param ctx Read / write interface definitions.(ptr)
862 * @param val Change the values of "out_sel" in reg L3GD20H.
863 * @retval Interface status (MANDATORY: return 0 -> no Error).
864 *
865 */
l3gd20h_gy_filter_out_path_set(const stmdev_ctx_t * ctx,l3gd20h_gy_out_path_t val)866 int32_t l3gd20h_gy_filter_out_path_set(const stmdev_ctx_t *ctx,
867 l3gd20h_gy_out_path_t val)
868 {
869 l3gd20h_ctrl5_t ctrl5;
870 int32_t ret;
871 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
872
873 if (ret == 0)
874 {
875 ctrl5.out_sel = (uint8_t)val & 0x03U;
876 ctrl5.hpen = ((uint8_t)val & 0x10U) >> 4;
877 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
878 }
879
880 return ret;
881 }
882
883 /**
884 * @brief Gyro output filter path configuration..[get]
885 *
886 * @param ctx Read / write interface definitions.(ptr)
887 * @param val Get the values of out_sel in reg CTRL5.(ptr)
888 * @retval Interface status (MANDATORY: return 0 -> no Error).
889 *
890 */
l3gd20h_gy_filter_out_path_get(const stmdev_ctx_t * ctx,l3gd20h_gy_out_path_t * val)891 int32_t l3gd20h_gy_filter_out_path_get(const stmdev_ctx_t *ctx,
892 l3gd20h_gy_out_path_t *val)
893 {
894 l3gd20h_ctrl5_t ctrl5;
895 int32_t ret;
896 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
897
898 switch ((ctrl5.hpen << 4) + ctrl5.out_sel)
899 {
900 case L3GD20H_LPF1_OUT:
901 *val = L3GD20H_LPF1_OUT;
902 break;
903
904 case L3GD20H_LPF1_HPF_OUT:
905 *val = L3GD20H_LPF1_HPF_OUT;
906 break;
907
908 case L3GD20H_LPF1_LPF2_OUT:
909 *val = L3GD20H_LPF1_LPF2_OUT;
910 break;
911
912 case L3GD20H_LPF1_HPF_LPF2_OUT:
913 *val = L3GD20H_LPF1_HPF_LPF2_OUT;
914 break;
915
916 default:
917 *val = L3GD20H_LPF1_OUT;
918 break;
919 }
920
921 return ret;
922 }
923
924 /**
925 * @brief Gyro interrupt filter path configuration..[set]
926 *
927 * @param ctx Read / write interface definitions.(ptr)
928 * @param val Change the values of "ig_sel" in reg L3GD20H.
929 * @retval Interface status (MANDATORY: return 0 -> no Error).
930 *
931 */
l3gd20h_gy_filter_int_path_set(const stmdev_ctx_t * ctx,l3gd20h_gy_int_path_t val)932 int32_t l3gd20h_gy_filter_int_path_set(const stmdev_ctx_t *ctx,
933 l3gd20h_gy_int_path_t val)
934 {
935 l3gd20h_ctrl5_t ctrl5;
936 int32_t ret;
937 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
938
939 if (ret == 0)
940 {
941 ctrl5.ig_sel = (uint8_t)val & 0x03U;
942 ctrl5.hpen = ((uint8_t)val & 0x10U) >> 4;
943 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
944 }
945
946 return ret;
947 }
948
949 /**
950 * @brief Gyro interrupt filter path configuration..[get]
951 *
952 * @param ctx Read / write interface definitions.(ptr)
953 * @param val Get the values of ig_sel in reg CTRL5.(ptr)
954 * @retval Interface status (MANDATORY: return 0 -> no Error).
955 *
956 */
l3gd20h_gy_filter_int_path_get(const stmdev_ctx_t * ctx,l3gd20h_gy_int_path_t * val)957 int32_t l3gd20h_gy_filter_int_path_get(const stmdev_ctx_t *ctx,
958 l3gd20h_gy_int_path_t *val)
959 {
960 l3gd20h_ctrl5_t ctrl5;
961 int32_t ret;
962 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5,
963 (uint8_t *)&ctrl5, 1);
964
965 switch ((ctrl5.hpen << 4) + ctrl5.ig_sel)
966 {
967 case L3GD20H_LPF1_INT:
968 *val = L3GD20H_LPF1_INT;
969 break;
970
971 case L3GD20H_LPF1_HPF_INT:
972 *val = L3GD20H_LPF1_HPF_INT;
973 break;
974
975 case L3GD20H_LPF1_LPF2_INT:
976 *val = L3GD20H_LPF1_LPF2_INT;
977 break;
978
979 case L3GD20H_LPF1_HPF_LPF2_INT:
980 *val = L3GD20H_LPF1_HPF_LPF2_INT;
981 break;
982
983 default:
984 *val = L3GD20H_LPF1_INT;
985 break;
986 }
987
988 return ret;
989 }
990
991 /**
992 * @brief Reference value for gyroscope’s digital high-pass filter.[set]
993 *
994 * @param ctx Read / write interface definitions.(ptr)
995 * @param buff Buffer that stores data to be write.(ptr)
996 * @retval Interface status (MANDATORY: return 0 -> no Error).
997 *
998 */
l3gd20h_gy_filter_reference_set(const stmdev_ctx_t * ctx,uint8_t * buff)999 int32_t l3gd20h_gy_filter_reference_set(const stmdev_ctx_t *ctx,
1000 uint8_t *buff)
1001 {
1002 int32_t ret;
1003 ret = l3gd20h_write_reg(ctx, L3GD20H_REFERENCE, buff, 1);
1004
1005 return ret;
1006 }
1007
1008 /**
1009 * @brief Reference value for gyroscope’s digital high-pass filter.[get]
1010 *
1011 * @param ctx Read / write interface definitions.(ptr)
1012 * @param buff Buffer that stores data read.(ptr)
1013 * @retval Interface status (MANDATORY: return 0 -> no Error).
1014 *
1015 */
l3gd20h_gy_filter_reference_get(const stmdev_ctx_t * ctx,uint8_t * buff)1016 int32_t l3gd20h_gy_filter_reference_get(const stmdev_ctx_t *ctx,
1017 uint8_t *buff)
1018 {
1019 int32_t ret;
1020 ret = l3gd20h_read_reg(ctx, L3GD20H_REFERENCE, buff, 1);
1021
1022 return ret;
1023 }
1024
1025 /**
1026 * @}
1027 *
1028 */
1029
1030 /**
1031 * @defgroup L3GD20H_Serialinterface
1032 * @brief This section groups all the functions concerning main
1033 * serial interface management (not auxiliary)
1034 * @{
1035 *
1036 */
1037
1038 /**
1039 * @brief SPI Serial Interface Mode selection..[set]
1040 *
1041 * @param ctx Read / write interface definitions.(ptr)
1042 * @param val Change the values of "sim" in reg L3GD20H.
1043 * @retval Interface status (MANDATORY: return 0 -> no Error).
1044 *
1045 */
l3gd20h_spi_mode_set(const stmdev_ctx_t * ctx,l3gd20h_sim_t val)1046 int32_t l3gd20h_spi_mode_set(const stmdev_ctx_t *ctx, l3gd20h_sim_t val)
1047 {
1048 l3gd20h_ctrl4_t ctrl4;
1049 int32_t ret;
1050 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
1051
1052 if (ret == 0)
1053 {
1054 ctrl4.sim = (uint8_t)val;
1055 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
1056 }
1057
1058 return ret;
1059 }
1060
1061 /**
1062 * @brief SPI Serial Interface Mode selection..[get]
1063 *
1064 * @param ctx Read / write interface definitions.(ptr)
1065 * @param val Get the values of sim in reg CTRL4.(ptr)
1066 * @retval Interface status (MANDATORY: return 0 -> no Error).
1067 *
1068 */
l3gd20h_spi_mode_get(const stmdev_ctx_t * ctx,l3gd20h_sim_t * val)1069 int32_t l3gd20h_spi_mode_get(const stmdev_ctx_t *ctx, l3gd20h_sim_t *val)
1070 {
1071 l3gd20h_ctrl4_t ctrl4;
1072 int32_t ret;
1073 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
1074
1075 switch (ctrl4.sim)
1076 {
1077 case L3GD20H_SPI_4_WIRE:
1078 *val = L3GD20H_SPI_4_WIRE;
1079 break;
1080
1081 case L3GD20H_SPI_3_WIRE:
1082 *val = L3GD20H_SPI_3_WIRE;
1083 break;
1084
1085 default:
1086 *val = L3GD20H_SPI_4_WIRE;
1087 break;
1088 }
1089
1090 return ret;
1091 }
1092
1093 /**
1094 * @brief Enable / Disable I2C interface..[set]
1095 *
1096 * @param ctx Read / write interface definitions.(ptr)
1097 * @param val Change the values of "i2c_dis" in reg L3GD20H.
1098 * @retval Interface status (MANDATORY: return 0 -> no Error).
1099 *
1100 */
l3gd20h_i2c_interface_set(const stmdev_ctx_t * ctx,l3gd20h_i2c_dis_t val)1101 int32_t l3gd20h_i2c_interface_set(const stmdev_ctx_t *ctx,
1102 l3gd20h_i2c_dis_t val)
1103 {
1104 l3gd20h_low_odr_t low_odr;
1105 int32_t ret;
1106 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
1107
1108 if (ret == 0)
1109 {
1110 low_odr.i2c_dis = (uint8_t)val;
1111 ret = l3gd20h_write_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
1112 }
1113
1114 return ret;
1115 }
1116
1117 /**
1118 * @brief Enable / Disable I2C interface..[get]
1119 *
1120 * @param ctx Read / write interface definitions.(ptr)
1121 * @param val Get the values of i2c_dis in reg LOW_ODR.(ptr)
1122 * @retval Interface status (MANDATORY: return 0 -> no Error).
1123 *
1124 */
l3gd20h_i2c_interface_get(const stmdev_ctx_t * ctx,l3gd20h_i2c_dis_t * val)1125 int32_t l3gd20h_i2c_interface_get(const stmdev_ctx_t *ctx,
1126 l3gd20h_i2c_dis_t *val)
1127 {
1128 l3gd20h_low_odr_t low_odr;
1129 int32_t ret;
1130 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
1131
1132 switch (low_odr.i2c_dis)
1133 {
1134 case L3GD20H_I2C_ENABLE:
1135 *val = L3GD20H_I2C_ENABLE;
1136 break;
1137
1138 case L3GD20H_I2C_DISABLE:
1139 *val = L3GD20H_I2C_DISABLE;
1140 break;
1141
1142 default:
1143 *val = L3GD20H_I2C_ENABLE;
1144 break;
1145 }
1146
1147 return ret;
1148 }
1149 /**
1150 * @}
1151 *
1152 */
1153
1154 /**
1155 * @defgroup L3GD20H_Interruptpins
1156 * @brief This section groups all the functions that manage interrupt pins
1157 * @{
1158 *
1159 */
1160
1161 /**
1162 * @brief Route a signal on INT 2_A/G pin..[set]
1163 *
1164 * @param ctx Read / write interface definitions.(ptr)
1165 * @param val FIFO Empty interrupt on DRDY/INT2 pin..
1166 * @retval Interface status (MANDATORY: return 0 -> no Error).
1167 *
1168 */
l3gd20h_pin_int2_route_set(const stmdev_ctx_t * ctx,l3gd20h_pin_int2_rt_t val)1169 int32_t l3gd20h_pin_int2_route_set(const stmdev_ctx_t *ctx,
1170 l3gd20h_pin_int2_rt_t val)
1171 {
1172 l3gd20h_ctrl3_t ctrl3;
1173 int32_t ret;
1174 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1175
1176 if (ret == 0)
1177 {
1178 ctrl3.int2_empty = val.int2_empty;
1179 ctrl3.int2_fth = val.int2_fth;
1180 ctrl3.int2_orun = val.int2_orun;
1181 ctrl3.int2_drdy = val.int2_drdy;
1182 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1183 }
1184
1185 return ret;
1186 }
1187
1188 /**
1189 * @brief Route a signal on INT 2_A/G pin..[get]
1190 *
1191 * @param ctx Read / write interface definitions.(ptr)
1192 * @param val FIFO Empty interrupt on DRDY/INT2 pin..(ptr)
1193 * @retval Interface status (MANDATORY: return 0 -> no Error).
1194 *
1195 */
l3gd20h_pin_int2_route_get(const stmdev_ctx_t * ctx,l3gd20h_pin_int2_rt_t * val)1196 int32_t l3gd20h_pin_int2_route_get(const stmdev_ctx_t *ctx,
1197 l3gd20h_pin_int2_rt_t *val)
1198 {
1199 l3gd20h_ctrl3_t ctrl3;
1200 int32_t ret;
1201 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1202 val->int2_empty = ctrl3.int2_empty;
1203 val->int2_orun = ctrl3.int2_orun;
1204 val->int2_fth = ctrl3.int2_fth;
1205 val->int2_drdy = ctrl3.int2_drdy;
1206
1207 return ret;
1208 }
1209
1210 /**
1211 * @brief Push-pull/open drain selection on interrupt pads..[set]
1212 *
1213 * @param ctx Read / write interface definitions.(ptr)
1214 * @param val Change the values of "pp_od" in reg L3GD20H.
1215 * @retval Interface status (MANDATORY: return 0 -> no Error).
1216 *
1217 */
l3gd20h_pin_mode_set(const stmdev_ctx_t * ctx,l3gd20h_pp_od_t val)1218 int32_t l3gd20h_pin_mode_set(const stmdev_ctx_t *ctx, l3gd20h_pp_od_t val)
1219 {
1220 l3gd20h_ctrl3_t ctrl3;
1221 int32_t ret;
1222 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1223
1224 if (ret == 0)
1225 {
1226 ctrl3.pp_od = (uint8_t)val;
1227 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1228 }
1229
1230 return ret;
1231 }
1232
1233 /**
1234 * @brief Push-pull/open drain selection on interrupt pads..[get]
1235 *
1236 * @param ctx Read / write interface definitions.(ptr)
1237 * @param val Get the values of pp_od in reg CTRL3.(ptr)
1238 * @retval Interface status (MANDATORY: return 0 -> no Error).
1239 *
1240 */
l3gd20h_pin_mode_get(const stmdev_ctx_t * ctx,l3gd20h_pp_od_t * val)1241 int32_t l3gd20h_pin_mode_get(const stmdev_ctx_t *ctx, l3gd20h_pp_od_t *val)
1242 {
1243 l3gd20h_ctrl3_t ctrl3;
1244 int32_t ret;
1245 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1246
1247 switch (ctrl3.pp_od)
1248 {
1249 case L3GD20H_PUSH_PULL:
1250 *val = L3GD20H_PUSH_PULL;
1251 break;
1252
1253 case L3GD20H_OPEN_DRAIN:
1254 *val = L3GD20H_OPEN_DRAIN;
1255 break;
1256
1257 default:
1258 *val = L3GD20H_PUSH_PULL;
1259 break;
1260 }
1261
1262 return ret;
1263 }
1264
1265 /**
1266 * @brief Interrupt active-high/low.Interrupt active-high/low..[set]
1267 *
1268 * @param ctx Read / write interface definitions.(ptr)
1269 * @param val Change the values of "h_lactive" in reg L3GD20H.
1270 * @retval Interface status (MANDATORY: return 0 -> no Error).
1271 *
1272 */
l3gd20h_pin_polarity_set(const stmdev_ctx_t * ctx,l3gd20h_pin_pol_t val)1273 int32_t l3gd20h_pin_polarity_set(const stmdev_ctx_t *ctx,
1274 l3gd20h_pin_pol_t val)
1275 {
1276 l3gd20h_low_odr_t low_odr;
1277 l3gd20h_ctrl3_t ctrl3;
1278 int32_t ret;
1279 ret = l3gd20h_read_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
1280
1281 if (ret == 0)
1282 {
1283 low_odr.drdy_hl = (uint8_t)val;
1284 ret = l3gd20h_write_reg(ctx, L3GD20H_LOW_ODR, (uint8_t *)&low_odr, 1);
1285 }
1286
1287 if (ret == 0)
1288 {
1289 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1290 }
1291
1292 if (ret == 0)
1293 {
1294 ctrl3.h_lactive = (uint8_t)val;
1295 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1296 }
1297
1298 return ret;
1299 }
1300
1301 /**
1302 * @brief Interrupt active-high/low.Interrupt active-high/low..[get]
1303 *
1304 * @param ctx Read / write interface definitions.(ptr)
1305 * @param val Get the values of h_lactive in reg CTRL3.(ptr)
1306 * @retval Interface status (MANDATORY: return 0 -> no Error).
1307 *
1308 */
l3gd20h_pin_polarity_get(const stmdev_ctx_t * ctx,l3gd20h_pin_pol_t * val)1309 int32_t l3gd20h_pin_polarity_get(const stmdev_ctx_t *ctx,
1310 l3gd20h_pin_pol_t *val)
1311 {
1312 l3gd20h_ctrl3_t ctrl3;
1313 int32_t ret;
1314 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1315
1316 switch (ctrl3.h_lactive)
1317 {
1318 case L3GD20H_ACTIVE_HIGH:
1319 *val = L3GD20H_ACTIVE_HIGH;
1320 break;
1321
1322 case L3GD20H_ACTIVE_LOW:
1323 *val = L3GD20H_ACTIVE_LOW;
1324 break;
1325
1326 default:
1327 *val = L3GD20H_ACTIVE_HIGH;
1328 break;
1329 }
1330
1331 return ret;
1332 }
1333
1334 /**
1335 * @brief Route a signal on INT1 pin.[set]
1336 *
1337 * @param ctx Read / write interface definitions.(ptr)
1338 * @param val Boot status available on INT1 pin..
1339 * @retval Interface status (MANDATORY: return 0 -> no Error).
1340 *
1341 */
l3gd20h_pin_int1_route_set(const stmdev_ctx_t * ctx,l3gd20h_pin_int1_rt_t val)1342 int32_t l3gd20h_pin_int1_route_set(const stmdev_ctx_t *ctx,
1343 l3gd20h_pin_int1_rt_t val)
1344 {
1345 l3gd20h_ctrl3_t ctrl3;
1346 int32_t ret;
1347 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1348
1349 if (ret == 0)
1350 {
1351 ctrl3.int1_boot = val.int1_boot;
1352 ctrl3.int1_ig = val.int1_ig;
1353 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1354 }
1355
1356 return ret;
1357 }
1358
1359 /**
1360 * @brief Route a signal on INT1 pin.[get]
1361 *
1362 * @param ctx Read / write interface definitions.(ptr)
1363 * @param val Boot status available on INT1 pin..(ptr)
1364 * @retval Interface status (MANDATORY: return 0 -> no Error).
1365 *
1366 */
l3gd20h_pin_int1_route_get(const stmdev_ctx_t * ctx,l3gd20h_pin_int1_rt_t * val)1367 int32_t l3gd20h_pin_int1_route_get(const stmdev_ctx_t *ctx,
1368 l3gd20h_pin_int1_rt_t *val)
1369 {
1370 l3gd20h_ctrl3_t ctrl3;
1371 int32_t ret;
1372 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL3, (uint8_t *)&ctrl3, 1);
1373 val->int1_boot = ctrl3.int1_boot;
1374 val->int1_ig = ctrl3.int1_ig;
1375
1376 return ret;
1377 }
1378
1379 /**
1380 * @brief Latched/pulsed interrupt..[set]
1381 *
1382 * @param ctx Read / write interface definitions.(ptr)
1383 * @param val Change the values of "lir" in reg L3GD20H.
1384 * @retval Interface status (MANDATORY: return 0 -> no Error).
1385 *
1386 */
l3gd20h_pin_notification_set(const stmdev_ctx_t * ctx,l3gd20h_lir_t val)1387 int32_t l3gd20h_pin_notification_set(const stmdev_ctx_t *ctx,
1388 l3gd20h_lir_t val)
1389 {
1390 l3gd20h_ig_cfg_t ig_cfg;
1391 int32_t ret;
1392 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1393
1394 if (ret == 0)
1395 {
1396 ig_cfg.lir = (uint8_t)val;
1397 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1398 }
1399
1400 return ret;
1401 }
1402
1403 /**
1404 * @brief Latched/pulsed interrupt..[get]
1405 *
1406 * @param ctx Read / write interface definitions.(ptr)
1407 * @param val Get the values of lir in reg IG_CFG.(ptr)
1408 * @retval Interface status (MANDATORY: return 0 -> no Error).
1409 *
1410 */
l3gd20h_pin_notification_get(const stmdev_ctx_t * ctx,l3gd20h_lir_t * val)1411 int32_t l3gd20h_pin_notification_get(const stmdev_ctx_t *ctx,
1412 l3gd20h_lir_t *val)
1413 {
1414 l3gd20h_ig_cfg_t ig_cfg;
1415 int32_t ret;
1416 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG,
1417 (uint8_t *)&ig_cfg, 1);
1418
1419 switch (ig_cfg.lir)
1420 {
1421 case L3GD20H_INT_PULSED:
1422 *val = L3GD20H_INT_PULSED;
1423 break;
1424
1425 case L3GD20H_INT_LATCHED:
1426 *val = L3GD20H_INT_LATCHED;
1427 break;
1428
1429 default:
1430 *val = L3GD20H_INT_PULSED;
1431 break;
1432 }
1433
1434 return ret;
1435 }
1436
1437 /**
1438 * @brief AND/OR combination of accelerometer’s interrupt events..[set]
1439 *
1440 * @param ctx Read / write interface definitions.(ptr)
1441 * @param val Change the values of "and_or" in reg L3GD20H.
1442 * @retval Interface status (MANDATORY: return 0 -> no Error).
1443 *
1444 */
l3gd20h_pin_logic_set(const stmdev_ctx_t * ctx,l3gd20h_pin_logic_t val)1445 int32_t l3gd20h_pin_logic_set(const stmdev_ctx_t *ctx,
1446 l3gd20h_pin_logic_t val)
1447 {
1448 l3gd20h_ig_cfg_t ig_cfg;
1449 int32_t ret;
1450 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1451
1452 if (ret == 0)
1453 {
1454 ig_cfg.and_or = (uint8_t)val;
1455 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1456 }
1457
1458 return ret;
1459 }
1460
1461 /**
1462 * @brief AND/OR combination of accelerometer’s interrupt events..[get]
1463 *
1464 * @param ctx Read / write interface definitions.(ptr)
1465 * @param val Get the values of and_or in reg IG_CFG.(ptr)
1466 * @retval Interface status (MANDATORY: return 0 -> no Error).
1467 *
1468 */
l3gd20h_pin_logic_get(const stmdev_ctx_t * ctx,l3gd20h_pin_logic_t * val)1469 int32_t l3gd20h_pin_logic_get(const stmdev_ctx_t *ctx,
1470 l3gd20h_pin_logic_t *val)
1471 {
1472 l3gd20h_ig_cfg_t ig_cfg;
1473 int32_t ret;
1474 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1475
1476 switch (ig_cfg.and_or)
1477 {
1478 case L3GD20H_LOGIC_OR:
1479 *val = L3GD20H_LOGIC_OR;
1480 break;
1481
1482 case L3GD20H_LOGIC_AND:
1483 *val = L3GD20H_LOGIC_AND;
1484 break;
1485
1486 default:
1487 *val = L3GD20H_LOGIC_OR;
1488 break;
1489 }
1490
1491 return ret;
1492 }
1493
1494 /**
1495 * @}
1496 *
1497 */
1498
1499 /**
1500 * @defgroup L3GD20H_Interrupt on threshold
1501 * @brief This section group all the functions concerning the
1502 * interrupt on threshold configuration.
1503 * @{
1504 *
1505 */
1506
1507 /**
1508 * @brief Enable interrupt generation on threshold event..[set]
1509 *
1510 * @param ctx Read / write interface definitions.(ptr)
1511 * @param val Enable interrupt generation on gyroscope’s pitch (X)
1512 * axis low event..
1513 * @retval Interface status (MANDATORY: return 0 -> no Error).
1514 *
1515 */
l3gd20h_gy_trshld_axis_set(const stmdev_ctx_t * ctx,l3gd20h_gy_trshld_en_t val)1516 int32_t l3gd20h_gy_trshld_axis_set(const stmdev_ctx_t *ctx,
1517 l3gd20h_gy_trshld_en_t val)
1518 {
1519 l3gd20h_ig_cfg_t ig_cfg;
1520 int32_t ret;
1521 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1522
1523 if (ret == 0)
1524 {
1525 ig_cfg.xlie = val.xlie;
1526 ig_cfg.xhie = val.xhie;
1527 ig_cfg.ylie = val.ylie;
1528 ig_cfg.yhie = val.yhie;
1529 ig_cfg.zlie = val.zlie;
1530 ig_cfg.zhie = val.zhie;
1531 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_CFG, (uint8_t *)&ig_cfg, 1);
1532 }
1533
1534 return ret;
1535 }
1536
1537 /**
1538 * @brief Enable interrupt generation on threshold event..[get]
1539 *
1540 * @param ctx Read / write interface definitions.(ptr)
1541 * @param val Enable interrupt generation on gyroscope’s pitch (X)
1542 * axis low event..(ptr)
1543 * @retval Interface status (MANDATORY: return 0 -> no Error).
1544 *
1545 */
l3gd20h_gy_trshld_axis_get(const stmdev_ctx_t * ctx,l3gd20h_gy_trshld_en_t * val)1546 int32_t l3gd20h_gy_trshld_axis_get(const stmdev_ctx_t *ctx,
1547 l3gd20h_gy_trshld_en_t *val)
1548 {
1549 l3gd20h_ig_cfg_t ig_cfg;
1550 int32_t ret;
1551 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_CFG,
1552 (uint8_t *)&ig_cfg, 1);
1553 val->xlie = ig_cfg.xlie;
1554 val->xhie = ig_cfg.xhie;
1555 val->ylie = ig_cfg.ylie;
1556 val->yhie = ig_cfg.yhie;
1557 val->zlie = ig_cfg.zlie;
1558 val->zhie = ig_cfg.zhie;
1559
1560 return ret;
1561 }
1562
1563 /**
1564 * @brief Angular rate sensor interrupt on threshold source..[get]
1565 *
1566 * @param ctx Read / write interface definitions.(ptr)
1567 * @param val Pitch(X)low..(ptr)
1568 * @retval Interface status (MANDATORY: return 0 -> no Error).
1569 *
1570 */
l3gd20h_gy_trshld_src_get(const stmdev_ctx_t * ctx,l3gd20h_gy_trshld_src_t * val)1571 int32_t l3gd20h_gy_trshld_src_get(const stmdev_ctx_t *ctx,
1572 l3gd20h_gy_trshld_src_t *val)
1573 {
1574 l3gd20h_ig_src_t ig_src;
1575 int32_t ret;
1576 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_SRC, (uint8_t *)&ig_src, 1);
1577 val->xl = ig_src.xl;
1578 val->xh = ig_src.xh;
1579 val->yl = ig_src.yl;
1580 val->yh = ig_src.yh;
1581 val->zl = ig_src.zl;
1582 val->zh = ig_src.zh;
1583 val->ia = ig_src.ia;
1584
1585 return ret;
1586 }
1587
1588 /**
1589 * @brief Angular rate sensor interrupt threshold on pitch (X) axis..[set]
1590 *
1591 * @param ctx Read / write interface definitions.(ptr)
1592 * @param val Change the values of thsx in reg IG_THS_XH.
1593 * @retval Interface status (MANDATORY: return 0 -> no Error).
1594 *
1595 */
l3gd20h_gy_trshld_x_set(const stmdev_ctx_t * ctx,uint16_t val)1596 int32_t l3gd20h_gy_trshld_x_set(const stmdev_ctx_t *ctx, uint16_t val)
1597 {
1598 l3gd20h_ig_ths_xl_t ig_ths_xl;
1599 l3gd20h_ig_ths_xh_t ig_ths_xh;
1600 int32_t ret;
1601 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1602
1603 if (ret == 0)
1604 {
1605 ig_ths_xh.thsx = (uint8_t)(val / 256U) & 0x7FU;
1606 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1607 }
1608
1609 if (ret == 0)
1610 {
1611 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XL, (uint8_t *)&ig_ths_xl, 1);
1612 }
1613
1614 if (ret == 0)
1615 {
1616 ig_ths_xl.thsx = (uint8_t)(val - (ig_ths_xh.thsx * 256U));
1617 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_XL, (uint8_t *)&ig_ths_xl, 1);
1618 }
1619
1620 return ret;
1621 }
1622
1623 /**
1624 * @brief Angular rate sensor interrupt threshold on pitch (X) axis..[get]
1625 *
1626 * @param ctx Read / write interface definitions.(ptr)
1627 * @param val Get the values of thsx in reg IG_THS_XH.(ptr)
1628 * @retval Interface status (MANDATORY: return 0 -> no Error).
1629 *
1630 */
l3gd20h_gy_trshld_x_get(const stmdev_ctx_t * ctx,uint16_t * val)1631 int32_t l3gd20h_gy_trshld_x_get(const stmdev_ctx_t *ctx, uint16_t *val)
1632 {
1633 l3gd20h_ig_ths_xl_t ig_ths_xl;
1634 l3gd20h_ig_ths_xh_t ig_ths_xh;
1635 int32_t ret;
1636 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XL, (uint8_t *)&ig_ths_xl, 1);
1637
1638 if (ret == 0)
1639 {
1640 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1641 *val = ig_ths_xh.thsx;
1642 *val = *val / 256U;
1643 *val += ig_ths_xl.thsx;
1644 }
1645
1646 return ret;
1647 }
1648 /**
1649 * @brief Decrement or reset counter mode selection..[set]
1650 *
1651 * @param ctx Read / write interface definitions.(ptr)
1652 * @param val Change the values of "dcrm" in reg L3GD20H.
1653 * @retval Interface status (MANDATORY: return 0 -> no Error).
1654 *
1655 */
l3gd20h_gy_trshld_mode_set(const stmdev_ctx_t * ctx,l3gd20h_dcrm_g_t val)1656 int32_t l3gd20h_gy_trshld_mode_set(const stmdev_ctx_t *ctx,
1657 l3gd20h_dcrm_g_t val)
1658 {
1659 l3gd20h_ig_ths_xh_t ig_ths_xh;
1660 int32_t ret;
1661 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1662
1663 if (ret == 0)
1664 {
1665 ig_ths_xh.dcrm = (uint8_t)val;
1666 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1667 }
1668
1669 return ret;
1670 }
1671
1672 /**
1673 * @brief Decrement or reset counter mode selection..[get]
1674 *
1675 * @param ctx Read / write interface definitions.(ptr)
1676 * @param val Get the values of dcrm in reg IG_THS_XH.(ptr)
1677 * @retval Interface status (MANDATORY: return 0 -> no Error).
1678 *
1679 */
l3gd20h_gy_trshld_mode_get(const stmdev_ctx_t * ctx,l3gd20h_dcrm_g_t * val)1680 int32_t l3gd20h_gy_trshld_mode_get(const stmdev_ctx_t *ctx,
1681 l3gd20h_dcrm_g_t *val)
1682 {
1683 l3gd20h_ig_ths_xh_t ig_ths_xh;
1684 int32_t ret;
1685 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_XH, (uint8_t *)&ig_ths_xh, 1);
1686
1687 switch (ig_ths_xh.dcrm)
1688 {
1689 case L3GD20H_RESET_MODE:
1690 *val = L3GD20H_RESET_MODE;
1691 break;
1692
1693 case L3GD20H_DECREMENT_MODE:
1694 *val = L3GD20H_DECREMENT_MODE;
1695 break;
1696
1697 default:
1698 *val = L3GD20H_RESET_MODE;
1699 break;
1700 }
1701
1702 return ret;
1703 }
1704
1705 /**
1706 * @brief Angular rate sensor interrupt threshold on roll (Y) axis.[set]
1707 *
1708 * @param ctx Read / write interface definitions.(ptr)
1709 * @param val Change the values of thsy in reg IG_THS_YH.
1710 * @retval Interface status (MANDATORY: return 0 -> no Error).
1711 *
1712 */
l3gd20h_gy_trshld_y_set(const stmdev_ctx_t * ctx,uint16_t val)1713 int32_t l3gd20h_gy_trshld_y_set(const stmdev_ctx_t *ctx, uint16_t val)
1714 {
1715 l3gd20h_ig_ths_yh_t ig_ths_yh;
1716 l3gd20h_ig_ths_yl_t ig_ths_yl;
1717 int32_t ret;
1718 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_YH, (uint8_t *)&ig_ths_yh, 1);
1719
1720 if (ret == 0)
1721 {
1722 ig_ths_yh.thsy = (uint8_t)(val / 256U) & 0x7FU;
1723 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_YH, (uint8_t *)&ig_ths_yh, 1);
1724 }
1725
1726 if (ret == 0)
1727 {
1728 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_YL, (uint8_t *)&ig_ths_yl, 1);
1729 }
1730
1731 if (ret == 0)
1732 {
1733 ig_ths_yl.thsy = (uint8_t)(val - (ig_ths_yh.thsy * 256U));
1734 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_YL, (uint8_t *)&ig_ths_yl, 1);
1735 }
1736
1737 return ret;
1738 }
1739
1740 /**
1741 * @brief Angular rate sensor interrupt threshold on roll (Y) axis.[get]
1742 *
1743 * @param ctx Read / write interface definitions.(ptr)
1744 * @param val Get the values of thsy in reg IG_THS_YH.(ptr)
1745 * @retval Interface status (MANDATORY: return 0 -> no Error).
1746 *
1747 */
l3gd20h_gy_trshld_y_get(const stmdev_ctx_t * ctx,uint16_t * val)1748 int32_t l3gd20h_gy_trshld_y_get(const stmdev_ctx_t *ctx, uint16_t *val)
1749 {
1750 l3gd20h_ig_ths_yh_t ig_ths_yh;
1751 l3gd20h_ig_ths_yl_t ig_ths_yl;
1752 int32_t ret;
1753 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_YL, (uint8_t *)&ig_ths_yl, 1);
1754
1755 if (ret == 0)
1756 {
1757 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_YH, (uint8_t *)&ig_ths_yh, 1);
1758 *val = ig_ths_yh.thsy;
1759 *val = *val / 256U;
1760 *val += ig_ths_yl.thsy;
1761 }
1762
1763 return ret;
1764 }
1765
1766 /**
1767 * @brief Angular rate sensor interrupt threshold on roll (Z) axis.[set]
1768 *
1769 * @param ctx Read / write interface definitions.(ptr)
1770 * @param val Change the values of thsz in reg IG_THS_ZH.
1771 * @retval Interface status (MANDATORY: return 0 -> no Error).
1772 *
1773 */
l3gd20h_gy_trshld_z_set(const stmdev_ctx_t * ctx,uint16_t val)1774 int32_t l3gd20h_gy_trshld_z_set(const stmdev_ctx_t *ctx, uint16_t val)
1775 {
1776 l3gd20h_ig_ths_zh_t ig_ths_zh;
1777 l3gd20h_ig_ths_zl_t ig_ths_zl;
1778 int32_t ret;
1779 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_ZH, (uint8_t *)&ig_ths_zh, 1);
1780
1781 if (ret == 0)
1782 {
1783 ig_ths_zh.thsz = (uint8_t)(val / 256U) & 0x7FU;
1784 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_ZH, (uint8_t *)&ig_ths_zh, 1);
1785 }
1786
1787 if (ret == 0)
1788 {
1789 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_ZL, (uint8_t *)&ig_ths_zl, 1);
1790 }
1791
1792 if (ret == 0)
1793 {
1794 ig_ths_zl.thsz = (uint8_t)(val - (ig_ths_zh.thsz * 256U));
1795 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_THS_ZL, (uint8_t *)&ig_ths_zl, 1);
1796 }
1797
1798 return ret;
1799 }
1800
1801 /**
1802 * @brief Angular rate sensor interrupt threshold on roll (Z) axis.[get]
1803 *
1804 * @param ctx Read / write interface definitions.(ptr)
1805 * @param val Get the values of thsz in reg IG_THS_ZH.(ptr)
1806 * @retval Interface status (MANDATORY: return 0 -> no Error).
1807 *
1808 */
l3gd20h_gy_trshld_z_get(const stmdev_ctx_t * ctx,uint16_t * val)1809 int32_t l3gd20h_gy_trshld_z_get(const stmdev_ctx_t *ctx, uint16_t *val)
1810 {
1811 l3gd20h_ig_ths_zh_t ig_ths_zh;
1812 l3gd20h_ig_ths_zl_t ig_ths_zl;
1813 int32_t ret;
1814 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_ZL, (uint8_t *)&ig_ths_zl, 1);
1815
1816 if (ret == 0)
1817 {
1818 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_THS_ZH, (uint8_t *)&ig_ths_zh, 1);
1819 *val = ig_ths_zh.thsz;
1820 *val = *val / 256U;
1821 *val += ig_ths_zh.thsz;
1822 }
1823
1824 return ret;
1825 }
1826
1827 /**
1828 * @brief Enter/exit interrupt duration value..[set]
1829 *
1830 * @param ctx Read / write interface definitions.(ptr)
1831 * @param val Change the values of d in reg IG_DURATION.
1832 * @retval Interface status (MANDATORY: return 0 -> no Error).
1833 *
1834 */
l3gd20h_gy_trshld_min_sample_set(const stmdev_ctx_t * ctx,uint8_t val)1835 int32_t l3gd20h_gy_trshld_min_sample_set(const stmdev_ctx_t *ctx,
1836 uint8_t val)
1837 {
1838 l3gd20h_ig_duration_t ig_duration;
1839 int32_t ret;
1840 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_DURATION,
1841 (uint8_t *)&ig_duration, 1);
1842
1843 if (ret == 0)
1844 {
1845 ig_duration.d = val;
1846
1847 if (val != 0x00U)
1848 {
1849 ig_duration.wait = PROPERTY_ENABLE;
1850 }
1851
1852 else
1853 {
1854 ig_duration.wait = PROPERTY_DISABLE;
1855 }
1856
1857 ret = l3gd20h_write_reg(ctx, L3GD20H_IG_DURATION,
1858 (uint8_t *)&ig_duration, 1);
1859 }
1860
1861 return ret;
1862 }
1863
1864 /**
1865 * @brief Enter/exit interrupt duration value..[get]
1866 *
1867 * @param ctx Read / write interface definitions.(ptr)
1868 * @param val Get the values of d in reg IG_DURATION.(ptr)
1869 * @retval Interface status (MANDATORY: return 0 -> no Error).
1870 *
1871 */
l3gd20h_gy_trshld_min_sample_get(const stmdev_ctx_t * ctx,uint8_t * val)1872 int32_t l3gd20h_gy_trshld_min_sample_get(const stmdev_ctx_t *ctx,
1873 uint8_t *val)
1874 {
1875 l3gd20h_ig_duration_t ig_duration;
1876 int32_t ret;
1877 ret = l3gd20h_read_reg(ctx, L3GD20H_IG_DURATION,
1878 (uint8_t *)&ig_duration, 1);
1879 *val = ig_duration.d;
1880
1881 return ret;
1882 }
1883
1884 /**
1885 * @}
1886 *
1887 */
1888
1889 /**
1890 * @defgroup L3GD20H_Fifo
1891 * @brief This section group all the functions concerning the fifo usage.
1892 * @{
1893 *
1894 */
1895
1896 /**
1897 * @brief Sensing chain FIFO stop values memorization at threshold level.[set]
1898 *
1899 * @param ctx Read / write interface definitions.(ptr)
1900 * @param val Change the values of stoponfth in reg CTRL5.
1901 * @retval Interface status (MANDATORY: return 0 -> no Error).
1902 *
1903 */
l3gd20h_fifo_stop_on_wtm_set(const stmdev_ctx_t * ctx,uint8_t val)1904 int32_t l3gd20h_fifo_stop_on_wtm_set(const stmdev_ctx_t *ctx, uint8_t val)
1905 {
1906 l3gd20h_ctrl5_t ctrl5;
1907 int32_t ret;
1908 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1909
1910 if (ret == 0)
1911 {
1912 ctrl5.stoponfth = val;
1913 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1914 }
1915
1916 return ret;
1917 }
1918
1919 /**
1920 * @brief Sensing chain FIFO stop values memorization at threshold level.[get]
1921 *
1922 * @param ctx Read / write interface definitions.(ptr)
1923 * @param val Get the values of stoponfth in reg CTRL5.(ptr)
1924 * @retval Interface status (MANDATORY: return 0 -> no Error).
1925 *
1926 */
l3gd20h_fifo_stop_on_wtm_get(const stmdev_ctx_t * ctx,uint8_t * val)1927 int32_t l3gd20h_fifo_stop_on_wtm_get(const stmdev_ctx_t *ctx, uint8_t *val)
1928 {
1929 l3gd20h_ctrl5_t ctrl5;
1930 int32_t ret;
1931 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1932 *val = ctrl5.stoponfth;
1933
1934 return ret;
1935 }
1936 /**
1937 * @brief FIFO mode selection..[set]
1938 *
1939 * @param ctx Read / write interface definitions.(ptr)
1940 * @param val Change the values of "fifo_en" in reg L3GD20H.
1941 * @retval Interface status (MANDATORY: return 0 -> no Error).
1942 *
1943 */
l3gd20h_fifo_mode_set(const stmdev_ctx_t * ctx,l3gd20h_fifo_m_t val)1944 int32_t l3gd20h_fifo_mode_set(const stmdev_ctx_t *ctx, l3gd20h_fifo_m_t val)
1945 {
1946 l3gd20h_ctrl5_t ctrl5;
1947 l3gd20h_fifo_ctrl_t fifo_ctrl;
1948 int32_t ret;
1949 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
1950
1951 if (ret == 0)
1952 {
1953 fifo_ctrl.fm = ((uint8_t)val & 0x07U);
1954 ret = l3gd20h_write_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
1955 }
1956
1957 if (ret == 0)
1958 {
1959 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1960 }
1961
1962 if (ret == 0)
1963 {
1964 ctrl5.fifo_en = (((uint8_t)val & 0x10U) >> 4);
1965 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1966 }
1967
1968 return ret;
1969 }
1970
1971 /**
1972 * @brief FIFO mode selection..[get]
1973 *
1974 * @param ctx Read / write interface definitions.(ptr)
1975 * @param val Get the values of fifo_en in reg CTRL5.(ptr)
1976 * @retval Interface status (MANDATORY: return 0 -> no Error).
1977 *
1978 */
l3gd20h_fifo_mode_get(const stmdev_ctx_t * ctx,l3gd20h_fifo_m_t * val)1979 int32_t l3gd20h_fifo_mode_get(const stmdev_ctx_t *ctx,
1980 l3gd20h_fifo_m_t *val)
1981 {
1982 l3gd20h_ctrl5_t ctrl5;
1983 l3gd20h_fifo_ctrl_t fifo_ctrl;
1984 int32_t ret;
1985 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
1986
1987 if (ret == 0)
1988 {
1989 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL5, (uint8_t *)&ctrl5, 1);
1990 }
1991
1992 switch ((ctrl5.fifo_en << 4) + fifo_ctrl.fm)
1993 {
1994 case L3GD20H_BYPASS_MODE:
1995 *val = L3GD20H_BYPASS_MODE;
1996 break;
1997
1998 case L3GD20H_FIFO_MODE:
1999 *val = L3GD20H_FIFO_MODE;
2000 break;
2001
2002 case L3GD20H_STREAM_MODE:
2003 *val = L3GD20H_STREAM_MODE;
2004 break;
2005
2006 case L3GD20H_STREAM_TO_FIFO_MODE:
2007 *val = L3GD20H_STREAM_TO_FIFO_MODE;
2008 break;
2009
2010 case L3GD20H_BYPASS_TO_STREAM_MODE:
2011 *val = L3GD20H_BYPASS_TO_STREAM_MODE;
2012 break;
2013
2014 case L3GD20H_BYPASS_TO_FIFO_MODE:
2015 *val = L3GD20H_BYPASS_TO_FIFO_MODE;
2016 break;
2017
2018 default:
2019 *val = L3GD20H_BYPASS_MODE;
2020 break;
2021 }
2022
2023 return ret;
2024 }
2025 /**
2026 * @brief FIFO watermark level selection..[set]
2027 *
2028 * @param ctx Read / write interface definitions.(ptr)
2029 * @param val Change the values of fth in reg FIFO_CTRL.
2030 * @retval Interface status (MANDATORY: return 0 -> no Error).
2031 *
2032 */
l3gd20h_fifo_watermark_set(const stmdev_ctx_t * ctx,uint8_t val)2033 int32_t l3gd20h_fifo_watermark_set(const stmdev_ctx_t *ctx, uint8_t val)
2034 {
2035 l3gd20h_fifo_ctrl_t fifo_ctrl;
2036 int32_t ret;
2037 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
2038
2039 if (ret == 0)
2040 {
2041 fifo_ctrl.fth = val;
2042 ret = l3gd20h_write_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
2043 }
2044
2045 return ret;
2046 }
2047
2048 /**
2049 * @brief FIFO watermark level selection..[get]
2050 *
2051 * @param ctx Read / write interface definitions.(ptr)
2052 * @param val Get the values of fth in reg FIFO_CTRL.(ptr)
2053 * @retval Interface status (MANDATORY: return 0 -> no Error).
2054 *
2055 */
l3gd20h_fifo_watermark_get(const stmdev_ctx_t * ctx,uint8_t * val)2056 int32_t l3gd20h_fifo_watermark_get(const stmdev_ctx_t *ctx, uint8_t *val)
2057 {
2058 l3gd20h_fifo_ctrl_t fifo_ctrl;
2059 int32_t ret;
2060 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_CTRL, (uint8_t *)&fifo_ctrl, 1);
2061 *val = fifo_ctrl.fth;
2062
2063 return ret;
2064 }
2065
2066 /**
2067 * @brief FIFO source register..[get]
2068 *
2069 * @param ctx Read / write interface definitions.(ptr)
2070 * @param val FIFO stored data level of the unread samples..(ptr)
2071 * @retval Interface status (MANDATORY: return 0 -> no Error).
2072 *
2073 */
l3gd20h_fifo_src_get(const stmdev_ctx_t * ctx,l3gd20h_fifo_srs_t * val)2074 int32_t l3gd20h_fifo_src_get(const stmdev_ctx_t *ctx,
2075 l3gd20h_fifo_srs_t *val)
2076 {
2077 l3gd20h_fifo_src_t fifo_src;
2078 int32_t ret;
2079 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_SRC, (uint8_t *)&fifo_src, 1);
2080 val->fss = fifo_src.fss;
2081 val->empty = fifo_src.empty;
2082 val->ovrn = fifo_src.ovrn;
2083 val->fth = fifo_src.fth;
2084
2085 return ret;
2086 }
2087
2088 /**
2089 * @brief FIFO stored data level of the unread samples..[get]
2090 *
2091 * @param ctx Read / write interface definitions.(ptr)
2092 * @param val Iet the values of "fss" in reg FIFO_SRC.(ptr)
2093 * @retval Interface status (MANDATORY: return 0 -> no Error).
2094 *
2095 */
l3gd20h_fifo_data_level_get(const stmdev_ctx_t * ctx,uint8_t * val)2096 int32_t l3gd20h_fifo_data_level_get(const stmdev_ctx_t *ctx, uint8_t *val)
2097 {
2098 l3gd20h_fifo_src_t fifo_src;
2099 int32_t ret;
2100 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_SRC, (uint8_t *)&fifo_src, 1);
2101 *val = fifo_src.fss;
2102
2103 return ret;
2104 }
2105
2106 /**
2107 * @brief FIFOfullstatus.[get]
2108 *
2109 * @param ctx Read / write interface definitions.(ptr)
2110 * @param val Iet the values of "fss" in reg FIFO_SRC.(ptr)
2111 * @retval Interface status (MANDATORY: return 0 -> no Error).
2112 *
2113 */
l3gd20h_fifo_full_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)2114 int32_t l3gd20h_fifo_full_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
2115 {
2116 l3gd20h_fifo_src_t fifo_src;
2117 int32_t ret;
2118 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_SRC, (uint8_t *)&fifo_src, 1);
2119 *val = fifo_src.fss;
2120
2121 return ret;
2122 }
2123
2124 /**
2125 * @brief FIFO watermark status..[get]
2126 *
2127 * @param ctx Read / write interface definitions.(ptr)
2128 * @param val Iet the values of "fth" in reg FIFO_SRC.(ptr)
2129 * @retval Interface status (MANDATORY: return 0 -> no Error).
2130 *
2131 */
l3gd20h_fifo_wtm_flag_get(const stmdev_ctx_t * ctx,uint8_t * val)2132 int32_t l3gd20h_fifo_wtm_flag_get(const stmdev_ctx_t *ctx, uint8_t *val)
2133 {
2134 l3gd20h_fifo_src_t fifo_src;
2135 int32_t ret;
2136 ret = l3gd20h_read_reg(ctx, L3GD20H_FIFO_SRC, (uint8_t *)&fifo_src, 1);
2137 *val = fifo_src.fth;
2138
2139 return ret;
2140 }
2141
2142 /**
2143 * @}
2144 *
2145 */
2146
2147 /**
2148 * @defgroup L3GD20H_DENPin
2149 * @brief This section group all the functions concerning DEN pin usage.
2150 * @{
2151 *
2152 */
2153
2154 /**
2155 * @brief DEN pin mode..[set]
2156 *
2157 * @param ctx Read / write interface definitions.(ptr)
2158 * @param val Change the values of "lvlen" in reg L3GD20H.
2159 * @retval Interface status (MANDATORY: return 0 -> no Error).
2160 *
2161 */
l3gd20h_den_mode_set(const stmdev_ctx_t * ctx,l3gd20h_den_md_t val)2162 int32_t l3gd20h_den_mode_set(const stmdev_ctx_t *ctx, l3gd20h_den_md_t val)
2163 {
2164 l3gd20h_ctrl2_t ctrl2;
2165 l3gd20h_ctrl4_t ctrl4;
2166 int32_t ret;
2167 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2168
2169 if (ret == 0)
2170 {
2171 ctrl4.impen = (uint8_t)val & 0x01U;
2172 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2173 }
2174
2175 if (ret == 0)
2176 {
2177 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
2178 }
2179
2180 if (ret == 0)
2181 {
2182 ctrl2.lvlen = ((uint8_t)val & 0x04U) >> 2;
2183 ctrl2.extren = ((uint8_t)val & 0x02U) >> 1;
2184 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
2185 }
2186
2187 return ret;
2188 }
2189
2190 /**
2191 * @brief DEN pin mode..[get]
2192 *
2193 * @param ctx Read / write interface definitions.(ptr)
2194 * @param val Get the values of lvlen in reg CTRL2.(ptr)
2195 * @retval Interface status (MANDATORY: return 0 -> no Error).
2196 *
2197 */
l3gd20h_den_mode_get(const stmdev_ctx_t * ctx,l3gd20h_den_md_t * val)2198 int32_t l3gd20h_den_mode_get(const stmdev_ctx_t *ctx, l3gd20h_den_md_t *val)
2199 {
2200 l3gd20h_ctrl2_t ctrl2;
2201 l3gd20h_ctrl4_t ctrl4;
2202 int32_t ret;
2203 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2204
2205 if (ret == 0)
2206 {
2207 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL2, (uint8_t *)&ctrl2, 1);
2208 }
2209
2210 switch ((ctrl2.lvlen << 2) + (ctrl2.extren << 1) + ctrl4.impen)
2211 {
2212 case L3GD20H_DEN_DISABLE:
2213 *val = L3GD20H_DEN_DISABLE;
2214 break;
2215
2216 case L3GD20H_DEN_ON_LEVEL_TRIGGER:
2217 *val = L3GD20H_DEN_ON_LEVEL_TRIGGER;
2218 break;
2219
2220 case L3GD20H_DEN_ON_EDGE_TRIGGER:
2221 *val = L3GD20H_DEN_ON_EDGE_TRIGGER;
2222 break;
2223
2224 case L3GD20H_DEN_IMPULSE_TRIGGER:
2225 *val = L3GD20H_DEN_IMPULSE_TRIGGER;
2226 break;
2227
2228 default:
2229 *val = L3GD20H_DEN_DISABLE;
2230 break;
2231 }
2232
2233 return ret;
2234 }
2235
2236 /**
2237 * @}
2238 *
2239 */
2240
2241 /**
2242 * @defgroup L3GD20H_Selftest
2243 * @brief This section groups all the functions that manage self
2244 * test configuration
2245 * @{
2246 *
2247 */
2248
2249 /**
2250 * @brief Enable/disable self-test mode for gyroscope..[set]
2251 *
2252 * @param ctx Read / write interface definitions.(ptr)
2253 * @param val Change the values of "st" in reg L3GD20H.
2254 * @retval Interface status (MANDATORY: return 0 -> no Error).
2255 *
2256 */
l3gd20h_gy_self_test_set(const stmdev_ctx_t * ctx,l3gd20h_st_t val)2257 int32_t l3gd20h_gy_self_test_set(const stmdev_ctx_t *ctx, l3gd20h_st_t val)
2258 {
2259 l3gd20h_ctrl4_t ctrl4;
2260 int32_t ret;
2261 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2262
2263 if (ret == 0)
2264 {
2265 ctrl4.st = (uint8_t)val;
2266 ret = l3gd20h_write_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2267 }
2268
2269 return ret;
2270 }
2271
2272 /**
2273 * @brief Enable/disable self-test mode for gyroscope..[get]
2274 *
2275 * @param ctx Read / write interface definitions.(ptr)
2276 * @param val Get the values of st in reg CTRL4.(ptr)
2277 * @retval Interface status (MANDATORY: return 0 -> no Error).
2278 *
2279 */
l3gd20h_gy_self_test_get(const stmdev_ctx_t * ctx,l3gd20h_st_t * val)2280 int32_t l3gd20h_gy_self_test_get(const stmdev_ctx_t *ctx, l3gd20h_st_t *val)
2281 {
2282 l3gd20h_ctrl4_t ctrl4;
2283 int32_t ret;
2284 ret = l3gd20h_read_reg(ctx, L3GD20H_CTRL4, (uint8_t *)&ctrl4, 1);
2285
2286 switch (ctrl4.st)
2287 {
2288 case L3GD20H_ST_DISABLE:
2289 *val = L3GD20H_ST_DISABLE;
2290 break;
2291
2292 case L3GD20H_ST_POSITIVE:
2293 *val = L3GD20H_ST_POSITIVE;
2294 break;
2295
2296 case L3GD20H_ST_NEGATIVE:
2297 *val = L3GD20H_ST_NEGATIVE;
2298 break;
2299
2300 default:
2301 *val = L3GD20H_ST_DISABLE;
2302 break;
2303 }
2304
2305 return ret;
2306 }
2307
2308 /**
2309 * @}
2310 *
2311 */
2312
2313 /**
2314 * @}
2315 *
2316 */
2317
2318 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2319