iNEMO inertial module: 3D accelerometer and 3D gyroscope.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lsm6dso_reg.c Source File

lsm6dso_reg.c

00001 /*
00002  ******************************************************************************
00003  * @file    lsm6dso_reg.c
00004  * @author  Sensors Software Solution Team
00005  * @brief   LSM6DSO driver file
00006  ******************************************************************************
00007  * @attention
00008  *
00009  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
00010  * All rights reserved.</center></h2>
00011  *
00012  * This software component is licensed by ST under BSD 3-Clause license,
00013  * the "License"; You may not use this file except in compliance with the
00014  * License. You may obtain a copy of the License at:
00015  *                        opensource.org/licenses/BSD-3-Clause
00016  *
00017  ******************************************************************************
00018  */
00019 
00020 #include "lsm6dso_reg.h"
00021 
00022 /**
00023   * @defgroup  LSM6DSO
00024   * @brief     This file provides a set of functions needed to drive the
00025   *            lsm6dso enhanced inertial module.
00026   * @{
00027   *
00028 */
00029 
00030 /**
00031   * @defgroup  LSM6DSO_Interfaces_Functions
00032   * @brief     This section provide a set of functions used to read and
00033   *            write a generic register of the device.
00034   *            MANDATORY: return 0 -> no Error.
00035   * @{
00036   *
00037 */
00038 
00039 /**
00040   * @brief  Read generic device register
00041   *
00042   * @param  ctx   read / write interface definitions(ptr)
00043   * @param  reg   register to read
00044   * @param  data  pointer to buffer that store the data read(ptr)
00045   * @param  len   number of consecutive register to read
00046   * @retval          interface status (MANDATORY: return 0 -> no Error)
00047   *
00048   */
00049 int32_t lsm6dso_read_reg(lsm6dso_ctx_t* ctx, uint8_t reg, uint8_t* data,
00050                          uint16_t len)
00051 {
00052   int32_t ret;
00053   ret = ctx->read_reg(ctx->handle, reg, data, len);
00054   return ret;
00055 }
00056 
00057 /**
00058   * @brief  Write generic device register
00059   *
00060   * @param  ctx   read / write interface definitions(ptr)
00061   * @param  reg   register to write
00062   * @param  data  pointer to data to write in register reg(ptr)
00063   * @param  len   number of consecutive register to write
00064   * @retval          interface status (MANDATORY: return 0 -> no Error)
00065   *
00066   */
00067 int32_t lsm6dso_write_reg(lsm6dso_ctx_t* ctx, uint8_t reg, uint8_t* data,
00068                           uint16_t len)
00069 {
00070   int32_t ret;
00071   ret = ctx->write_reg(ctx->handle, reg, data, len);
00072   return ret;
00073 }
00074 
00075 /**
00076   * @}
00077   *
00078 */
00079 
00080 /**
00081   * @defgroup  LSM6DSOX_Private_functions
00082   * @brief     Section collect all the utility functions needed by APIs.
00083   * @{
00084   *
00085   */
00086 
00087 static void bytecpy(uint8_t *target, uint8_t *source)
00088 {
00089   if ( (target != NULL) && (source != NULL) ) {
00090     *target = *source;
00091   }
00092 }
00093 
00094 /**
00095   * @defgroup  LSM6DSO_Sensitivity
00096   * @brief     These functions convert raw-data into engineering units.
00097   * @{
00098   *
00099 */
00100 float_t lsm6dso_from_fs2_to_mg(int16_t lsb)
00101 {
00102   return ((float_t)lsb) * 0.061f;
00103 }
00104 
00105 float_t lsm6dso_from_fs4_to_mg(int16_t lsb)
00106 {
00107   return ((float_t)lsb) * 0.122f;
00108 }
00109 
00110 float_t lsm6dso_from_fs8_to_mg(int16_t lsb)
00111 {
00112   return ((float_t)lsb) * 0.244f;
00113 }
00114 
00115 float_t lsm6dso_from_fs16_to_mg(int16_t lsb)
00116 {
00117   return ((float_t)lsb) *0.488f;
00118 }
00119 
00120 float_t lsm6dso_from_fs125_to_mdps(int16_t lsb)
00121 {
00122   return ((float_t)lsb) *4.375f;
00123 }
00124 
00125 float_t lsm6dso_from_fs500_to_mdps(int16_t lsb)
00126 {
00127   return ((float_t)lsb) *17.50f;
00128 }
00129 
00130 float_t lsm6dso_from_fs250_to_mdps(int16_t lsb)
00131 {
00132   return ((float_t)lsb) *8.750f;
00133 }
00134 
00135 float_t lsm6dso_from_fs1000_to_mdps(int16_t lsb)
00136 {
00137   return ((float_t)lsb) *35.0f;
00138 }
00139 
00140 float_t lsm6dso_from_fs2000_to_mdps(int16_t lsb)
00141 {
00142   return ((float_t)lsb) *70.0f;
00143 }
00144 
00145 float_t lsm6dso_from_lsb_to_celsius(int16_t lsb)
00146 {
00147   return (((float_t)lsb / 256.0f) + 25.0f);
00148 }
00149 
00150 float_t lsm6dso_from_lsb_to_nsec(int16_t lsb)
00151 {
00152   return ((float_t)lsb * 25000.0f);
00153 }
00154 
00155 /**
00156   * @}
00157   *
00158 */
00159 
00160 /**
00161   * @defgroup  LSM6DSO_Data_Generation
00162   * @brief     This section groups all the functions concerning
00163   *            data generation.
00164   *
00165 */
00166 
00167 /**
00168   * @brief  Accelerometer full-scale selection.[set]
00169   *
00170   * @param  ctx      read / write interface definitions
00171   * @param  val      change the values of fs_xl in reg CTRL1_XL
00172   *
00173   */
00174 int32_t lsm6dso_xl_full_scale_set(lsm6dso_ctx_t *ctx,
00175                                   lsm6dso_fs_xl_t val)
00176 {
00177   lsm6dso_ctrl1_xl_t reg;
00178   int32_t ret;
00179 
00180   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00181   if (ret == 0) {
00182     reg.fs_xl = (uint8_t) val;
00183     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00184   }
00185   return ret;
00186 }
00187 
00188 /**
00189   * @brief  Accelerometer full-scale selection.[get]
00190   *
00191   * @param  ctx      read / write interface definitions
00192   * @param  val      Get the values of fs_xl in reg CTRL1_XL
00193   *
00194   */
00195 int32_t lsm6dso_xl_full_scale_get(lsm6dso_ctx_t *ctx, lsm6dso_fs_xl_t *val)
00196 {
00197   lsm6dso_ctrl1_xl_t reg;
00198   int32_t ret;
00199 
00200   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00201   switch (reg.fs_xl) {
00202     case LSM6DSO_2g:
00203       *val = LSM6DSO_2g;
00204       break;
00205     case LSM6DSO_16g:
00206       *val = LSM6DSO_16g;
00207       break;
00208     case LSM6DSO_4g:
00209       *val = LSM6DSO_4g;
00210       break;
00211     case LSM6DSO_8g:
00212       *val = LSM6DSO_8g;
00213       break;
00214     default:
00215       *val = LSM6DSO_2g;
00216       break;
00217   }
00218 
00219   return ret;
00220 }
00221 
00222 /**
00223   * @brief  Accelerometer UI data rate selection.[set]
00224   *
00225   * @param  ctx      read / write interface definitions
00226   * @param  val      change the values of odr_xl in reg CTRL1_XL
00227   *
00228   */
00229 int32_t lsm6dso_xl_data_rate_set(lsm6dso_ctx_t *ctx, lsm6dso_odr_xl_t val)
00230 {
00231   lsm6dso_odr_xl_t odr_xl =  val;
00232   lsm6dso_emb_fsm_enable_t fsm_enable;
00233   lsm6dso_fsm_odr_t fsm_odr;
00234   lsm6dso_ctrl1_xl_t reg;
00235   int32_t ret;
00236 
00237   /* Check the Finite State Machine data rate constraints */
00238   ret =  lsm6dso_fsm_enable_get(ctx, &fsm_enable);
00239   if (ret == 0) {
00240     if ( (fsm_enable.fsm_enable_a.fsm1_en  |
00241           fsm_enable.fsm_enable_a.fsm2_en  |
00242           fsm_enable.fsm_enable_a.fsm3_en  |
00243           fsm_enable.fsm_enable_a.fsm4_en  |
00244           fsm_enable.fsm_enable_a.fsm5_en  |
00245           fsm_enable.fsm_enable_a.fsm6_en  |
00246           fsm_enable.fsm_enable_a.fsm7_en  |
00247           fsm_enable.fsm_enable_a.fsm8_en  |
00248           fsm_enable.fsm_enable_b.fsm9_en  |
00249           fsm_enable.fsm_enable_b.fsm10_en |
00250           fsm_enable.fsm_enable_b.fsm11_en |
00251           fsm_enable.fsm_enable_b.fsm12_en |
00252           fsm_enable.fsm_enable_b.fsm13_en |
00253           fsm_enable.fsm_enable_b.fsm14_en |
00254           fsm_enable.fsm_enable_b.fsm15_en |
00255           fsm_enable.fsm_enable_b.fsm16_en ) == PROPERTY_ENABLE ){
00256 
00257       ret =  lsm6dso_fsm_data_rate_get(ctx, &fsm_odr);
00258       if (ret == 0) {
00259         switch (fsm_odr) {
00260           case LSM6DSO_ODR_FSM_12Hz5:
00261 
00262             if (val == LSM6DSO_XL_ODR_OFF){
00263               odr_xl = LSM6DSO_XL_ODR_12Hz5;
00264 
00265             } else {
00266               odr_xl = val;
00267             }
00268             break;
00269           case LSM6DSO_ODR_FSM_26Hz:
00270 
00271             if (val == LSM6DSO_XL_ODR_OFF){
00272               odr_xl = LSM6DSO_XL_ODR_26Hz;
00273 
00274             } else if (val == LSM6DSO_XL_ODR_12Hz5){
00275               odr_xl = LSM6DSO_XL_ODR_26Hz;
00276 
00277             } else {
00278               odr_xl = val;
00279             }
00280             break;
00281           case LSM6DSO_ODR_FSM_52Hz:
00282 
00283             if (val == LSM6DSO_XL_ODR_OFF){
00284               odr_xl = LSM6DSO_XL_ODR_52Hz;
00285 
00286             } else if (val == LSM6DSO_XL_ODR_12Hz5){
00287               odr_xl = LSM6DSO_XL_ODR_52Hz;
00288 
00289             } else if (val == LSM6DSO_XL_ODR_26Hz){
00290               odr_xl = LSM6DSO_XL_ODR_52Hz;
00291 
00292             } else {
00293               odr_xl = val;
00294             }
00295             break;
00296           case LSM6DSO_ODR_FSM_104Hz:
00297 
00298             if (val == LSM6DSO_XL_ODR_OFF){
00299               odr_xl = LSM6DSO_XL_ODR_104Hz;
00300 
00301             } else if (val == LSM6DSO_XL_ODR_12Hz5){
00302               odr_xl = LSM6DSO_XL_ODR_104Hz;
00303 
00304             } else if (val == LSM6DSO_XL_ODR_26Hz){
00305               odr_xl = LSM6DSO_XL_ODR_104Hz;
00306 
00307             } else if (val == LSM6DSO_XL_ODR_52Hz){
00308               odr_xl = LSM6DSO_XL_ODR_104Hz;
00309 
00310             } else {
00311               odr_xl = val;
00312             }
00313             break;
00314           default:
00315             odr_xl = val;
00316             break;
00317         }
00318       }
00319     }
00320   }
00321   if (ret == 0) {
00322     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00323   }
00324   if (ret == 0) {
00325     reg.odr_xl = (uint8_t) odr_xl;
00326     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00327   }
00328   return ret;
00329 }
00330 
00331 /**
00332   * @brief  Accelerometer UI data rate selection.[get]
00333   *
00334   * @param  ctx      read / write interface definitions
00335   * @param  val      Get the values of odr_xl in reg CTRL1_XL
00336   *
00337   */
00338 int32_t lsm6dso_xl_data_rate_get(lsm6dso_ctx_t *ctx, lsm6dso_odr_xl_t *val)
00339 {
00340   lsm6dso_ctrl1_xl_t reg;
00341   int32_t ret;
00342 
00343   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
00344 
00345   switch (reg.odr_xl) {
00346     case LSM6DSO_XL_ODR_OFF:
00347       *val = LSM6DSO_XL_ODR_OFF;
00348       break;
00349     case LSM6DSO_XL_ODR_12Hz5:
00350       *val = LSM6DSO_XL_ODR_12Hz5;
00351       break;
00352     case LSM6DSO_XL_ODR_26Hz:
00353       *val = LSM6DSO_XL_ODR_26Hz;
00354       break;
00355     case LSM6DSO_XL_ODR_52Hz:
00356       *val = LSM6DSO_XL_ODR_52Hz;
00357       break;
00358     case LSM6DSO_XL_ODR_104Hz:
00359       *val = LSM6DSO_XL_ODR_104Hz;
00360       break;
00361     case LSM6DSO_XL_ODR_208Hz:
00362       *val = LSM6DSO_XL_ODR_208Hz;
00363       break;
00364     case LSM6DSO_XL_ODR_417Hz:
00365       *val = LSM6DSO_XL_ODR_417Hz;
00366       break;
00367     case LSM6DSO_XL_ODR_833Hz:
00368       *val = LSM6DSO_XL_ODR_833Hz;
00369       break;
00370     case LSM6DSO_XL_ODR_1667Hz:
00371       *val = LSM6DSO_XL_ODR_1667Hz;
00372       break;
00373     case LSM6DSO_XL_ODR_3333Hz:
00374       *val = LSM6DSO_XL_ODR_3333Hz;
00375       break;
00376     case LSM6DSO_XL_ODR_6667Hz:
00377       *val = LSM6DSO_XL_ODR_6667Hz;
00378       break;
00379     case LSM6DSO_XL_ODR_1Hz6:
00380       *val = LSM6DSO_XL_ODR_1Hz6;
00381       break;
00382     default:
00383       *val = LSM6DSO_XL_ODR_OFF;
00384       break;
00385   }
00386   return ret;
00387 }
00388 
00389 /**
00390   * @brief  Gyroscope UI chain full-scale selection.[set]
00391   *
00392   * @param  ctx      read / write interface definitions
00393   * @param  val      change the values of fs_g in reg CTRL2_G
00394   *
00395   */
00396 int32_t lsm6dso_gy_full_scale_set(lsm6dso_ctx_t *ctx, lsm6dso_fs_g_t val)
00397 {
00398   lsm6dso_ctrl2_g_t reg;
00399   int32_t ret;
00400 
00401   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00402   if (ret == 0) {
00403     reg.fs_g = (uint8_t) val;
00404     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00405   }
00406 
00407   return ret;
00408 }
00409 
00410 /**
00411   * @brief  Gyroscope UI chain full-scale selection.[get]
00412   *
00413   * @param  ctx      read / write interface definitions
00414   * @param  val      Get the values of fs_g in reg CTRL2_G
00415   *
00416   */
00417 int32_t lsm6dso_gy_full_scale_get(lsm6dso_ctx_t *ctx, lsm6dso_fs_g_t *val)
00418 {
00419   lsm6dso_ctrl2_g_t reg;
00420   int32_t ret;
00421 
00422   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00423   switch (reg.fs_g) {
00424     case LSM6DSO_250dps:
00425       *val = LSM6DSO_250dps;
00426       break;
00427     case LSM6DSO_125dps:
00428       *val = LSM6DSO_125dps;
00429       break;
00430     case LSM6DSO_500dps:
00431       *val = LSM6DSO_500dps;
00432       break;
00433     case LSM6DSO_1000dps:
00434       *val = LSM6DSO_1000dps;
00435       break;
00436     case LSM6DSO_2000dps:
00437       *val = LSM6DSO_2000dps;
00438       break;
00439     default:
00440       *val = LSM6DSO_250dps;
00441       break;
00442   }
00443 
00444   return ret;
00445 }
00446 
00447 /**
00448   * @brief  Gyroscope UI data rate selection.[set]
00449   *
00450   * @param  ctx      read / write interface definitions
00451   * @param  val      change the values of odr_g in reg CTRL2_G
00452   *
00453   */
00454 int32_t lsm6dso_gy_data_rate_set(lsm6dso_ctx_t *ctx, lsm6dso_odr_g_t val)
00455 {
00456   lsm6dso_odr_g_t odr_gy =  val;
00457   lsm6dso_emb_fsm_enable_t fsm_enable;
00458   lsm6dso_fsm_odr_t fsm_odr;
00459   lsm6dso_ctrl2_g_t reg;
00460   int32_t ret;
00461 
00462   /* Check the Finite State Machine data rate constraints */
00463   ret =  lsm6dso_fsm_enable_get(ctx, &fsm_enable);
00464   if (ret == 0) {
00465     if ( (fsm_enable.fsm_enable_a.fsm1_en  |
00466           fsm_enable.fsm_enable_a.fsm2_en  |
00467           fsm_enable.fsm_enable_a.fsm3_en  |
00468           fsm_enable.fsm_enable_a.fsm4_en  |
00469           fsm_enable.fsm_enable_a.fsm5_en  |
00470           fsm_enable.fsm_enable_a.fsm6_en  |
00471           fsm_enable.fsm_enable_a.fsm7_en  |
00472           fsm_enable.fsm_enable_a.fsm8_en  |
00473           fsm_enable.fsm_enable_b.fsm9_en  |
00474           fsm_enable.fsm_enable_b.fsm10_en |
00475           fsm_enable.fsm_enable_b.fsm11_en |
00476           fsm_enable.fsm_enable_b.fsm12_en |
00477           fsm_enable.fsm_enable_b.fsm13_en |
00478           fsm_enable.fsm_enable_b.fsm14_en |
00479           fsm_enable.fsm_enable_b.fsm15_en |
00480           fsm_enable.fsm_enable_b.fsm16_en ) == PROPERTY_ENABLE ){
00481 
00482       ret =  lsm6dso_fsm_data_rate_get(ctx, &fsm_odr);
00483       if (ret == 0) {
00484         switch (fsm_odr) {
00485           case LSM6DSO_ODR_FSM_12Hz5:
00486 
00487             if (val == LSM6DSO_GY_ODR_OFF){
00488               odr_gy = LSM6DSO_GY_ODR_12Hz5;
00489 
00490             } else {
00491               odr_gy = val;
00492             }
00493             break;
00494           case LSM6DSO_ODR_FSM_26Hz:
00495 
00496             if (val == LSM6DSO_GY_ODR_OFF){
00497               odr_gy = LSM6DSO_GY_ODR_26Hz;
00498 
00499             } else if (val == LSM6DSO_GY_ODR_12Hz5){
00500               odr_gy = LSM6DSO_GY_ODR_26Hz;
00501 
00502             } else {
00503               odr_gy = val;
00504             }
00505             break;
00506           case LSM6DSO_ODR_FSM_52Hz:
00507 
00508             if (val == LSM6DSO_GY_ODR_OFF){
00509               odr_gy = LSM6DSO_GY_ODR_52Hz;
00510 
00511             } else if (val == LSM6DSO_GY_ODR_12Hz5){
00512               odr_gy = LSM6DSO_GY_ODR_52Hz;
00513 
00514             } else if (val == LSM6DSO_GY_ODR_26Hz){
00515               odr_gy = LSM6DSO_GY_ODR_52Hz;
00516 
00517             } else {
00518               odr_gy = val;
00519             }
00520             break;
00521           case LSM6DSO_ODR_FSM_104Hz:
00522 
00523             if (val == LSM6DSO_GY_ODR_OFF){
00524               odr_gy = LSM6DSO_GY_ODR_104Hz;
00525 
00526             } else if (val == LSM6DSO_GY_ODR_12Hz5){
00527               odr_gy = LSM6DSO_GY_ODR_104Hz;
00528 
00529             } else if (val == LSM6DSO_GY_ODR_26Hz){
00530               odr_gy = LSM6DSO_GY_ODR_104Hz;
00531 
00532             } else if (val == LSM6DSO_GY_ODR_52Hz){
00533               odr_gy = LSM6DSO_GY_ODR_104Hz;
00534 
00535             } else {
00536               odr_gy = val;
00537             }
00538             break;
00539           default:
00540             odr_gy = val;
00541             break;
00542         }
00543       }
00544     }
00545   }
00546 
00547   if (ret == 0) {
00548     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00549   }
00550   if (ret == 0) {
00551     reg.odr_g = (uint8_t) odr_gy;
00552     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00553   }
00554 
00555   return ret;
00556 }
00557 
00558 /**
00559   * @brief  Gyroscope UI data rate selection.[get]
00560   *
00561   * @param  ctx      read / write interface definitions
00562   * @param  val      Get the values of odr_g in reg CTRL2_G
00563   *
00564   */
00565 int32_t lsm6dso_gy_data_rate_get(lsm6dso_ctx_t *ctx, lsm6dso_odr_g_t *val)
00566 {
00567   lsm6dso_ctrl2_g_t reg;
00568   int32_t ret;
00569 
00570   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_G, (uint8_t*)&reg, 1);
00571   switch (reg.odr_g) {
00572     case LSM6DSO_GY_ODR_OFF:
00573       *val = LSM6DSO_GY_ODR_OFF;
00574       break;
00575     case LSM6DSO_GY_ODR_12Hz5:
00576       *val = LSM6DSO_GY_ODR_12Hz5;
00577       break;
00578     case LSM6DSO_GY_ODR_26Hz:
00579       *val = LSM6DSO_GY_ODR_26Hz;
00580       break;
00581     case LSM6DSO_GY_ODR_52Hz:
00582       *val = LSM6DSO_GY_ODR_52Hz;
00583       break;
00584     case LSM6DSO_GY_ODR_104Hz:
00585       *val = LSM6DSO_GY_ODR_104Hz;
00586       break;
00587     case LSM6DSO_GY_ODR_208Hz:
00588       *val = LSM6DSO_GY_ODR_208Hz;
00589       break;
00590     case LSM6DSO_GY_ODR_417Hz:
00591       *val = LSM6DSO_GY_ODR_417Hz;
00592       break;
00593     case LSM6DSO_GY_ODR_833Hz:
00594       *val = LSM6DSO_GY_ODR_833Hz;
00595       break;
00596     case LSM6DSO_GY_ODR_1667Hz:
00597       *val = LSM6DSO_GY_ODR_1667Hz;
00598       break;
00599     case LSM6DSO_GY_ODR_3333Hz:
00600       *val = LSM6DSO_GY_ODR_3333Hz;
00601       break;
00602     case LSM6DSO_GY_ODR_6667Hz:
00603       *val = LSM6DSO_GY_ODR_6667Hz;
00604       break;
00605     default:
00606       *val = LSM6DSO_GY_ODR_OFF;
00607       break;
00608   }
00609   return ret;
00610 }
00611 
00612 /**
00613   * @brief  Block data update.[set]
00614   *
00615   * @param  ctx      read / write interface definitions
00616   * @param  val      change the values of bdu in reg CTRL3_C
00617   *
00618   */
00619 int32_t lsm6dso_block_data_update_set(lsm6dso_ctx_t *ctx, uint8_t val)
00620 {
00621   lsm6dso_ctrl3_c_t reg;
00622   int32_t ret;
00623 
00624   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
00625   if (ret == 0) {
00626     reg.bdu = val;
00627     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
00628   }
00629   return ret;
00630 }
00631 
00632 /**
00633   * @brief  Block data update.[get]
00634   *
00635   * @param  ctx      read / write interface definitions
00636   * @param  val      change the values of bdu in reg CTRL3_C
00637   *
00638   */
00639 int32_t lsm6dso_block_data_update_get(lsm6dso_ctx_t *ctx, uint8_t *val)
00640 {
00641   lsm6dso_ctrl3_c_t reg;
00642   int32_t ret;
00643 
00644   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
00645   *val = reg.bdu;
00646 
00647   return ret;
00648 }
00649 
00650 /**
00651   * @brief  Weight of XL user offset bits of registers X_OFS_USR (73h),
00652   *         Y_OFS_USR (74h), Z_OFS_USR (75h).[set]
00653   *
00654   * @param  ctx      read / write interface definitions
00655   * @param  val      change the values of usr_off_w in reg CTRL6_C
00656   *
00657   */
00658 int32_t lsm6dso_xl_offset_weight_set(lsm6dso_ctx_t *ctx,
00659                                      lsm6dso_usr_off_w_t val)
00660 {
00661   lsm6dso_ctrl6_c_t reg;
00662   int32_t ret;
00663 
00664   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
00665   if (ret == 0) {
00666     reg.usr_off_w = (uint8_t)val;
00667     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
00668   }
00669   return ret;
00670 }
00671 
00672 /**
00673   * @brief    Weight of XL user offset bits of registers X_OFS_USR (73h),
00674   *           Y_OFS_USR (74h), Z_OFS_USR (75h).[get]
00675   *
00676   * @param    ctx      read / write interface definitions
00677   * @param    val      Get the values of usr_off_w in reg CTRL6_C
00678   *
00679   */
00680 int32_t lsm6dso_xl_offset_weight_get(lsm6dso_ctx_t *ctx,
00681                                      lsm6dso_usr_off_w_t *val)
00682 {
00683   lsm6dso_ctrl6_c_t reg;
00684   int32_t ret;
00685 
00686   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
00687 
00688   switch (reg.usr_off_w) {
00689     case LSM6DSO_LSb_1mg:
00690       *val = LSM6DSO_LSb_1mg;
00691       break;
00692     case LSM6DSO_LSb_16mg:
00693       *val = LSM6DSO_LSb_16mg;
00694       break;
00695     default:
00696       *val = LSM6DSO_LSb_1mg;
00697       break;
00698   }
00699   return ret;
00700 }
00701 
00702 /**
00703   * @brief  Accelerometer power mode.[set]
00704   *
00705   * @param  ctx      read / write interface definitions
00706   * @param  val      change the values of xl_hm_mode in
00707   *                               reg CTRL6_C
00708   *
00709   */
00710 int32_t lsm6dso_xl_power_mode_set(lsm6dso_ctx_t *ctx,
00711                                   lsm6dso_xl_hm_mode_t val)
00712 {
00713   lsm6dso_ctrl5_c_t ctrl5_c;
00714   lsm6dso_ctrl6_c_t ctrl6_c;
00715   int32_t ret;
00716 
00717   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*) &ctrl5_c, 1);
00718   if (ret == 0) {
00719     ctrl5_c.xl_ulp_en = ((uint8_t)val & 0x02U) >> 1;
00720     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*) &ctrl5_c, 1);
00721   }
00722   if (ret == 0) {
00723     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*) &ctrl6_c, 1);
00724   }
00725   if (ret == 0) {
00726     ctrl6_c.xl_hm_mode = (uint8_t)val & 0x01U;
00727     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*) &ctrl6_c, 1);
00728   }
00729   return ret;
00730 }
00731 
00732 /**
00733   * @brief  Accelerometer power mode.[get]
00734   *
00735   * @param  ctx      read / write interface definitions
00736   * @param  val      Get the values of xl_hm_mode in reg CTRL6_C
00737   *
00738   */
00739 int32_t lsm6dso_xl_power_mode_get(lsm6dso_ctx_t *ctx,
00740                                   lsm6dso_xl_hm_mode_t *val)
00741 {
00742   lsm6dso_ctrl5_c_t ctrl5_c;
00743   lsm6dso_ctrl6_c_t ctrl6_c;
00744   int32_t ret;
00745 
00746   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*) &ctrl5_c, 1);
00747   if (ret == 0) {
00748     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*) &ctrl6_c, 1);
00749     switch ( (ctrl5_c.xl_ulp_en << 1) | ctrl6_c.xl_hm_mode) {
00750       case LSM6DSO_HIGH_PERFORMANCE_MD:
00751         *val = LSM6DSO_HIGH_PERFORMANCE_MD;
00752         break;
00753       case LSM6DSO_LOW_NORMAL_POWER_MD:
00754         *val = LSM6DSO_LOW_NORMAL_POWER_MD;
00755         break;
00756       case LSM6DSO_ULTRA_LOW_POWER_MD:
00757         *val = LSM6DSO_ULTRA_LOW_POWER_MD;
00758         break;
00759       default:
00760         *val = LSM6DSO_HIGH_PERFORMANCE_MD;
00761         break;
00762     }
00763   }
00764   return ret;
00765 }
00766 
00767 /**
00768   * @brief  Operating mode for gyroscope.[set]
00769   *
00770   * @param  ctx      read / write interface definitions
00771   * @param  val      change the values of g_hm_mode in reg CTRL7_G
00772   *
00773   */
00774 int32_t lsm6dso_gy_power_mode_set(lsm6dso_ctx_t *ctx,
00775                                   lsm6dso_g_hm_mode_t val)
00776 {
00777   lsm6dso_ctrl7_g_t reg;
00778   int32_t ret;
00779 
00780   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
00781   if (ret == 0) {
00782     reg.g_hm_mode = (uint8_t)val;
00783     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
00784   }
00785   return ret;
00786 }
00787 
00788 /**
00789   * @brief  Operating mode for gyroscope.[get]
00790   *
00791   * @param  ctx      read / write interface definitions
00792   * @param  val      Get the values of g_hm_mode in reg CTRL7_G
00793   *
00794   */
00795 int32_t lsm6dso_gy_power_mode_get(lsm6dso_ctx_t *ctx,
00796                                   lsm6dso_g_hm_mode_t *val)
00797 {
00798   lsm6dso_ctrl7_g_t reg;
00799   int32_t ret;
00800 
00801   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
00802   switch (reg.g_hm_mode) {
00803     case LSM6DSO_GY_HIGH_PERFORMANCE:
00804       *val = LSM6DSO_GY_HIGH_PERFORMANCE;
00805       break;
00806     case LSM6DSO_GY_NORMAL:
00807       *val = LSM6DSO_GY_NORMAL;
00808       break;
00809     default:
00810       *val = LSM6DSO_GY_HIGH_PERFORMANCE;
00811       break;
00812   }
00813   return ret;
00814 }
00815 
00816 /**
00817   * @brief  The STATUS_REG register is read by the primary interface.[get]
00818   *
00819   * @param  ctx      read / write interface definitions
00820   * @param  val      register STATUS_REG
00821   *
00822   */
00823 int32_t lsm6dso_status_reg_get(lsm6dso_ctx_t *ctx, lsm6dso_status_reg_t *val)
00824 {
00825   int32_t ret;
00826   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t*) val, 1);
00827   return ret;
00828 }
00829 
00830 /**
00831   * @brief  Accelerometer new data available.[get]
00832   *
00833   * @param  ctx      read / write interface definitions
00834   * @param  val      change the values of xlda in reg STATUS_REG
00835   *
00836   */
00837 int32_t lsm6dso_xl_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
00838 {
00839   lsm6dso_status_reg_t reg;
00840   int32_t ret;
00841 
00842   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t*)&reg, 1);
00843   *val = reg.xlda;
00844 
00845   return ret;
00846 }
00847 
00848 /**
00849   * @brief  Gyroscope new data available.[get]
00850   *
00851   * @param  ctx      read / write interface definitions
00852   * @param  val      change the values of gda in reg STATUS_REG
00853   *
00854   */
00855 int32_t lsm6dso_gy_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
00856 {
00857   lsm6dso_status_reg_t reg;
00858   int32_t ret;
00859 
00860   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t*)&reg, 1);
00861   *val = reg.gda;
00862 
00863   return ret;
00864 }
00865 
00866 /**
00867   * @brief  Temperature new data available.[get]
00868   *
00869   * @param  ctx      read / write interface definitions
00870   * @param  val      change the values of tda in reg STATUS_REG
00871   *
00872   */
00873 int32_t lsm6dso_temp_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
00874 {
00875   lsm6dso_status_reg_t reg;
00876   int32_t ret;
00877 
00878   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG, (uint8_t*)&reg, 1);
00879   *val = reg.tda;
00880 
00881   return ret;
00882 }
00883 
00884 /**
00885   * @brief  Accelerometer X-axis user offset correction expressed in
00886   *         two’s complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00887   *         The value must be in the range [-127 127].[set]
00888   *
00889   * @param  ctx      read / write interface definitions
00890   * @param  buff     buffer that contains data to write
00891   *
00892   */
00893 int32_t lsm6dso_xl_usr_offset_x_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
00894 {
00895   int32_t ret;
00896   ret = lsm6dso_write_reg(ctx, LSM6DSO_X_OFS_USR, buff, 1);
00897   return ret;
00898 }
00899 
00900 /**
00901   * @brief  Accelerometer X-axis user offset correction expressed in two’s
00902   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00903   *         The value must be in the range [-127 127].[get]
00904   *
00905   * @param  ctx      read / write interface definitions
00906   * @param  buff     buffer that stores data read
00907   *
00908   */
00909 int32_t lsm6dso_xl_usr_offset_x_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
00910 {
00911   int32_t ret;
00912   ret = lsm6dso_read_reg(ctx, LSM6DSO_X_OFS_USR, buff, 1);
00913   return ret;
00914 }
00915 
00916 /**
00917   * @brief  Accelerometer Y-axis user offset correction expressed in two’s
00918   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00919   *         The value must be in the range [-127 127].[set]
00920   *
00921   * @param  ctx      read / write interface definitions
00922   * @param  buff     buffer that contains data to write
00923   *
00924   */
00925 int32_t lsm6dso_xl_usr_offset_y_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
00926 {
00927   int32_t ret;
00928   ret = lsm6dso_write_reg(ctx, LSM6DSO_Y_OFS_USR, buff, 1);
00929   return ret;
00930 }
00931 
00932 /**
00933   * @brief  Accelerometer Y-axis user offset correction expressed in two’s
00934   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00935   *         The value must be in the range [-127 127].[get]
00936   *
00937   * @param  ctx      read / write interface definitions
00938   * @param  buff     buffer that stores data read
00939   *
00940   */
00941 int32_t lsm6dso_xl_usr_offset_y_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
00942 {
00943   int32_t ret;
00944   ret = lsm6dso_read_reg(ctx, LSM6DSO_Y_OFS_USR, buff, 1);
00945   return ret;
00946 }
00947 
00948 /**
00949   * @brief  Accelerometer Z-axis user offset correction expressed in two’s
00950   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00951   *         The value must be in the range [-127 127].[set]
00952   *
00953   * @param  ctx      read / write interface definitions
00954   * @param  buff     buffer that contains data to write
00955   *
00956   */
00957 int32_t lsm6dso_xl_usr_offset_z_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
00958 {
00959   int32_t ret;
00960   ret = lsm6dso_write_reg(ctx, LSM6DSO_Z_OFS_USR, buff, 1);
00961   return ret;
00962 }
00963 
00964 /**
00965   * @brief  Accelerometer Z-axis user offset correction expressed in two’s
00966   *         complement, weight depends on USR_OFF_W in CTRL6_C (15h).
00967   *         The value must be in the range [-127 127].[get]
00968   *
00969   * @param  ctx      read / write interface definitions
00970   * @param  buff     buffer that stores data read
00971   *
00972   */
00973 int32_t lsm6dso_xl_usr_offset_z_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
00974 {
00975   int32_t ret;
00976   ret = lsm6dso_read_reg(ctx, LSM6DSO_Z_OFS_USR, buff, 1);
00977   return ret;
00978 }
00979 
00980 /**
00981   * @brief  Enables user offset on out.[set]
00982   *
00983   * @param  ctx      read / write interface definitions
00984   * @param  val      change the values of usr_off_on_out in reg CTRL7_G
00985   *
00986   */
00987 int32_t lsm6dso_xl_usr_offset_set(lsm6dso_ctx_t *ctx, uint8_t val)
00988 {
00989   lsm6dso_ctrl7_g_t reg;
00990   int32_t ret;
00991 
00992   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
00993   if (ret == 0) {
00994     reg.usr_off_on_out = val;
00995     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
00996   }
00997   return ret;
00998 }
00999 
01000 /**
01001   * @brief  User offset on out flag.[get]
01002   *
01003   * @param  ctx      read / write interface definitions
01004   * @param  val      values of usr_off_on_out in reg CTRL7_G
01005   *
01006   */
01007 int32_t lsm6dso_xl_usr_offset_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01008 {
01009   lsm6dso_ctrl7_g_t reg;
01010   int32_t ret;
01011 
01012   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
01013   *val = reg.usr_off_on_out;
01014 
01015   return ret;
01016 }
01017 
01018 /**
01019   * @}
01020   *
01021   */
01022 
01023 /**
01024   * @defgroup  LSM6DSO_Timestamp
01025   * @brief     This section groups all the functions that manage the
01026   *            timestamp generation.
01027   * @{
01028   *
01029   */
01030 
01031 /**
01032   * @brief  Reset timestamp counter.[set]
01033   *
01034   * @param  ctx    Read / write interface definitions.(ptr)
01035   * @retval        Interface status (MANDATORY: return 0 -> no Error).
01036   *
01037   */
01038 int32_t lsm6dso_timestamp_rst(lsm6dso_ctx_t *ctx)
01039 {
01040   uint8_t rst_val = 0xAA;
01041 
01042   return lsm6dso_write_reg(ctx, LSM6DSO_TIMESTAMP2, &rst_val, 1);
01043 }
01044 
01045 /**
01046   * @brief  Enables timestamp counter.[set]
01047   *
01048   * @param  ctx      read / write interface definitions
01049   * @param  val      change the values of timestamp_en in reg CTRL10_C
01050   *
01051   */
01052 int32_t lsm6dso_timestamp_set(lsm6dso_ctx_t *ctx, uint8_t val)
01053 {
01054   lsm6dso_ctrl10_c_t reg;
01055   int32_t ret;
01056 
01057   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t*)&reg, 1);
01058   if (ret == 0) {
01059     reg.timestamp_en = val;
01060     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t*)&reg, 1);
01061   }
01062   return ret;
01063 }
01064 
01065 /**
01066   * @brief  Enables timestamp counter.[get]
01067   *
01068   * @param  ctx      read / write interface definitions
01069   * @param  val      change the values of timestamp_en in reg CTRL10_C
01070   *
01071   */
01072 int32_t lsm6dso_timestamp_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01073 {
01074   lsm6dso_ctrl10_c_t reg;
01075   int32_t ret;
01076 
01077   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL10_C, (uint8_t*)&reg, 1);
01078   *val = reg.timestamp_en;
01079 
01080   return ret;
01081 }
01082 
01083 /**
01084   * @brief  Timestamp first data output register (r).
01085   *         The value is expressed as a 32-bit word and the bit
01086   *         resolution is 25 μs.[get]
01087   *
01088   * @param  ctx      read / write interface definitions
01089   * @param  buff     buffer that stores data read
01090   *
01091   */
01092 int32_t lsm6dso_timestamp_raw_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01093 {
01094   int32_t ret;
01095   ret = lsm6dso_read_reg(ctx, LSM6DSO_TIMESTAMP0, buff, 4);
01096   return ret;
01097 }
01098 
01099 /**
01100   * @}
01101   *
01102   */
01103 
01104 /**
01105   * @defgroup  LSM6DSO_Data output
01106   * @brief     This section groups all the data output functions.
01107   * @{
01108   *
01109 */
01110 
01111 /**
01112   * @brief  Circular burst-mode (rounding) read of the output
01113   *         registers.[set]
01114   *
01115   * @param  ctx      read / write interface definitions
01116   * @param  val      change the values of rounding in reg CTRL5_C
01117   *
01118   */
01119 int32_t lsm6dso_rounding_mode_set(lsm6dso_ctx_t *ctx,
01120                                   lsm6dso_rounding_t val)
01121 {
01122   lsm6dso_ctrl5_c_t reg;
01123   int32_t ret;
01124 
01125   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01126   if (ret == 0) {
01127     reg.rounding = (uint8_t)val;
01128     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01129   }
01130   return ret;
01131 }
01132 
01133 /**
01134   * @brief  Gyroscope UI chain full-scale selection.[get]
01135   *
01136   * @param  ctx      read / write interface definitions
01137   * @param  val      Get the values of rounding in reg CTRL5_C
01138   *
01139   */
01140 int32_t lsm6dso_rounding_mode_get(lsm6dso_ctx_t *ctx,
01141                                   lsm6dso_rounding_t *val)
01142 {
01143   lsm6dso_ctrl5_c_t reg;
01144   int32_t ret;
01145 
01146   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01147   switch (reg.rounding) {
01148     case LSM6DSO_NO_ROUND:
01149       *val = LSM6DSO_NO_ROUND;
01150       break;
01151     case LSM6DSO_ROUND_XL:
01152       *val = LSM6DSO_ROUND_XL;
01153       break;
01154     case LSM6DSO_ROUND_GY:
01155       *val = LSM6DSO_ROUND_GY;
01156       break;
01157     case LSM6DSO_ROUND_GY_XL:
01158       *val = LSM6DSO_ROUND_GY_XL;
01159       break;
01160     default:
01161       *val = LSM6DSO_NO_ROUND;
01162       break;
01163   }
01164   return ret;
01165 }
01166 
01167 /**
01168   * @brief  Temperature data output register (r).
01169   *         L and H registers together express a 16-bit word in two’s
01170   *         complement.[get]
01171   *
01172   * @param  ctx      read / write interface definitions
01173   * @param  buff     buffer that stores data read
01174   *
01175   */
01176 int32_t lsm6dso_temperature_raw_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01177 {
01178   int32_t ret;
01179   ret = lsm6dso_read_reg(ctx, LSM6DSO_OUT_TEMP_L, buff, 2);
01180   return ret;
01181 }
01182 
01183 /**
01184   * @brief  Angular rate sensor. The value is expressed as a 16-bit
01185   *         word in two’s complement.[get]
01186   *
01187   * @param  ctx      read / write interface definitions
01188   * @param  buff     buffer that stores data read
01189   *
01190   */
01191 int32_t lsm6dso_angular_rate_raw_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01192 {
01193   int32_t ret;
01194   ret = lsm6dso_read_reg(ctx, LSM6DSO_OUTX_L_G, buff, 6);
01195   return ret;
01196 }
01197 
01198 /**
01199   * @brief  Linear acceleration output register.
01200   *         The value is expressed as a 16-bit word in two’s complement.[get]
01201   *
01202   * @param  ctx      read / write interface definitions
01203   * @param  buff     buffer that stores data read
01204   *
01205   */
01206 int32_t lsm6dso_acceleration_raw_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01207 {
01208   int32_t ret;
01209   ret = lsm6dso_read_reg(ctx, LSM6DSO_OUTX_L_A, buff, 6);
01210   return ret;
01211 }
01212 
01213 /**
01214   * @brief  FIFO data output [get]
01215   *
01216   * @param  ctx      read / write interface definitions
01217   * @param  buff     buffer that stores data read
01218   *
01219   */
01220 int32_t lsm6dso_fifo_out_raw_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01221 {
01222   int32_t ret;
01223   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_DATA_OUT_X_L, buff, 6);
01224   return ret;
01225 }
01226 
01227 /**
01228   * @brief  Step counter output register.[get]
01229   *
01230   * @param  ctx      read / write interface definitions
01231   * @param  buff     buffer that stores data read
01232   *
01233   */
01234 int32_t lsm6dso_number_of_steps_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01235 {
01236   int32_t ret;
01237 
01238   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
01239   if (ret == 0) {
01240     ret = lsm6dso_read_reg(ctx, LSM6DSO_STEP_COUNTER_L, buff, 2);
01241   }
01242   if (ret == 0) {
01243     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
01244   }
01245   return ret;
01246 }
01247 
01248 /**
01249   * @brief  Reset step counter register.[get]
01250   *
01251   * @param  ctx      read / write interface definitions
01252   *
01253   */
01254 int32_t lsm6dso_steps_reset(lsm6dso_ctx_t *ctx)
01255 {
01256   lsm6dso_emb_func_src_t reg;
01257   int32_t ret;
01258 
01259   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
01260   if (ret == 0) {
01261     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_SRC, (uint8_t*)&reg, 1);
01262   }
01263   if (ret == 0) {
01264     reg.pedo_rst_step = PROPERTY_ENABLE;
01265     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_SRC, (uint8_t*)&reg, 1);
01266   }
01267   if (ret == 0) {
01268     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
01269   }
01270   return ret;
01271 }
01272 
01273 /**
01274   * @}
01275   *
01276   */
01277 
01278 /**
01279   * @defgroup  LSM6DSO_common
01280   * @brief   This section groups common usefull functions.
01281   * @{
01282   *
01283 */
01284 
01285 /**
01286   * @brief  Difference in percentage of the effective ODR(and timestamp rate)
01287   *         with respect to the typical.
01288   *         Step:  0.15%. 8-bit format, 2's complement.[set]
01289   *
01290   * @param  ctx      read / write interface definitions
01291   * @param  val      change the values of freq_fine in reg
01292   *                      INTERNAL_FREQ_FINE
01293   *
01294   */
01295 int32_t lsm6dso_odr_cal_reg_set(lsm6dso_ctx_t *ctx, uint8_t val)
01296 {
01297   lsm6dso_internal_freq_fine_t reg;
01298   int32_t ret;
01299 
01300   ret = lsm6dso_read_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE, (uint8_t*)&reg, 1);
01301   if (ret == 0) {
01302     reg.freq_fine = val;
01303     ret = lsm6dso_write_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE,
01304                             (uint8_t*)&reg, 1);
01305   }
01306   return ret;
01307 }
01308 
01309 /**
01310   * @brief  Difference in percentage of the effective ODR(and timestamp rate)
01311   *         with respect to the typical.
01312   *         Step:  0.15%. 8-bit format, 2's complement.[get]
01313   *
01314   * @param  ctx      read / write interface definitions
01315   * @param  val      change the values of freq_fine in reg INTERNAL_FREQ_FINE
01316   *
01317   */
01318 int32_t lsm6dso_odr_cal_reg_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01319 {
01320   lsm6dso_internal_freq_fine_t reg;
01321   int32_t ret;
01322 
01323   ret = lsm6dso_read_reg(ctx, LSM6DSO_INTERNAL_FREQ_FINE, (uint8_t*)&reg, 1);
01324   *val = reg.freq_fine;
01325 
01326   return ret;
01327 }
01328 
01329 
01330 /**
01331   * @brief  Enable access to the embedded functions/sensor
01332   *         hub configuration registers.[set]
01333   *
01334   * @param  ctx      read / write interface definitions
01335   * @param  val      change the values of reg_access in
01336   *                               reg FUNC_CFG_ACCESS
01337   *
01338   */
01339 int32_t lsm6dso_mem_bank_set(lsm6dso_ctx_t *ctx, lsm6dso_reg_access_t val)
01340 {
01341   lsm6dso_func_cfg_access_t reg;
01342   int32_t ret;
01343 
01344   ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t*)&reg, 1);
01345   if (ret == 0) {
01346     reg.reg_access = (uint8_t)val;
01347     ret = lsm6dso_write_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t*)&reg, 1);
01348   }
01349   return ret;
01350 }
01351 
01352 /**
01353   * @brief  Enable access to the embedded functions/sensor
01354   *         hub configuration registers.[get]
01355   *
01356   * @param  ctx      read / write interface definitions
01357   * @param  val      Get the values of reg_access in
01358   *                               reg FUNC_CFG_ACCESS
01359   *
01360   */
01361 int32_t lsm6dso_mem_bank_get(lsm6dso_ctx_t *ctx, lsm6dso_reg_access_t *val)
01362 {
01363   lsm6dso_func_cfg_access_t reg;
01364   int32_t ret;
01365 
01366   ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS, (uint8_t*)&reg, 1);
01367   switch (reg.reg_access) {
01368     case LSM6DSO_USER_BANK:
01369       *val = LSM6DSO_USER_BANK;
01370       break;
01371     case LSM6DSO_SENSOR_HUB_BANK:
01372       *val = LSM6DSO_SENSOR_HUB_BANK;
01373       break;
01374     case LSM6DSO_EMBEDDED_FUNC_BANK:
01375       *val = LSM6DSO_EMBEDDED_FUNC_BANK;
01376       break;
01377     default:
01378       *val = LSM6DSO_USER_BANK;
01379       break;
01380   }
01381   return ret;
01382 }
01383 
01384 /**
01385   * @brief  Write a line(byte) in a page.[set]
01386   *
01387   * @param  ctx      read / write interface definitions
01388   * @param  uint8_t address: page line address
01389   * @param  val      value to write
01390   *
01391   */
01392 int32_t lsm6dso_ln_pg_write_byte(lsm6dso_ctx_t *ctx, uint16_t address,
01393                                  uint8_t *val)
01394 {
01395   lsm6dso_page_rw_t page_rw;
01396   lsm6dso_page_sel_t page_sel;
01397   lsm6dso_page_address_t page_address;
01398   int32_t ret;
01399 
01400   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
01401 
01402   if (ret == 0) {
01403     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01404   }
01405   if (ret == 0) {
01406     page_rw.page_rw = 0x02; /* page_write enable */
01407     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01408   }
01409   if (ret == 0) {
01410     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01411   }
01412 
01413   if (ret == 0) {
01414     page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
01415     page_sel.not_used_01 = 1;
01416     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01417   }
01418   if (ret == 0) {
01419     page_address.page_addr = (uint8_t)address & 0xFFU;
01420     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
01421                             (uint8_t*)&page_address, 1);
01422   }
01423   if (ret == 0) {
01424     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_VALUE, val, 1);
01425   }
01426   if (ret == 0) {
01427     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01428   }
01429   if (ret == 0) {
01430     page_rw.page_rw = 0x00; /* page_write disable */
01431     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01432   }
01433   if (ret == 0) {
01434 
01435     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
01436   }
01437   return ret;
01438 }
01439 
01440 /**
01441   * @brief  Write buffer in a page.[set]
01442   *
01443   * @param  ctx      read / write interface definitions
01444   * @param  uint8_t address: page line address
01445   * @param  uint8_t *buf: buffer to write
01446   * @param  uint8_t len: buffer len
01447   *
01448   */
01449 int32_t lsm6dso_ln_pg_write(lsm6dso_ctx_t *ctx, uint16_t address,
01450                             uint8_t *buf, uint8_t len)
01451 {
01452   lsm6dso_page_rw_t page_rw;
01453   lsm6dso_page_sel_t page_sel;
01454   lsm6dso_page_address_t  page_address;
01455   uint16_t addr_pointed;
01456   int32_t ret;
01457   uint8_t i ;
01458 
01459   addr_pointed = address;
01460 
01461   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
01462   if (ret == 0) {
01463 
01464     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01465   }
01466   if (ret == 0) {
01467     page_rw.page_rw = 0x02; /* page_write enable*/
01468     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01469   }
01470   if (ret == 0) {
01471     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01472   }
01473   if (ret == 0) {
01474     page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
01475     page_sel.not_used_01 = 1;
01476     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01477   }
01478   if (ret == 0) {
01479     page_address.page_addr = (uint8_t)(addr_pointed & 0x00FFU);
01480     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
01481                             (uint8_t*)&page_address, 1);
01482   }
01483 
01484   if (ret == 0) {
01485     for (i = 0; ( (i < len) && (ret == 0) ); i++) {
01486       ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_VALUE, &buf[i], 1);
01487       addr_pointed++;
01488       /* Check if page wrap */
01489       if ( ( (addr_pointed % 0x0100U) == 0x00U ) && (ret == 0) ) {
01490         ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*)&page_sel, 1);
01491         if (ret == 0) {
01492           page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
01493           page_sel.not_used_01 = 1;
01494           ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL,
01495                                   (uint8_t*)&page_sel, 1);
01496         }
01497       }
01498     }
01499     page_sel.page_sel = 0;
01500     page_sel.not_used_01 = 1;
01501     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01502   }
01503   if (ret == 0) {
01504     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01505   }
01506   if (ret == 0) {
01507     page_rw.page_rw = 0x00; /* page_write disable */
01508     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01509   }
01510   if (ret == 0) {
01511     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
01512   }
01513   return ret;
01514 }
01515 
01516 /**
01517   * @brief  Read a line(byte) in a page.[get]
01518   *
01519   * @param  ctx      read / write interface definitions
01520   * @param  uint8_t address: page line address
01521   * @param  val      read value
01522   *
01523   */
01524 int32_t lsm6dso_ln_pg_read_byte(lsm6dso_ctx_t *ctx, uint16_t address,
01525                                 uint8_t *val)
01526 {
01527   lsm6dso_page_rw_t page_rw;
01528   lsm6dso_page_sel_t page_sel;
01529   lsm6dso_page_address_t  page_address;
01530   int32_t ret;
01531 
01532   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
01533   if (ret == 0) {
01534 
01535     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01536   }
01537   if (ret == 0) {
01538     page_rw.page_rw = 0x01; /* page_read enable*/
01539     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01540   }
01541   if (ret == 0) {
01542 
01543     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01544   }
01545   if (ret == 0) {
01546     page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
01547     page_sel.not_used_01 = 1;
01548     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
01549   }
01550   if (ret == 0) {
01551     page_address.page_addr = (uint8_t)address & 0x00FFU;
01552     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
01553                             (uint8_t*)&page_address, 1);
01554   }
01555   if (ret == 0) {
01556 
01557     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_VALUE, val, 1);
01558   }
01559   if (ret == 0) {
01560     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01561   }
01562   if (ret == 0) {
01563     page_rw.page_rw = 0x00; /* page_read disable */
01564     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
01565   }
01566   if (ret == 0) {
01567     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
01568   }
01569 
01570   return ret;
01571 }
01572 
01573 /**
01574   * @brief  Data-ready pulsed / letched mode.[set]
01575   *
01576   * @param  ctx      read / write interface definitions
01577   * @param  val      change the values of
01578   *                                     dataready_pulsed in
01579   *                                     reg COUNTER_BDR_REG1
01580   *
01581   */
01582 int32_t lsm6dso_data_ready_mode_set(lsm6dso_ctx_t *ctx,
01583                                     lsm6dso_dataready_pulsed_t val)
01584 {
01585   lsm6dso_counter_bdr_reg1_t reg;
01586   int32_t ret;
01587 
01588   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
01589   if (ret == 0) {
01590     reg.dataready_pulsed = (uint8_t)val;
01591     ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
01592   }
01593   return ret;
01594 }
01595 
01596 /**
01597   * @brief  Data-ready pulsed / letched mode.[get]
01598   *
01599   * @param  ctx      read / write interface definitions
01600   * @param  val      Get the values of
01601   *                                     dataready_pulsed in
01602   *                                     reg COUNTER_BDR_REG1
01603   *
01604   */
01605 int32_t lsm6dso_data_ready_mode_get(lsm6dso_ctx_t *ctx,
01606                                     lsm6dso_dataready_pulsed_t *val)
01607 {
01608   lsm6dso_counter_bdr_reg1_t reg;
01609   int32_t ret;
01610 
01611   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
01612   switch (reg.dataready_pulsed) {
01613     case LSM6DSO_DRDY_LATCHED:
01614       *val = LSM6DSO_DRDY_LATCHED;
01615       break;
01616     case LSM6DSO_DRDY_PULSED:
01617       *val = LSM6DSO_DRDY_PULSED;
01618       break;
01619     default:
01620       *val = LSM6DSO_DRDY_LATCHED;
01621       break;
01622   }
01623   return ret;
01624 }
01625 
01626 /**
01627   * @brief  Device "Who am I".[get]
01628   *
01629   * @param  ctx      read / write interface definitions
01630   * @param  buff     buffer that stores data read
01631   *
01632   */
01633 int32_t lsm6dso_device_id_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
01634 {
01635   int32_t ret;
01636   ret = lsm6dso_read_reg(ctx, LSM6DSO_WHO_AM_I, buff, 1);
01637   return ret;
01638 }
01639 
01640 /**
01641   * @brief  Software reset. Restore the default values
01642   *         in user registers[set]
01643   *
01644   * @param  ctx      read / write interface definitions
01645   * @param  val      change the values of sw_reset in reg CTRL3_C
01646   *
01647   */
01648 int32_t lsm6dso_reset_set(lsm6dso_ctx_t *ctx, uint8_t val)
01649 {
01650   lsm6dso_ctrl3_c_t reg;
01651   int32_t ret;
01652 
01653   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01654   if (ret == 0) {
01655     reg.sw_reset = val;
01656     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01657   }
01658 
01659   return ret;
01660 }
01661 
01662 /**
01663   * @brief  Software reset. Restore the default values in user registers.[get]
01664   *
01665   * @param  ctx      read / write interface definitions
01666   * @param  val      change the values of sw_reset in reg CTRL3_C
01667   *
01668   */
01669 int32_t lsm6dso_reset_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01670 {
01671   lsm6dso_ctrl3_c_t reg;
01672   int32_t ret;
01673 
01674   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01675   *val = reg.sw_reset;
01676 
01677   return ret;
01678 }
01679 
01680 /**
01681   * @brief  Register address automatically incremented during a multiple byte
01682   *         access with a serial interface.[set]
01683   *
01684   * @param  ctx      read / write interface definitions
01685   * @param  val      change the values of if_inc in reg CTRL3_C
01686   *
01687   */
01688 int32_t lsm6dso_auto_increment_set(lsm6dso_ctx_t *ctx, uint8_t val)
01689 {
01690   lsm6dso_ctrl3_c_t reg;
01691   int32_t ret;
01692 
01693   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01694   if (ret == 0) {
01695     reg.if_inc = val;
01696     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01697   }
01698   return ret;
01699 }
01700 
01701 /**
01702   * @brief  Register address automatically incremented during a multiple byte
01703   *         access with a serial interface.[get]
01704   *
01705   * @param  ctx      read / write interface definitions
01706   * @param  val      change the values of if_inc in reg CTRL3_C
01707   *
01708   */
01709 int32_t lsm6dso_auto_increment_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01710 {
01711   lsm6dso_ctrl3_c_t reg;
01712   int32_t ret;
01713 
01714   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01715   *val = reg.if_inc;
01716 
01717   return ret;
01718 }
01719 
01720 /**
01721   * @brief  Reboot memory content. Reload the calibration parameters.[set]
01722   *
01723   * @param  ctx      read / write interface definitions
01724   * @param  val      change the values of boot in reg CTRL3_C
01725   *
01726   */
01727 int32_t lsm6dso_boot_set(lsm6dso_ctx_t *ctx, uint8_t val)
01728 {
01729   lsm6dso_ctrl3_c_t reg;
01730   int32_t ret;
01731 
01732   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01733   if (ret == 0) {
01734     reg.boot = val;
01735     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01736   }
01737   return ret;
01738 }
01739 
01740 /**
01741   * @brief  Reboot memory content. Reload the calibration parameters.[get]
01742   *
01743   * @param  ctx      read / write interface definitions
01744   * @param  val      change the values of boot in reg CTRL3_C
01745   *
01746   */
01747 int32_t lsm6dso_boot_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01748 {
01749   lsm6dso_ctrl3_c_t reg;
01750   int32_t ret;
01751 
01752   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
01753   *val = reg.boot;
01754 
01755   return ret;
01756 }
01757 
01758 /**
01759   * @brief  Linear acceleration sensor self-test enable.[set]
01760   *
01761   * @param  ctx      read / write interface definitions
01762   * @param  val      change the values of st_xl in reg CTRL5_C
01763   *
01764   */
01765 int32_t lsm6dso_xl_self_test_set(lsm6dso_ctx_t *ctx, lsm6dso_st_xl_t val)
01766 {
01767   lsm6dso_ctrl5_c_t reg;
01768   int32_t ret;
01769 
01770   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01771   if (ret == 0) {
01772     reg.st_xl = (uint8_t)val;
01773     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01774   }
01775   return ret;
01776 }
01777 
01778 /**
01779   * @brief  Linear acceleration sensor self-test enable.[get]
01780   *
01781   * @param  ctx      read / write interface definitions
01782   * @param  val      Get the values of st_xl in reg CTRL5_C
01783   *
01784   */
01785 int32_t lsm6dso_xl_self_test_get(lsm6dso_ctx_t *ctx, lsm6dso_st_xl_t *val)
01786 {
01787   lsm6dso_ctrl5_c_t reg;
01788   int32_t ret;
01789 
01790   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01791   switch (reg.st_xl) {
01792     case LSM6DSO_XL_ST_DISABLE:
01793       *val = LSM6DSO_XL_ST_DISABLE;
01794       break;
01795     case LSM6DSO_XL_ST_POSITIVE:
01796       *val = LSM6DSO_XL_ST_POSITIVE;
01797       break;
01798     case LSM6DSO_XL_ST_NEGATIVE:
01799       *val = LSM6DSO_XL_ST_NEGATIVE;
01800       break;
01801     default:
01802       *val = LSM6DSO_XL_ST_DISABLE;
01803       break;
01804   }
01805   return ret;
01806 }
01807 
01808 /**
01809   * @brief  Angular rate sensor self-test enable.[set]
01810   *
01811   * @param  ctx      read / write interface definitions
01812   * @param  val      change the values of st_g in reg CTRL5_C
01813   *
01814   */
01815 int32_t lsm6dso_gy_self_test_set(lsm6dso_ctx_t *ctx, lsm6dso_st_g_t val)
01816 {
01817   lsm6dso_ctrl5_c_t reg;
01818   int32_t ret;
01819 
01820   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01821   if (ret == 0) {
01822     reg.st_g = (uint8_t)val;
01823     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01824   }
01825   return ret;
01826 }
01827 
01828 /**
01829   * @brief  Angular rate sensor self-test enable.[get]
01830   *
01831   * @param  ctx      read / write interface definitions
01832   * @param  val      Get the values of st_g in reg CTRL5_C
01833   *
01834   */
01835 int32_t lsm6dso_gy_self_test_get(lsm6dso_ctx_t *ctx, lsm6dso_st_g_t *val)
01836 {
01837   lsm6dso_ctrl5_c_t reg;
01838   int32_t ret;
01839 
01840   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&reg, 1);
01841   switch (reg.st_g) {
01842     case LSM6DSO_GY_ST_DISABLE:
01843       *val = LSM6DSO_GY_ST_DISABLE;
01844       break;
01845     case LSM6DSO_GY_ST_POSITIVE:
01846       *val = LSM6DSO_GY_ST_POSITIVE;
01847       break;
01848     case LSM6DSO_GY_ST_NEGATIVE:
01849       *val = LSM6DSO_GY_ST_NEGATIVE;
01850       break;
01851     default:
01852       *val = LSM6DSO_GY_ST_DISABLE;
01853       break;
01854   }
01855   return ret;
01856 }
01857 
01858 /**
01859   * @}
01860   *
01861   */
01862 
01863 /**
01864   * @defgroup  LSM6DSO_filters
01865   * @brief     This section group all the functions concerning the
01866   *            filters configuration
01867   * @{
01868   *
01869 */
01870 
01871 /**
01872   * @brief  Accelerometer output from LPF2 filtering stage selection.[set]
01873   *
01874   * @param  ctx      read / write interface definitions
01875   * @param  val      change the values of lpf2_xl_en in reg CTRL1_XL
01876   *
01877   */
01878 int32_t lsm6dso_xl_filter_lp2_set(lsm6dso_ctx_t *ctx, uint8_t val)
01879 {
01880   lsm6dso_ctrl1_xl_t reg;
01881   int32_t ret;
01882 
01883   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
01884   if (ret == 0) {
01885     reg.lpf2_xl_en = val;
01886     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
01887   }
01888   return ret;
01889 }
01890 
01891 /**
01892   * @brief  Accelerometer output from LPF2 filtering stage selection.[get]
01893   *
01894   * @param  ctx      read / write interface definitions
01895   * @param  val      change the values of lpf2_xl_en in reg CTRL1_XL
01896   *
01897   */
01898 int32_t lsm6dso_xl_filter_lp2_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01899 {
01900   lsm6dso_ctrl1_xl_t reg;
01901   int32_t ret;
01902 
01903   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 1);
01904   *val = reg.lpf2_xl_en;
01905 
01906   return ret;
01907 }
01908 
01909 /**
01910   * @brief  Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
01911   *         the bandwidth can be selected through FTYPE [2:0]
01912   *         in CTRL6_C (15h).[set]
01913   *
01914   * @param  ctx      read / write interface definitions
01915   * @param  val      change the values of lpf1_sel_g in reg CTRL4_C
01916   *
01917   */
01918 int32_t lsm6dso_gy_filter_lp1_set(lsm6dso_ctx_t *ctx, uint8_t val)
01919 {
01920   lsm6dso_ctrl4_c_t reg;
01921   int32_t ret;
01922 
01923   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01924   if (ret == 0) {
01925     reg.lpf1_sel_g = val;
01926     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01927   }
01928   return ret;
01929 }
01930 
01931 /**
01932   * @brief  Enables gyroscope digital LPF1 if auxiliary SPI is disabled;
01933   *         the bandwidth can be selected through FTYPE [2:0]
01934   *         in CTRL6_C (15h).[get]
01935   *
01936   * @param  ctx      read / write interface definitions
01937   * @param  val      change the values of lpf1_sel_g in reg CTRL4_C
01938   *
01939   */
01940 int32_t lsm6dso_gy_filter_lp1_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01941 {
01942   lsm6dso_ctrl4_c_t reg;
01943   int32_t ret;
01944 
01945   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01946   *val = reg.lpf1_sel_g;
01947 
01948   return ret;
01949 }
01950 
01951 /**
01952   * @brief  Mask DRDY on pin (both XL & Gyro) until filter settling ends
01953   *         (XL and Gyro independently masked).[set]
01954   *
01955   * @param  ctx      read / write interface definitions
01956   * @param  val      change the values of drdy_mask in reg CTRL4_C
01957   *
01958   */
01959 int32_t lsm6dso_filter_settling_mask_set(lsm6dso_ctx_t *ctx, uint8_t val)
01960 {
01961   lsm6dso_ctrl4_c_t reg;
01962   int32_t ret;
01963 
01964   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01965   if (ret == 0) {
01966     reg.drdy_mask = val;
01967     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01968   }
01969   return ret;
01970 }
01971 
01972 /**
01973   * @brief  Mask DRDY on pin (both XL & Gyro) until filter settling ends
01974   *         (XL and Gyro independently masked).[get]
01975   *
01976   * @param  ctx      read / write interface definitions
01977   * @param  val      change the values of drdy_mask in reg CTRL4_C
01978   *
01979   */
01980 int32_t lsm6dso_filter_settling_mask_get(lsm6dso_ctx_t *ctx, uint8_t *val)
01981 {
01982   lsm6dso_ctrl4_c_t reg;
01983   int32_t ret;
01984 
01985   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
01986   *val = reg.drdy_mask;
01987 
01988   return ret;
01989 }
01990 
01991 /**
01992   * @brief  Gyroscope lp1 bandwidth.[set]
01993   *
01994   * @param  ctx      read / write interface definitions
01995   * @param  val      change the values of ftype in reg CTRL6_C
01996   *
01997   */
01998 int32_t lsm6dso_gy_lp1_bandwidth_set(lsm6dso_ctx_t *ctx, lsm6dso_ftype_t val)
01999 {
02000   lsm6dso_ctrl6_c_t reg;
02001   int32_t ret;
02002 
02003   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
02004   if (ret == 0) {
02005     reg.ftype = (uint8_t)val;
02006     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
02007   }
02008   return ret;
02009 }
02010 
02011 /**
02012   * @brief  Gyroscope lp1 bandwidth.[get]
02013   *
02014   * @param  ctx      read / write interface definitions
02015   * @param  val       Get the values of ftype in reg CTRL6_C
02016   *
02017   */
02018 int32_t lsm6dso_gy_lp1_bandwidth_get(lsm6dso_ctx_t *ctx, lsm6dso_ftype_t *val)
02019 {
02020   lsm6dso_ctrl6_c_t reg;
02021   int32_t ret;
02022 
02023   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
02024   switch (reg.ftype) {
02025     case LSM6DSO_ULTRA_LIGHT:
02026       *val = LSM6DSO_ULTRA_LIGHT;
02027       break;
02028     case LSM6DSO_VERY_LIGHT:
02029       *val = LSM6DSO_VERY_LIGHT;
02030       break;
02031     case LSM6DSO_LIGHT:
02032       *val = LSM6DSO_LIGHT;
02033       break;
02034     case LSM6DSO_MEDIUM:
02035       *val = LSM6DSO_MEDIUM;
02036       break;
02037     case LSM6DSO_STRONG:
02038       *val = LSM6DSO_STRONG;
02039       break;
02040     case LSM6DSO_VERY_STRONG:
02041       *val = LSM6DSO_VERY_STRONG;
02042       break;
02043     case LSM6DSO_AGGRESSIVE:
02044       *val = LSM6DSO_AGGRESSIVE;
02045       break;
02046     case LSM6DSO_XTREME:
02047       *val = LSM6DSO_XTREME;
02048       break;
02049     default:
02050       *val = LSM6DSO_ULTRA_LIGHT;
02051       break;
02052   }
02053   return ret;
02054 }
02055 
02056 /**
02057   * @brief  Low pass filter 2 on 6D function selection.[set]
02058   *
02059   * @param  ctx      read / write interface definitions
02060   * @param  val      change the values of low_pass_on_6d in reg CTRL8_XL
02061   *
02062   */
02063 int32_t lsm6dso_xl_lp2_on_6d_set(lsm6dso_ctx_t *ctx, uint8_t val)
02064 {
02065   lsm6dso_ctrl8_xl_t reg;
02066   int32_t ret;
02067 
02068   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02069   if (ret == 0) {
02070     reg.low_pass_on_6d = val;
02071     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02072   }
02073   return ret;
02074 }
02075 
02076 /**
02077   * @brief  Low pass filter 2 on 6D function selection.[get]
02078   *
02079   * @param  ctx      read / write interface definitions
02080   * @param  val      change the values of low_pass_on_6d in reg CTRL8_XL
02081   *
02082   */
02083 int32_t lsm6dso_xl_lp2_on_6d_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02084 {
02085   lsm6dso_ctrl8_xl_t reg;
02086   int32_t ret;
02087 
02088   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02089   *val = reg.low_pass_on_6d;
02090 
02091   return ret;
02092 }
02093 
02094 /**
02095   * @brief  Accelerometer slope filter / high-pass filter selection
02096   *         on output.[set]
02097   *
02098   * @param  ctx      read / write interface definitions
02099   * @param  val      change the values of hp_slope_xl_en
02100   *                                   in reg CTRL8_XL
02101   *
02102   */
02103 int32_t lsm6dso_xl_hp_path_on_out_set(lsm6dso_ctx_t *ctx,
02104                                       lsm6dso_hp_slope_xl_en_t val)
02105 {
02106   lsm6dso_ctrl8_xl_t reg;
02107   int32_t ret;
02108 
02109   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02110   if (ret == 0) {
02111     reg.hp_slope_xl_en = ((uint8_t)val & 0x10U) >> 4;
02112     reg.hp_ref_mode_xl = ((uint8_t)val & 0x20U) >> 5;
02113     reg.hpcf_xl = (uint8_t)val & 0x07U;
02114     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02115   }
02116   return ret;
02117 }
02118 
02119 /**
02120   * @brief  Accelerometer slope filter / high-pass filter selection
02121   *         on output.[get]
02122   *
02123   * @param  ctx      read / write interface definitions
02124   * @param  val      Get the values of hp_slope_xl_en
02125   *                                   in reg CTRL8_XL
02126   *
02127   */
02128 int32_t lsm6dso_xl_hp_path_on_out_get(lsm6dso_ctx_t *ctx,
02129                                       lsm6dso_hp_slope_xl_en_t *val)
02130 {
02131   lsm6dso_ctrl8_xl_t reg;
02132   int32_t ret;
02133 
02134   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02135   switch ((reg.hp_ref_mode_xl << 5) | (reg.hp_slope_xl_en << 4) |
02136           reg.hpcf_xl) {
02137     case LSM6DSO_HP_PATH_DISABLE_ON_OUT:
02138       *val = LSM6DSO_HP_PATH_DISABLE_ON_OUT;
02139       break;
02140     case LSM6DSO_SLOPE_ODR_DIV_4:
02141       *val = LSM6DSO_SLOPE_ODR_DIV_4;
02142       break;
02143     case LSM6DSO_HP_ODR_DIV_10:
02144       *val = LSM6DSO_HP_ODR_DIV_10;
02145       break;
02146     case LSM6DSO_HP_ODR_DIV_20:
02147       *val = LSM6DSO_HP_ODR_DIV_20;
02148       break;
02149     case LSM6DSO_HP_ODR_DIV_45:
02150       *val = LSM6DSO_HP_ODR_DIV_45;
02151       break;
02152     case LSM6DSO_HP_ODR_DIV_100:
02153       *val = LSM6DSO_HP_ODR_DIV_100;
02154       break;
02155     case LSM6DSO_HP_ODR_DIV_200:
02156       *val = LSM6DSO_HP_ODR_DIV_200;
02157       break;
02158     case LSM6DSO_HP_ODR_DIV_400:
02159       *val = LSM6DSO_HP_ODR_DIV_400;
02160       break;
02161     case LSM6DSO_HP_ODR_DIV_800:
02162       *val = LSM6DSO_HP_ODR_DIV_800;
02163       break;
02164     case LSM6DSO_HP_REF_MD_ODR_DIV_10:
02165       *val = LSM6DSO_HP_REF_MD_ODR_DIV_10;
02166       break;
02167     case LSM6DSO_HP_REF_MD_ODR_DIV_20:
02168       *val = LSM6DSO_HP_REF_MD_ODR_DIV_20;
02169       break;
02170     case LSM6DSO_HP_REF_MD_ODR_DIV_45:
02171       *val = LSM6DSO_HP_REF_MD_ODR_DIV_45;
02172       break;
02173     case LSM6DSO_HP_REF_MD_ODR_DIV_100:
02174       *val = LSM6DSO_HP_REF_MD_ODR_DIV_100;
02175       break;
02176     case LSM6DSO_HP_REF_MD_ODR_DIV_200:
02177       *val = LSM6DSO_HP_REF_MD_ODR_DIV_200;
02178       break;
02179     case LSM6DSO_HP_REF_MD_ODR_DIV_400:
02180       *val = LSM6DSO_HP_REF_MD_ODR_DIV_400;
02181       break;
02182     case LSM6DSO_HP_REF_MD_ODR_DIV_800:
02183       *val = LSM6DSO_HP_REF_MD_ODR_DIV_800;
02184       break;
02185     case LSM6DSO_LP_ODR_DIV_10:
02186       *val = LSM6DSO_LP_ODR_DIV_10;
02187       break;
02188     case LSM6DSO_LP_ODR_DIV_20:
02189       *val = LSM6DSO_LP_ODR_DIV_20;
02190       break;
02191     case LSM6DSO_LP_ODR_DIV_45:
02192       *val = LSM6DSO_LP_ODR_DIV_45;
02193       break;
02194     case LSM6DSO_LP_ODR_DIV_100:
02195       *val = LSM6DSO_LP_ODR_DIV_100;
02196       break;
02197     case LSM6DSO_LP_ODR_DIV_200:
02198       *val = LSM6DSO_LP_ODR_DIV_200;
02199       break;
02200     case LSM6DSO_LP_ODR_DIV_400:
02201       *val = LSM6DSO_LP_ODR_DIV_400;
02202       break;
02203     case LSM6DSO_LP_ODR_DIV_800:
02204       *val = LSM6DSO_LP_ODR_DIV_800;
02205       break;
02206     default:
02207       *val = LSM6DSO_HP_PATH_DISABLE_ON_OUT;
02208       break;
02209   }
02210 
02211   return ret;
02212 }
02213 
02214 /**
02215   * @brief  Enables accelerometer LPF2 and HPF fast-settling mode.
02216   *         The filter sets the second samples after writing this bit.
02217   *         Active only during device exit from power-down mode.[set]
02218   *
02219   * @param  ctx      read / write interface definitions
02220   * @param  val      change the values of fastsettl_mode_xl in
02221   *                  reg CTRL8_XL
02222   *
02223   */
02224 int32_t lsm6dso_xl_fast_settling_set(lsm6dso_ctx_t *ctx, uint8_t val)
02225 {
02226   lsm6dso_ctrl8_xl_t reg;
02227   int32_t ret;
02228 
02229   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02230   if (ret == 0) {
02231     reg.fastsettl_mode_xl = val;
02232     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02233   }
02234   return ret;
02235 }
02236 
02237 /**
02238   * @brief  Enables accelerometer LPF2 and HPF fast-settling mode.
02239   *         The filter sets the second samples after writing this bit.
02240   *         Active only during device exit from power-down mode.[get]
02241   *
02242   * @param  ctx      read / write interface definitions
02243   * @param  val      change the values of fastsettl_mode_xl in reg CTRL8_XL
02244   *
02245   */
02246 int32_t lsm6dso_xl_fast_settling_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02247 {
02248   lsm6dso_ctrl8_xl_t reg;
02249   int32_t ret;
02250 
02251   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02252   *val = reg.fastsettl_mode_xl;
02253 
02254   return ret;
02255 }
02256 
02257 /**
02258   * @brief  HPF or SLOPE filter selection on wake-up and Activity/Inactivity
02259   *         functions.[set]
02260   *
02261   * @param  ctx      read / write interface definitions
02262   * @param  val      change the values of slope_fds in reg TAP_CFG0
02263   *
02264   */
02265 int32_t lsm6dso_xl_hp_path_internal_set(lsm6dso_ctx_t *ctx,
02266                                         lsm6dso_slope_fds_t val)
02267 {
02268   lsm6dso_tap_cfg0_t reg;
02269   int32_t ret;
02270 
02271   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
02272   if (ret == 0) {
02273     reg.slope_fds = (uint8_t)val;
02274     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
02275   }
02276   return ret;
02277 }
02278 
02279 /**
02280   * @brief  HPF or SLOPE filter selection on wake-up and Activity/Inactivity
02281   *         functions.[get]
02282   *
02283   * @param  ctx      read / write interface definitions
02284   * @param  val      Get the values of slope_fds in reg TAP_CFG0
02285   *
02286   */
02287 int32_t lsm6dso_xl_hp_path_internal_get(lsm6dso_ctx_t *ctx,
02288                                         lsm6dso_slope_fds_t *val)
02289 {
02290   lsm6dso_tap_cfg0_t reg;
02291   int32_t ret;
02292 
02293   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
02294   switch (reg.slope_fds) {
02295     case LSM6DSO_USE_SLOPE:
02296       *val = LSM6DSO_USE_SLOPE;
02297       break;
02298     case LSM6DSO_USE_HPF:
02299       *val = LSM6DSO_USE_HPF;
02300       break;
02301     default:
02302       *val = LSM6DSO_USE_SLOPE;
02303       break;
02304   }
02305   return ret;
02306 }
02307 
02308 /**
02309   * @brief  Enables gyroscope digital high-pass filter. The filter is
02310   *         enabled only if the gyro is in HP mode.[set]
02311   *
02312   * @param  ctx      read / write interface definitions
02313   * @param  val      Get the values of hp_en_g and hp_en_g
02314   *                            in reg CTRL7_G
02315   *
02316   */
02317 int32_t lsm6dso_gy_hp_path_internal_set(lsm6dso_ctx_t *ctx,
02318                                         lsm6dso_hpm_g_t val)
02319 {
02320   lsm6dso_ctrl7_g_t reg;
02321   int32_t ret;
02322 
02323   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02324   if (ret == 0) {
02325     reg.hp_en_g = ((uint8_t)val & 0x80U) >> 7;
02326     reg.hpm_g = (uint8_t)val & 0x03U;
02327     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02328   }
02329   return ret;
02330 }
02331 
02332 /**
02333   * @brief  Enables gyroscope digital high-pass filter. The filter is
02334   *         enabled only if the gyro is in HP mode.[get]
02335   *
02336   * @param  ctx      read / write interface definitions
02337   * @param  val      Get the values of hp_en_g and hp_en_g
02338   *                            in reg CTRL7_G
02339   *
02340   */
02341 int32_t lsm6dso_gy_hp_path_internal_get(lsm6dso_ctx_t *ctx,
02342                                         lsm6dso_hpm_g_t *val)
02343 {
02344   lsm6dso_ctrl7_g_t reg;
02345   int32_t ret;
02346 
02347   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02348   switch ((reg.hp_en_g << 7) + reg.hpm_g) {
02349     case LSM6DSO_HP_FILTER_NONE:
02350       *val = LSM6DSO_HP_FILTER_NONE;
02351       break;
02352     case LSM6DSO_HP_FILTER_16mHz:
02353       *val = LSM6DSO_HP_FILTER_16mHz;
02354       break;
02355     case LSM6DSO_HP_FILTER_65mHz:
02356       *val = LSM6DSO_HP_FILTER_65mHz;
02357       break;
02358     case LSM6DSO_HP_FILTER_260mHz:
02359       *val = LSM6DSO_HP_FILTER_260mHz;
02360       break;
02361     case LSM6DSO_HP_FILTER_1Hz04:
02362       *val = LSM6DSO_HP_FILTER_1Hz04;
02363       break;
02364     default:
02365       *val = LSM6DSO_HP_FILTER_NONE;
02366       break;
02367   }
02368   return ret;
02369 }
02370 
02371 /**
02372   * @}
02373   *
02374   */
02375 
02376 /**
02377   * @defgroup  LSM6DSO_ Auxiliary_interface
02378   * @brief     This section groups all the functions concerning
02379   *            auxiliary interface.
02380   * @{
02381   *
02382 */
02383 
02384 /**
02385   * @brief  aOn auxiliary interface connect/disconnect SDO and OCS
02386   *         internal pull-up.[set]
02387   *
02388   * @param  ctx      read / write interface definitions
02389   * @param  val      change the values of ois_pu_dis in
02390   *                               reg PIN_CTRL
02391   *
02392   */
02393 int32_t lsm6dso_aux_sdo_ocs_mode_set(lsm6dso_ctx_t *ctx,
02394                                      lsm6dso_ois_pu_dis_t val)
02395 {
02396   lsm6dso_pin_ctrl_t reg;
02397   int32_t ret;
02398 
02399   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
02400   if (ret == 0) {
02401     reg.ois_pu_dis = (uint8_t)val;
02402     ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
02403   }
02404   return ret;
02405 }
02406 
02407 /**
02408   * @brief  On auxiliary interface connect/disconnect SDO and OCS
02409   *         internal pull-up.[get]
02410   *
02411   * @param  ctx      read / write interface definitions
02412   * @param  val      Get the values of ois_pu_dis in reg PIN_CTRL
02413   *
02414   */
02415 int32_t lsm6dso_aux_sdo_ocs_mode_get(lsm6dso_ctx_t *ctx,
02416                                      lsm6dso_ois_pu_dis_t *val)
02417 {
02418   lsm6dso_pin_ctrl_t reg;
02419   int32_t ret;
02420 
02421   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
02422   switch (reg.ois_pu_dis) {
02423     case LSM6DSO_AUX_PULL_UP_DISC:
02424       *val = LSM6DSO_AUX_PULL_UP_DISC;
02425       break;
02426     case LSM6DSO_AUX_PULL_UP_CONNECT:
02427       *val = LSM6DSO_AUX_PULL_UP_CONNECT;
02428       break;
02429     default:
02430       *val = LSM6DSO_AUX_PULL_UP_DISC;
02431       break;
02432   }
02433   return ret;
02434 }
02435 
02436 /**
02437   * @brief  OIS chain on aux interface power on mode.[set]
02438   *
02439   * @param  ctx      read / write interface definitions
02440   * @param  val      change the values of ois_on in reg CTRL7_G
02441   *
02442   */
02443 int32_t lsm6dso_aux_pw_on_ctrl_set(lsm6dso_ctx_t *ctx, lsm6dso_ois_on_t val)
02444 {
02445   lsm6dso_ctrl7_g_t reg;
02446   int32_t ret;
02447 
02448   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02449   if (ret == 0) {
02450     reg.ois_on_en = (uint8_t)val & 0x01U;
02451     reg.ois_on = (uint8_t)val & 0x01U;
02452     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02453   }
02454   return ret;
02455 }
02456 
02457 /**
02458   * @brief  aux_pw_on_ctrl: [get]  OIS chain on aux interface power on mode
02459   *
02460   * @param  ctx      read / write interface definitions
02461   * @param  val      Get the values of ois_on in reg CTRL7_G
02462   *
02463   */
02464 int32_t lsm6dso_aux_pw_on_ctrl_get(lsm6dso_ctx_t *ctx, lsm6dso_ois_on_t *val)
02465 {
02466   lsm6dso_ctrl7_g_t reg;
02467   int32_t ret;
02468 
02469   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL7_G, (uint8_t*)&reg, 1);
02470   switch (reg.ois_on) {
02471     case LSM6DSO_AUX_ON:
02472       *val = LSM6DSO_AUX_ON;
02473       break;
02474     case LSM6DSO_AUX_ON_BY_AUX_INTERFACE:
02475       *val = LSM6DSO_AUX_ON_BY_AUX_INTERFACE;
02476       break;
02477     default:
02478       *val = LSM6DSO_AUX_ON;
02479       break;
02480   }
02481 
02482   return ret;
02483 }
02484 
02485 /**
02486   * @brief  Accelerometer full-scale management between UI chain and
02487   *         OIS chain. When XL UI is on, the full scale is the same
02488   *         between UI/OIS and is chosen by the UI CTRL registers;
02489   *         when XL UI is in PD, the OIS can choose the FS.
02490   *         Full scales are independent between the UI/OIS chain
02491   *         but both bound to 8 g.[set]
02492   *
02493   * @param  ctx      read / write interface definitions
02494   * @param  val      change the values of xl_fs_mode in
02495   *                               reg CTRL8_XL
02496   *
02497   */
02498 int32_t lsm6dso_aux_xl_fs_mode_set(lsm6dso_ctx_t *ctx,
02499                                    lsm6dso_xl_fs_mode_t val)
02500 {
02501   lsm6dso_ctrl8_xl_t reg;
02502   int32_t ret;
02503 
02504   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02505   if (ret == 0) {
02506     reg.xl_fs_mode = (uint8_t)val;
02507     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02508   }
02509   return ret;
02510 }
02511 
02512 /**
02513   * @brief  Accelerometer full-scale management between UI chain and
02514   *         OIS chain. When XL UI is on, the full scale is the same
02515   *         between UI/OIS and is chosen by the UI CTRL registers;
02516   *         when XL UI is in PD, the OIS can choose the FS.
02517   *         Full scales are independent between the UI/OIS chain
02518   *         but both bound to 8 g.[get]
02519   *
02520   * @param  ctx      read / write interface definitions
02521   * @param  val      Get the values of xl_fs_mode in reg CTRL8_XL
02522   *
02523   */
02524 int32_t lsm6dso_aux_xl_fs_mode_get(lsm6dso_ctx_t *ctx,
02525                                    lsm6dso_xl_fs_mode_t *val)
02526 {
02527   lsm6dso_ctrl8_xl_t reg;
02528   int32_t ret;
02529 
02530   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL8_XL, (uint8_t*)&reg, 1);
02531   switch (reg.xl_fs_mode) {
02532     case LSM6DSO_USE_SAME_XL_FS:
02533       *val = LSM6DSO_USE_SAME_XL_FS;
02534       break;
02535     case LSM6DSO_USE_DIFFERENT_XL_FS:
02536       *val = LSM6DSO_USE_DIFFERENT_XL_FS;
02537       break;
02538     default:
02539       *val = LSM6DSO_USE_SAME_XL_FS;
02540       break;
02541   }
02542 
02543   return ret;
02544 }
02545 
02546 /**
02547   * @brief  The STATUS_SPIAux register is read by the auxiliary SPI.[get]
02548   *
02549   * @param  ctx      read / write interface definitions
02550   * @param  lsm6dso_status_spiaux_t: registers STATUS_SPIAUX
02551   *
02552   */
02553 int32_t lsm6dso_aux_status_reg_get(lsm6dso_ctx_t *ctx,
02554                                    lsm6dso_status_spiaux_t *val)
02555 {
02556   int32_t ret;
02557   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t*) val, 1);
02558   return ret;
02559 }
02560 
02561 /**
02562   * @brief  aux_xl_flag_data_ready: [get]  AUX accelerometer data available
02563   *
02564   * @param  ctx      read / write interface definitions
02565   * @param  val      change the values of xlda in reg STATUS_SPIAUX
02566   *
02567   */
02568 int32_t lsm6dso_aux_xl_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02569 {
02570   lsm6dso_status_spiaux_t reg;
02571   int32_t ret;
02572 
02573   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t*)&reg, 1);
02574   *val = reg.xlda;
02575 
02576   return ret;
02577 }
02578 
02579 /**
02580   * @brief  aux_gy_flag_data_ready: [get]  AUX gyroscope data available.
02581   *
02582   * @param  ctx      read / write interface definitions
02583   * @param  val      change the values of gda in reg STATUS_SPIAUX
02584   *
02585   */
02586 int32_t lsm6dso_aux_gy_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02587 {
02588   lsm6dso_status_spiaux_t reg;
02589   int32_t ret;
02590 
02591   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t*)&reg, 1);
02592   *val = reg.gda;
02593 
02594   return ret;
02595 }
02596 
02597 /**
02598   * @brief  High when the gyroscope output is in the settling phase.[get]
02599   *
02600   * @param  ctx      read / write interface definitions
02601   * @param  val      change the values of gyro_settling in reg STATUS_SPIAUX
02602   *
02603   */
02604 int32_t lsm6dso_aux_gy_flag_settling_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02605 {
02606   lsm6dso_status_spiaux_t reg;
02607   int32_t ret;
02608 
02609   ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_SPIAUX, (uint8_t*)&reg, 1);
02610   *val = reg.gyro_settling;
02611 
02612   return ret;
02613 }
02614 
02615 /**
02616   * @brief  Selects accelerometer self-test. Effective only if XL OIS
02617   *         chain is enabled.[set]
02618   *
02619   * @param  ctx      read / write interface definitions
02620   * @param  val      change the values of st_xl_ois in reg INT_OIS
02621   *
02622   */
02623 int32_t lsm6dso_aux_xl_self_test_set(lsm6dso_ctx_t *ctx,
02624                                      lsm6dso_st_xl_ois_t val)
02625 {
02626   lsm6dso_int_ois_t reg;
02627   int32_t ret;
02628 
02629   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02630   if (ret == 0) {
02631     reg.st_xl_ois = (uint8_t)val;
02632     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02633   }
02634   return ret;
02635 }
02636 
02637 /**
02638   * @brief  Selects accelerometer self-test. Effective only if XL OIS
02639   *         chain is enabled.[get]
02640   *
02641   * @param  ctx      read / write interface definitions
02642   * @param  val      Get the values of st_xl_ois in reg INT_OIS
02643   *
02644   */
02645 int32_t lsm6dso_aux_xl_self_test_get(lsm6dso_ctx_t *ctx,
02646                                      lsm6dso_st_xl_ois_t *val)
02647 {
02648   lsm6dso_int_ois_t reg;
02649   int32_t ret;
02650 
02651   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02652   switch (reg.st_xl_ois) {
02653     case LSM6DSO_AUX_XL_DISABLE:
02654       *val = LSM6DSO_AUX_XL_DISABLE;
02655       break;
02656     case LSM6DSO_AUX_XL_POS:
02657       *val = LSM6DSO_AUX_XL_POS;
02658       break;
02659     case LSM6DSO_AUX_XL_NEG:
02660       *val = LSM6DSO_AUX_XL_NEG;
02661       break;
02662     default:
02663       *val = LSM6DSO_AUX_XL_DISABLE;
02664       break;
02665   }
02666   return ret;
02667 }
02668 
02669 /**
02670   * @brief  Indicates polarity of DEN signal on OIS chain.[set]
02671   *
02672   * @param  ctx      read / write interface definitions
02673   * @param  val      change the values of den_lh_ois in
02674   *                  reg INT_OIS
02675   *
02676   */
02677 int32_t lsm6dso_aux_den_polarity_set(lsm6dso_ctx_t *ctx,
02678                                      lsm6dso_den_lh_ois_t val)
02679 {
02680   lsm6dso_int_ois_t reg;
02681   int32_t ret;
02682 
02683   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02684   if (ret == 0) {
02685     reg.den_lh_ois = (uint8_t)val;
02686     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02687   }
02688   return ret;
02689 }
02690 
02691 /**
02692   * @brief  Indicates polarity of DEN signal on OIS chain.[get]
02693   *
02694   * @param  ctx      read / write interface definitions
02695   * @param  val      Get the values of den_lh_ois in reg INT_OIS
02696   *
02697   */
02698 int32_t lsm6dso_aux_den_polarity_get(lsm6dso_ctx_t *ctx,
02699                                      lsm6dso_den_lh_ois_t *val)
02700 {
02701   lsm6dso_int_ois_t reg;
02702   int32_t ret;
02703 
02704   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02705   switch (reg.den_lh_ois) {
02706     case LSM6DSO_AUX_DEN_ACTIVE_LOW:
02707       *val = LSM6DSO_AUX_DEN_ACTIVE_LOW;
02708       break;
02709     case LSM6DSO_AUX_DEN_ACTIVE_HIGH:
02710       *val = LSM6DSO_AUX_DEN_ACTIVE_HIGH;
02711       break;
02712     default:
02713       *val = LSM6DSO_AUX_DEN_ACTIVE_LOW;
02714       break;
02715   }
02716   return ret;
02717 }
02718 
02719 /**
02720   * @brief  Configure DEN mode on the OIS chain.[set]
02721   *
02722   * @param  ctx      read / write interface definitions
02723   * @param  val      change the values of lvl2_ois in reg INT_OIS
02724   *
02725   */
02726 int32_t lsm6dso_aux_den_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_lvl2_ois_t val)
02727 {
02728   lsm6dso_ctrl1_ois_t ctrl1_ois;
02729   lsm6dso_int_ois_t int_ois;
02730   int32_t ret;
02731 
02732   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*) &int_ois, 1);
02733   if (ret == 0) {
02734     int_ois.lvl2_ois = (uint8_t)val & 0x01U;
02735     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*) &int_ois, 1);
02736   }
02737   if (ret == 0) {
02738     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*) &ctrl1_ois, 1);
02739   }
02740   if (ret == 0) {
02741     ctrl1_ois.lvl1_ois = ((uint8_t)val & 0x02U) >> 1;
02742     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*) &ctrl1_ois, 1);
02743   }
02744   return ret;
02745 }
02746 
02747 /**
02748   * @brief  Configure DEN mode on the OIS chain.[get]
02749   *
02750   * @param  ctx      read / write interface definitions
02751   * @param  val      Get the values of lvl2_ois in reg INT_OIS
02752   *
02753   */
02754 int32_t lsm6dso_aux_den_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_lvl2_ois_t *val)
02755 {
02756   lsm6dso_ctrl1_ois_t ctrl1_ois;
02757   lsm6dso_int_ois_t int_ois;
02758   int32_t ret;
02759 
02760   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*) &int_ois, 1);
02761   if (ret == 0) {
02762     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*) &ctrl1_ois, 1);
02763     switch ((ctrl1_ois.lvl1_ois << 1) + int_ois.lvl2_ois) {
02764       case LSM6DSO_AUX_DEN_DISABLE:
02765         *val = LSM6DSO_AUX_DEN_DISABLE;
02766         break;
02767       case LSM6DSO_AUX_DEN_LEVEL_LATCH:
02768         *val = LSM6DSO_AUX_DEN_LEVEL_LATCH;
02769         break;
02770       case LSM6DSO_AUX_DEN_LEVEL_TRIG:
02771         *val = LSM6DSO_AUX_DEN_LEVEL_TRIG;
02772         break;
02773       default:
02774         *val = LSM6DSO_AUX_DEN_DISABLE;
02775         break;
02776     }
02777   }
02778   return ret;
02779 }
02780 
02781 /**
02782   * @brief  Enables/Disable OIS chain DRDY on INT2 pin.
02783   *         This setting has priority over all other INT2 settings.[set]
02784   *
02785   * @param  ctx      read / write interface definitions
02786   * @param  val      change the values of int2_drdy_ois in reg INT_OIS
02787   *
02788   */
02789 int32_t lsm6dso_aux_drdy_on_int2_set(lsm6dso_ctx_t *ctx, uint8_t val)
02790 {
02791   lsm6dso_int_ois_t reg;
02792   int32_t ret;
02793 
02794   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02795   if (ret == 0) {
02796     reg.int2_drdy_ois = val;
02797     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02798   }
02799   return ret;
02800 }
02801 
02802 /**
02803   * @brief  Enables/Disable OIS chain DRDY on INT2 pin.
02804   *         This setting has priority over all other INT2 settings.[get]
02805   *
02806   * @param  ctx      read / write interface definitions
02807   * @param  val      change the values of int2_drdy_ois in reg INT_OIS
02808   *
02809   */
02810 int32_t lsm6dso_aux_drdy_on_int2_get(lsm6dso_ctx_t *ctx, uint8_t *val)
02811 {
02812   lsm6dso_int_ois_t reg;
02813   int32_t ret;
02814 
02815   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_OIS, (uint8_t*)&reg, 1);
02816   *val = reg.int2_drdy_ois;
02817 
02818   return ret;
02819 }
02820 
02821 /**
02822   * @brief  Enables OIS chain data processing for gyro in Mode 3 and Mode 4
02823   *         (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
02824   *         When the OIS chain is enabled, the OIS outputs are available
02825   *         through the SPI2 in registers OUTX_L_G (22h) through
02826   *         OUTZ_H_G (27h) and STATUS_REG (1Eh) / STATUS_SPIAux, and
02827   *         LPF1 is dedicated to this chain.[set]
02828   *
02829   * @param  ctx      read / write interface definitions
02830   * @param  val      change the values of ois_en_spi2 in
02831   *                                reg CTRL1_OIS
02832   *
02833   */
02834 int32_t lsm6dso_aux_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_ois_en_spi2_t val)
02835 {
02836   lsm6dso_ctrl1_ois_t reg;
02837   int32_t ret;
02838 
02839   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02840   if (ret == 0) {
02841     reg.ois_en_spi2 = (uint8_t)val & 0x01U;
02842     reg.mode4_en = ((uint8_t)val & 0x02U) >> 1;
02843     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02844   }
02845   return ret;
02846 }
02847 
02848 /**
02849   * @brief  Enables OIS chain data processing for gyro in Mode 3 and Mode 4
02850   *         (mode4_en = 1) and accelerometer data in and Mode 4 (mode4_en = 1).
02851   *         When the OIS chain is enabled, the OIS outputs are available
02852   *         through the SPI2 in registers OUTX_L_G (22h) through
02853   *         OUTZ_H_G (27h) and STATUS_REG (1Eh) / STATUS_SPIAux, and
02854   *         LPF1 is dedicated to this chain.[get]
02855   *
02856   * @param  ctx      read / write interface definitions
02857   * @param  val      Get the values of ois_en_spi2 in
02858   *                                reg CTRL1_OIS
02859   *
02860   */
02861 int32_t lsm6dso_aux_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_ois_en_spi2_t *val)
02862 {
02863   lsm6dso_ctrl1_ois_t reg;
02864   int32_t ret;
02865 
02866   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02867   switch ((reg.mode4_en << 1) | reg.ois_en_spi2) {
02868     case LSM6DSO_AUX_DISABLE:
02869       *val = LSM6DSO_AUX_DISABLE;
02870       break;
02871     case LSM6DSO_MODE_3_GY:
02872       *val = LSM6DSO_MODE_3_GY;
02873       break;
02874     case LSM6DSO_MODE_4_GY_XL:
02875       *val = LSM6DSO_MODE_4_GY_XL;
02876       break;
02877     default:
02878       *val = LSM6DSO_AUX_DISABLE;
02879       break;
02880   }
02881   return ret;
02882 }
02883 
02884 /**
02885   * @brief  Selects gyroscope OIS chain full-scale.[set]
02886   *
02887   * @param  ctx      read / write interface definitions
02888   * @param  val      change the values of fs_g_ois in reg CTRL1_OIS
02889   *
02890   */
02891 int32_t lsm6dso_aux_gy_full_scale_set(lsm6dso_ctx_t *ctx,
02892                                       lsm6dso_fs_g_ois_t val)
02893 {
02894   lsm6dso_ctrl1_ois_t reg;
02895   int32_t ret;
02896 
02897   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02898   if (ret == 0) {
02899     reg.fs_g_ois = (uint8_t)val;
02900     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02901   }
02902   return ret;
02903 }
02904 
02905 /**
02906   * @brief  Selects gyroscope OIS chain full-scale.[get]
02907   *
02908   * @param  ctx      read / write interface definitions
02909   * @param  val      Get the values of fs_g_ois in reg CTRL1_OIS
02910   *
02911   */
02912 int32_t lsm6dso_aux_gy_full_scale_get(lsm6dso_ctx_t *ctx,
02913                                       lsm6dso_fs_g_ois_t *val)
02914 {
02915   lsm6dso_ctrl1_ois_t reg;
02916   int32_t ret;
02917 
02918   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02919   switch (reg.fs_g_ois) {
02920     case LSM6DSO_250dps_AUX:
02921       *val = LSM6DSO_250dps_AUX;
02922       break;
02923     case LSM6DSO_125dps_AUX:
02924       *val = LSM6DSO_125dps_AUX;
02925       break;
02926     case LSM6DSO_500dps_AUX:
02927       *val = LSM6DSO_500dps_AUX;
02928       break;
02929     case LSM6DSO_1000dps_AUX:
02930       *val = LSM6DSO_1000dps_AUX;
02931       break;
02932     case LSM6DSO_2000dps_AUX:
02933       *val = LSM6DSO_2000dps_AUX;
02934       break;
02935     default:
02936       *val = LSM6DSO_250dps_AUX;
02937       break;
02938   }
02939   return ret;
02940 }
02941 
02942 /**
02943   * @brief  SPI2 3- or 4-wire interface.[set]
02944   *
02945   * @param  ctx      read / write interface definitions
02946   * @param  val      change the values of sim_ois in reg CTRL1_OIS
02947   *
02948   */
02949 int32_t lsm6dso_aux_spi_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_sim_ois_t val)
02950 {
02951   lsm6dso_ctrl1_ois_t reg;
02952   int32_t ret;
02953 
02954   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02955   if (ret == 0) {
02956     reg.sim_ois = (uint8_t)val;
02957     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02958   }
02959   return ret;
02960 }
02961 
02962 /**
02963   * @brief  SPI2 3- or 4-wire interface.[get]
02964   *
02965   * @param  ctx      read / write interface definitions
02966   * @param  val      Get the values of sim_ois in reg CTRL1_OIS
02967   *
02968   */
02969 int32_t lsm6dso_aux_spi_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_sim_ois_t *val)
02970 {
02971   lsm6dso_ctrl1_ois_t reg;
02972   int32_t ret;
02973 
02974   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, (uint8_t*)&reg, 1);
02975   switch (reg.sim_ois) {
02976     case LSM6DSO_AUX_SPI_4_WIRE:
02977       *val = LSM6DSO_AUX_SPI_4_WIRE;
02978       break;
02979     case LSM6DSO_AUX_SPI_3_WIRE:
02980       *val = LSM6DSO_AUX_SPI_3_WIRE;
02981       break;
02982     default:
02983       *val = LSM6DSO_AUX_SPI_4_WIRE;
02984       break;
02985   }
02986   return ret;
02987 }
02988 
02989 /**
02990   * @brief  Selects gyroscope digital LPF1 filter bandwidth.[set]
02991   *
02992   * @param  ctx      read / write interface definitions
02993   * @param  val      change the values of ftype_ois in
02994   *                              reg CTRL2_OIS
02995   *
02996   */
02997 int32_t lsm6dso_aux_gy_lp1_bandwidth_set(lsm6dso_ctx_t *ctx,
02998                                          lsm6dso_ftype_ois_t val)
02999 {
03000   lsm6dso_ctrl2_ois_t reg;
03001   int32_t ret;
03002 
03003   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03004   if (ret == 0) {
03005     reg.ftype_ois = (uint8_t)val;
03006     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03007   }
03008   return ret;
03009 }
03010 
03011 /**
03012   * @brief  Selects gyroscope digital LPF1 filter bandwidth.[get]
03013   *
03014   * @param  ctx      read / write interface definitions
03015   * @param  val      Get the values of ftype_ois in reg CTRL2_OIS
03016   *
03017   */
03018 int32_t lsm6dso_aux_gy_lp1_bandwidth_get(lsm6dso_ctx_t *ctx,
03019                                          lsm6dso_ftype_ois_t *val)
03020 {
03021   lsm6dso_ctrl2_ois_t reg;
03022   int32_t ret;
03023 
03024   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03025   switch (reg.ftype_ois) {
03026     case LSM6DSO_351Hz39:
03027       *val = LSM6DSO_351Hz39;
03028       break;
03029     case LSM6DSO_236Hz63:
03030       *val = LSM6DSO_236Hz63;
03031       break;
03032     case LSM6DSO_172Hz70:
03033       *val = LSM6DSO_172Hz70;
03034       break;
03035     case LSM6DSO_937Hz91:
03036       *val = LSM6DSO_937Hz91;
03037       break;
03038     default:
03039       *val = LSM6DSO_351Hz39;
03040       break;
03041   }
03042   return ret;
03043 }
03044 
03045 /**
03046   * @brief  Selects gyroscope OIS chain digital high-pass filter cutoff.[set]
03047   *
03048   * @param  ctx      read / write interface definitions
03049   * @param  val      change the values of hpm_ois in reg CTRL2_OIS
03050   *
03051   */
03052 int32_t lsm6dso_aux_gy_hp_bandwidth_set(lsm6dso_ctx_t *ctx,
03053                                         lsm6dso_hpm_ois_t val)
03054 {
03055   lsm6dso_ctrl2_ois_t reg;
03056   int32_t ret;
03057 
03058   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03059   if (ret == 0) {
03060     reg.hpm_ois = (uint8_t)val & 0x03U;
03061     reg.hp_en_ois = ((uint8_t)val & 0x10U) >> 4;
03062     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03063   }
03064   return ret;
03065 }
03066 
03067 /**
03068   * @brief  Selects gyroscope OIS chain digital high-pass filter cutoff.[get]
03069   *
03070   * @param  ctx      read / write interface definitions
03071   * @param  val      Get the values of hpm_ois in reg CTRL2_OIS
03072   *
03073   */
03074 int32_t lsm6dso_aux_gy_hp_bandwidth_get(lsm6dso_ctx_t *ctx,
03075                                         lsm6dso_hpm_ois_t *val)
03076 {
03077   lsm6dso_ctrl2_ois_t reg;
03078   int32_t ret;
03079 
03080   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL2_OIS, (uint8_t*)&reg, 1);
03081   switch ((reg.hp_en_ois << 4) | reg.hpm_ois) {
03082     case LSM6DSO_AUX_HP_DISABLE:
03083       *val = LSM6DSO_AUX_HP_DISABLE;
03084       break;
03085     case LSM6DSO_AUX_HP_Hz016:
03086       *val = LSM6DSO_AUX_HP_Hz016;
03087       break;
03088     case LSM6DSO_AUX_HP_Hz065:
03089       *val = LSM6DSO_AUX_HP_Hz065;
03090       break;
03091     case LSM6DSO_AUX_HP_Hz260:
03092       *val = LSM6DSO_AUX_HP_Hz260;
03093       break;
03094     case LSM6DSO_AUX_HP_1Hz040:
03095       *val = LSM6DSO_AUX_HP_1Hz040;
03096       break;
03097     default:
03098       *val = LSM6DSO_AUX_HP_DISABLE;
03099       break;
03100   }
03101   return ret;
03102 }
03103 
03104 /**
03105   * @brief  Enable / Disables OIS chain clamp.
03106   *         Enable: All OIS chain outputs = 8000h
03107   *         during self-test; Disable: OIS chain self-test
03108   *         outputs dependent from the aux gyro full
03109   *         scale selected.[set]
03110   *
03111   * @param  ctx      read / write interface definitions
03112   * @param  val      change the values of st_ois_clampdis in
03113   *                                    reg CTRL3_OIS
03114   *
03115   */
03116 int32_t lsm6dso_aux_gy_clamp_set(lsm6dso_ctx_t *ctx,
03117                                  lsm6dso_st_ois_clampdis_t val)
03118 {
03119   lsm6dso_ctrl3_ois_t reg;
03120   int32_t ret;
03121 
03122   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03123   if (ret == 0) {
03124     reg.st_ois_clampdis = (uint8_t)val;
03125     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03126   }
03127   return ret;
03128 }
03129 
03130 /**
03131   * @brief  Enable / Disables OIS chain clamp.
03132   *         Enable: All OIS chain outputs = 8000h
03133   *         during self-test; Disable: OIS chain self-test
03134   *         outputs dependent from the aux gyro full
03135   *         scale selected.[set]
03136   *
03137   * @param  ctx      read / write interface definitions
03138   * @param  val      Get the values of st_ois_clampdis in
03139   *                                    reg CTRL3_OIS
03140   *
03141   */
03142 int32_t lsm6dso_aux_gy_clamp_get(lsm6dso_ctx_t *ctx,
03143                                  lsm6dso_st_ois_clampdis_t *val)
03144 {
03145   lsm6dso_ctrl3_ois_t reg;
03146   int32_t ret;
03147 
03148   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03149   switch (reg.st_ois_clampdis) {
03150     case LSM6DSO_ENABLE_CLAMP:
03151       *val = LSM6DSO_ENABLE_CLAMP;
03152       break;
03153     case LSM6DSO_DISABLE_CLAMP:
03154       *val = LSM6DSO_DISABLE_CLAMP;
03155       break;
03156     default:
03157       *val = LSM6DSO_ENABLE_CLAMP;
03158       break;
03159   }
03160   return ret;
03161 }
03162 
03163 /**
03164   * @brief  Selects gyroscope OIS chain self-test.[set]
03165   *
03166   * @param  ctx      read / write interface definitions
03167   * @param  val      change the values of st_ois in reg CTRL3_OIS
03168   *
03169   */
03170 int32_t lsm6dso_aux_gy_self_test_set(lsm6dso_ctx_t *ctx, lsm6dso_st_ois_t val)
03171 {
03172   lsm6dso_ctrl3_ois_t reg;
03173   int32_t ret;
03174 
03175   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03176   if (ret == 0) {
03177     reg.st_ois = (uint8_t)val;
03178     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03179   }
03180   return ret;
03181 }
03182 
03183 /**
03184   * @brief  Selects gyroscope OIS chain self-test.[get]
03185   *
03186   * @param  ctx      read / write interface definitions
03187   * @param  val      Get the values of st_ois in reg CTRL3_OIS
03188   *
03189   */
03190 int32_t lsm6dso_aux_gy_self_test_get(lsm6dso_ctx_t *ctx, lsm6dso_st_ois_t *val)
03191 {
03192   lsm6dso_ctrl3_ois_t reg;
03193   int32_t ret;
03194 
03195   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03196   switch (reg.st_ois) {
03197     case LSM6DSO_AUX_GY_DISABLE:
03198       *val = LSM6DSO_AUX_GY_DISABLE;
03199       break;
03200     case LSM6DSO_AUX_GY_POS:
03201       *val = LSM6DSO_AUX_GY_POS;
03202       break;
03203     case LSM6DSO_AUX_GY_NEG:
03204       *val = LSM6DSO_AUX_GY_NEG;
03205       break;
03206     default:
03207       *val = LSM6DSO_AUX_GY_DISABLE;
03208       break;
03209   }
03210   return ret;
03211 }
03212 
03213 /**
03214   * @brief  Selects accelerometer OIS channel bandwidth.[set]
03215   *
03216   * @param  ctx      read / write interface definitions
03217   * @param  val      change the values of
03218   *                                       filter_xl_conf_ois in reg CTRL3_OIS
03219   *
03220   */
03221 int32_t lsm6dso_aux_xl_bandwidth_set(lsm6dso_ctx_t *ctx,
03222                                      lsm6dso_filter_xl_conf_ois_t val)
03223 {
03224   lsm6dso_ctrl3_ois_t reg;
03225   int32_t ret;
03226 
03227   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03228   if (ret == 0) {
03229     reg.filter_xl_conf_ois = (uint8_t)val;
03230     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03231   }
03232   return ret;
03233 }
03234 
03235 /**
03236   * @brief  Selects accelerometer OIS channel bandwidth.[get]
03237   *
03238   * @param  ctx      read / write interface definitions
03239   * @param  val      Get the values of
03240   *                                       filter_xl_conf_ois in reg CTRL3_OIS
03241   *
03242   */
03243 int32_t lsm6dso_aux_xl_bandwidth_get(lsm6dso_ctx_t *ctx,
03244                                      lsm6dso_filter_xl_conf_ois_t *val)
03245 {
03246   lsm6dso_ctrl3_ois_t reg;
03247   int32_t ret;
03248 
03249   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03250 
03251   switch (reg.filter_xl_conf_ois) {
03252     case LSM6DSO_289Hz:
03253       *val = LSM6DSO_289Hz;
03254       break;
03255     case LSM6DSO_258Hz:
03256       *val = LSM6DSO_258Hz;
03257       break;
03258     case LSM6DSO_120Hz:
03259       *val = LSM6DSO_120Hz;
03260       break;
03261     case LSM6DSO_65Hz2:
03262       *val = LSM6DSO_65Hz2;
03263       break;
03264     case LSM6DSO_33Hz2:
03265       *val = LSM6DSO_33Hz2;
03266       break;
03267     case LSM6DSO_16Hz6:
03268       *val = LSM6DSO_16Hz6;
03269       break;
03270     case LSM6DSO_8Hz30:
03271       *val = LSM6DSO_8Hz30;
03272       break;
03273     case LSM6DSO_4Hz15:
03274       *val = LSM6DSO_4Hz15;
03275       break;
03276     default:
03277       *val = LSM6DSO_289Hz;
03278       break;
03279   }
03280   return ret;
03281 }
03282 
03283 /**
03284   * @brief  Selects accelerometer OIS channel full-scale.[set]
03285   *
03286   * @param  ctx      read / write interface definitions
03287   * @param  val      change the values of fs_xl_ois in
03288   *                              reg CTRL3_OIS
03289   *
03290   */
03291 int32_t lsm6dso_aux_xl_full_scale_set(lsm6dso_ctx_t *ctx,
03292                                       lsm6dso_fs_xl_ois_t val)
03293 {
03294   lsm6dso_ctrl3_ois_t reg;
03295   int32_t ret;
03296 
03297   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03298   if (ret == 0) {
03299     reg.fs_xl_ois = (uint8_t)val;
03300     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03301   }
03302   return ret;
03303 }
03304 
03305 /**
03306   * @brief  Selects accelerometer OIS channel full-scale.[get]
03307   *
03308   * @param  ctx      read / write interface definitions
03309   * @param  val      Get the values of fs_xl_ois in reg CTRL3_OIS
03310   *
03311   */
03312 int32_t lsm6dso_aux_xl_full_scale_get(lsm6dso_ctx_t *ctx,
03313                                       lsm6dso_fs_xl_ois_t *val)
03314 {
03315   lsm6dso_ctrl3_ois_t reg;
03316   int32_t ret;
03317 
03318   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_OIS, (uint8_t*)&reg, 1);
03319   switch (reg.fs_xl_ois) {
03320     case LSM6DSO_AUX_2g:
03321       *val = LSM6DSO_AUX_2g;
03322       break;
03323     case LSM6DSO_AUX_16g:
03324       *val = LSM6DSO_AUX_16g;
03325       break;
03326     case LSM6DSO_AUX_4g:
03327       *val = LSM6DSO_AUX_4g;
03328       break;
03329     case LSM6DSO_AUX_8g:
03330       *val = LSM6DSO_AUX_8g;
03331       break;
03332     default:
03333       *val = LSM6DSO_AUX_2g;
03334       break;
03335   }
03336   return ret;
03337 }
03338 
03339 /**
03340   * @}
03341   *
03342   */
03343 
03344 /**
03345   * @defgroup  LSM6DSO_ main_serial_interface
03346   * @brief     This section groups all the functions concerning main
03347   *            serial interface management (not auxiliary)
03348   * @{
03349   *
03350 */
03351 
03352 /**
03353   * @brief  Connect/Disconnect SDO/SA0 internal pull-up.[set]
03354   *
03355   * @param  ctx      read / write interface definitions
03356   * @param  val      change the values of sdo_pu_en in
03357   *                              reg PIN_CTRL
03358   *
03359   */
03360 int32_t lsm6dso_sdo_sa0_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_sdo_pu_en_t val)
03361 {
03362   lsm6dso_pin_ctrl_t reg;
03363   int32_t ret;
03364 
03365   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
03366   if (ret == 0) {
03367     reg.sdo_pu_en = (uint8_t)val;
03368     ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
03369   }
03370   return ret;
03371 }
03372 
03373 /**
03374   * @brief  Connect/Disconnect SDO/SA0 internal pull-up.[get]
03375   *
03376   * @param  ctx      read / write interface definitions
03377   * @param  val      Get the values of sdo_pu_en in reg PIN_CTRL
03378   *
03379   */
03380 int32_t lsm6dso_sdo_sa0_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_sdo_pu_en_t *val)
03381 {
03382   lsm6dso_pin_ctrl_t reg;
03383   int32_t ret;
03384 
03385   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&reg, 1);
03386   switch (reg.sdo_pu_en) {
03387     case LSM6DSO_PULL_UP_DISC:
03388       *val = LSM6DSO_PULL_UP_DISC;
03389       break;
03390     case LSM6DSO_PULL_UP_CONNECT:
03391       *val = LSM6DSO_PULL_UP_CONNECT;
03392       break;
03393     default:
03394       *val = LSM6DSO_PULL_UP_DISC;
03395       break;
03396   }
03397   return ret;
03398 }
03399 
03400 /**
03401   * @brief  SPI Serial Interface Mode selection.[set]
03402   *
03403   * @param  ctx      read / write interface definitions
03404   * @param  val      change the values of sim in reg CTRL3_C
03405   *
03406   */
03407 int32_t lsm6dso_spi_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_sim_t val)
03408 {
03409   lsm6dso_ctrl3_c_t reg;
03410   int32_t ret;
03411 
03412   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03413   if (ret == 0) {
03414     reg.sim = (uint8_t)val;
03415     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03416   }
03417   return ret;
03418 }
03419 
03420 /**
03421   * @brief  SPI Serial Interface Mode selection.[get]
03422   *
03423   * @param  ctx      read / write interface definitions
03424   * @param  val      Get the values of sim in reg CTRL3_C
03425   *
03426   */
03427 int32_t lsm6dso_spi_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_sim_t *val)
03428 {
03429   lsm6dso_ctrl3_c_t reg;
03430   int32_t ret;
03431 
03432   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03433   switch (reg.sim) {
03434     case LSM6DSO_SPI_4_WIRE:
03435       *val = LSM6DSO_SPI_4_WIRE;
03436       break;
03437     case LSM6DSO_SPI_3_WIRE:
03438       *val = LSM6DSO_SPI_3_WIRE;
03439       break;
03440     default:
03441       *val = LSM6DSO_SPI_4_WIRE;
03442       break;
03443   }
03444   return ret;
03445 }
03446 
03447 /**
03448   * @brief  Disable / Enable I2C interface.[set]
03449   *
03450   * @param  ctx      read / write interface definitions
03451   * @param  val      change the values of i2c_disable in
03452   *                                reg CTRL4_C
03453   *
03454   */
03455 int32_t lsm6dso_i2c_interface_set(lsm6dso_ctx_t *ctx,
03456                                   lsm6dso_i2c_disable_t val)
03457 {
03458   lsm6dso_ctrl4_c_t reg;
03459   int32_t ret;
03460 
03461   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03462   if (ret == 0) {
03463     reg.i2c_disable = (uint8_t)val;
03464     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03465   }
03466   return ret;
03467 }
03468 
03469 /**
03470   * @brief  Disable / Enable I2C interface.[get]
03471   *
03472   * @param  ctx      read / write interface definitions
03473   * @param  val      Get the values of i2c_disable in
03474   *                                reg CTRL4_C
03475   *
03476   */
03477 int32_t lsm6dso_i2c_interface_get(lsm6dso_ctx_t *ctx,
03478                                   lsm6dso_i2c_disable_t *val)
03479 {
03480   lsm6dso_ctrl4_c_t reg;
03481   int32_t ret;
03482 
03483   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03484   switch (reg.i2c_disable) {
03485     case LSM6DSO_I2C_ENABLE:
03486       *val = LSM6DSO_I2C_ENABLE;
03487       break;
03488     case LSM6DSO_I2C_DISABLE:
03489       *val = LSM6DSO_I2C_DISABLE;
03490       break;
03491     default:
03492       *val = LSM6DSO_I2C_ENABLE;
03493       break;
03494   }
03495   return ret;
03496 }
03497 
03498 /**
03499   * @brief  I3C Enable/Disable communication protocol[.set]
03500   *
03501   * @param  ctx      read / write interface definitions
03502   * @param  val      change the values of i3c_disable
03503   *                                    in reg CTRL9_XL
03504   *
03505   */
03506 int32_t lsm6dso_i3c_disable_set(lsm6dso_ctx_t *ctx, lsm6dso_i3c_disable_t val)
03507 {
03508   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
03509   lsm6dso_ctrl9_xl_t ctrl9_xl;
03510   int32_t ret;
03511 
03512   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&ctrl9_xl, 1);
03513   if (ret == 0) {
03514     ctrl9_xl.i3c_disable = ((uint8_t)val & 0x80U) >> 7;
03515     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&ctrl9_xl, 1);
03516   }
03517   if (ret == 0) {
03518 
03519     ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
03520                            (uint8_t*)&i3c_bus_avb, 1);
03521   }
03522   if (ret == 0) {
03523     i3c_bus_avb.i3c_bus_avb_sel = (uint8_t)val & 0x03U;
03524     ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
03525                             (uint8_t*)&i3c_bus_avb, 1);
03526   }
03527 
03528   return ret;
03529 }
03530 
03531 /**
03532   * @brief  I3C Enable/Disable communication protocol.[get]
03533   *
03534   * @param  ctx      read / write interface definitions
03535   * @param  val      change the values of i3c_disable in
03536   *                                reg CTRL9_XL
03537   *
03538   */
03539 int32_t lsm6dso_i3c_disable_get(lsm6dso_ctx_t *ctx, lsm6dso_i3c_disable_t *val)
03540 {
03541   lsm6dso_ctrl9_xl_t ctrl9_xl;
03542   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
03543   int32_t ret;
03544 
03545   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&ctrl9_xl, 1);
03546   if (ret == 0) {
03547     ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
03548                            (uint8_t*)&i3c_bus_avb, 1);
03549 
03550     switch ((ctrl9_xl.i3c_disable << 7) | i3c_bus_avb.i3c_bus_avb_sel) {
03551       case LSM6DSO_I3C_DISABLE:
03552         *val = LSM6DSO_I3C_DISABLE;
03553         break;
03554       case LSM6DSO_I3C_ENABLE_T_50us:
03555         *val = LSM6DSO_I3C_ENABLE_T_50us;
03556         break;
03557       case LSM6DSO_I3C_ENABLE_T_2us:
03558         *val = LSM6DSO_I3C_ENABLE_T_2us;
03559         break;
03560       case LSM6DSO_I3C_ENABLE_T_1ms:
03561         *val = LSM6DSO_I3C_ENABLE_T_1ms;
03562         break;
03563       case LSM6DSO_I3C_ENABLE_T_25ms:
03564         *val = LSM6DSO_I3C_ENABLE_T_25ms;
03565         break;
03566       default:
03567         *val = LSM6DSO_I3C_DISABLE;
03568         break;
03569     }
03570   }
03571   return ret;
03572 }
03573 
03574 /**
03575   * @}
03576   *
03577   */
03578 
03579 /**
03580   * @defgroup  LSM6DSO_interrupt_pins
03581   * @brief     This section groups all the functions that manage interrup pins
03582   * @{
03583   *
03584   */
03585 
03586 /**
03587   * @brief  Connect/Disconnect INT1 internal pull-down.[set]
03588   *
03589   * @param  ctx      read / write interface definitions
03590   * @param  val      change the values of pd_dis_int1 in reg I3C_BUS_AVB
03591   *
03592   */
03593 int32_t lsm6dso_int1_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_int1_pd_en_t val)
03594 {
03595   lsm6dso_i3c_bus_avb_t reg;
03596   int32_t ret;
03597 
03598   ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t*)&reg, 1);
03599   if (ret == 0) {
03600     reg.pd_dis_int1 = (uint8_t)val;
03601     ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t*)&reg, 1);
03602   }
03603   return ret;
03604 }
03605 
03606 /**
03607   * @brief  Connect/Disconnect INT1 internal pull-down.[get]
03608   *
03609   * @param  ctx      read / write interface definitions
03610   * @param  val      Get the values of pd_dis_int1 in reg I3C_BUS_AVB
03611   *
03612   */
03613 int32_t lsm6dso_int1_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_int1_pd_en_t *val)
03614 {
03615   lsm6dso_i3c_bus_avb_t reg;
03616   int32_t ret;
03617 
03618   ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB, (uint8_t*)&reg, 1);
03619   switch (reg.pd_dis_int1) {
03620     case LSM6DSO_PULL_DOWN_DISC:
03621       *val = LSM6DSO_PULL_DOWN_DISC;
03622       break;
03623     case LSM6DSO_PULL_DOWN_CONNECT:
03624       *val = LSM6DSO_PULL_DOWN_CONNECT;
03625       break;
03626     default:
03627       *val = LSM6DSO_PULL_DOWN_DISC;
03628       break;
03629   }
03630   return ret;
03631 }
03632 
03633 /**
03634   * @brief  Push-pull/open drain selection on interrupt pads.[set]
03635   *
03636   * @param  ctx      read / write interface definitions
03637   * @param  val      change the values of pp_od in reg CTRL3_C
03638   *
03639   */
03640 int32_t lsm6dso_pin_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_pp_od_t val)
03641 {
03642   lsm6dso_ctrl3_c_t reg;
03643   int32_t ret;
03644 
03645   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03646   if (ret == 0) {
03647     reg.pp_od = (uint8_t)val;
03648     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03649   }
03650   return ret;
03651 }
03652 
03653 /**
03654   * @brief  Push-pull/open drain selection on interrupt pads.[get]
03655   *
03656   * @param  ctx      read / write interface definitions
03657   * @param  val      Get the values of pp_od in reg CTRL3_C
03658   *
03659   */
03660 int32_t lsm6dso_pin_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_pp_od_t *val)
03661 {
03662   lsm6dso_ctrl3_c_t reg;
03663   int32_t ret;
03664 
03665   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03666 
03667   switch (reg.pp_od) {
03668     case LSM6DSO_PUSH_PULL:
03669       *val = LSM6DSO_PUSH_PULL;
03670       break;
03671     case LSM6DSO_OPEN_DRAIN:
03672       *val = LSM6DSO_OPEN_DRAIN;
03673       break;
03674     default:
03675       *val = LSM6DSO_PUSH_PULL;
03676       break;
03677   }
03678   return ret;
03679 }
03680 
03681 /**
03682   * @brief  Interrupt active-high/low.[set]
03683   *
03684   * @param  ctx      read / write interface definitions
03685   * @param  val      change the values of h_lactive in reg CTRL3_C
03686   *
03687   */
03688 int32_t lsm6dso_pin_polarity_set(lsm6dso_ctx_t *ctx, lsm6dso_h_lactive_t val)
03689 {
03690   lsm6dso_ctrl3_c_t reg;
03691   int32_t ret;
03692 
03693   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03694   if (ret == 0) {
03695     reg.h_lactive = (uint8_t)val;
03696     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03697   }
03698 
03699   return ret;
03700 }
03701 
03702 /**
03703   * @brief  Interrupt active-high/low.[get]
03704   *
03705   * @param  ctx      read / write interface definitions
03706   * @param  val      Get the values of h_lactive in reg CTRL3_C
03707   *
03708   */
03709 int32_t lsm6dso_pin_polarity_get(lsm6dso_ctx_t *ctx, lsm6dso_h_lactive_t *val)
03710 {
03711   lsm6dso_ctrl3_c_t reg;
03712   int32_t ret;
03713 
03714   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&reg, 1);
03715 
03716   switch (reg.h_lactive) {
03717     case LSM6DSO_ACTIVE_HIGH:
03718       *val = LSM6DSO_ACTIVE_HIGH;
03719       break;
03720     case LSM6DSO_ACTIVE_LOW:
03721       *val = LSM6DSO_ACTIVE_LOW;
03722       break;
03723     default:
03724       *val = LSM6DSO_ACTIVE_HIGH;
03725       break;
03726   }
03727   return ret;
03728 }
03729 
03730 /**
03731   * @brief  All interrupt signals become available on INT1 pin.[set]
03732   *
03733   * @param  ctx      read / write interface definitions
03734   * @param  val      change the values of int2_on_int1 in reg CTRL4_C
03735   *
03736   */
03737 int32_t lsm6dso_all_on_int1_set(lsm6dso_ctx_t *ctx, uint8_t val)
03738 {
03739   lsm6dso_ctrl4_c_t reg;
03740   int32_t ret;
03741 
03742   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03743   if (ret == 0) {
03744     reg.int2_on_int1 = val;
03745     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03746   }
03747 
03748   return ret;
03749 }
03750 
03751 /**
03752   * @brief  All interrupt signals become available on INT1 pin.[get]
03753   *
03754   * @param  ctx      read / write interface definitions
03755   * @param  val      change the values of int2_on_int1 in reg CTRL4_C
03756   *
03757   */
03758 int32_t lsm6dso_all_on_int1_get(lsm6dso_ctx_t *ctx, uint8_t *val)
03759 {
03760   lsm6dso_ctrl4_c_t reg;
03761   int32_t ret;
03762 
03763   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
03764   *val = reg.int2_on_int1;
03765 
03766   return ret;
03767 }
03768 
03769 /**
03770   * @brief  Interrupt notification mode.[set]
03771   *
03772   * @param  ctx      read / write interface definitions
03773   * @param  val      change the values of lir in reg TAP_CFG0
03774   *
03775   */
03776 int32_t lsm6dso_int_notification_set(lsm6dso_ctx_t *ctx, lsm6dso_lir_t val)
03777 {
03778   lsm6dso_tap_cfg0_t tap_cfg0;
03779   lsm6dso_page_rw_t page_rw;
03780   int32_t ret;
03781 
03782   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
03783   if (ret == 0) {
03784     tap_cfg0.lir = (uint8_t)val & 0x01U;
03785     tap_cfg0.int_clr_on_read = (uint8_t)val & 0x01U;
03786     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
03787   }
03788   if (ret == 0) {
03789 
03790     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
03791   }
03792   if (ret == 0) {
03793     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
03794   }
03795   if (ret == 0) {
03796     page_rw.emb_func_lir = ((uint8_t)val & 0x02U) >> 1;
03797     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
03798   }
03799   if (ret == 0) {
03800     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
03801   }
03802 
03803   return ret;
03804 }
03805 
03806 /**
03807   * @brief  Interrupt notification mode.[get]
03808   *
03809   * @param  ctx      read / write interface definitions
03810   * @param  val      Get the values of lir in reg TAP_CFG0
03811   *
03812   */
03813 int32_t lsm6dso_int_notification_get(lsm6dso_ctx_t *ctx, lsm6dso_lir_t *val)
03814 {
03815   lsm6dso_tap_cfg0_t tap_cfg0;
03816   lsm6dso_page_rw_t page_rw;
03817   int32_t ret;
03818 
03819 
03820   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
03821   if (ret == 0) {
03822 
03823       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
03824   }
03825   if (ret == 0) {
03826     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
03827   }
03828   if (ret == 0) {
03829     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
03830   }
03831   if (ret == 0) {
03832     switch ((page_rw.emb_func_lir << 1) | tap_cfg0.lir) {
03833       case LSM6DSO_ALL_INT_PULSED:
03834         *val = LSM6DSO_ALL_INT_PULSED;
03835         break;
03836       case LSM6DSO_BASE_LATCHED_EMB_PULSED:
03837         *val = LSM6DSO_BASE_LATCHED_EMB_PULSED;
03838         break;
03839       case LSM6DSO_BASE_PULSED_EMB_LATCHED:
03840         *val = LSM6DSO_BASE_PULSED_EMB_LATCHED;
03841         break;
03842       case LSM6DSO_ALL_INT_LATCHED:
03843         *val = LSM6DSO_ALL_INT_LATCHED;
03844         break;
03845       default:
03846         *val = LSM6DSO_ALL_INT_PULSED;
03847         break;
03848     }
03849     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
03850   }
03851   if (ret == 0) {
03852     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
03853   }
03854   if (ret == 0) {
03855     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
03856   }
03857 
03858   return ret;
03859 }
03860 
03861 /**
03862   * @}
03863   *
03864   */
03865 
03866 /**
03867   * @defgroup  LSM6DSO_Wake_Up_event
03868   * @brief     This section groups all the functions that manage the Wake Up
03869   *            event generation.
03870   * @{
03871   *
03872 */
03873 
03874 /**
03875   * @brief  Weight of 1 LSB of wakeup threshold.[set]
03876   *         0: 1 LSB =FS_XL  /  64
03877   *         1: 1 LSB = FS_XL / 256
03878   *
03879   * @param  ctx      read / write interface definitions
03880   * @param  val      change the values of wake_ths_w in
03881   *                                 reg WAKE_UP_DUR
03882   *
03883   */
03884 int32_t lsm6dso_wkup_ths_weight_set(lsm6dso_ctx_t *ctx,
03885                                     lsm6dso_wake_ths_w_t val)
03886 {
03887   lsm6dso_wake_up_dur_t reg;
03888   int32_t ret;
03889 
03890   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
03891   if (ret == 0) {
03892     reg.wake_ths_w = (uint8_t)val;
03893     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
03894   }
03895   return ret;
03896 }
03897 
03898 /**
03899   * @brief  Weight of 1 LSB of wakeup threshold.[get]
03900   *         0: 1 LSB =FS_XL  /  64
03901   *         1: 1 LSB = FS_XL / 256
03902   *
03903   * @param  ctx      read / write interface definitions
03904   * @param  val      Get the values of wake_ths_w in
03905   *                                 reg WAKE_UP_DUR
03906   *
03907   */
03908 int32_t lsm6dso_wkup_ths_weight_get(lsm6dso_ctx_t *ctx,
03909                                     lsm6dso_wake_ths_w_t *val)
03910 {
03911   lsm6dso_wake_up_dur_t reg;
03912   int32_t ret;
03913 
03914   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
03915 
03916   switch (reg.wake_ths_w) {
03917     case LSM6DSO_LSb_FS_DIV_64:
03918       *val = LSM6DSO_LSb_FS_DIV_64;
03919       break;
03920     case LSM6DSO_LSb_FS_DIV_256:
03921       *val = LSM6DSO_LSb_FS_DIV_256;
03922       break;
03923     default:
03924       *val = LSM6DSO_LSb_FS_DIV_64;
03925       break;
03926   }
03927   return ret;
03928 }
03929 
03930 /**
03931   * @brief  Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
03932   *         WAKE_UP_DUR.[set]
03933   *
03934   * @param  ctx      read / write interface definitions
03935   * @param  val      change the values of wk_ths in reg WAKE_UP_THS
03936   *
03937   */
03938 int32_t lsm6dso_wkup_threshold_set(lsm6dso_ctx_t *ctx, uint8_t val)
03939 {
03940   lsm6dso_wake_up_ths_t reg;
03941   int32_t ret;
03942 
03943   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
03944   if (ret == 0) {
03945     reg.wk_ths = val;
03946     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
03947   }
03948   return ret;
03949 }
03950 
03951 /**
03952   * @brief  Threshold for wakeup: 1 LSB weight depends on WAKE_THS_W in
03953   *         WAKE_UP_DUR.[get]
03954   *
03955   * @param  ctx      read / write interface definitions
03956   * @param  val      change the values of wk_ths in reg WAKE_UP_THS
03957   *
03958   */
03959 int32_t lsm6dso_wkup_threshold_get(lsm6dso_ctx_t *ctx, uint8_t *val)
03960 {
03961   lsm6dso_wake_up_ths_t reg;
03962   int32_t ret;
03963 
03964   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
03965   *val = reg.wk_ths;
03966 
03967   return ret;
03968 }
03969 
03970 /**
03971   * @brief  Wake up duration event.[set]
03972   *         1LSb = 1 / ODR
03973   *
03974   * @param  ctx      read / write interface definitions
03975   * @param  val      change the values of usr_off_on_wu in reg WAKE_UP_THS
03976   *
03977   */
03978 int32_t lsm6dso_xl_usr_offset_on_wkup_set(lsm6dso_ctx_t *ctx, uint8_t val)
03979 {
03980   lsm6dso_wake_up_ths_t reg;
03981   int32_t ret;
03982 
03983   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
03984   if (ret == 0) {
03985     reg.usr_off_on_wu = val;
03986     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
03987   }
03988   return ret;
03989 }
03990 
03991 /**
03992   * @brief  Wake up duration event.[get]
03993   *         1LSb = 1 / ODR
03994   *
03995   * @param  ctx      read / write interface definitions
03996   * @param  val      change the values of usr_off_on_wu in reg WAKE_UP_THS
03997   *
03998   */
03999 int32_t lsm6dso_xl_usr_offset_on_wkup_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04000 {
04001   lsm6dso_wake_up_ths_t reg;
04002   int32_t ret;
04003 
04004   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
04005   *val = reg.usr_off_on_wu;
04006 
04007   return ret;
04008 }
04009 
04010 /**
04011   * @brief  Wake up duration event.[set]
04012   *         1LSb = 1 / ODR
04013   *
04014   * @param  ctx      read / write interface definitions
04015   * @param  val      change the values of wake_dur in reg WAKE_UP_DUR
04016   *
04017   */
04018 int32_t lsm6dso_wkup_dur_set(lsm6dso_ctx_t *ctx, uint8_t val)
04019 {
04020   lsm6dso_wake_up_dur_t reg;
04021   int32_t ret;
04022 
04023   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04024   if (ret == 0) {
04025     reg.wake_dur = val;
04026     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04027   }
04028   return ret;
04029 }
04030 
04031 /**
04032   * @brief  Wake up duration event.[get]
04033   *         1LSb = 1 / ODR
04034   *
04035   * @param  ctx      read / write interface definitions
04036   * @param  val      change the values of wake_dur in reg WAKE_UP_DUR
04037   *
04038   */
04039 int32_t lsm6dso_wkup_dur_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04040 {
04041   lsm6dso_wake_up_dur_t reg;
04042   int32_t ret;
04043 
04044   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04045   *val = reg.wake_dur;
04046 
04047   return ret;
04048 }
04049 
04050 /**
04051   * @}
04052   *
04053   */
04054 
04055 /**
04056   * @defgroup  LSM6DSO_ Activity/Inactivity_detection
04057   * @brief     This section groups all the functions concerning
04058   *            activity/inactivity detection.
04059   * @{
04060   *
04061 */
04062 
04063 /**
04064   * @brief  Enables gyroscope Sleep mode.[set]
04065   *
04066   * @param  ctx      read / write interface definitions
04067   * @param  val      change the values of sleep_g in reg CTRL4_C
04068   *
04069   */
04070 int32_t lsm6dso_gy_sleep_mode_set(lsm6dso_ctx_t *ctx, uint8_t val)
04071 {
04072   lsm6dso_ctrl4_c_t reg;
04073   int32_t ret;
04074 
04075   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
04076   if (ret == 0) {
04077     reg.sleep_g = val;
04078     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
04079   }
04080   return ret;
04081 }
04082 
04083 /**
04084   * @brief  Enables gyroscope Sleep mode.[get]
04085   *
04086   * @param  ctx      read / write interface definitions
04087   * @param  val      change the values of sleep_g in reg CTRL4_C
04088   *
04089   */
04090 int32_t lsm6dso_gy_sleep_mode_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04091 {
04092   lsm6dso_ctrl4_c_t reg;
04093   int32_t ret;
04094 
04095   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&reg, 1);
04096   *val = reg.sleep_g;
04097 
04098   return ret;
04099 }
04100 
04101 /**
04102   * @brief  Drives the sleep status instead of
04103   *         sleep change on INT pins
04104   *         (only if INT1_SLEEP_CHANGE or
04105   *         INT2_SLEEP_CHANGE bits are enabled).[set]
04106   *
04107   * @param  ctx      read / write interface definitions
04108   * @param  val      change the values of sleep_status_on_int in reg TAP_CFG0
04109   *
04110   */
04111 int32_t lsm6dso_act_pin_notification_set(lsm6dso_ctx_t *ctx,
04112                                          lsm6dso_sleep_status_on_int_t val)
04113 {
04114   lsm6dso_tap_cfg0_t reg;
04115   int32_t ret;
04116 
04117   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04118   if (ret == 0) {
04119     reg.sleep_status_on_int = (uint8_t)val;
04120     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04121   }
04122   return ret;
04123 }
04124 
04125 /**
04126   * @brief  Drives the sleep status instead of
04127   *         sleep change on INT pins (only if
04128   *         INT1_SLEEP_CHANGE or
04129   *         INT2_SLEEP_CHANGE bits are enabled).[get]
04130   *
04131   * @param  ctx      read / write interface definitions
04132   * @param  val      Get the values of sleep_status_on_int in reg TAP_CFG0
04133   *
04134   */
04135 int32_t lsm6dso_act_pin_notification_get(lsm6dso_ctx_t *ctx,
04136                                          lsm6dso_sleep_status_on_int_t *val)
04137 {
04138   lsm6dso_tap_cfg0_t reg;
04139   int32_t ret;
04140 
04141   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04142   switch (reg.sleep_status_on_int) {
04143     case LSM6DSO_DRIVE_SLEEP_CHG_EVENT:
04144       *val = LSM6DSO_DRIVE_SLEEP_CHG_EVENT;
04145       break;
04146     case LSM6DSO_DRIVE_SLEEP_STATUS:
04147       *val = LSM6DSO_DRIVE_SLEEP_STATUS;
04148       break;
04149     default:
04150       *val = LSM6DSO_DRIVE_SLEEP_CHG_EVENT;
04151       break;
04152   }
04153   return ret;
04154 }
04155 
04156 /**
04157   * @brief  Enable inactivity function.[set]
04158   *
04159   * @param  ctx      read / write interface definitions
04160   * @param  val      change the values of inact_en in reg TAP_CFG2
04161   *
04162   */
04163 int32_t lsm6dso_act_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_inact_en_t val)
04164 {
04165   lsm6dso_tap_cfg2_t reg;
04166   int32_t ret;
04167 
04168   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04169   if (ret == 0) {
04170     reg.inact_en = (uint8_t)val;
04171     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04172   }
04173   return ret;
04174 }
04175 
04176 /**
04177   * @brief  Enable inactivity function.[get]
04178   *
04179   * @param  ctx      read / write interface definitions
04180   * @param  val      Get the values of inact_en in reg TAP_CFG2
04181   *
04182   */
04183 int32_t lsm6dso_act_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_inact_en_t *val)
04184 {
04185   lsm6dso_tap_cfg2_t reg;
04186   int32_t ret;
04187 
04188   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04189   switch (reg.inact_en) {
04190     case LSM6DSO_XL_AND_GY_NOT_AFFECTED:
04191       *val = LSM6DSO_XL_AND_GY_NOT_AFFECTED;
04192       break;
04193     case LSM6DSO_XL_12Hz5_GY_NOT_AFFECTED:
04194       *val = LSM6DSO_XL_12Hz5_GY_NOT_AFFECTED;
04195       break;
04196     case LSM6DSO_XL_12Hz5_GY_SLEEP:
04197       *val = LSM6DSO_XL_12Hz5_GY_SLEEP;
04198       break;
04199     case LSM6DSO_XL_12Hz5_GY_PD:
04200       *val = LSM6DSO_XL_12Hz5_GY_PD;
04201       break;
04202     default:
04203       *val = LSM6DSO_XL_AND_GY_NOT_AFFECTED;
04204       break;
04205   }
04206   return ret;
04207 }
04208 
04209 /**
04210   * @brief  Duration to go in sleep mode.[set]
04211   *         1 LSb = 512 / ODR
04212   *
04213   * @param  ctx      read / write interface definitions
04214   * @param  val      change the values of sleep_dur in reg WAKE_UP_DUR
04215   *
04216   */
04217 int32_t lsm6dso_act_sleep_dur_set(lsm6dso_ctx_t *ctx, uint8_t val)
04218 {
04219   lsm6dso_wake_up_dur_t reg;
04220   int32_t ret;
04221 
04222   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04223   if (ret == 0) {
04224     reg.sleep_dur = val;
04225     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04226   }
04227   return ret;
04228 }
04229 
04230 /**
04231   * @brief  Duration to go in sleep mode.[get]
04232   *         1 LSb = 512 / ODR
04233   *
04234   * @param  ctx      read / write interface definitions
04235   * @param  val      change the values of sleep_dur in reg WAKE_UP_DUR
04236   *
04237   */
04238 int32_t lsm6dso_act_sleep_dur_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04239 {
04240   lsm6dso_wake_up_dur_t reg;
04241   int32_t ret;
04242 
04243   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&reg, 1);
04244   *val = reg.sleep_dur;
04245 
04246   return ret;
04247 }
04248 
04249 /**
04250   * @}
04251   *
04252   */
04253 
04254 /**
04255   * @defgroup  LSM6DSO_tap_generator
04256   * @brief     This section groups all the functions that manage the
04257   *            tap and double tap event generation.
04258   * @{
04259   *
04260 */
04261 
04262 /**
04263   * @brief  Enable Z direction in tap recognition.[set]
04264   *
04265   * @param  ctx      read / write interface definitions
04266   * @param  val      change the values of tap_z_en in reg TAP_CFG0
04267   *
04268   */
04269 int32_t lsm6dso_tap_detection_on_z_set(lsm6dso_ctx_t *ctx, uint8_t val)
04270 {
04271   lsm6dso_tap_cfg0_t reg;
04272   int32_t ret;
04273 
04274   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04275   if (ret == 0) {
04276     reg.tap_z_en = val;
04277     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04278   }
04279   return ret;
04280 }
04281 
04282 /**
04283   * @brief  Enable Z direction in tap recognition.[get]
04284   *
04285   * @param  ctx      read / write interface definitions
04286   * @param  val      change the values of tap_z_en in reg TAP_CFG0
04287   *
04288   */
04289 int32_t lsm6dso_tap_detection_on_z_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04290 {
04291   lsm6dso_tap_cfg0_t reg;
04292   int32_t ret;
04293 
04294   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04295   *val = reg.tap_z_en;
04296 
04297   return ret;
04298 }
04299 
04300 /**
04301   * @brief  Enable Y direction in tap recognition.[set]
04302   *
04303   * @param  ctx      read / write interface definitions
04304   * @param  val      change the values of tap_y_en in reg TAP_CFG0
04305   *
04306   */
04307 int32_t lsm6dso_tap_detection_on_y_set(lsm6dso_ctx_t *ctx, uint8_t val)
04308 {
04309   lsm6dso_tap_cfg0_t reg;
04310   int32_t ret;
04311 
04312   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04313   if (ret == 0) {
04314     reg.tap_y_en = val;
04315     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04316   }
04317   return ret;
04318 }
04319 
04320 /**
04321   * @brief  Enable Y direction in tap recognition.[get]
04322   *
04323   * @param  ctx      read / write interface definitions
04324   * @param  val      change the values of tap_y_en in reg TAP_CFG0
04325   *
04326   */
04327 int32_t lsm6dso_tap_detection_on_y_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04328 {
04329   lsm6dso_tap_cfg0_t reg;
04330   int32_t ret;
04331 
04332   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04333   *val = reg.tap_y_en;
04334 
04335   return ret;
04336 }
04337 
04338 /**
04339   * @brief  Enable X direction in tap recognition.[set]
04340   *
04341   * @param  ctx      read / write interface definitions
04342   * @param  val      change the values of tap_x_en in reg TAP_CFG0
04343   *
04344   */
04345 int32_t lsm6dso_tap_detection_on_x_set(lsm6dso_ctx_t *ctx, uint8_t val)
04346 {
04347   lsm6dso_tap_cfg0_t reg;
04348   int32_t ret;
04349 
04350   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04351   if (ret == 0) {
04352     reg.tap_x_en = val;
04353     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04354   }
04355   return ret;
04356 }
04357 
04358 /**
04359   * @brief  Enable X direction in tap recognition.[get]
04360   *
04361   * @param  ctx      read / write interface definitions
04362   * @param  val      change the values of tap_x_en in reg TAP_CFG0
04363   *
04364   */
04365 int32_t lsm6dso_tap_detection_on_x_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04366 {
04367   lsm6dso_tap_cfg0_t reg;
04368   int32_t ret;
04369 
04370   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*)&reg, 1);
04371   *val = reg.tap_x_en;
04372 
04373   return ret;
04374 }
04375 
04376 /**
04377   * @brief  X-axis tap recognition threshold.[set]
04378   *
04379   * @param  ctx      read / write interface definitions
04380   * @param  val      change the values of tap_ths_x in reg TAP_CFG1
04381   *
04382   */
04383 int32_t lsm6dso_tap_threshold_x_set(lsm6dso_ctx_t *ctx, uint8_t val)
04384 {
04385   lsm6dso_tap_cfg1_t reg;
04386   int32_t ret;
04387 
04388   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04389   if (ret == 0) {
04390     reg.tap_ths_x = val;
04391     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04392   }
04393   return ret;
04394 }
04395 
04396 /**
04397   * @brief  X-axis tap recognition threshold.[get]
04398   *
04399   * @param  ctx      read / write interface definitions
04400   * @param  val      change the values of tap_ths_x in reg TAP_CFG1
04401   *
04402   */
04403 int32_t lsm6dso_tap_threshold_x_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04404 {
04405   lsm6dso_tap_cfg1_t reg;
04406   int32_t ret;
04407 
04408   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04409   *val = reg.tap_ths_x;
04410 
04411   return ret;
04412 }
04413 
04414 /**
04415   * @brief  Selection of axis priority for TAP detection.[set]
04416   *
04417   * @param  ctx      read / write interface definitions
04418   * @param  val      change the values of tap_priority in
04419   *                                 reg TAP_CFG1
04420   *
04421   */
04422 int32_t lsm6dso_tap_axis_priority_set(lsm6dso_ctx_t *ctx,
04423                                       lsm6dso_tap_priority_t val)
04424 {
04425   lsm6dso_tap_cfg1_t reg;
04426   int32_t ret;
04427 
04428   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04429   if (ret == 0) {
04430     reg.tap_priority = (uint8_t)val;
04431     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04432   }
04433   return ret;
04434 }
04435 
04436 /**
04437   * @brief  Selection of axis priority for TAP detection.[get]
04438   *
04439   * @param  ctx      read / write interface definitions
04440   * @param  val      Get the values of tap_priority in
04441   *                                 reg TAP_CFG1
04442   *
04443   */
04444 int32_t lsm6dso_tap_axis_priority_get(lsm6dso_ctx_t *ctx,
04445                                       lsm6dso_tap_priority_t *val)
04446 {
04447   lsm6dso_tap_cfg1_t reg;
04448   int32_t ret;
04449 
04450   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG1, (uint8_t*)&reg, 1);
04451   switch (reg.tap_priority) {
04452     case LSM6DSO_XYZ:
04453       *val = LSM6DSO_XYZ;
04454       break;
04455     case LSM6DSO_YXZ:
04456       *val = LSM6DSO_YXZ;
04457       break;
04458     case LSM6DSO_XZY:
04459       *val = LSM6DSO_XZY;
04460       break;
04461     case LSM6DSO_ZYX:
04462       *val = LSM6DSO_ZYX;
04463       break;
04464     case LSM6DSO_YZX:
04465       *val = LSM6DSO_YZX;
04466       break;
04467     case LSM6DSO_ZXY:
04468       *val = LSM6DSO_ZXY;
04469       break;
04470     default:
04471       *val = LSM6DSO_XYZ;
04472       break;
04473   }
04474   return ret;
04475 }
04476 
04477 /**
04478   * @brief  Y-axis tap recognition threshold.[set]
04479   *
04480   * @param  ctx      read / write interface definitions
04481   * @param  val      change the values of tap_ths_y in reg TAP_CFG2
04482   *
04483   */
04484 int32_t lsm6dso_tap_threshold_y_set(lsm6dso_ctx_t *ctx, uint8_t val)
04485 {
04486   lsm6dso_tap_cfg2_t reg;
04487   int32_t ret;
04488 
04489   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04490   if (ret == 0) {
04491     reg.tap_ths_y = val;
04492     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04493   }
04494   return ret;
04495 }
04496 
04497 /**
04498   * @brief  Y-axis tap recognition threshold.[get]
04499   *
04500   * @param  ctx      read / write interface definitions
04501   * @param  val      change the values of tap_ths_y in reg TAP_CFG2
04502   *
04503   */
04504 int32_t lsm6dso_tap_threshold_y_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04505 {
04506   lsm6dso_tap_cfg2_t reg;
04507   int32_t ret;
04508 
04509   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*)&reg, 1);
04510   *val = reg.tap_ths_y;
04511 
04512   return ret;
04513 }
04514 
04515 /**
04516   * @brief  Z-axis recognition threshold.[set]
04517   *
04518   * @param  ctx      read / write interface definitions
04519   * @param  val      change the values of tap_ths_z in reg TAP_THS_6D
04520   *
04521   */
04522 int32_t lsm6dso_tap_threshold_z_set(lsm6dso_ctx_t *ctx, uint8_t val)
04523 {
04524   lsm6dso_tap_ths_6d_t reg;
04525   int32_t ret;
04526 
04527   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04528   if (ret == 0) {
04529     reg.tap_ths_z = val;
04530     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04531   }
04532   return ret;
04533 }
04534 
04535 /**
04536   * @brief  Z-axis recognition threshold.[get]
04537   *
04538   * @param  ctx      read / write interface definitions
04539   * @param  val      change the values of tap_ths_z in reg TAP_THS_6D
04540   *
04541   */
04542 int32_t lsm6dso_tap_threshold_z_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04543 {
04544   lsm6dso_tap_ths_6d_t reg;
04545   int32_t ret;
04546 
04547   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04548   *val = reg.tap_ths_z;
04549 
04550   return ret;
04551 }
04552 
04553 /**
04554   * @brief  Maximum duration is the maximum time of an
04555   *         over threshold signal detection to be recognized
04556   *         as a tap event. The default value of these bits
04557   *         is 00b which corresponds to 4*ODR_XL time.
04558   *         If the SHOCK[1:0] bits are set to a different
04559   *         value, 1LSB corresponds to 8*ODR_XL time.[set]
04560   *
04561   * @param  ctx      read / write interface definitions
04562   * @param  val      change the values of shock in reg INT_DUR2
04563   *
04564   */
04565 int32_t lsm6dso_tap_shock_set(lsm6dso_ctx_t *ctx, uint8_t val)
04566 {
04567   lsm6dso_int_dur2_t reg;
04568   int32_t ret;
04569 
04570   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04571   if (ret == 0) {
04572     reg.shock = val;
04573     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04574   }
04575   return ret;
04576 }
04577 
04578 /**
04579   * @brief  Maximum duration is the maximum time of an
04580   *         over threshold signal detection to be recognized
04581   *         as a tap event. The default value of these bits
04582   *         is 00b which corresponds to 4*ODR_XL time.
04583   *         If the SHOCK[1:0] bits are set to a different
04584   *         value, 1LSB corresponds to 8*ODR_XL time.[get]
04585   *
04586   * @param  ctx      read / write interface definitions
04587   * @param  val      change the values of shock in reg INT_DUR2
04588   *
04589   */
04590 int32_t lsm6dso_tap_shock_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04591 {
04592   lsm6dso_int_dur2_t reg;
04593   int32_t ret;
04594 
04595   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04596   *val = reg.shock;
04597 
04598   return ret;
04599 }
04600 
04601 /**
04602   * @brief   Quiet time is the time after the first detected
04603   *          tap in which there must not be any over threshold
04604   *          event.
04605   *          The default value of these bits is 00b which
04606   *          corresponds to 2*ODR_XL time. If the QUIET[1:0]
04607   *          bits are set to a different value,
04608   *          1LSB corresponds to 4*ODR_XL time.[set]
04609   *
04610   * @param  ctx      read / write interface definitions
04611   * @param  val      change the values of quiet in reg INT_DUR2
04612   *
04613   */
04614 int32_t lsm6dso_tap_quiet_set(lsm6dso_ctx_t *ctx, uint8_t val)
04615 {
04616   lsm6dso_int_dur2_t reg;
04617   int32_t ret;
04618 
04619   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04620   if (ret == 0) {
04621     reg.quiet = val;
04622     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04623   }
04624   return ret;
04625 }
04626 
04627 /**
04628   * @brief  Quiet time is the time after the first detected
04629   *         tap in which there must not be any over threshold
04630   *         event.
04631   *         The default value of these bits is 00b which
04632   *         corresponds to 2*ODR_XL time.
04633   *         If the QUIET[1:0] bits are set to a different
04634   *         value, 1LSB corresponds to 4*ODR_XL time.[get]
04635   *
04636   * @param  ctx      read / write interface definitions
04637   * @param  val      change the values of quiet in reg INT_DUR2
04638   *
04639   */
04640 int32_t lsm6dso_tap_quiet_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04641 {
04642   lsm6dso_int_dur2_t reg;
04643   int32_t ret;
04644 
04645   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04646   *val = reg.quiet;
04647 
04648   return ret;
04649 }
04650 
04651 /**
04652   * @brief  When double tap recognition is enabled,
04653   *         this register expresses the maximum time
04654   *         between two consecutive detected taps to
04655   *         determine a double tap event.
04656   *         The default value of these bits is 0000b which
04657   *         corresponds to 16*ODR_XL time.
04658   *         If the DUR[3:0] bits are set to a different value,
04659   *         1LSB corresponds to 32*ODR_XL time.[set]
04660   *
04661   * @param  ctx      read / write interface definitions
04662   * @param  val      change the values of dur in reg INT_DUR2
04663   *
04664   */
04665 int32_t lsm6dso_tap_dur_set(lsm6dso_ctx_t *ctx, uint8_t val)
04666 {
04667   lsm6dso_int_dur2_t reg;
04668   int32_t ret;
04669 
04670   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04671   if (ret == 0) {
04672     reg.dur = val;
04673     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04674   }
04675   return ret;
04676 }
04677 
04678 /**
04679   * @brief  When double tap recognition is enabled,
04680   *         this register expresses the maximum time
04681   *         between two consecutive detected taps to
04682   *         determine a double tap event.
04683   *         The default value of these bits is 0000b which
04684   *         corresponds to 16*ODR_XL time. If the DUR[3:0]
04685   *         bits are set to a different value,
04686   *         1LSB corresponds to 32*ODR_XL time.[get]
04687   *
04688   * @param  ctx      read / write interface definitions
04689   * @param  val      change the values of dur in reg INT_DUR2
04690   *
04691   */
04692 int32_t lsm6dso_tap_dur_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04693 {
04694   lsm6dso_int_dur2_t reg;
04695   int32_t ret;
04696 
04697   ret = lsm6dso_read_reg(ctx, LSM6DSO_INT_DUR2, (uint8_t*)&reg, 1);
04698   *val = reg.dur;
04699 
04700   return ret;
04701 }
04702 
04703 /**
04704   * @brief  Single/double-tap event enable.[set]
04705   *
04706   * @param  ctx      read / write interface definitions
04707   * @param  val      change the values of single_double_tap in reg WAKE_UP_THS
04708   *
04709   */
04710 int32_t lsm6dso_tap_mode_set(lsm6dso_ctx_t *ctx,
04711                              lsm6dso_single_double_tap_t val)
04712 {
04713   lsm6dso_wake_up_ths_t reg;
04714   int32_t ret;
04715 
04716   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
04717   if (ret == 0) {
04718     reg.single_double_tap = (uint8_t)val;
04719     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
04720   }
04721   return ret;
04722 }
04723 
04724 /**
04725   * @brief  Single/double-tap event enable.[get]
04726   *
04727   * @param  ctx      read / write interface definitions
04728   * @param  val      Get the values of single_double_tap in reg WAKE_UP_THS
04729   *
04730   */
04731 int32_t lsm6dso_tap_mode_get(lsm6dso_ctx_t *ctx,
04732                              lsm6dso_single_double_tap_t *val)
04733 {
04734   lsm6dso_wake_up_ths_t reg;
04735   int32_t ret;
04736 
04737   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_THS, (uint8_t*)&reg, 1);
04738 
04739   switch (reg.single_double_tap) {
04740     case LSM6DSO_ONLY_SINGLE:
04741       *val = LSM6DSO_ONLY_SINGLE;
04742       break;
04743     case LSM6DSO_BOTH_SINGLE_DOUBLE:
04744       *val = LSM6DSO_BOTH_SINGLE_DOUBLE;
04745       break;
04746     default:
04747       *val = LSM6DSO_ONLY_SINGLE;
04748       break;
04749   }
04750 
04751   return ret;
04752 }
04753 
04754 /**
04755   * @}
04756   *
04757   */
04758 
04759 /**
04760   * @defgroup  LSM6DSO_ Six_position_detection(6D/4D)
04761   * @brief   This section groups all the functions concerning six position
04762   *          detection (6D).
04763   * @{
04764   *
04765 */
04766 
04767 /**
04768   * @brief  Threshold for 4D/6D function.[set]
04769   *
04770   * @param  ctx      read / write interface definitions
04771   * @param  val      change the values of sixd_ths in reg TAP_THS_6D
04772   *
04773   */
04774 int32_t lsm6dso_6d_threshold_set(lsm6dso_ctx_t *ctx, lsm6dso_sixd_ths_t val)
04775 {
04776   lsm6dso_tap_ths_6d_t reg;
04777   int32_t ret;
04778 
04779   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04780   if (ret == 0) {
04781     reg.sixd_ths = (uint8_t)val;
04782     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04783   }
04784   return ret;
04785 }
04786 
04787 /**
04788   * @brief  Threshold for 4D/6D function.[get]
04789   *
04790   * @param  ctx      read / write interface definitions
04791   * @param  val      Get the values of sixd_ths in reg TAP_THS_6D
04792   *
04793   */
04794 int32_t lsm6dso_6d_threshold_get(lsm6dso_ctx_t *ctx, lsm6dso_sixd_ths_t *val)
04795 {
04796   lsm6dso_tap_ths_6d_t reg;
04797   int32_t ret;
04798 
04799   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04800   switch (reg.sixd_ths) {
04801     case LSM6DSO_DEG_80:
04802       *val = LSM6DSO_DEG_80;
04803       break;
04804     case LSM6DSO_DEG_70:
04805       *val = LSM6DSO_DEG_70;
04806       break;
04807     case LSM6DSO_DEG_60:
04808       *val = LSM6DSO_DEG_60;
04809       break;
04810     case LSM6DSO_DEG_50:
04811       *val = LSM6DSO_DEG_50;
04812       break;
04813     default:
04814       *val = LSM6DSO_DEG_80;
04815       break;
04816   }
04817   return ret;
04818 }
04819 
04820 /**
04821   * @brief  4D orientation detection enable.[set]
04822   *
04823   * @param  ctx      read / write interface definitions
04824   * @param  val      change the values of d4d_en in reg TAP_THS_6D
04825   *
04826   */
04827 int32_t lsm6dso_4d_mode_set(lsm6dso_ctx_t *ctx, uint8_t val)
04828 {
04829   lsm6dso_tap_ths_6d_t reg;
04830   int32_t ret;
04831 
04832   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04833   if (ret == 0) {
04834     reg.d4d_en = val;
04835     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04836   }
04837   return ret;
04838 }
04839 
04840 /**
04841   * @brief  4D orientation detection enable.[get]
04842   *
04843   * @param  ctx      read / write interface definitions
04844   * @param  val      change the values of d4d_en in reg TAP_THS_6D
04845   *
04846   */
04847 int32_t lsm6dso_4d_mode_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04848 {
04849   lsm6dso_tap_ths_6d_t reg;
04850   int32_t ret;
04851 
04852   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_THS_6D, (uint8_t*)&reg, 1);
04853   *val = reg.d4d_en;
04854 
04855   return ret;
04856 }
04857 
04858 /**
04859   * @}
04860   *
04861   */
04862 
04863 /**
04864   * @defgroup  LSM6DSO_free_fall
04865   * @brief   This section group all the functions concerning the free
04866   *          fall detection.
04867   * @{
04868   *
04869 */
04870 /**
04871   * @brief  Free fall threshold setting.[set]
04872   *
04873   * @param  ctx      read / write interface definitions
04874   * @param  val      change the values of ff_ths in reg FREE_FALL
04875   *
04876   */
04877 int32_t lsm6dso_ff_threshold_set(lsm6dso_ctx_t *ctx, lsm6dso_ff_ths_t val)
04878 {
04879   lsm6dso_free_fall_t reg;
04880   int32_t ret;
04881 
04882   ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&reg, 1);
04883   if (ret == 0) {
04884     reg.ff_ths = (uint8_t)val;
04885     ret = lsm6dso_write_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&reg, 1);
04886   }
04887   return ret;
04888 }
04889 
04890 /**
04891   * @brief  Free fall threshold setting.[get]
04892   *
04893   * @param  ctx      read / write interface definitions
04894   * @param  val      Get the values of ff_ths in reg FREE_FALL
04895   *
04896   */
04897 int32_t lsm6dso_ff_threshold_get(lsm6dso_ctx_t *ctx, lsm6dso_ff_ths_t *val)
04898 {
04899   lsm6dso_free_fall_t reg;
04900   int32_t ret;
04901 
04902   ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&reg, 1);
04903   switch (reg.ff_ths) {
04904     case LSM6DSO_FF_TSH_156mg:
04905       *val = LSM6DSO_FF_TSH_156mg;
04906       break;
04907     case LSM6DSO_FF_TSH_219mg:
04908       *val = LSM6DSO_FF_TSH_219mg;
04909       break;
04910     case LSM6DSO_FF_TSH_250mg:
04911       *val = LSM6DSO_FF_TSH_250mg;
04912       break;
04913     case LSM6DSO_FF_TSH_312mg:
04914       *val = LSM6DSO_FF_TSH_312mg;
04915       break;
04916     case LSM6DSO_FF_TSH_344mg:
04917       *val = LSM6DSO_FF_TSH_344mg;
04918       break;
04919     case LSM6DSO_FF_TSH_406mg:
04920       *val = LSM6DSO_FF_TSH_406mg;
04921       break;
04922     case LSM6DSO_FF_TSH_469mg:
04923       *val = LSM6DSO_FF_TSH_469mg;
04924       break;
04925     case LSM6DSO_FF_TSH_500mg:
04926       *val = LSM6DSO_FF_TSH_500mg;
04927       break;
04928     default:
04929       *val = LSM6DSO_FF_TSH_156mg;
04930       break;
04931   }
04932   return ret;
04933 }
04934 
04935 /**
04936   * @brief  Free-fall duration event.[set]
04937   *         1LSb = 1 / ODR
04938   *
04939   * @param  ctx      read / write interface definitions
04940   * @param  val      change the values of ff_dur in reg FREE_FALL
04941   *
04942   */
04943 int32_t lsm6dso_ff_dur_set(lsm6dso_ctx_t *ctx, uint8_t val)
04944 {
04945   lsm6dso_wake_up_dur_t wake_up_dur;
04946   lsm6dso_free_fall_t free_fall;
04947   int32_t ret;
04948 
04949   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&wake_up_dur, 1);
04950   if (ret == 0) {
04951     ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&free_fall, 1);
04952   }
04953   if (ret == 0) {
04954     wake_up_dur.ff_dur = ((uint8_t)val & 0x20U) >> 5;
04955     free_fall.ff_dur = (uint8_t)val & 0x1FU;
04956     ret = lsm6dso_write_reg(ctx, LSM6DSO_WAKE_UP_DUR,
04957                             (uint8_t*)&wake_up_dur, 1);
04958   }
04959   if (ret == 0) {
04960     ret = lsm6dso_write_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&free_fall, 1);
04961   }
04962   return ret;
04963 }
04964 
04965 /**
04966   * @brief  Free-fall duration event.[get]
04967   *         1LSb = 1 / ODR
04968   *
04969   * @param  ctx      read / write interface definitions
04970   * @param  val      change the values of ff_dur in reg FREE_FALL
04971   *
04972   */
04973 int32_t lsm6dso_ff_dur_get(lsm6dso_ctx_t *ctx, uint8_t *val)
04974 {
04975   lsm6dso_wake_up_dur_t wake_up_dur;
04976   lsm6dso_free_fall_t free_fall;
04977   int32_t ret;
04978 
04979   ret = lsm6dso_read_reg(ctx, LSM6DSO_WAKE_UP_DUR, (uint8_t*)&wake_up_dur, 1);
04980   if (ret == 0) {
04981     ret = lsm6dso_read_reg(ctx, LSM6DSO_FREE_FALL, (uint8_t*)&free_fall, 1);
04982     *val = (wake_up_dur.ff_dur << 5) + free_fall.ff_dur;
04983   }
04984   return ret;
04985 }
04986 
04987 /**
04988   * @}
04989   *
04990   */
04991 
04992 /**
04993   * @defgroup  LSM6DSO_fifo
04994   * @brief   This section group all the functions concerning the fifo usage
04995   * @{
04996   *
04997 */
04998 
04999 /**
05000   * @brief  FIFO watermark level selection.[set]
05001   *
05002   * @param  ctx      read / write interface definitions
05003   * @param  val      change the values of wtm in reg FIFO_CTRL1
05004   *
05005   */
05006 int32_t lsm6dso_fifo_watermark_set(lsm6dso_ctx_t *ctx, uint16_t val)
05007 {
05008   lsm6dso_fifo_ctrl1_t fifo_ctrl1;
05009   lsm6dso_fifo_ctrl2_t fifo_ctrl2;
05010   int32_t ret;
05011 
05012   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&fifo_ctrl2, 1);
05013   if (ret == 0) {
05014     fifo_ctrl1.wtm = 0x00FFU & (uint8_t)val;
05015     fifo_ctrl2.wtm = (uint8_t)(( 0x0100U & val ) >> 8);
05016     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL1, (uint8_t*)&fifo_ctrl1, 1);
05017   }
05018   if (ret == 0) {
05019     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&fifo_ctrl2, 1);
05020   }
05021   return ret;
05022 }
05023 
05024 /**
05025   * @brief  FIFO watermark level selection.[get]
05026   *
05027   * @param  ctx      read / write interface definitions
05028   * @param  val      change the values of wtm in reg FIFO_CTRL1
05029   *
05030   */
05031 int32_t lsm6dso_fifo_watermark_get(lsm6dso_ctx_t *ctx, uint16_t *val)
05032 {
05033   lsm6dso_fifo_ctrl1_t fifo_ctrl1;
05034   lsm6dso_fifo_ctrl2_t fifo_ctrl2;
05035   int32_t ret;
05036 
05037   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL1, (uint8_t*)&fifo_ctrl1, 1);
05038   if (ret == 0) {
05039     ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&fifo_ctrl2, 1);
05040     *val = ((uint16_t)fifo_ctrl2.wtm << 8) + (uint16_t)fifo_ctrl1.wtm;
05041   }
05042   return ret;
05043 }
05044 
05045 /**
05046   * @brief  FIFO compression feature initialization request [set].
05047   *
05048   * @param  ctx       read / write interface definitions
05049   * @param  val       change the values of FIFO_COMPR_INIT in
05050   *                   reg EMB_FUNC_INIT_B
05051   *
05052   */
05053 int32_t lsm6dso_compression_algo_init_set(lsm6dso_ctx_t *ctx, uint8_t val)
05054 {
05055   lsm6dso_emb_func_init_b_t reg;
05056   int32_t ret;
05057 
05058   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
05059   if (ret == 0) {
05060     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
05061   }
05062   if (ret == 0) {
05063     reg.fifo_compr_init = val;
05064     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
05065   }
05066   if (ret == 0) {
05067     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
05068   }
05069 
05070   return ret;
05071 }
05072 
05073 /**
05074   * @brief  FIFO compression feature initialization request [get].
05075   *
05076   * @param  ctx    read / write interface definitions
05077   * @param  val    change the values of FIFO_COMPR_INIT in
05078   *                reg EMB_FUNC_INIT_B
05079   *
05080   */
05081 int32_t lsm6dso_compression_algo_init_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05082 {
05083   lsm6dso_emb_func_init_b_t reg;
05084   int32_t ret;
05085 
05086   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
05087   if (ret == 0) {
05088     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
05089   }
05090   if (ret == 0) {
05091     *val = reg.fifo_compr_init;
05092     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
05093   }
05094 
05095   return ret;
05096 }
05097 
05098 /**
05099   * @brief  Enable and configure compression algo.[set]
05100   *
05101   * @param  ctx      read / write interface definitions
05102   * @param  val      change the values of uncoptr_rate in
05103   *                  reg FIFO_CTRL2
05104   *
05105   */
05106 int32_t lsm6dso_compression_algo_set(lsm6dso_ctx_t *ctx,
05107                                      lsm6dso_uncoptr_rate_t val)
05108 {
05109   lsm6dso_fifo_ctrl2_t fifo_ctrl2;
05110   int32_t ret;
05111 
05112   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2,
05113                          (uint8_t*)&fifo_ctrl2, 1);
05114 
05115   if (ret == 0) {
05116     fifo_ctrl2.fifo_compr_rt_en = ((uint8_t)val & 0x04U) >> 2;
05117     fifo_ctrl2.uncoptr_rate = (uint8_t)val & 0x03U;
05118     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2,
05119                             (uint8_t*)&fifo_ctrl2, 1);
05120   }
05121   return ret;
05122 }
05123 
05124 /**
05125   * @brief  Enable and configure compression algo.[get]
05126   *
05127   * @param  ctx      read / write interface definitions
05128   * @param  val      Get the values of uncoptr_rate in
05129   *                  reg FIFO_CTRL2
05130   *
05131   */
05132 int32_t lsm6dso_compression_algo_get(lsm6dso_ctx_t *ctx,
05133                                      lsm6dso_uncoptr_rate_t *val)
05134 {
05135   lsm6dso_fifo_ctrl2_t reg;
05136   int32_t ret;
05137 
05138   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05139 
05140   switch ((reg.fifo_compr_rt_en<<2) | reg.uncoptr_rate) {
05141     case LSM6DSO_CMP_DISABLE:
05142       *val = LSM6DSO_CMP_DISABLE;
05143       break;
05144     case LSM6DSO_CMP_ALWAYS:
05145       *val = LSM6DSO_CMP_ALWAYS;
05146       break;
05147     case LSM6DSO_CMP_8_TO_1:
05148       *val = LSM6DSO_CMP_8_TO_1;
05149       break;
05150     case LSM6DSO_CMP_16_TO_1:
05151       *val = LSM6DSO_CMP_16_TO_1;
05152       break;
05153     case LSM6DSO_CMP_32_TO_1:
05154       *val = LSM6DSO_CMP_32_TO_1;
05155       break;
05156     default:
05157       *val = LSM6DSO_CMP_DISABLE;
05158       break;
05159   }
05160   return ret;
05161 }
05162 
05163 /**
05164   * @brief  Enables ODR CHANGE virtual sensor to be batched in FIFO.[set]
05165   *
05166   * @param  ctx      read / write interface definitions
05167   * @param  val      change the values of odrchg_en in reg FIFO_CTRL2
05168   *
05169   */
05170 int32_t lsm6dso_fifo_virtual_sens_odr_chg_set(lsm6dso_ctx_t *ctx,
05171                                               uint8_t val)
05172 {
05173   lsm6dso_fifo_ctrl2_t reg;
05174   int32_t ret;
05175 
05176   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05177   if (ret == 0) {
05178     reg.odrchg_en = val;
05179     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05180   }
05181   return ret;
05182 }
05183 
05184 /**
05185   * @brief  Enables ODR CHANGE virtual sensor to be batched in FIFO.[get]
05186   *
05187   * @param  ctx      read / write interface definitions
05188   * @param  val      change the values of odrchg_en in reg FIFO_CTRL2
05189   *
05190   */
05191 int32_t lsm6dso_fifo_virtual_sens_odr_chg_get(lsm6dso_ctx_t *ctx,
05192                                               uint8_t *val)
05193 {
05194   lsm6dso_fifo_ctrl2_t reg;
05195   int32_t ret;
05196 
05197   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05198   *val = reg.odrchg_en;
05199 
05200   return ret;
05201 }
05202 
05203 /**
05204   * @brief  Enables/Disables compression algorithm runtime.[set]
05205   *
05206   * @param  ctx      read / write interface definitions
05207   * @param  val      change the values of fifo_compr_rt_en in
05208   *                  reg FIFO_CTRL2
05209   *
05210   */
05211 int32_t lsm6dso_compression_algo_real_time_set(lsm6dso_ctx_t *ctx,
05212                                                uint8_t val)
05213 {
05214   lsm6dso_fifo_ctrl2_t reg;
05215   int32_t ret;
05216 
05217   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05218   if (ret == 0) {
05219     reg.fifo_compr_rt_en = val;
05220     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05221   }
05222   return ret;
05223 }
05224 
05225 /**
05226   * @brief   Enables/Disables compression algorithm runtime. [get]
05227   *
05228   * @param  ctx      read / write interface definitions
05229   * @param  val      change the values of fifo_compr_rt_en in reg FIFO_CTRL2
05230   *
05231   */
05232 int32_t lsm6dso_compression_algo_real_time_get(lsm6dso_ctx_t *ctx,
05233                                                uint8_t *val)
05234 {
05235   lsm6dso_fifo_ctrl2_t reg;
05236   int32_t ret;
05237 
05238   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05239   *val = reg.fifo_compr_rt_en;
05240 
05241   return ret;
05242 }
05243 
05244 /**
05245   * @brief  Sensing chain FIFO stop values memorization at
05246   *         threshold level.[set]
05247   *
05248   * @param  ctx      read / write interface definitions
05249   * @param  val      change the values of stop_on_wtm in reg FIFO_CTRL2
05250   *
05251   */
05252 int32_t lsm6dso_fifo_stop_on_wtm_set(lsm6dso_ctx_t *ctx, uint8_t val)
05253 {
05254   lsm6dso_fifo_ctrl2_t reg;
05255   int32_t ret;
05256 
05257   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05258   if (ret == 0) {
05259     reg.stop_on_wtm = val;
05260     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05261   }
05262   return ret;
05263 }
05264 
05265 /**
05266   * @brief  Sensing chain FIFO stop values memorization at
05267   *         threshold level.[get]
05268   *
05269   * @param  ctx      read / write interface definitions
05270   * @param  val      change the values of stop_on_wtm in reg FIFO_CTRL2
05271   *
05272   */
05273 int32_t lsm6dso_fifo_stop_on_wtm_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05274 {
05275   lsm6dso_fifo_ctrl2_t reg;
05276   int32_t ret;
05277 
05278   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL2, (uint8_t*)&reg, 1);
05279   *val = reg.stop_on_wtm;
05280 
05281   return ret;
05282 }
05283 
05284 /**
05285   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05286   *         for accelerometer data.[set]
05287   *
05288   * @param  ctx      read / write interface definitions
05289   * @param  val      change the values of bdr_xl in reg FIFO_CTRL3
05290   *
05291   */
05292 int32_t lsm6dso_fifo_xl_batch_set(lsm6dso_ctx_t *ctx, lsm6dso_bdr_xl_t val)
05293 {
05294   lsm6dso_fifo_ctrl3_t reg;
05295   int32_t ret;
05296 
05297   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05298   if (ret == 0) {
05299     reg.bdr_xl = (uint8_t)val;
05300     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05301   }
05302   return ret;
05303 }
05304 
05305 /**
05306   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05307   *         for accelerometer data.[get]
05308   *
05309   * @param  ctx      read / write interface definitions
05310   * @param  val      Get the values of bdr_xl in reg FIFO_CTRL3
05311   *
05312   */
05313 int32_t lsm6dso_fifo_xl_batch_get(lsm6dso_ctx_t *ctx, lsm6dso_bdr_xl_t *val)
05314 {
05315   lsm6dso_fifo_ctrl3_t reg;
05316   int32_t ret;
05317 
05318   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05319   switch (reg.bdr_xl) {
05320     case LSM6DSO_XL_NOT_BATCHED:
05321       *val = LSM6DSO_XL_NOT_BATCHED;
05322       break;
05323     case LSM6DSO_XL_BATCHED_AT_12Hz5:
05324       *val = LSM6DSO_XL_BATCHED_AT_12Hz5;
05325       break;
05326     case LSM6DSO_XL_BATCHED_AT_26Hz:
05327       *val = LSM6DSO_XL_BATCHED_AT_26Hz;
05328       break;
05329     case LSM6DSO_XL_BATCHED_AT_52Hz:
05330       *val = LSM6DSO_XL_BATCHED_AT_52Hz;
05331       break;
05332     case LSM6DSO_XL_BATCHED_AT_104Hz:
05333       *val = LSM6DSO_XL_BATCHED_AT_104Hz;
05334       break;
05335     case LSM6DSO_XL_BATCHED_AT_208Hz:
05336       *val = LSM6DSO_XL_BATCHED_AT_208Hz;
05337       break;
05338     case LSM6DSO_XL_BATCHED_AT_417Hz:
05339       *val = LSM6DSO_XL_BATCHED_AT_417Hz;
05340       break;
05341     case LSM6DSO_XL_BATCHED_AT_833Hz:
05342       *val = LSM6DSO_XL_BATCHED_AT_833Hz;
05343       break;
05344     case LSM6DSO_XL_BATCHED_AT_1667Hz:
05345       *val = LSM6DSO_XL_BATCHED_AT_1667Hz;
05346       break;
05347     case LSM6DSO_XL_BATCHED_AT_3333Hz:
05348       *val = LSM6DSO_XL_BATCHED_AT_3333Hz;
05349       break;
05350     case LSM6DSO_XL_BATCHED_AT_6667Hz:
05351       *val = LSM6DSO_XL_BATCHED_AT_6667Hz;
05352       break;
05353     case LSM6DSO_XL_BATCHED_AT_6Hz5:
05354       *val = LSM6DSO_XL_BATCHED_AT_6Hz5;
05355       break;
05356     default:
05357       *val = LSM6DSO_XL_NOT_BATCHED;
05358       break;
05359   }
05360 
05361   return ret;
05362 }
05363 
05364 /**
05365   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05366   *         for gyroscope data.[set]
05367   *
05368   * @param  ctx      read / write interface definitions
05369   * @param  val      change the values of bdr_gy in reg FIFO_CTRL3
05370   *
05371   */
05372 int32_t lsm6dso_fifo_gy_batch_set(lsm6dso_ctx_t *ctx, lsm6dso_bdr_gy_t val)
05373 {
05374   lsm6dso_fifo_ctrl3_t reg;
05375   int32_t ret;
05376 
05377   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05378   if (ret == 0) {
05379     reg.bdr_gy = (uint8_t)val;
05380     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05381   }
05382   return ret;
05383 }
05384 
05385 /**
05386   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05387   *         for gyroscope data.[get]
05388   *
05389   * @param  ctx      read / write interface definitions
05390   * @param  val      Get the values of bdr_gy in reg FIFO_CTRL3
05391   *
05392   */
05393 int32_t lsm6dso_fifo_gy_batch_get(lsm6dso_ctx_t *ctx, lsm6dso_bdr_gy_t *val)
05394 {
05395   lsm6dso_fifo_ctrl3_t reg;
05396   int32_t ret;
05397 
05398   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL3, (uint8_t*)&reg, 1);
05399   switch (reg.bdr_gy) {
05400     case LSM6DSO_GY_NOT_BATCHED:
05401       *val = LSM6DSO_GY_NOT_BATCHED;
05402       break;
05403     case LSM6DSO_GY_BATCHED_AT_12Hz5:
05404       *val = LSM6DSO_GY_BATCHED_AT_12Hz5;
05405       break;
05406     case LSM6DSO_GY_BATCHED_AT_26Hz:
05407       *val = LSM6DSO_GY_BATCHED_AT_26Hz;
05408       break;
05409     case LSM6DSO_GY_BATCHED_AT_52Hz:
05410       *val = LSM6DSO_GY_BATCHED_AT_52Hz;
05411       break;
05412     case LSM6DSO_GY_BATCHED_AT_104Hz:
05413       *val = LSM6DSO_GY_BATCHED_AT_104Hz;
05414       break;
05415     case LSM6DSO_GY_BATCHED_AT_208Hz:
05416       *val = LSM6DSO_GY_BATCHED_AT_208Hz;
05417       break;
05418     case LSM6DSO_GY_BATCHED_AT_417Hz:
05419       *val = LSM6DSO_GY_BATCHED_AT_417Hz;
05420       break;
05421     case LSM6DSO_GY_BATCHED_AT_833Hz:
05422       *val = LSM6DSO_GY_BATCHED_AT_833Hz;
05423       break;
05424     case LSM6DSO_GY_BATCHED_AT_1667Hz:
05425       *val = LSM6DSO_GY_BATCHED_AT_1667Hz;
05426       break;
05427     case LSM6DSO_GY_BATCHED_AT_3333Hz:
05428       *val = LSM6DSO_GY_BATCHED_AT_3333Hz;
05429       break;
05430     case LSM6DSO_GY_BATCHED_AT_6667Hz:
05431       *val = LSM6DSO_GY_BATCHED_AT_6667Hz;
05432       break;
05433     case LSM6DSO_GY_BATCHED_AT_6Hz5:
05434       *val = LSM6DSO_GY_BATCHED_AT_6Hz5;
05435       break;
05436     default:
05437       *val = LSM6DSO_GY_NOT_BATCHED;
05438       break;
05439   }
05440   return ret;
05441 }
05442 
05443 /**
05444   * @brief  FIFO mode selection.[set]
05445   *
05446   * @param  ctx      read / write interface definitions
05447   * @param  val      change the values of fifo_mode in reg FIFO_CTRL4
05448   *
05449   */
05450 int32_t lsm6dso_fifo_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_fifo_mode_t val)
05451 {
05452   lsm6dso_fifo_ctrl4_t reg;
05453   int32_t ret;
05454 
05455   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05456   if (ret == 0) {
05457     reg.fifo_mode = (uint8_t)val;
05458     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05459   }
05460   return ret;
05461 }
05462 
05463 /**
05464   * @brief  FIFO mode selection.[get]
05465   *
05466   * @param  ctx      read / write interface definitions
05467   * @param  val      Get the values of fifo_mode in reg FIFO_CTRL4
05468   *
05469   */
05470 int32_t lsm6dso_fifo_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_fifo_mode_t *val)
05471 {
05472   lsm6dso_fifo_ctrl4_t reg;
05473   int32_t ret;
05474 
05475   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05476 
05477   switch (reg.fifo_mode) {
05478     case LSM6DSO_BYPASS_MODE:
05479       *val = LSM6DSO_BYPASS_MODE;
05480       break;
05481     case LSM6DSO_FIFO_MODE:
05482       *val = LSM6DSO_FIFO_MODE;
05483       break;
05484     case LSM6DSO_STREAM_TO_FIFO_MODE:
05485       *val = LSM6DSO_STREAM_TO_FIFO_MODE;
05486       break;
05487     case LSM6DSO_BYPASS_TO_STREAM_MODE:
05488       *val = LSM6DSO_BYPASS_TO_STREAM_MODE;
05489       break;
05490     case LSM6DSO_STREAM_MODE:
05491       *val = LSM6DSO_STREAM_MODE;
05492       break;
05493     case LSM6DSO_BYPASS_TO_FIFO_MODE:
05494       *val = LSM6DSO_BYPASS_TO_FIFO_MODE;
05495       break;
05496     default:
05497       *val = LSM6DSO_BYPASS_MODE;
05498       break;
05499   }
05500   return ret;
05501 }
05502 
05503 /**
05504   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05505   *         for temperature data.[set]
05506   *
05507   * @param  ctx      read / write interface definitions
05508   * @param  val      change the values of odr_t_batch in reg FIFO_CTRL4
05509   *
05510   */
05511 int32_t lsm6dso_fifo_temp_batch_set(lsm6dso_ctx_t *ctx,
05512                                     lsm6dso_odr_t_batch_t val)
05513 {
05514   lsm6dso_fifo_ctrl4_t reg;
05515   int32_t ret;
05516 
05517   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05518   if (ret == 0) {
05519     reg.odr_t_batch = (uint8_t)val;
05520     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05521   }
05522   return ret;
05523 }
05524 
05525 /**
05526   * @brief  Selects Batching Data Rate (writing frequency in FIFO)
05527   *         for temperature data.[get]
05528   *
05529   * @param  ctx      read / write interface definitions
05530   * @param  val      Get the values of odr_t_batch in reg FIFO_CTRL4
05531   *
05532   */
05533 int32_t lsm6dso_fifo_temp_batch_get(lsm6dso_ctx_t *ctx,
05534                                     lsm6dso_odr_t_batch_t *val)
05535 {
05536   lsm6dso_fifo_ctrl4_t reg;
05537   int32_t ret;
05538 
05539   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05540 
05541   switch (reg.odr_t_batch) {
05542     case LSM6DSO_TEMP_NOT_BATCHED:
05543       *val = LSM6DSO_TEMP_NOT_BATCHED;
05544       break;
05545     case LSM6DSO_TEMP_BATCHED_AT_1Hz6:
05546       *val = LSM6DSO_TEMP_BATCHED_AT_1Hz6;
05547       break;
05548     case LSM6DSO_TEMP_BATCHED_AT_12Hz5:
05549       *val = LSM6DSO_TEMP_BATCHED_AT_12Hz5;
05550       break;
05551     case LSM6DSO_TEMP_BATCHED_AT_52Hz:
05552       *val = LSM6DSO_TEMP_BATCHED_AT_52Hz;
05553       break;
05554     default:
05555       *val = LSM6DSO_TEMP_NOT_BATCHED;
05556       break;
05557   }
05558   return ret;
05559 }
05560 
05561 /**
05562   * @brief  Selects decimation for timestamp batching in FIFO.
05563   *         Writing rate will be the maximum rate between XL and
05564   *         GYRO BDR divided by decimation decoder.[set]
05565   *
05566   * @param  ctx      read / write interface definitions
05567   * @param  val      change the values of odr_ts_batch in reg FIFO_CTRL4
05568   *
05569   */
05570 int32_t lsm6dso_fifo_timestamp_decimation_set(lsm6dso_ctx_t *ctx,
05571                                               lsm6dso_odr_ts_batch_t val)
05572 {
05573   lsm6dso_fifo_ctrl4_t reg;
05574   int32_t ret;
05575 
05576   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05577   if (ret == 0) {
05578     reg.odr_ts_batch = (uint8_t)val;
05579     ret = lsm6dso_write_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05580   }
05581   return ret;
05582 }
05583 
05584 /**
05585   * @brief   Selects decimation for timestamp batching in FIFO.
05586   *          Writing rate will be the maximum rate between XL and
05587   *          GYRO BDR divided by decimation decoder.[get]
05588   *
05589   * @param  ctx      read / write interface definitions
05590   * @param  val      Get the values of odr_ts_batch in reg FIFO_CTRL4
05591   *
05592   */
05593 int32_t lsm6dso_fifo_timestamp_decimation_get(lsm6dso_ctx_t *ctx,
05594                                               lsm6dso_odr_ts_batch_t *val)
05595 {
05596   lsm6dso_fifo_ctrl4_t reg;
05597   int32_t ret;
05598 
05599   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_CTRL4, (uint8_t*)&reg, 1);
05600   switch (reg.odr_ts_batch) {
05601     case LSM6DSO_NO_DECIMATION:
05602       *val = LSM6DSO_NO_DECIMATION;
05603       break;
05604     case LSM6DSO_DEC_1:
05605       *val = LSM6DSO_DEC_1;
05606       break;
05607     case LSM6DSO_DEC_8:
05608       *val = LSM6DSO_DEC_8;
05609       break;
05610     case LSM6DSO_DEC_32:
05611       *val = LSM6DSO_DEC_32;
05612       break;
05613     default:
05614       *val = LSM6DSO_NO_DECIMATION;
05615       break;
05616   }
05617   return ret;
05618 }
05619 
05620 /**
05621   * @brief  Selects the trigger for the internal counter of batching events
05622   *         between XL and gyro.[set]
05623   *
05624   * @param  ctx      read / write interface definitions
05625   * @param  val      change the values of trig_counter_bdr
05626   *                  in reg COUNTER_BDR_REG1
05627   *
05628   */
05629 int32_t lsm6dso_fifo_cnt_event_batch_set(lsm6dso_ctx_t *ctx,
05630                                          lsm6dso_trig_counter_bdr_t val)
05631 {
05632   lsm6dso_counter_bdr_reg1_t reg;
05633   int32_t ret;
05634 
05635   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05636   if (ret == 0) {
05637     reg.trig_counter_bdr = (uint8_t)val;
05638     ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05639   }
05640   return ret;
05641 }
05642 
05643 /**
05644   * @brief  Selects the trigger for the internal counter of batching events
05645   *         between XL and gyro.[get]
05646   *
05647   * @param  ctx      read / write interface definitions
05648   * @param  val      Get the values of trig_counter_bdr
05649   *                                     in reg COUNTER_BDR_REG1
05650   *
05651   */
05652 int32_t lsm6dso_fifo_cnt_event_batch_get(lsm6dso_ctx_t *ctx,
05653                                          lsm6dso_trig_counter_bdr_t *val)
05654 {
05655   lsm6dso_counter_bdr_reg1_t reg;
05656   int32_t ret;
05657 
05658   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05659   switch (reg.trig_counter_bdr) {
05660     case LSM6DSO_XL_BATCH_EVENT:
05661       *val = LSM6DSO_XL_BATCH_EVENT;
05662       break;
05663     case LSM6DSO_GYRO_BATCH_EVENT:
05664       *val = LSM6DSO_GYRO_BATCH_EVENT;
05665       break;
05666     default:
05667       *val = LSM6DSO_XL_BATCH_EVENT;
05668       break;
05669   }
05670   return ret;
05671 }
05672 
05673 /**
05674   * @brief  Resets the internal counter of batching vents for a single sensor.
05675   *         This bit is automatically reset to zero if it was set to ‘1’.[set]
05676   *
05677   * @param  ctx      read / write interface definitions
05678   * @param  val      change the values of rst_counter_bdr in
05679   *                      reg COUNTER_BDR_REG1
05680   *
05681   */
05682 int32_t lsm6dso_rst_batch_counter_set(lsm6dso_ctx_t *ctx, uint8_t val)
05683 {
05684   lsm6dso_counter_bdr_reg1_t reg;
05685   int32_t ret;
05686 
05687   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05688   if (ret == 0) {
05689     reg.rst_counter_bdr = val;
05690     ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05691   }
05692   return ret;
05693 }
05694 
05695 /**
05696   * @brief  Resets the internal counter of batching events for a single sensor.
05697   *         This bit is automatically reset to zero if it was set to ‘1’.[get]
05698   *
05699   * @param  ctx      read / write interface definitions
05700   * @param  val      change the values of rst_counter_bdr in
05701   *                  reg COUNTER_BDR_REG1
05702   *
05703   */
05704 int32_t lsm6dso_rst_batch_counter_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05705 {
05706   lsm6dso_counter_bdr_reg1_t reg;
05707   int32_t ret;
05708 
05709   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1, (uint8_t*)&reg, 1);
05710   *val = reg.rst_counter_bdr;
05711 
05712   return ret;
05713 }
05714 
05715 /**
05716   * @brief  Batch data rate counter.[set]
05717   *
05718   * @param  ctx      read / write interface definitions
05719   * @param  val      change the values of cnt_bdr_th in
05720   *                  reg COUNTER_BDR_REG2 and COUNTER_BDR_REG1.
05721   *
05722   */
05723 int32_t lsm6dso_batch_counter_threshold_set(lsm6dso_ctx_t *ctx, uint16_t val)
05724 {
05725   lsm6dso_counter_bdr_reg1_t counter_bdr_reg1;
05726   lsm6dso_counter_bdr_reg2_t counter_bdr_reg2;
05727   int32_t ret;
05728 
05729   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
05730                          (uint8_t*)&counter_bdr_reg1, 1);
05731   if (ret == 0) {
05732     counter_bdr_reg2.cnt_bdr_th =  0x00FFU & (uint8_t)val;
05733     counter_bdr_reg1.cnt_bdr_th = (uint8_t)(0x0700U & val) >> 8;
05734     ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
05735                             (uint8_t*)&counter_bdr_reg1, 1);
05736   }
05737   if (ret == 0) {
05738     ret = lsm6dso_write_reg(ctx, LSM6DSO_COUNTER_BDR_REG2,
05739                             (uint8_t*)&counter_bdr_reg2, 1);
05740   }
05741   return ret;
05742 }
05743 
05744 /**
05745   * @brief  Batch data rate counter.[get]
05746   *
05747   * @param  ctx      read / write interface definitions
05748   * @param  val      change the values of cnt_bdr_th in
05749   *                  reg COUNTER_BDR_REG2 and COUNTER_BDR_REG1.
05750   *
05751   */
05752 int32_t lsm6dso_batch_counter_threshold_get(lsm6dso_ctx_t *ctx, uint16_t *val)
05753 {
05754   lsm6dso_counter_bdr_reg1_t counter_bdr_reg1;
05755   lsm6dso_counter_bdr_reg2_t counter_bdr_reg2;
05756   int32_t ret;
05757 
05758   ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG1,
05759                          (uint8_t*)&counter_bdr_reg1, 1);
05760   if (ret == 0) {
05761     ret = lsm6dso_read_reg(ctx, LSM6DSO_COUNTER_BDR_REG2,
05762                            (uint8_t*)&counter_bdr_reg2, 1);
05763 
05764     *val = ((uint16_t)counter_bdr_reg1.cnt_bdr_th << 8)
05765     + (uint16_t)counter_bdr_reg2.cnt_bdr_th;
05766   }
05767 
05768   return ret;
05769 }
05770 
05771 /**
05772   * @brief  Number of unread sensor data(TAG + 6 bytes) stored in FIFO.[get]
05773   *
05774   * @param  ctx      read / write interface definitions
05775   * @param  val      change the values of diff_fifo in reg FIFO_STATUS1
05776   *
05777   */
05778 int32_t lsm6dso_fifo_data_level_get(lsm6dso_ctx_t *ctx, uint16_t *val)
05779 {
05780   lsm6dso_fifo_status1_t fifo_status1;
05781   lsm6dso_fifo_status2_t fifo_status2;
05782   int32_t ret;
05783 
05784   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS1,
05785                          (uint8_t*)&fifo_status1, 1);
05786   if (ret == 0) {
05787     ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2,
05788                            (uint8_t*)&fifo_status2, 1);
05789     *val = ((uint16_t)fifo_status2.diff_fifo << 8) +
05790             (uint16_t)fifo_status1.diff_fifo;
05791   }
05792   return ret;
05793 }
05794 
05795 /**
05796   * @brief  FIFO status.[get]
05797   *
05798   * @param  ctx      read / write interface definitions
05799   * @param  val      registers FIFO_STATUS2
05800   *
05801   */
05802 int32_t lsm6dso_fifo_status_get(lsm6dso_ctx_t *ctx,
05803                                 lsm6dso_fifo_status2_t *val)
05804 {
05805   int32_t ret;
05806   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t*) val, 1);
05807   return ret;
05808 }
05809 
05810 /**
05811   * @brief  Smart FIFO full status.[get]
05812   *
05813   * @param  ctx      read / write interface definitions
05814   * @param  val      change the values of fifo_full_ia in reg FIFO_STATUS2
05815   *
05816   */
05817 int32_t lsm6dso_fifo_full_flag_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05818 {
05819   lsm6dso_fifo_status2_t reg;
05820   int32_t ret;
05821 
05822   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t*)&reg, 1);
05823   *val = reg.fifo_full_ia;
05824 
05825   return ret;
05826 }
05827 
05828 /**
05829   * @brief  FIFO overrun status.[get]
05830   *
05831   * @param  ctx      read / write interface definitions
05832   * @param  val      change the values of  fifo_over_run_latched in
05833   *                  reg FIFO_STATUS2
05834   *
05835   */
05836 int32_t lsm6dso_fifo_ovr_flag_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05837 {
05838   lsm6dso_fifo_status2_t reg;
05839   int32_t ret;
05840 
05841   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t*)&reg, 1);
05842   *val = reg.fifo_ovr_ia;
05843 
05844   return ret;
05845 }
05846 
05847 /**
05848   * @brief  FIFO watermark status.[get]
05849   *
05850   * @param  ctx      read / write interface definitions
05851   * @param  val      change the values of fifo_wtm_ia in reg FIFO_STATUS2
05852   *
05853   */
05854 int32_t lsm6dso_fifo_wtm_flag_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05855 {
05856   lsm6dso_fifo_status2_t reg;
05857   int32_t ret;
05858 
05859   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_STATUS2, (uint8_t*)&reg, 1);
05860   *val = reg.fifo_wtm_ia;
05861 
05862   return ret;
05863 }
05864 
05865 /**
05866   * @brief  Identifies the sensor in FIFO_DATA_OUT.[get]
05867   *
05868   * @param  ctx      read / write interface definitions
05869   * @param  val      change the values of tag_sensor in reg FIFO_DATA_OUT_TAG
05870   *
05871   */
05872 int32_t lsm6dso_fifo_sensor_tag_get(lsm6dso_ctx_t *ctx,
05873                                     lsm6dso_fifo_tag_t *val)
05874 {
05875   lsm6dso_fifo_data_out_tag_t reg;
05876   int32_t ret;
05877 
05878   ret = lsm6dso_read_reg(ctx, LSM6DSO_FIFO_DATA_OUT_TAG, (uint8_t*)&reg, 1);
05879   switch (reg.tag_sensor) {
05880     case LSM6DSO_GYRO_NC_TAG:
05881       *val = LSM6DSO_GYRO_NC_TAG;
05882       break;
05883     case LSM6DSO_XL_NC_TAG:
05884       *val = LSM6DSO_XL_NC_TAG;
05885       break;
05886     case LSM6DSO_TEMPERATURE_TAG:
05887       *val = LSM6DSO_TEMPERATURE_TAG;
05888       break;
05889     case LSM6DSO_CFG_CHANGE_TAG:
05890       *val = LSM6DSO_CFG_CHANGE_TAG;
05891       break;
05892     case LSM6DSO_XL_NC_T_2_TAG:
05893       *val = LSM6DSO_XL_NC_T_2_TAG;
05894       break;
05895     case LSM6DSO_XL_NC_T_1_TAG:
05896       *val = LSM6DSO_XL_NC_T_1_TAG;
05897       break;
05898     case LSM6DSO_XL_2XC_TAG:
05899       *val = LSM6DSO_XL_2XC_TAG;
05900       break;
05901     case LSM6DSO_XL_3XC_TAG:
05902       *val = LSM6DSO_XL_3XC_TAG;
05903       break;
05904     case LSM6DSO_GYRO_NC_T_2_TAG:
05905       *val = LSM6DSO_GYRO_NC_T_2_TAG;
05906       break;
05907     case LSM6DSO_GYRO_NC_T_1_TAG:
05908       *val = LSM6DSO_GYRO_NC_T_1_TAG;
05909       break;
05910     case LSM6DSO_GYRO_2XC_TAG:
05911       *val = LSM6DSO_GYRO_2XC_TAG;
05912       break;
05913     case LSM6DSO_GYRO_3XC_TAG:
05914       *val = LSM6DSO_GYRO_3XC_TAG;
05915       break;
05916     case LSM6DSO_SENSORHUB_SLAVE0_TAG:
05917       *val = LSM6DSO_SENSORHUB_SLAVE0_TAG;
05918       break;
05919     case LSM6DSO_SENSORHUB_SLAVE1_TAG:
05920       *val = LSM6DSO_SENSORHUB_SLAVE1_TAG;
05921       break;
05922     case LSM6DSO_SENSORHUB_SLAVE2_TAG:
05923       *val = LSM6DSO_SENSORHUB_SLAVE2_TAG;
05924       break;
05925     case LSM6DSO_SENSORHUB_SLAVE3_TAG:
05926       *val = LSM6DSO_SENSORHUB_SLAVE3_TAG;
05927       break;
05928     case LSM6DSO_STEP_CPUNTER_TAG:
05929       *val = LSM6DSO_STEP_CPUNTER_TAG;
05930       break;
05931     case LSM6DSO_GAME_ROTATION_TAG:
05932       *val = LSM6DSO_GAME_ROTATION_TAG;
05933       break;
05934     case LSM6DSO_GEOMAG_ROTATION_TAG:
05935       *val = LSM6DSO_GEOMAG_ROTATION_TAG;
05936       break;
05937     case LSM6DSO_ROTATION_TAG:
05938       *val = LSM6DSO_ROTATION_TAG;
05939       break;
05940     case LSM6DSO_SENSORHUB_NACK_TAG:
05941       *val = LSM6DSO_SENSORHUB_NACK_TAG;
05942       break;
05943     default:
05944       *val = LSM6DSO_GYRO_NC_TAG;
05945       break;
05946   }
05947   return ret;
05948 }
05949 
05950 /**
05951   * @brief  :  Enable FIFO batching of pedometer embedded
05952   *            function values.[set]
05953   *
05954   * @param  ctx      read / write interface definitions
05955   * @param  val      change the values of gbias_fifo_en in
05956   *                  reg LSM6DSO_EMB_FUNC_FIFO_CFG
05957   *
05958   */
05959 int32_t lsm6dso_fifo_pedo_batch_set(lsm6dso_ctx_t *ctx, uint8_t val)
05960 {
05961   lsm6dso_emb_func_fifo_cfg_t reg;
05962   int32_t ret;
05963 
05964   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
05965   if (ret == 0) {
05966     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG, (uint8_t*)&reg, 1);
05967   }
05968   if (ret == 0) {
05969     reg.pedo_fifo_en = val;
05970     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG,
05971                             (uint8_t*)&reg, 1);
05972   }
05973   if (ret == 0) {
05974     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
05975   }
05976   return ret;
05977 }
05978 
05979 /**
05980   * @brief  Enable FIFO batching of pedometer embedded function values.[get]
05981   *
05982   * @param  ctx      read / write interface definitions
05983   * @param  val      change the values of pedo_fifo_en in
05984   *                  reg LSM6DSO_EMB_FUNC_FIFO_CFG
05985   *
05986   */
05987 int32_t lsm6dso_fifo_pedo_batch_get(lsm6dso_ctx_t *ctx, uint8_t *val)
05988 {
05989   lsm6dso_emb_func_fifo_cfg_t reg;
05990   int32_t ret;
05991 
05992   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
05993   if (ret == 0) {
05994     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_FIFO_CFG, (uint8_t*)&reg, 1);
05995   }
05996   if (ret == 0) {
05997     *val = reg.pedo_fifo_en;
05998     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
05999   }
06000   return ret;
06001 }
06002 
06003 /**
06004   * @brief   Enable FIFO batching data of first slave.[set]
06005   *
06006   * @param  ctx      read / write interface definitions
06007   * @param  val      change the values of  batch_ext_sens_0_en in
06008   *                  reg SLV0_CONFIG
06009   *
06010   */
06011 int32_t lsm6dso_sh_batch_slave_0_set(lsm6dso_ctx_t *ctx, uint8_t val)
06012 {
06013   lsm6dso_slv0_config_t reg;
06014   int32_t ret;
06015 
06016   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06017   if (ret == 0) {
06018     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t*)&reg, 1);
06019   }
06020   if (ret == 0) {
06021     reg.batch_ext_sens_0_en = val;
06022     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t*)&reg, 1);
06023   }
06024   if (ret == 0) {
06025     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06026   }
06027   return ret;
06028 }
06029 
06030 /**
06031   * @brief  Enable FIFO batching data of first slave.[get]
06032   *
06033   * @param  ctx      read / write interface definitions
06034   * @param  val      change the values of  batch_ext_sens_0_en in
06035   *                  reg SLV0_CONFIG
06036   *
06037   */
06038 int32_t lsm6dso_sh_batch_slave_0_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06039 {
06040   lsm6dso_slv0_config_t reg;
06041   int32_t ret;
06042 
06043   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06044   if (ret == 0) {
06045     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG, (uint8_t*)&reg, 1);
06046   }
06047   if (ret == 0) {
06048     *val = reg.batch_ext_sens_0_en;
06049     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06050   }
06051   return ret;
06052 }
06053 
06054 /**
06055   * @brief  Enable FIFO batching data of second slave.[set]
06056   *
06057   * @param  ctx      read / write interface definitions
06058   * @param  val      change the values of  batch_ext_sens_1_en in
06059   *                  reg SLV1_CONFIG
06060   *
06061   */
06062 int32_t lsm6dso_sh_batch_slave_1_set(lsm6dso_ctx_t *ctx, uint8_t val)
06063 {
06064   lsm6dso_slv1_config_t reg;
06065   int32_t ret;
06066 
06067   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06068   if (ret == 0) {
06069     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
06070   }
06071   if (ret == 0) {
06072     reg.batch_ext_sens_1_en = val;
06073     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
06074   }
06075   if (ret == 0) {
06076     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06077   }
06078 
06079   return ret;
06080 }
06081 
06082 /**
06083   * @brief   Enable FIFO batching data of second slave.[get]
06084   *
06085   * @param  ctx      read / write interface definitions
06086   * @param  val      change the values of  batch_ext_sens_1_en in
06087   *                  reg SLV1_CONFIG
06088   *
06089   */
06090 int32_t lsm6dso_sh_batch_slave_1_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06091 {
06092   lsm6dso_slv1_config_t reg;
06093   int32_t ret;
06094 
06095   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06096   if (ret == 0) {
06097     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
06098     *val = reg.batch_ext_sens_1_en;
06099   }
06100   if (ret == 0) {
06101     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06102   }
06103   return ret;
06104 }
06105 
06106 /**
06107   * @brief  Enable FIFO batching data of third slave.[set]
06108   *
06109   * @param  ctx      read / write interface definitions
06110   * @param  val      change the values of  batch_ext_sens_2_en in
06111   *                  reg SLV2_CONFIG
06112   *
06113   */
06114 int32_t lsm6dso_sh_batch_slave_2_set(lsm6dso_ctx_t *ctx, uint8_t val)
06115 {
06116   lsm6dso_slv2_config_t reg;
06117   int32_t ret;
06118 
06119   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06120 
06121   if (ret == 0) {
06122     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t*)&reg, 1);
06123   }
06124   if (ret == 0) {
06125     reg.batch_ext_sens_2_en = val;
06126     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t*)&reg, 1);
06127   }
06128   if (ret == 0) {
06129     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06130   }
06131   return ret;
06132 }
06133 
06134 /**
06135   * @brief  Enable FIFO batching data of third slave.[get]
06136   *
06137   * @param  ctx      read / write interface definitions
06138   * @param  val      change the values of  batch_ext_sens_2_en in
06139   *                  reg SLV2_CONFIG
06140   *
06141   */
06142 int32_t lsm6dso_sh_batch_slave_2_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06143 {
06144   lsm6dso_slv2_config_t reg;
06145   int32_t ret;
06146 
06147   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06148   if (ret == 0) {
06149     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG, (uint8_t*)&reg, 1);
06150   }
06151   if (ret == 0) {
06152     *val = reg.batch_ext_sens_2_en;
06153     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06154   }
06155 
06156   return ret;
06157 }
06158 
06159 /**
06160   * @brief   Enable FIFO batching data of fourth slave.[set]
06161   *
06162   * @param  ctx      read / write interface definitions
06163   * @param  val      change the values of  batch_ext_sens_3_en
06164   *                  in reg SLV3_CONFIG
06165   *
06166   */
06167 int32_t lsm6dso_sh_batch_slave_3_set(lsm6dso_ctx_t *ctx, uint8_t val)
06168 {
06169   lsm6dso_slv3_config_t reg;
06170   int32_t ret;
06171 
06172   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06173   if (ret == 0) {
06174     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t*)&reg, 1);
06175   }
06176   if (ret == 0) {
06177     reg.batch_ext_sens_3_en = val;
06178     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t*)&reg, 1);
06179   }
06180   if (ret == 0) {
06181     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06182   }
06183 
06184   return ret;
06185 }
06186 
06187 /**
06188   * @brief  Enable FIFO batching data of fourth slave.[get]
06189   *
06190   * @param  ctx      read / write interface definitions
06191   * @param  val      change the values of  batch_ext_sens_3_en in
06192   *                  reg SLV3_CONFIG
06193   *
06194   */
06195 int32_t lsm6dso_sh_batch_slave_3_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06196 {
06197   lsm6dso_slv3_config_t reg;
06198   int32_t ret;
06199 
06200   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
06201   if (ret == 0) {
06202     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG, (uint8_t*)&reg, 1);
06203   }
06204   if (ret == 0) {
06205     *val = reg.batch_ext_sens_3_en;
06206     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06207   }
06208 
06209   return ret;
06210 }
06211 
06212 /**
06213   * @}
06214   *
06215   */
06216 
06217 /**
06218   * @defgroup  LSM6DSO_DEN_functionality
06219   * @brief     This section groups all the functions concerning
06220   *            DEN functionality.
06221   * @{
06222   *
06223 */
06224 
06225 /**
06226   * @brief  DEN functionality marking mode.[set]
06227   *
06228   * @param  ctx      read / write interface definitions
06229   * @param  val      change the values of den_mode in reg CTRL6_C
06230   *
06231   */
06232 int32_t lsm6dso_den_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_den_mode_t val)
06233 {
06234   lsm6dso_ctrl6_c_t reg;
06235   int32_t ret;
06236 
06237   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
06238   if (ret == 0) {
06239     reg.den_mode = (uint8_t)val;
06240     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
06241   }
06242 
06243   return ret;
06244 }
06245 
06246 /**
06247   * @brief  DEN functionality marking mode.[get]
06248   *
06249   * @param  ctx      read / write interface definitions
06250   * @param  val      Get the values of den_mode in reg CTRL6_C
06251   *
06252   */
06253 int32_t lsm6dso_den_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_den_mode_t *val)
06254 {
06255   lsm6dso_ctrl6_c_t reg;
06256   int32_t ret;
06257 
06258   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL6_C, (uint8_t*)&reg, 1);
06259 
06260   switch (reg.den_mode) {
06261     case LSM6DSO_DEN_DISABLE:
06262       *val = LSM6DSO_DEN_DISABLE;
06263       break;
06264     case LSM6DSO_LEVEL_FIFO:
06265       *val = LSM6DSO_LEVEL_FIFO;
06266       break;
06267     case LSM6DSO_LEVEL_LETCHED:
06268       *val = LSM6DSO_LEVEL_LETCHED;
06269       break;
06270     case LSM6DSO_LEVEL_TRIGGER:
06271       *val = LSM6DSO_LEVEL_TRIGGER;
06272       break;
06273     case LSM6DSO_EDGE_TRIGGER:
06274       *val = LSM6DSO_EDGE_TRIGGER;
06275       break;
06276     default:
06277       *val = LSM6DSO_DEN_DISABLE;
06278       break;
06279   }
06280   return ret;
06281 }
06282 
06283 /**
06284   * @brief  DEN active level configuration.[set]
06285   *
06286   * @param  ctx      read / write interface definitions
06287   * @param  val      change the values of den_lh in reg CTRL9_XL
06288   *
06289   */
06290 int32_t lsm6dso_den_polarity_set(lsm6dso_ctx_t *ctx, lsm6dso_den_lh_t val)
06291 {
06292   lsm6dso_ctrl9_xl_t reg;
06293   int32_t ret;
06294 
06295   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06296   if (ret == 0) {
06297     reg.den_lh = (uint8_t)val;
06298     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06299   }
06300 
06301   return ret;
06302 }
06303 
06304 /**
06305   * @brief  DEN active level configuration.[get]
06306   *
06307   * @param  ctx      read / write interface definitions
06308   * @param  val      Get the values of den_lh in reg CTRL9_XL
06309   *
06310   */
06311 int32_t lsm6dso_den_polarity_get(lsm6dso_ctx_t *ctx, lsm6dso_den_lh_t *val)
06312 {
06313   lsm6dso_ctrl9_xl_t reg;
06314   int32_t ret;
06315 
06316   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06317 
06318   switch (reg.den_lh) {
06319     case LSM6DSO_DEN_ACT_LOW:
06320       *val = LSM6DSO_DEN_ACT_LOW;
06321       break;
06322     case LSM6DSO_DEN_ACT_HIGH:
06323       *val = LSM6DSO_DEN_ACT_HIGH;
06324       break;
06325     default:
06326       *val = LSM6DSO_DEN_ACT_LOW;
06327       break;
06328   }
06329   return ret;
06330 }
06331 
06332 /**
06333   * @brief  DEN enable.[set]
06334   *
06335   * @param  ctx      read / write interface definitions
06336   * @param  val      change the values of den_xl_g in reg CTRL9_XL
06337   *
06338   */
06339 int32_t lsm6dso_den_enable_set(lsm6dso_ctx_t *ctx, lsm6dso_den_xl_g_t val)
06340 {
06341   lsm6dso_ctrl9_xl_t reg;
06342   int32_t ret;
06343 
06344   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06345   if (ret == 0) {
06346     reg.den_xl_g = (uint8_t)val;
06347     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06348   }
06349 
06350   return ret;
06351 }
06352 
06353 /**
06354   * @brief  DEN enable.[get]
06355   *
06356   * @param  ctx      read / write interface definitions
06357   * @param  val      Get the values of den_xl_g in reg CTRL9_XL
06358   *
06359   */
06360 int32_t lsm6dso_den_enable_get(lsm6dso_ctx_t *ctx, lsm6dso_den_xl_g_t *val)
06361 {
06362   lsm6dso_ctrl9_xl_t reg;
06363   int32_t ret;
06364 
06365   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06366 
06367   switch (reg.den_xl_g) {
06368     case LSM6DSO_STAMP_IN_GY_DATA:
06369       *val = LSM6DSO_STAMP_IN_GY_DATA;
06370       break;
06371     case LSM6DSO_STAMP_IN_XL_DATA:
06372       *val = LSM6DSO_STAMP_IN_XL_DATA;
06373       break;
06374     case LSM6DSO_STAMP_IN_GY_XL_DATA:
06375       *val = LSM6DSO_STAMP_IN_GY_XL_DATA;
06376       break;
06377     default:
06378       *val = LSM6DSO_STAMP_IN_GY_DATA;
06379       break;
06380   }
06381   return ret;
06382 }
06383 
06384 /**
06385   * @brief  DEN value stored in LSB of X-axis.[set]
06386   *
06387   * @param  ctx      read / write interface definitions
06388   * @param  val      change the values of den_z in reg CTRL9_XL
06389   *
06390   */
06391 int32_t lsm6dso_den_mark_axis_x_set(lsm6dso_ctx_t *ctx, uint8_t val)
06392 {
06393   lsm6dso_ctrl9_xl_t reg;
06394   int32_t ret;
06395 
06396   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06397   if (ret == 0) {
06398     reg.den_z = val;
06399     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06400   }
06401 
06402   return ret;
06403 }
06404 
06405 /**
06406   * @brief  DEN value stored in LSB of X-axis.[get]
06407   *
06408   * @param  ctx      read / write interface definitions
06409   * @param  val      change the values of den_z in reg CTRL9_XL
06410   *
06411   */
06412 int32_t lsm6dso_den_mark_axis_x_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06413 {
06414   lsm6dso_ctrl9_xl_t reg;
06415   int32_t ret;
06416 
06417   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06418   *val = reg.den_z;
06419 
06420   return ret;
06421 }
06422 
06423 /**
06424   * @brief  DEN value stored in LSB of Y-axis.[set]
06425   *
06426   * @param  ctx      read / write interface definitions
06427   * @param  val      change the values of den_y in reg CTRL9_XL
06428   *
06429   */
06430 int32_t lsm6dso_den_mark_axis_y_set(lsm6dso_ctx_t *ctx, uint8_t val)
06431 {
06432   lsm6dso_ctrl9_xl_t reg;
06433   int32_t ret;
06434 
06435   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06436   if (ret == 0) {
06437     reg.den_y = val;
06438     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06439   }
06440 
06441   return ret;
06442 }
06443 
06444 /**
06445   * @brief  DEN value stored in LSB of Y-axis.[get]
06446   *
06447   * @param  ctx      read / write interface definitions
06448   * @param  val      change the values of den_y in reg CTRL9_XL
06449   *
06450   */
06451 int32_t lsm6dso_den_mark_axis_y_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06452 {
06453   lsm6dso_ctrl9_xl_t reg;
06454   int32_t ret;
06455 
06456   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06457   *val = reg.den_y;
06458 
06459   return ret;
06460 }
06461 
06462 /**
06463   * @brief  DEN value stored in LSB of Z-axis.[set]
06464   *
06465   * @param  ctx      read / write interface definitions
06466   * @param  val      change the values of den_x in reg CTRL9_XL
06467   *
06468   */
06469 int32_t lsm6dso_den_mark_axis_z_set(lsm6dso_ctx_t *ctx, uint8_t val)
06470 {
06471   lsm6dso_ctrl9_xl_t reg;
06472   int32_t ret;
06473 
06474   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06475   if (ret == 0) {
06476     reg.den_x = val;
06477     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06478   }
06479 
06480   return ret;
06481 }
06482 
06483 /**
06484   * @brief  DEN value stored in LSB of Z-axis.[get]
06485   *
06486   * @param  ctx      read / write interface definitions
06487   * @param  val      change the values of den_x in reg CTRL9_XL
06488   *
06489   */
06490 int32_t lsm6dso_den_mark_axis_z_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06491 {
06492   lsm6dso_ctrl9_xl_t reg;
06493   int32_t ret;
06494 
06495   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL, (uint8_t*)&reg, 1);
06496   *val = reg.den_x;
06497 
06498   return ret;
06499 }
06500 
06501 /**
06502   * @}
06503   *
06504   */
06505 
06506 /**
06507   * @defgroup  LSM6DSO_Pedometer
06508   * @brief     This section groups all the functions that manage pedometer.
06509   * @{
06510   *
06511 */
06512 
06513 /**
06514   * @brief  Enable pedometer algorithm.[set]
06515   *
06516   * @param  ctx      read / write interface definitions
06517   * @param  val      turn on and configure pedometer
06518   *
06519   */
06520 int32_t lsm6dso_pedo_sens_set(lsm6dso_ctx_t *ctx, lsm6dso_pedo_md_t val)
06521 {
06522   lsm6dso_pedo_cmd_reg_t pedo_cmd_reg;
06523   int32_t ret;
06524 
06525   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
06526                                 (uint8_t*)&pedo_cmd_reg);
06527 
06528   if (ret == 0) {
06529     pedo_cmd_reg.fp_rejection_en = ((uint8_t)val & 0x10U)>>4;
06530     pedo_cmd_reg.ad_det_en = ((uint8_t)val & 0x20U)>>5;
06531     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_CMD_REG,
06532                                    (uint8_t*)&pedo_cmd_reg);
06533   }
06534   return ret;
06535 }
06536 
06537 /**
06538   * @brief  Enable pedometer algorithm.[get]
06539   *
06540   * @param  ctx      read / write interface definitions
06541   * @param  val      turn on and configure pedometer
06542   *
06543   */
06544 int32_t lsm6dso_pedo_sens_get(lsm6dso_ctx_t *ctx, lsm6dso_pedo_md_t *val)
06545 {
06546   lsm6dso_pedo_cmd_reg_t pedo_cmd_reg;
06547   int32_t ret;
06548 
06549   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG,
06550                                 (uint8_t*)&pedo_cmd_reg);
06551   switch ( (pedo_cmd_reg.ad_det_en <<5) | (pedo_cmd_reg.fp_rejection_en << 4) ) {
06552     case LSM6DSO_PEDO_BASE_MODE:
06553       *val = LSM6DSO_PEDO_BASE_MODE;
06554       break;
06555     case LSM6DSO_FALSE_STEP_REJ:
06556       *val = LSM6DSO_FALSE_STEP_REJ;
06557       break;
06558     case LSM6DSO_FALSE_STEP_REJ_ADV_MODE:
06559       *val = LSM6DSO_FALSE_STEP_REJ_ADV_MODE;
06560       break;
06561     default:
06562       *val = LSM6DSO_PEDO_BASE_MODE;
06563       break;
06564   }
06565   return ret;
06566 }
06567 
06568 /**
06569   * @brief  Interrupt status bit for step detection.[get]
06570   *
06571   * @param  ctx      read / write interface definitions
06572   * @param  val      change the values of is_step_det in reg EMB_FUNC_STATUS
06573   *
06574   */
06575 int32_t lsm6dso_pedo_step_detect_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06576 {
06577   lsm6dso_emb_func_status_t reg;
06578   int32_t ret;
06579 
06580   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
06581   if (ret == 0) {
06582     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t*)&reg, 1);
06583   }
06584   if (ret == 0) {
06585     *val = reg.is_step_det;
06586     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06587   }
06588 
06589   return ret;
06590 }
06591 
06592 /**
06593   * @brief  Pedometer debounce configuration register (r/w).[set]
06594   *
06595   * @param  ctx      read / write interface definitions
06596   * @param  buff     buffer that contains data to write
06597   *
06598   */
06599 int32_t lsm6dso_pedo_debounce_steps_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
06600 {
06601   int32_t ret;
06602   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_DEB_STEPS_CONF, buff);
06603   return ret;
06604 }
06605 
06606 /**
06607   * @brief  Pedometer debounce configuration register (r/w).[get]
06608   *
06609   * @param  ctx      read / write interface definitions
06610   * @param  buff     buffer that stores data read
06611   *
06612   */
06613 int32_t lsm6dso_pedo_debounce_steps_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
06614 {
06615   int32_t ret;
06616   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_DEB_STEPS_CONF, buff);
06617   return ret;
06618 }
06619 
06620 /**
06621   * @brief  Time period register for step detection on delta time (r/w).[set]
06622   *
06623   * @param  ctx      read / write interface definitions
06624   * @param  buff     buffer that contains data to write
06625   *
06626   */
06627 int32_t lsm6dso_pedo_steps_period_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
06628 {
06629   int32_t ret;
06630   uint8_t index;
06631 
06632   index = 0x00U;
06633   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_L, &buff[index]);
06634   if (ret == 0) {
06635     index++;
06636     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_H,
06637                                    &buff[index]);
06638   }
06639   return ret;
06640 }
06641 
06642 /**
06643   * @brief   Time period register for step detection on delta time (r/w).[get]
06644   *
06645   * @param  ctx      read / write interface definitions
06646   * @param  buff     buffer that stores data read
06647   *
06648   */
06649 int32_t lsm6dso_pedo_steps_period_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
06650 {
06651   int32_t ret;
06652   uint8_t index;
06653 
06654   index = 0x00U;
06655   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_L, &buff[index]);
06656   if (ret == 0) {
06657     index++;
06658     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_SC_DELTAT_H,
06659                                   &buff[index]);
06660   }
06661   return ret;
06662 }
06663 
06664 /**
06665   * @brief  Set when user wants to generate interrupt on count overflow
06666   *         event/every step.[set]
06667   *
06668   * @param  ctx      read / write interface definitions
06669   * @param  val      change the values of carry_count_en in reg PEDO_CMD_REG
06670   *
06671   */
06672 int32_t lsm6dso_pedo_int_mode_set(lsm6dso_ctx_t *ctx,
06673                                   lsm6dso_carry_count_en_t val)
06674 {
06675   lsm6dso_pedo_cmd_reg_t reg;
06676   int32_t ret;
06677 
06678   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG, (uint8_t*)&reg);
06679   if (ret == 0) {
06680     reg.carry_count_en = (uint8_t)val;
06681     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_PEDO_CMD_REG,
06682                                    (uint8_t*)&reg);
06683   }
06684   return ret;
06685 }
06686 
06687 /**
06688   * @brief  Set when user wants to generate interrupt on count overflow
06689   *         event/every step.[get]
06690   *
06691   * @param  ctx      read / write interface definitions
06692   * @param  val      Get the values of carry_count_en in reg PEDO_CMD_REG
06693   *
06694   */
06695 int32_t lsm6dso_pedo_int_mode_get(lsm6dso_ctx_t *ctx,
06696                                   lsm6dso_carry_count_en_t *val)
06697 {
06698   lsm6dso_pedo_cmd_reg_t reg;
06699   int32_t ret;
06700 
06701   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_PEDO_CMD_REG, (uint8_t*)&reg);
06702   switch (reg.carry_count_en) {
06703     case LSM6DSO_EVERY_STEP:
06704       *val = LSM6DSO_EVERY_STEP;
06705       break;
06706     case LSM6DSO_COUNT_OVERFLOW:
06707       *val = LSM6DSO_COUNT_OVERFLOW;
06708       break;
06709     default:
06710       *val = LSM6DSO_EVERY_STEP;
06711       break;
06712   }
06713   return ret;
06714 }
06715 
06716 /**
06717   * @}
06718   *
06719   */
06720 
06721 /**
06722   * @defgroup  LSM6DSO_significant_motion
06723   * @brief   This section groups all the functions that manage the
06724   *          significant motion detection.
06725   * @{
06726   *
06727 */
06728 
06729 /**
06730   * @brief   Interrupt status bit for significant motion detection.[get]
06731   *
06732   * @param  ctx      read / write interface definitions
06733   * @param  val      change the values of is_sigmot in reg EMB_FUNC_STATUS
06734   *
06735   */
06736 int32_t lsm6dso_motion_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06737 {
06738   lsm6dso_emb_func_status_t reg;
06739   int32_t ret;
06740 
06741   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
06742   if (ret == 0) {
06743     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t*)&reg, 1);
06744   }
06745   if (ret == 0) {
06746     *val = reg.is_sigmot;
06747     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06748   }
06749 
06750   return ret;
06751 }
06752 
06753 /**
06754   * @}
06755   *
06756   */
06757 
06758 /**
06759   * @defgroup  LSM6DSO_tilt_detection
06760   * @brief     This section groups all the functions that manage the tilt
06761   *            event detection.
06762   * @{
06763   *
06764 */
06765 
06766 /**
06767   * @brief  Interrupt status bit for tilt detection.[get]
06768   *
06769   * @param  ctx      read / write interface definitions
06770   * @param  val      change the values of is_tilt in reg EMB_FUNC_STATUS
06771   *
06772   */
06773 int32_t lsm6dso_tilt_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
06774 {
06775   lsm6dso_emb_func_status_t reg;
06776   int32_t ret;
06777 
06778   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
06779   if (ret == 0) {
06780     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t*)&reg, 1);
06781   }
06782   if (ret == 0) {
06783     *val = reg.is_tilt;
06784     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
06785   }
06786 
06787   return ret;
06788 }
06789 
06790 /**
06791   * @}
06792   *
06793   */
06794 
06795 /**
06796   * @defgroup  LSM6DSO_ magnetometer_sensor
06797   * @brief     This section groups all the functions that manage additional
06798   *            magnetometer sensor.
06799   * @{
06800   *
06801 */
06802 
06803 /**
06804   * @brief  External magnetometer sensitivity value register.[set]
06805   *
06806   * @param  ctx      read / write interface definitions
06807   * @param  buff     buffer that contains data to write
06808   *
06809   */
06810 int32_t lsm6dso_mag_sensitivity_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
06811 {
06812   int32_t ret;
06813   uint8_t index;
06814 
06815   index = 0x00U;
06816   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SENSITIVITY_L,
06817                                  &buff[index]);
06818   if (ret == 0) {
06819     index++;
06820     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SENSITIVITY_H,
06821                                    &buff[index]);
06822   }
06823 
06824   return ret;
06825 }
06826 
06827 /**
06828   * @brief  External magnetometer sensitivity value register.[get]
06829   *
06830   * @param  ctx      read / write interface definitions
06831   * @param  buff     buffer that stores data read
06832   *
06833   */
06834 int32_t lsm6dso_mag_sensitivity_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
06835 {
06836   int32_t ret;
06837   uint8_t index;
06838 
06839   index = 0x00U;
06840   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SENSITIVITY_L,
06841                                 &buff[index]);
06842   if (ret == 0) {
06843     index++;
06844     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SENSITIVITY_H,
06845                                   &buff[index]);
06846   }
06847 
06848   return ret;
06849 }
06850 
06851 /**
06852   * @brief  Offset for hard-iron compensation register (r/w).[set]
06853   *
06854   * @param  ctx      read / write interface definitions
06855   * @param  buff     buffer that contains data to write
06856   *
06857   */
06858 int32_t lsm6dso_mag_offset_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
06859 {
06860   int32_t ret;
06861   uint8_t index;
06862 
06863   index = 0x00U;
06864   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFX_L, &buff[index]);
06865   if (ret == 0) {
06866     index++;
06867     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFX_H, &buff[index]);
06868   }
06869   if (ret == 0) {
06870     index++;
06871     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFY_L, &buff[index]);
06872   }
06873   if (ret == 0) {
06874     index++;
06875     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFY_H, &buff[index]);
06876   }
06877   if (ret == 0) {
06878     index++;
06879 
06880     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFZ_L, &buff[index]);
06881   }
06882   if (ret == 0) {
06883     index++;
06884     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_OFFZ_H, &buff[index]);
06885   }
06886 
06887   return ret;
06888 }
06889 
06890 /**
06891   * @brief  Offset for hard-iron compensation register (r/w).[get]
06892   *
06893   * @param  ctx      read / write interface definitions
06894   * @param  buff     buffer that stores data read
06895   *
06896   */
06897 int32_t lsm6dso_mag_offset_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
06898 {
06899   int32_t ret;
06900   uint8_t index;
06901 
06902   index = 0x00U;
06903   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFX_L, &buff[index]);
06904   if (ret == 0) {
06905     index++;
06906     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFX_H, &buff[index]);
06907   }
06908   if (ret == 0) {
06909     index++;
06910 
06911     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFY_L, &buff[index]);
06912   }
06913   if (ret == 0) {
06914     index++;
06915     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFY_H, &buff[index]);
06916   }
06917   if (ret == 0) {
06918     index++;
06919 
06920     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFZ_L, &buff[index]);
06921   }
06922   if (ret == 0) {
06923     index++;
06924     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_OFFZ_H, &buff[index]);
06925   }
06926   return ret;
06927 }
06928 
06929 /**
06930   * @brief  Soft-iron (3x3 symmetric) matrix correction
06931   *         register (r/w). The value is expressed as
06932   *         half-precision floating-point format:
06933   *         SEEEEEFFFFFFFFFF
06934   *         S: 1 sign bit;
06935   *         E: 5 exponent bits;
06936   *         F: 10 fraction bits).[set]
06937   *
06938   * @param  ctx      read / write interface definitions
06939   * @param  buff     buffer that contains data to write
06940   *
06941   */
06942 int32_t lsm6dso_mag_soft_iron_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
06943 {
06944   int32_t ret;
06945   uint8_t index;
06946 
06947   index = 0x00U;
06948   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XX_L, &buff[index]);
06949   if (ret == 0) {
06950     index++;
06951     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XX_H, &buff[index]);
06952   }
06953   if (ret == 0) {
06954     index++;
06955 
06956     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XY_L, &buff[index]);
06957   }
06958   if (ret == 0) {
06959     index++;
06960     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XY_H, &buff[index]);
06961   }
06962   if (ret == 0) {
06963     index++;
06964 
06965     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XZ_L, &buff[index]);
06966   }
06967   if (ret == 0) {
06968     index++;
06969     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_XZ_H, &buff[index]);
06970   }
06971   if (ret == 0) {
06972     index++;
06973 
06974     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YY_L, &buff[index]);
06975   }
06976   if (ret == 0) {
06977     index++;
06978     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YY_H, &buff[index]);
06979   }
06980   if (ret == 0) {
06981     index++;
06982 
06983     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YZ_L, &buff[index]);
06984   }
06985   if (ret == 0) {
06986     index++;
06987     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_YZ_H, &buff[index]);
06988   }
06989   if (ret == 0) {
06990     index++;
06991 
06992     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_ZZ_L, &buff[index]);
06993   }
06994   if (ret == 0) {
06995     index++;
06996     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_SI_ZZ_H, &buff[index]);
06997   }
06998 
06999   return ret;
07000 }
07001 
07002 /**
07003   * @brief  Soft-iron (3x3 symmetric) matrix
07004   *         correction register (r/w).
07005   *         The value is expressed as half-precision
07006   *         floating-point format:
07007   *         SEEEEEFFFFFFFFFF
07008   *         S: 1 sign bit;
07009   *         E: 5 exponent bits;
07010   *         F: 10 fraction bits.[get]
07011   *
07012   * @param  ctx      read / write interface definitions
07013   * @param  buff     buffer that stores data read
07014   *
07015   */
07016 int32_t lsm6dso_mag_soft_iron_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
07017 {
07018   int32_t ret;
07019   uint8_t index;
07020 
07021   index = 0x00U;
07022   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XX_L, &buff[index]);
07023   if (ret == 0) {
07024     index++;
07025     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XX_H, &buff[index]);
07026   }
07027   if (ret == 0) {
07028     index++;
07029 
07030     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XY_L, &buff[index]);
07031   }
07032   if (ret == 0) {
07033     index++;
07034     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XY_H, &buff[index]);
07035   }
07036   if (ret == 0) {
07037     index++;
07038 
07039     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XZ_L, &buff[index]);
07040   }
07041   if (ret == 0) {
07042     index++;
07043     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_XZ_H, &buff[index]);
07044   }
07045   if (ret == 0) {
07046     index++;
07047 
07048     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YY_L, &buff[index]);
07049   }
07050   if (ret == 0) {
07051     index++;
07052     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YY_H, &buff[index]);
07053   }
07054   if (ret == 0) {
07055     index++;
07056 
07057     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YZ_L, &buff[index]);
07058   }
07059   if (ret == 0) {
07060     index++;
07061     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_YZ_H, &buff[index]);
07062   }
07063   if (ret == 0) {
07064     index++;
07065 
07066     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_ZZ_L, &buff[index]);
07067   }
07068   if (ret == 0) {
07069     index++;
07070     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_SI_ZZ_H, &buff[index]);
07071   }
07072 
07073   return ret;
07074 }
07075 
07076 /**
07077   * @brief  Magnetometer Z-axis coordinates
07078   *         rotation (to be aligned to
07079   *         accelerometer/gyroscope axes
07080   *         orientation).[set]
07081   *
07082   * @param  ctx      read / write interface definitions
07083   * @param  val      change the values of mag_z_axis in reg MAG_CFG_A
07084   *
07085   */
07086 int32_t lsm6dso_mag_z_orient_set(lsm6dso_ctx_t *ctx, lsm6dso_mag_z_axis_t val)
07087 {
07088   lsm6dso_mag_cfg_a_t reg;
07089   int32_t ret;
07090 
07091   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A, (uint8_t*)&reg);
07092   if (ret == 0) {
07093     reg.mag_z_axis = (uint8_t) val;
07094     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_A, (uint8_t*)&reg);
07095   }
07096 
07097   return ret;
07098 }
07099 
07100 /**
07101   * @brief  Magnetometer Z-axis coordinates
07102   *         rotation (to be aligned to
07103   *         accelerometer/gyroscope axes
07104   *         orientation).[get]
07105   *
07106   * @param  ctx      read / write interface definitions
07107   * @param  val      Get the values of mag_z_axis in reg MAG_CFG_A
07108   *
07109   */
07110 int32_t lsm6dso_mag_z_orient_get(lsm6dso_ctx_t *ctx,
07111                                  lsm6dso_mag_z_axis_t *val)
07112 {
07113   lsm6dso_mag_cfg_a_t reg;
07114   int32_t ret;
07115   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A, (uint8_t*)&reg);
07116   switch (reg.mag_z_axis) {
07117     case LSM6DSO_Z_EQ_Y:
07118       *val = LSM6DSO_Z_EQ_Y;
07119       break;
07120     case LSM6DSO_Z_EQ_MIN_Y:
07121       *val = LSM6DSO_Z_EQ_MIN_Y;
07122       break;
07123     case LSM6DSO_Z_EQ_X:
07124       *val = LSM6DSO_Z_EQ_X;
07125       break;
07126     case LSM6DSO_Z_EQ_MIN_X:
07127       *val = LSM6DSO_Z_EQ_MIN_X;
07128       break;
07129     case LSM6DSO_Z_EQ_MIN_Z:
07130       *val = LSM6DSO_Z_EQ_MIN_Z;
07131       break;
07132     case LSM6DSO_Z_EQ_Z:
07133       *val = LSM6DSO_Z_EQ_Z;
07134       break;
07135     default:
07136       *val = LSM6DSO_Z_EQ_Y;
07137       break;
07138   }
07139   return ret;
07140 }
07141 
07142 /**
07143   * @brief   Magnetometer Y-axis coordinates
07144   *          rotation (to be aligned to
07145   *          accelerometer/gyroscope axes
07146   *          orientation).[set]
07147   *
07148   * @param  ctx      read / write interface definitions
07149   * @param  val      change the values of mag_y_axis in reg MAG_CFG_A
07150   *
07151   */
07152 int32_t lsm6dso_mag_y_orient_set(lsm6dso_ctx_t *ctx,
07153                                  lsm6dso_mag_y_axis_t val)
07154 {
07155   lsm6dso_mag_cfg_a_t reg;
07156   int32_t ret;
07157 
07158   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A, (uint8_t*)&reg);
07159   if (ret == 0) {
07160     reg.mag_y_axis = (uint8_t)val;
07161     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_A,(uint8_t*) &reg);
07162   }
07163   return ret;
07164 }
07165 
07166 /**
07167   * @brief  Magnetometer Y-axis coordinates
07168   *         rotation (to be aligned to
07169   *         accelerometer/gyroscope axes
07170   *         orientation).[get]
07171   *
07172   * @param  ctx      read / write interface definitions
07173   * @param  val      Get the values of mag_y_axis in reg MAG_CFG_A
07174   *
07175   */
07176 int32_t lsm6dso_mag_y_orient_get(lsm6dso_ctx_t *ctx,
07177                                  lsm6dso_mag_y_axis_t *val)
07178 {
07179   lsm6dso_mag_cfg_a_t reg;
07180   int32_t ret;
07181 
07182   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_A, (uint8_t*)&reg);
07183   switch (reg.mag_y_axis) {
07184     case LSM6DSO_Y_EQ_Y:
07185       *val = LSM6DSO_Y_EQ_Y;
07186       break;
07187     case LSM6DSO_Y_EQ_MIN_Y:
07188       *val = LSM6DSO_Y_EQ_MIN_Y;
07189       break;
07190     case LSM6DSO_Y_EQ_X:
07191       *val = LSM6DSO_Y_EQ_X;
07192       break;
07193     case LSM6DSO_Y_EQ_MIN_X:
07194       *val = LSM6DSO_Y_EQ_MIN_X;
07195       break;
07196     case LSM6DSO_Y_EQ_MIN_Z:
07197       *val = LSM6DSO_Y_EQ_MIN_Z;
07198       break;
07199     case LSM6DSO_Y_EQ_Z:
07200       *val = LSM6DSO_Y_EQ_Z;
07201       break;
07202     default:
07203       *val = LSM6DSO_Y_EQ_Y;
07204       break;
07205   }
07206   return ret;
07207 }
07208 
07209 /**
07210   * @brief  Magnetometer X-axis coordinates
07211   *         rotation (to be aligned to
07212   *         accelerometer/gyroscope axes
07213   *         orientation).[set]
07214   *
07215   * @param  ctx      read / write interface definitions
07216   * @param  val      change the values of mag_x_axis in reg MAG_CFG_B
07217   *
07218   */
07219 int32_t lsm6dso_mag_x_orient_set(lsm6dso_ctx_t *ctx,
07220                                  lsm6dso_mag_x_axis_t val)
07221 {
07222   lsm6dso_mag_cfg_b_t reg;
07223   int32_t ret;
07224 
07225   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_B, (uint8_t*)&reg);
07226   if (ret == 0) {
07227     reg.mag_x_axis = (uint8_t)val;
07228     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_MAG_CFG_B, (uint8_t*)&reg);
07229   }
07230   return ret;
07231 }
07232 
07233 /**
07234   * @brief   Magnetometer X-axis coordinates
07235   *          rotation (to be aligned to
07236   *          accelerometer/gyroscope axes
07237   *          orientation).[get]
07238   *
07239   * @param  ctx      read / write interface definitions
07240   * @param  val      Get the values of mag_x_axis in reg MAG_CFG_B
07241   *
07242   */
07243 int32_t lsm6dso_mag_x_orient_get(lsm6dso_ctx_t *ctx,
07244                                  lsm6dso_mag_x_axis_t *val)
07245 {
07246   lsm6dso_mag_cfg_b_t reg;
07247   int32_t ret;
07248 
07249   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_MAG_CFG_B, (uint8_t*)&reg);
07250   switch (reg.mag_x_axis) {
07251     case LSM6DSO_X_EQ_Y:
07252       *val = LSM6DSO_X_EQ_Y;
07253       break;
07254     case LSM6DSO_X_EQ_MIN_Y:
07255       *val = LSM6DSO_X_EQ_MIN_Y;
07256       break;
07257     case LSM6DSO_X_EQ_X:
07258       *val = LSM6DSO_X_EQ_X;
07259       break;
07260     case LSM6DSO_X_EQ_MIN_X:
07261       *val = LSM6DSO_X_EQ_MIN_X;
07262       break;
07263     case LSM6DSO_X_EQ_MIN_Z:
07264       *val = LSM6DSO_X_EQ_MIN_Z;
07265       break;
07266     case LSM6DSO_X_EQ_Z:
07267       *val = LSM6DSO_X_EQ_Z;
07268       break;
07269     default:
07270       *val = LSM6DSO_X_EQ_Y;
07271       break;
07272   }
07273   return ret;
07274 }
07275 
07276 /**
07277   * @}
07278   *
07279   */
07280 
07281 /**
07282   * @defgroup  LSM6DSO_finite_state_machine
07283   * @brief     This section groups all the functions that manage the
07284   *            state_machine.
07285   * @{
07286   *
07287 */
07288 
07289 /**
07290   * @brief   Interrupt status bit for FSM long counter
07291   *          timeout interrupt event.[get]
07292   *
07293   * @param  ctx      read / write interface definitions
07294   * @param  val      change the values of is_fsm_lc in reg EMB_FUNC_STATUS
07295   *
07296   */
07297 int32_t lsm6dso_long_cnt_flag_data_ready_get(lsm6dso_ctx_t *ctx, uint8_t *val)
07298 {
07299   lsm6dso_emb_func_status_t reg;
07300   int32_t ret;
07301 
07302   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07303   if (ret == 0) {
07304     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_STATUS, (uint8_t*)&reg, 1);
07305   }
07306   if (ret == 0) {
07307     *val = reg.is_fsm_lc;
07308     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07309   }
07310   return ret;
07311 }
07312 
07313 /**
07314   * @brief  Final State Machine enable.[set]
07315   *
07316   * @param  ctx      read / write interface definitions
07317   * @param  val      union of registers from FSM_ENABLE_A to FSM_ENABLE_B
07318   *
07319   */
07320 int32_t lsm6dso_fsm_enable_set(lsm6dso_ctx_t *ctx,
07321                                lsm6dso_emb_fsm_enable_t *val)
07322 {
07323   int32_t ret;
07324 
07325   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07326   if (ret == 0) {
07327     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_ENABLE_A,
07328                             (uint8_t*)&val->fsm_enable_a, 1);
07329   }
07330   if (ret == 0) {
07331     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_ENABLE_B,
07332                             (uint8_t*)&val->fsm_enable_b, 1);
07333   }
07334   if (ret == 0) {
07335     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07336   }
07337 
07338   return ret;
07339 }
07340 
07341 /**
07342   * @brief  Final State Machine enable.[get]
07343   *
07344   * @param  ctx      read / write interface definitions
07345   * @param  val      union of registers from FSM_ENABLE_A to FSM_ENABLE_B
07346   *
07347   */
07348 int32_t lsm6dso_fsm_enable_get(lsm6dso_ctx_t *ctx,
07349                                lsm6dso_emb_fsm_enable_t *val)
07350 {
07351   int32_t ret;
07352 
07353   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07354   if (ret == 0) {
07355     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_ENABLE_A, (uint8_t*) val, 2);
07356   }
07357   if (ret == 0) {
07358     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07359   }
07360   return ret;
07361 }
07362 
07363 /**
07364   * @brief  FSM long counter status register. Long counter value is an
07365   *         unsigned integer value (16-bit format).[set]
07366   *
07367   * @param  ctx      read / write interface definitions
07368   * @param  buff     buffer that contains data to write
07369   *
07370   */
07371 int32_t lsm6dso_long_cnt_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
07372 {
07373   int32_t ret;
07374 
07375   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07376   if (ret == 0) {
07377     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_L, buff, 2);
07378   }
07379   if (ret == 0) {
07380     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07381   }
07382 
07383   return ret;
07384 }
07385 
07386 /**
07387   * @brief  FSM long counter status register. Long counter value is an
07388   *         unsigned integer value (16-bit format).[get]
07389   *
07390   * @param  ctx      read / write interface definitions
07391   * @param  buff     buffer that stores data read
07392   *
07393   */
07394 int32_t lsm6dso_long_cnt_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
07395 {
07396   int32_t ret;
07397 
07398   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07399   if (ret == 0) {
07400     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_L, buff, 2);
07401   }
07402   if (ret == 0) {
07403     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07404   }
07405 
07406   return ret;
07407 }
07408 
07409 /**
07410   * @brief  Clear FSM long counter value.[set]
07411   *
07412   * @param  ctx      read / write interface definitions
07413   * @param  val      change the values of fsm_lc_clr in
07414   *                  reg FSM_LONG_COUNTER_CLEAR
07415   *
07416   */
07417 int32_t lsm6dso_long_clr_set(lsm6dso_ctx_t *ctx, lsm6dso_fsm_lc_clr_t val)
07418 {
07419   lsm6dso_fsm_long_counter_clear_t reg;
07420   int32_t ret;
07421 
07422   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07423   if (ret == 0) {
07424     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
07425     (uint8_t*)&reg, 1);
07426   }
07427   if (ret == 0) {
07428     reg. fsm_lc_clr = (uint8_t)val;
07429     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
07430     (uint8_t*)&reg, 1);
07431   }
07432   if (ret == 0) {
07433     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07434   }
07435   return ret;
07436 }
07437 
07438 /**
07439   * @brief  Clear FSM long counter value.[get]
07440   *
07441   * @param  ctx      read / write interface definitions
07442   * @param  val      Get the values of fsm_lc_clr in
07443   *                  reg FSM_LONG_COUNTER_CLEAR
07444   *
07445   */
07446 int32_t lsm6dso_long_clr_get(lsm6dso_ctx_t *ctx, lsm6dso_fsm_lc_clr_t *val)
07447 {
07448   lsm6dso_fsm_long_counter_clear_t reg;
07449   int32_t ret;
07450 
07451   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07452   if (ret == 0) {
07453     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_LONG_COUNTER_CLEAR,
07454     (uint8_t*)&reg, 1);
07455   }
07456   if (ret == 0) {
07457     switch (reg.fsm_lc_clr) {
07458       case LSM6DSO_LC_NORMAL:
07459         *val = LSM6DSO_LC_NORMAL;
07460         break;
07461       case LSM6DSO_LC_CLEAR:
07462         *val = LSM6DSO_LC_CLEAR;
07463         break;
07464       case LSM6DSO_LC_CLEAR_DONE:
07465         *val = LSM6DSO_LC_CLEAR_DONE;
07466         break;
07467       default:
07468         *val = LSM6DSO_LC_NORMAL;
07469         break;
07470     }
07471   }
07472 
07473   if (ret == 0) {
07474     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07475   }
07476 
07477   return ret;
07478 }
07479 
07480 /**
07481   * @brief  FSM output registers[get]
07482   *
07483   * @param  ctx      read / write interface definitions
07484   * @param  val      struct of registers from FSM_OUTS1 to FSM_OUTS16
07485   *
07486   */
07487 int32_t lsm6dso_fsm_out_get(lsm6dso_ctx_t *ctx, lsm6dso_fsm_out_t *val)
07488 {
07489   int32_t ret;
07490 
07491   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07492   if (ret == 0) {
07493     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_OUTS1, (uint8_t*)val, 16);
07494   }
07495   if (ret == 0) {
07496     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07497   }
07498 
07499   return ret;
07500 }
07501 
07502 /**
07503   * @brief  Finite State Machine ODR configuration.[set]
07504   *
07505   * @param  ctx      read / write interface definitions
07506   * @param  val      change the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
07507   *
07508   */
07509 int32_t lsm6dso_fsm_data_rate_set(lsm6dso_ctx_t *ctx, lsm6dso_fsm_odr_t val)
07510 {
07511   lsm6dso_emb_func_odr_cfg_b_t reg;
07512   int32_t ret;
07513 
07514   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07515   if (ret == 0) {
07516     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
07517                            (uint8_t*)&reg, 1);
07518   }
07519   if (ret == 0) {
07520     reg.not_used_01 = 3; /* set default values */
07521     reg.not_used_02 = 2; /* set default values */
07522     reg.fsm_odr = (uint8_t)val;
07523     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
07524                             (uint8_t*)&reg, 1);
07525   }
07526   if (ret == 0) {
07527     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07528   }
07529   return ret;
07530 }
07531 
07532 /**
07533   * @brief  Finite State Machine ODR configuration.[get]
07534   *
07535   * @param  ctx      read / write interface definitions
07536   * @param  val      Get the values of fsm_odr in reg EMB_FUNC_ODR_CFG_B
07537   *
07538   */
07539 int32_t lsm6dso_fsm_data_rate_get(lsm6dso_ctx_t *ctx, lsm6dso_fsm_odr_t *val)
07540 {
07541   lsm6dso_emb_func_odr_cfg_b_t reg;
07542   int32_t ret;
07543 
07544   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07545   if (ret == 0) {
07546     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
07547                            (uint8_t*)&reg, 1);
07548   }
07549   if (ret == 0) {
07550     switch (reg.fsm_odr) {
07551       case LSM6DSO_ODR_FSM_12Hz5:
07552         *val = LSM6DSO_ODR_FSM_12Hz5;
07553         break;
07554       case LSM6DSO_ODR_FSM_26Hz:
07555         *val = LSM6DSO_ODR_FSM_26Hz;
07556         break;
07557       case LSM6DSO_ODR_FSM_52Hz:
07558         *val = LSM6DSO_ODR_FSM_52Hz;
07559         break;
07560       case LSM6DSO_ODR_FSM_104Hz:
07561         *val = LSM6DSO_ODR_FSM_104Hz;
07562         break;
07563       default:
07564         *val = LSM6DSO_ODR_FSM_12Hz5;
07565         break;
07566     }
07567     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07568   }
07569 
07570   return ret;
07571 }
07572 
07573 /**
07574   * @brief  FSM initialization request.[set]
07575   *
07576   * @param  ctx      read / write interface definitions
07577   * @param  val      change the values of fsm_init in reg FSM_INIT
07578   *
07579   */
07580 int32_t lsm6dso_fsm_init_set(lsm6dso_ctx_t *ctx, uint8_t val)
07581 {
07582   lsm6dso_emb_func_init_b_t reg;
07583   int32_t ret;
07584 
07585   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07586   if (ret == 0) {
07587     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
07588   }
07589   if (ret == 0) {
07590     reg.fsm_init = val;
07591     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
07592   }
07593   if (ret == 0) {
07594     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07595   }
07596 
07597   return ret;
07598 }
07599 
07600 /**
07601   * @brief  FSM initialization request.[get]
07602   *
07603   * @param  ctx      read / write interface definitions
07604   * @param  val      change the values of fsm_init in reg FSM_INIT
07605   *
07606   */
07607 int32_t lsm6dso_fsm_init_get(lsm6dso_ctx_t *ctx, uint8_t *val)
07608 {
07609   lsm6dso_emb_func_init_b_t reg;
07610   int32_t ret;
07611 
07612   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
07613   if (ret == 0) {
07614     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B, (uint8_t*)&reg, 1);
07615   }
07616   if (ret == 0) {
07617     *val = reg.fsm_init;
07618     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07619   }
07620   return ret;
07621 }
07622 
07623 /**
07624   * @brief  FSM long counter timeout register (r/w). The long counter
07625   *         timeout value is an unsigned integer value (16-bit format).
07626   *         When the long counter value reached this value,
07627   *         the FSM generates an interrupt.[set]
07628   *
07629   * @param  ctx      read / write interface definitions
07630   * @param  val      the value of long counter
07631   *
07632   */
07633 int32_t lsm6dso_long_cnt_int_value_set(lsm6dso_ctx_t *ctx, uint16_t val)
07634 {
07635   int32_t ret;
07636   uint8_t add_l;
07637   uint8_t add_h;
07638 
07639   add_h = (uint8_t)( ( val & 0xFF00U ) >> 8 );
07640   add_l = (uint8_t)( val & 0x00FFU );
07641 
07642   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &add_l);
07643   if (ret == 0) {
07644     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H, &add_h);
07645   }
07646 
07647   return ret;
07648 }
07649 
07650 /**
07651   * @brief  FSM long counter timeout register (r/w). The long counter
07652   *         timeout value is an unsigned integer value (16-bit format).
07653   *         When the long counter value reached this value,
07654   *         the FSM generates an interrupt.[get]
07655   *
07656   * @param  ctx     read / write interface definitions
07657   * @param  val     buffer that stores the value of long counter
07658   *
07659   */
07660 int32_t lsm6dso_long_cnt_int_value_get(lsm6dso_ctx_t *ctx, uint16_t *val)
07661 {
07662   int32_t ret;
07663   uint8_t add_l;
07664   uint8_t add_h;
07665 
07666   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &add_l);
07667   if (ret == 0) {
07668     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H, &add_h);
07669     *val = add_h;
07670     *val = *val << 8;
07671     *val += add_l;
07672   }
07673 
07674   return ret;
07675 }
07676 
07677 /**
07678   * @brief  FSM number of programs register.[set]
07679   *
07680   * @param  ctx      read / write interface definitions
07681   * @param  val      value to write
07682   *
07683   */
07684 int32_t lsm6dso_fsm_number_of_programs_set(lsm6dso_ctx_t *ctx, uint8_t val)
07685 {
07686   int32_t ret;
07687 
07688   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_PROGRAMS, &val);
07689 
07690   return ret;
07691 }
07692 
07693 /**
07694   * @brief  FSM number of programs register.[get]
07695   *
07696   * @param  ctx      read / write interface definitions
07697   * @param  val      buffer that stores data read.
07698   *
07699   */
07700 int32_t lsm6dso_fsm_number_of_programs_get(lsm6dso_ctx_t *ctx, uint8_t *val)
07701 {
07702   int32_t ret;
07703 
07704   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_PROGRAMS, val);
07705 
07706   return ret;
07707 }
07708 
07709 /**
07710   * @brief  FSM start address register (r/w).
07711   *         First available address is 0x033C.[set]
07712   *
07713   * @param  ctx      read / write interface definitions
07714   * @param  val      the value of start address
07715   *
07716   */
07717 int32_t lsm6dso_fsm_start_address_set(lsm6dso_ctx_t *ctx, uint16_t val)
07718 {
07719   int32_t ret;
07720   uint8_t add_l;
07721   uint8_t add_h;
07722 
07723   add_h = (uint8_t)( ( val & 0xFF00U ) >> 8 );
07724   add_l = (uint8_t)( val & 0x00FFU );
07725 
07726   ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_L, &add_l);
07727   if (ret == 0) {
07728     ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_H, &add_h);
07729   }
07730   return ret;
07731 }
07732 
07733 /**
07734   * @brief  FSM start address register (r/w).
07735   *         First available address is 0x033C.[get]
07736   *
07737   * @param  ctx      read / write interface definitions
07738   * @param  val      buffer the value of start address.
07739   *
07740   */
07741 int32_t lsm6dso_fsm_start_address_get(lsm6dso_ctx_t *ctx, uint16_t *val)
07742 {
07743   int32_t ret;
07744   uint8_t add_l;
07745   uint8_t add_h;
07746 
07747   ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_L, &add_l);
07748   if (ret == 0) {
07749     ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_H, &add_h);
07750     *val = add_h;
07751     *val = *val << 8;
07752     *val += add_l;
07753   }
07754   return ret;
07755 }
07756 
07757 /**
07758   * @}
07759   *
07760   */
07761 
07762 /**
07763   * @defgroup  LSM6DSO_Sensor_hub
07764   * @brief     This section groups all the functions that manage the
07765   *            sensor hub.
07766   * @{
07767   *
07768 */
07769 
07770 /**
07771   * @brief  Sensor hub output registers.[get]
07772   *
07773   * @param  ctx      read / write interface definitions
07774   * @param  val      values read from registers SENSOR_HUB_1 to SENSOR_HUB_18
07775   * @param  len      number of consecutive register to read (max 18)
07776   *
07777   */
07778 int32_t lsm6dso_sh_read_data_raw_get(lsm6dso_ctx_t *ctx, uint8_t *val,
07779                                      uint8_t len)
07780 {
07781   int32_t ret;
07782 
07783   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07784   if (ret == 0) {
07785     ret = lsm6dso_read_reg(ctx, LSM6DSO_SENSOR_HUB_1, (uint8_t*) val, len);
07786   }
07787   if (ret == 0) {
07788     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07789   }
07790 
07791   return ret;
07792 }
07793 
07794 /**
07795   * @brief  Number of external sensors to be read by the sensor hub.[set]
07796   *
07797   * @param  ctx      read / write interface definitions
07798   * @param  val      change the values of aux_sens_on in reg MASTER_CONFIG
07799   *
07800   */
07801 int32_t lsm6dso_sh_slave_connected_set(lsm6dso_ctx_t *ctx,
07802                                        lsm6dso_aux_sens_on_t val)
07803 {
07804   lsm6dso_master_config_t reg;
07805   int32_t ret;
07806 
07807   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07808   if (ret == 0) {
07809     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07810   }
07811   if (ret == 0) {
07812     reg.aux_sens_on = (uint8_t)val;
07813     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07814   }
07815   if (ret == 0) {
07816     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07817   }
07818   return ret;
07819 }
07820 
07821 /**
07822   * @brief  Number of external sensors to be read by the sensor hub.[get]
07823   *
07824   * @param  ctx      read / write interface definitions
07825   * @param  val      Get the values of aux_sens_on in reg MASTER_CONFIG
07826   *
07827   */
07828 int32_t lsm6dso_sh_slave_connected_get(lsm6dso_ctx_t *ctx,
07829                                        lsm6dso_aux_sens_on_t *val)
07830 {
07831   lsm6dso_master_config_t reg;
07832   int32_t ret;
07833 
07834   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07835   if (ret == 0) {
07836     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07837   }
07838   if (ret == 0) {
07839     switch (reg.aux_sens_on) {
07840       case LSM6DSO_SLV_0:
07841         *val = LSM6DSO_SLV_0;
07842         break;
07843       case LSM6DSO_SLV_0_1:
07844         *val = LSM6DSO_SLV_0_1;
07845         break;
07846       case LSM6DSO_SLV_0_1_2:
07847         *val = LSM6DSO_SLV_0_1_2;
07848         break;
07849       case LSM6DSO_SLV_0_1_2_3:
07850         *val = LSM6DSO_SLV_0_1_2_3;
07851         break;
07852       default:
07853         *val = LSM6DSO_SLV_0;
07854         break;
07855     }
07856     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07857   }
07858 
07859   return ret;
07860 }
07861 
07862 /**
07863   * @brief  Sensor hub I2C master enable.[set]
07864   *
07865   * @param  ctx      read / write interface definitions
07866   * @param  val      change the values of master_on in reg MASTER_CONFIG
07867   *
07868   */
07869 int32_t lsm6dso_sh_master_set(lsm6dso_ctx_t *ctx, uint8_t val)
07870 {
07871   lsm6dso_master_config_t reg;
07872   int32_t ret;
07873 
07874   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07875   if (ret == 0) {
07876     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07877   }
07878   if (ret == 0) {
07879     reg.master_on = val;
07880     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07881   }
07882   if (ret == 0) {
07883     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07884   }
07885   return ret;
07886 }
07887 
07888 /**
07889   * @brief  Sensor hub I2C master enable.[get]
07890   *
07891   * @param  ctx      read / write interface definitions
07892   * @param  val      change the values of master_on in reg MASTER_CONFIG
07893   *
07894   */
07895 int32_t lsm6dso_sh_master_get(lsm6dso_ctx_t *ctx, uint8_t *val)
07896 {
07897   lsm6dso_master_config_t reg;
07898   int32_t ret;
07899 
07900   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07901   if (ret == 0) {
07902     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07903   }
07904   if (ret == 0) {
07905     *val = reg.master_on;
07906     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07907   }
07908 
07909   return ret;
07910 }
07911 
07912 /**
07913   * @brief  Master I2C pull-up enable.[set]
07914   *
07915   * @param  ctx      read / write interface definitions
07916   * @param  val      change the values of shub_pu_en in reg MASTER_CONFIG
07917   *
07918   */
07919 int32_t lsm6dso_sh_pin_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_shub_pu_en_t val)
07920 {
07921   lsm6dso_master_config_t reg;
07922   int32_t ret;
07923 
07924   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07925   if (ret == 0) {
07926     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07927   }
07928   if (ret == 0) {
07929     reg.shub_pu_en = (uint8_t)val;
07930     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07931   }
07932   if (ret == 0) {
07933     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07934   }
07935 
07936   return ret;
07937 }
07938 
07939 /**
07940   * @brief  Master I2C pull-up enable.[get]
07941   *
07942   * @param  ctx      read / write interface definitions
07943   * @param  val      Get the values of shub_pu_en in reg MASTER_CONFIG
07944   *
07945   */
07946 int32_t lsm6dso_sh_pin_mode_get(lsm6dso_ctx_t *ctx,
07947                                 lsm6dso_shub_pu_en_t *val)
07948 {
07949   lsm6dso_master_config_t reg;
07950   int32_t ret;
07951 
07952   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07953   if (ret == 0) {
07954     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07955   }
07956   if (ret == 0) {
07957     switch (reg.shub_pu_en) {
07958       case LSM6DSO_EXT_PULL_UP:
07959         *val = LSM6DSO_EXT_PULL_UP;
07960         break;
07961       case LSM6DSO_INTERNAL_PULL_UP:
07962         *val = LSM6DSO_INTERNAL_PULL_UP;
07963         break;
07964       default:
07965         *val = LSM6DSO_EXT_PULL_UP;
07966         break;
07967     }
07968     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07969   }
07970 
07971   return ret;
07972 }
07973 
07974 /**
07975   * @brief  I2C interface pass-through.[set]
07976   *
07977   * @param  ctx      read / write interface definitions
07978   * @param  val      change the values of pass_through_mode in
07979   *                  reg MASTER_CONFIG
07980   *
07981   */
07982 int32_t lsm6dso_sh_pass_through_set(lsm6dso_ctx_t *ctx, uint8_t val)
07983 {
07984   lsm6dso_master_config_t reg;
07985   int32_t ret;
07986 
07987   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
07988   if (ret == 0) {
07989     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07990   }
07991   if (ret == 0) {
07992     reg.pass_through_mode = val;
07993     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
07994   }
07995   if (ret == 0) {
07996     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
07997   }
07998 
07999   return ret;
08000 }
08001 
08002 /**
08003   * @brief  I2C interface pass-through.[get]
08004   *
08005   * @param  ctx      read / write interface definitions
08006   * @param  val      change the values of pass_through_mode in
08007   *                  reg MASTER_CONFIG
08008   *
08009   */
08010 int32_t lsm6dso_sh_pass_through_get(lsm6dso_ctx_t *ctx, uint8_t *val)
08011 {
08012   lsm6dso_master_config_t reg;
08013   int32_t ret;
08014 
08015   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08016   if (ret == 0) {
08017     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08018   }
08019   if (ret == 0) {
08020     *val = reg.pass_through_mode;
08021     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08022   }
08023 
08024   return ret;
08025 }
08026 
08027 /**
08028   * @brief  Sensor hub trigger signal selection.[set]
08029   *
08030   * @param  ctx      read / write interface definitions
08031   * @param  val      change the values of start_config in reg MASTER_CONFIG
08032   *
08033   */
08034 int32_t lsm6dso_sh_syncro_mode_set(lsm6dso_ctx_t *ctx,
08035                                    lsm6dso_start_config_t val)
08036 {
08037   lsm6dso_master_config_t reg;
08038   int32_t ret;
08039 
08040   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08041   if (ret == 0) {
08042     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08043   }
08044   if (ret == 0) {
08045     reg.start_config = (uint8_t)val;
08046     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08047   }
08048   if (ret == 0) {
08049     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08050   }
08051 
08052   return ret;
08053 }
08054 
08055 /**
08056   * @brief  Sensor hub trigger signal selection.[get]
08057   *
08058   * @param  ctx      read / write interface definitions
08059   * @param  val      Get the values of start_config in reg MASTER_CONFIG
08060   *
08061   */
08062 int32_t lsm6dso_sh_syncro_mode_get(lsm6dso_ctx_t *ctx,
08063                                    lsm6dso_start_config_t *val)
08064 {
08065   lsm6dso_master_config_t reg;
08066   int32_t ret;
08067 
08068   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08069   if (ret == 0) {
08070     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08071   }
08072   if (ret == 0) {
08073     switch (reg.start_config) {
08074       case LSM6DSO_EXT_ON_INT2_PIN:
08075         *val = LSM6DSO_EXT_ON_INT2_PIN;
08076         break;
08077       case LSM6DSO_XL_GY_DRDY:
08078         *val = LSM6DSO_XL_GY_DRDY;
08079         break;
08080       default:
08081         *val = LSM6DSO_EXT_ON_INT2_PIN;
08082         break;
08083     }
08084     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08085   }
08086   return ret;
08087 }
08088 
08089 /**
08090   * @brief  Slave 0 write operation is performed only at the first
08091   *         sensor hub cycle.[set]
08092   *
08093   * @param  ctx      read / write interface definitions
08094   * @param  val      change the values of write_once in reg MASTER_CONFIG
08095   *
08096   */
08097 int32_t lsm6dso_sh_write_mode_set(lsm6dso_ctx_t *ctx,
08098                                   lsm6dso_write_once_t val)
08099 {
08100   lsm6dso_master_config_t reg;
08101   int32_t ret;
08102 
08103   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08104   if (ret == 0) {
08105     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08106   }
08107   if (ret == 0) {
08108     reg.write_once = (uint8_t)val;
08109     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08110   }
08111   if (ret == 0) {
08112     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08113   }
08114 
08115   return ret;
08116 }
08117 
08118 /**
08119   * @brief  Slave 0 write operation is performed only at the first sensor
08120   *         hub cycle.[get]
08121   *
08122   * @param  ctx      read / write interface definitions
08123   * @param  val      Get the values of write_once in reg MASTER_CONFIG
08124   *
08125   */
08126 int32_t lsm6dso_sh_write_mode_get(lsm6dso_ctx_t *ctx,
08127                                   lsm6dso_write_once_t *val)
08128 {
08129   lsm6dso_master_config_t reg;
08130   int32_t ret;
08131 
08132   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08133   if (ret == 0) {
08134     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08135   }
08136   if (ret == 0) {
08137     switch (reg.write_once) {
08138       case LSM6DSO_EACH_SH_CYCLE:
08139         *val = LSM6DSO_EACH_SH_CYCLE;
08140         break;
08141       case LSM6DSO_ONLY_FIRST_CYCLE:
08142         *val = LSM6DSO_ONLY_FIRST_CYCLE;
08143         break;
08144       default:
08145         *val = LSM6DSO_EACH_SH_CYCLE;
08146         break;
08147     }
08148     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08149   }
08150 
08151   return ret;
08152 }
08153 
08154 /**
08155   * @brief  Reset Master logic and output registers.[set]
08156   *
08157   * @param  ctx      read / write interface definitions
08158   *
08159   */
08160 int32_t lsm6dso_sh_reset_set(lsm6dso_ctx_t *ctx)
08161 {
08162   lsm6dso_master_config_t reg;
08163   int32_t ret;
08164 
08165   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08166   if (ret == 0) {
08167     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08168   }
08169   if (ret == 0) {
08170     reg.rst_master_regs = PROPERTY_ENABLE;
08171     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08172   }
08173   if (ret == 0) {
08174     reg.rst_master_regs = PROPERTY_DISABLE;
08175     ret = lsm6dso_write_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08176   }
08177   if (ret == 0) {
08178     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08179   }
08180 
08181   return ret;
08182 }
08183 
08184 /**
08185   * @brief  Reset Master logic and output registers.[get]
08186   *
08187   * @param  ctx      read / write interface definitions
08188   * @param  val      change the values of rst_master_regs in reg MASTER_CONFIG
08189   *
08190   */
08191 int32_t lsm6dso_sh_reset_get(lsm6dso_ctx_t *ctx, uint8_t *val)
08192 {
08193   lsm6dso_master_config_t reg;
08194   int32_t ret;
08195 
08196   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08197   if (ret == 0) {
08198     ret = lsm6dso_read_reg(ctx, LSM6DSO_MASTER_CONFIG, (uint8_t*)&reg, 1);
08199   }
08200   if (ret == 0) {
08201     *val = reg.rst_master_regs;
08202     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08203   }
08204   return ret;
08205 }
08206 
08207 /**
08208   * @brief  Rate at which the master communicates.[set]
08209   *
08210   * @param  ctx      read / write interface definitions
08211   * @param  val      change the values of shub_odr in reg slv1_CONFIG
08212   *
08213   */
08214 int32_t lsm6dso_sh_data_rate_set(lsm6dso_ctx_t *ctx, lsm6dso_shub_odr_t val)
08215 {
08216   lsm6dso_slv0_config_t reg;
08217   int32_t ret;
08218 
08219   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08220   if (ret == 0) {
08221     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
08222   }
08223   if (ret == 0) {
08224     reg.shub_odr = (uint8_t)val;
08225     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
08226   }
08227   if (ret == 0) {
08228     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08229   }
08230 
08231   return ret;
08232 }
08233 
08234 /**
08235   * @brief  Rate at which the master communicates.[get]
08236   *
08237   * @param  ctx      read / write interface definitions
08238   * @param  val      Get the values of shub_odr in reg slv1_CONFIG
08239   *
08240   */
08241 int32_t lsm6dso_sh_data_rate_get(lsm6dso_ctx_t *ctx,
08242                                  lsm6dso_shub_odr_t *val)
08243 {
08244   lsm6dso_slv0_config_t reg;
08245   int32_t ret;
08246 
08247   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08248   if (ret == 0) {
08249     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG, (uint8_t*)&reg, 1);
08250   }
08251   if (ret == 0) {
08252     switch (reg.shub_odr) {
08253       case LSM6DSO_SH_ODR_104Hz:
08254         *val = LSM6DSO_SH_ODR_104Hz;
08255         break;
08256       case LSM6DSO_SH_ODR_52Hz:
08257         *val = LSM6DSO_SH_ODR_52Hz;
08258         break;
08259       case LSM6DSO_SH_ODR_26Hz:
08260         *val = LSM6DSO_SH_ODR_26Hz;
08261         break;
08262       case LSM6DSO_SH_ODR_13Hz:
08263         *val = LSM6DSO_SH_ODR_13Hz;
08264         break;
08265       default:
08266         *val = LSM6DSO_SH_ODR_104Hz;
08267         break;
08268     }
08269     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08270   }
08271 
08272   return ret;
08273 }
08274 
08275 /**
08276   * @brief  Configure slave 0 for perform a write.[set]
08277   *
08278   * @param  ctx      read / write interface definitions
08279   * @param  val      a structure that contain
08280   *                      - uint8_t slv1_add;    8 bit i2c device address
08281   *                      - uint8_t slv1_subadd; 8 bit register device address
08282   *                      - uint8_t slv1_data;   8 bit data to write
08283   *
08284   */
08285 int32_t lsm6dso_sh_cfg_write(lsm6dso_ctx_t *ctx, lsm6dso_sh_cfg_write_t *val)
08286 {
08287   lsm6dso_slv0_add_t reg;
08288   int32_t ret;
08289 
08290   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08291   if (ret == 0) {
08292     reg.slave0 = val->slv0_add;
08293     reg.rw_0 = 0;
08294     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_ADD, (uint8_t*)&reg, 1);
08295   }
08296   if (ret == 0) {
08297     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_SUBADD,
08298     &(val->slv0_subadd), 1);
08299   }
08300   if (ret == 0) {
08301     ret = lsm6dso_write_reg(ctx, LSM6DSO_DATAWRITE_SLV0,
08302     &(val->slv0_data), 1);
08303   }
08304   if (ret == 0) {
08305     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08306   }
08307   return ret;
08308 }
08309 
08310 /**
08311   * @brief  Configure slave 0 for perform a read.[set]
08312   *
08313   * @param  ctx      read / write interface definitions
08314   * @param  val      Structure that contain
08315   *                      - uint8_t slv1_add;    8 bit i2c device address
08316   *                      - uint8_t slv1_subadd; 8 bit register device address
08317   *                      - uint8_t slv1_len;    num of bit to read
08318   *
08319   */
08320 int32_t lsm6dso_sh_slv0_cfg_read(lsm6dso_ctx_t *ctx,
08321                                  lsm6dso_sh_cfg_read_t *val)
08322 {
08323   lsm6dso_slv0_add_t slv0_add;
08324   lsm6dso_slv0_config_t slv0_config;
08325   int32_t ret;
08326 
08327   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08328   if (ret == 0) {
08329     slv0_add.slave0 = val->slv_add;
08330     slv0_add.rw_0 = 1;
08331     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_ADD, (uint8_t*)&slv0_add, 1);
08332   }
08333   if (ret == 0) {
08334     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_SUBADD,
08335     &(val->slv_subadd), 1);
08336   }
08337   if (ret == 0) {
08338     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV0_CONFIG,
08339                            (uint8_t*)&slv0_config, 1);
08340   }
08341   if (ret == 0) {
08342     slv0_config.slave0_numop = val->slv_len;
08343     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV0_CONFIG,
08344                             (uint8_t*)&slv0_config, 1);
08345   }
08346   if (ret == 0) {
08347     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08348   }
08349 
08350   return ret;
08351 }
08352 
08353 /**
08354   * @brief  Configure slave 0 for perform a write/read.[set]
08355   *
08356   * @param  ctx      read / write interface definitions
08357   * @param  val      Structure that contain
08358   *                      - uint8_t slv1_add;    8 bit i2c device address
08359   *                      - uint8_t slv1_subadd; 8 bit register device address
08360   *                      - uint8_t slv1_len;    num of bit to read
08361   *
08362   */
08363 int32_t lsm6dso_sh_slv1_cfg_read(lsm6dso_ctx_t *ctx,
08364                                  lsm6dso_sh_cfg_read_t *val)
08365 {
08366   lsm6dso_slv1_add_t slv1_add;
08367   lsm6dso_slv1_config_t slv1_config;
08368   int32_t ret;
08369 
08370   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08371   if (ret == 0) {
08372     slv1_add.slave1_add = val->slv_add;
08373     slv1_add.r_1 = 1;
08374     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_ADD, (uint8_t*)&slv1_add, 1);
08375   }
08376   if (ret == 0) {
08377     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_SUBADD,
08378     &(val->slv_subadd), 1);
08379   }
08380   if (ret == 0) {
08381     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV1_CONFIG,
08382                            (uint8_t*)&slv1_config, 1);
08383   }
08384   if (ret == 0) {
08385     slv1_config.slave1_numop = val->slv_len;
08386     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV1_CONFIG,
08387                             (uint8_t*)&slv1_config, 1);
08388   }
08389   if (ret == 0) {
08390     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08391   }
08392 
08393   return ret;
08394 }
08395 
08396 /**
08397   * @brief  Configure slave 0 for perform a write/read.[set]
08398   *
08399   * @param  ctx      read / write interface definitions
08400   * @param  val      Structure that contain
08401   *                      - uint8_t slv2_add;    8 bit i2c device address
08402   *                      - uint8_t slv2_subadd; 8 bit register device address
08403   *                      - uint8_t slv2_len;    num of bit to read
08404   *
08405   */
08406 int32_t lsm6dso_sh_slv2_cfg_read(lsm6dso_ctx_t *ctx,
08407                                  lsm6dso_sh_cfg_read_t *val)
08408 {
08409   lsm6dso_slv2_add_t slv2_add;
08410   lsm6dso_slv2_config_t slv2_config;
08411   int32_t ret;
08412 
08413   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08414   if (ret == 0) {
08415     slv2_add.slave2_add = val->slv_add;
08416     slv2_add.r_2 = 1;
08417     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_ADD, (uint8_t*)&slv2_add, 1);
08418   }
08419   if (ret == 0) {
08420     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_SUBADD,
08421     &(val->slv_subadd), 1);
08422   }
08423   if (ret == 0) {
08424     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV2_CONFIG,
08425                            (uint8_t*)&slv2_config, 1);
08426   }
08427   if (ret == 0) {
08428     slv2_config.slave2_numop = val->slv_len;
08429     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV2_CONFIG,
08430                             (uint8_t*)&slv2_config, 1);
08431   }
08432   if (ret == 0) {
08433     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08434   }
08435   return ret;
08436 }
08437 
08438 /**
08439   * @brief Configure slave 0 for perform a write/read.[set]
08440   *
08441   * @param  ctx      read / write interface definitions
08442   * @param  val      Structure that contain
08443   *                      - uint8_t slv3_add;    8 bit i2c device address
08444   *                      - uint8_t slv3_subadd; 8 bit register device address
08445   *                      - uint8_t slv3_len;    num of bit to read
08446   *
08447   */
08448 int32_t lsm6dso_sh_slv3_cfg_read(lsm6dso_ctx_t *ctx,
08449                                  lsm6dso_sh_cfg_read_t *val)
08450 {
08451   lsm6dso_slv3_add_t slv3_add;
08452   lsm6dso_slv3_config_t slv3_config;
08453   int32_t ret;
08454 
08455   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08456   if (ret == 0) {
08457     slv3_add.slave3_add = val->slv_add;
08458     slv3_add.r_3 = 1;
08459     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_ADD, (uint8_t*)&slv3_add, 1);
08460   }
08461   if (ret == 0) {
08462     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_SUBADD,
08463     &(val->slv_subadd), 1);
08464   }
08465   if (ret == 0) {
08466     ret = lsm6dso_read_reg(ctx, LSM6DSO_SLV3_CONFIG,
08467                            (uint8_t*)&slv3_config, 1);
08468   }
08469   if (ret == 0) {
08470     slv3_config.slave3_numop = val->slv_len;
08471     ret = lsm6dso_write_reg(ctx, LSM6DSO_SLV3_CONFIG,
08472                             (uint8_t*)&slv3_config, 1);
08473   }
08474   if (ret == 0) {
08475     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08476   }
08477   return ret;
08478 }
08479 
08480 /**
08481   * @brief  Sensor hub source register.[get]
08482   *
08483   * @param  ctx      read / write interface definitions
08484   * @param  val      union of registers from STATUS_MASTER to
08485   *
08486   */
08487 int32_t lsm6dso_sh_status_get(lsm6dso_ctx_t *ctx,
08488                               lsm6dso_status_master_t *val)
08489 {
08490   int32_t ret;
08491 
08492   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
08493   if (ret == 0) {
08494     ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_MASTER, (uint8_t*) val, 1);
08495   }
08496   if (ret == 0) {
08497     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08498   }
08499 
08500   return ret;
08501 }
08502 
08503 /**
08504   * @}
08505   *
08506   */
08507 
08508 /**
08509   * @defgroup  Basic configuration
08510   * @brief     This section groups all the functions concerning
08511   *            device basic configuration.
08512   * @{
08513   *
08514   */
08515 
08516 /**
08517   * @brief  Device "Who am I".[get]
08518   *
08519   * @param  ctx          communication interface handler. Use NULL to ingnore
08520   *                      this interface.(ptr)
08521   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
08522   *                      to ingnore this interface.(ptr)
08523   * @param  val          ID values read from the two interfaces. ID values
08524   *                      will be the same.(ptr)
08525   *
08526   */
08527 int32_t lsm6dso_id_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
08528                         lsm6dso_id_t *val)
08529 {
08530   int32_t ret = 0;
08531 
08532   if (ctx != NULL){
08533       ret = lsm6dso_read_reg(ctx, LSM6DSO_WHO_AM_I,
08534                               (uint8_t*)&(val->ui), 1);
08535   }
08536   if (aux_ctx != NULL){
08537     if (ret == 0) {
08538       ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_WHO_AM_I,
08539                               (uint8_t*)&(val->aux), 1);
08540     }
08541   }
08542   return ret;
08543 }
08544 
08545 /**
08546   * @brief  Re-initialize the device.[set]
08547   *
08548   * @param  ctx          communication interface handler.(ptr)
08549   * @param  val          re-initialization mode. Refer to datasheet
08550   *                      and application note for more information
08551   *                      about differencies beetween boot and sw_reset
08552   *                      procedure.
08553   *
08554   */
08555 int32_t lsm6dso_init_set(lsm6dso_ctx_t *ctx, lsm6dso_init_t val)
08556 {
08557   lsm6dso_emb_func_init_a_t emb_func_init_a;
08558   lsm6dso_emb_func_init_b_t emb_func_init_b;
08559   lsm6dso_ctrl3_c_t ctrl3_c;
08560   int32_t ret;
08561 
08562   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
08563   if (ret == 0) {
08564     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B,
08565                             (uint8_t*)&emb_func_init_b, 1);
08566   }
08567   if (ret == 0) {
08568     emb_func_init_b.fifo_compr_init = (uint8_t)val
08569                                       & ( (uint8_t)LSM6DSO_FIFO_COMP >> 2 );
08570     emb_func_init_b.fsm_init = (uint8_t)val
08571                                & ( (uint8_t)LSM6DSO_FSM >> 3 );
08572     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_B,
08573                              (uint8_t*)&emb_func_init_b, 1);
08574   }
08575   if (ret == 0) {
08576     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INIT_A,
08577                             (uint8_t*)&emb_func_init_a, 1);
08578   }
08579   if (ret == 0) {
08580     emb_func_init_a.step_det_init = ( (uint8_t)val
08581                                        & (uint8_t)LSM6DSO_PEDO ) >> 5;
08582     emb_func_init_a.tilt_init = ( (uint8_t)val
08583                                   & (uint8_t)LSM6DSO_TILT ) >> 6;
08584     emb_func_init_a.sig_mot_init = ( (uint8_t)val
08585                                      & (uint8_t)LSM6DSO_SMOTION ) >> 7;
08586     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INIT_A,
08587                              (uint8_t*)&emb_func_init_a, 1);
08588   }
08589   if (ret == 0) {
08590     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08591   }
08592 
08593   if (ret == 0) {
08594     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08595   }
08596   if ( ( (val == LSM6DSO_BOOT) || (val == LSM6DSO_RESET) ) && (ret == 0) ) {
08597     ctrl3_c.boot = (uint8_t)val & (uint8_t)LSM6DSO_BOOT;
08598     ctrl3_c.sw_reset = ( (uint8_t)val & (uint8_t)LSM6DSO_RESET) >> 1;
08599     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08600   }
08601   if ( ( val == LSM6DSO_DRV_RDY )
08602        && ( (ctrl3_c.bdu == PROPERTY_DISABLE)
08603             || (ctrl3_c.if_inc == PROPERTY_DISABLE) ) && (ret == 0) ) {
08604     ctrl3_c.bdu = PROPERTY_ENABLE;
08605     ctrl3_c.if_inc = PROPERTY_ENABLE;
08606     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08607   }
08608 
08609   return ret;
08610 }
08611 
08612 /**
08613   * @brief  Configures the bus operating mode.[set]
08614   *
08615   * @param  ctx          communication interface handler. Use NULL to ingnore
08616   *                      this interface.(ptr)
08617   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
08618   *                      to ingnore this interface.(ptr)
08619   * @param  val          configures the bus operating mode for both the
08620   *                      main and the auxiliary interface.
08621   *
08622   */
08623 int32_t lsm6dso_bus_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
08624                               lsm6dso_bus_mode_t val)
08625 {
08626   lsm6dso_ctrl1_ois_t ctrl1_ois;
08627   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
08628   lsm6dso_ctrl9_xl_t ctrl9_xl;
08629   lsm6dso_ctrl3_c_t ctrl3_c;
08630   lsm6dso_ctrl4_c_t ctrl4_c;
08631   uint8_t bit_val;
08632   int32_t ret;
08633 
08634   ret = 0;
08635 
08636   if (aux_ctx != NULL) {
08637     ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
08638                             (uint8_t*)&ctrl1_ois, 1);
08639 
08640     bit_val = ( (uint8_t)val.aux_bus_md & 0x04U ) >> 2;
08641     if ( ( ret == 0 ) && ( ctrl1_ois.sim_ois != bit_val ) ) {
08642       ctrl1_ois.sim_ois = bit_val;
08643       ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
08644                                (uint8_t*)&ctrl1_ois, 1);
08645     }
08646   }
08647 
08648   if (ctx != NULL) {
08649     if (ret == 0) {
08650       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL,
08651                               (uint8_t*)&ctrl9_xl, 1);
08652     }
08653 
08654     bit_val = ((uint8_t)val.ui_bus_md & 0x04U) >> 2;
08655     if ( ( ret == 0 ) && ( ctrl9_xl.i3c_disable != bit_val ) ) {
08656       ctrl9_xl.i3c_disable = bit_val;
08657       ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL9_XL,
08658                                (uint8_t*)&ctrl9_xl, 1);
08659     }
08660 
08661     if (ret == 0) {
08662       ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08663                               (uint8_t*)&i3c_bus_avb, 1);
08664     }
08665 
08666     bit_val = ((uint8_t)val.ui_bus_md & 0x30U) >> 4;
08667     if ( ( ret == 0 ) && ( i3c_bus_avb.i3c_bus_avb_sel != bit_val ) ) {
08668       i3c_bus_avb.i3c_bus_avb_sel = bit_val;
08669       ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08670                                (uint8_t*)&i3c_bus_avb, 1);
08671     }
08672     if (ret == 0) {
08673       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C,
08674                               (uint8_t*)&ctrl4_c, 1);
08675     }
08676     bit_val = ( (uint8_t)val.ui_bus_md & 0x02U ) >> 1;
08677     if ( ( ret == 0 ) && ( ctrl4_c.i2c_disable != bit_val ) ) {
08678       ctrl4_c.i2c_disable = bit_val;
08679       ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C,
08680                                (uint8_t*)&ctrl4_c, 1);
08681     }
08682     if (ret == 0) {
08683       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C,
08684                               (uint8_t*)&ctrl3_c, 1);
08685     }
08686     bit_val = (uint8_t)val.ui_bus_md & 0x01U;
08687     if ( ( ret == 0 ) && ( ctrl3_c.sim != bit_val ) ) {
08688       ctrl3_c.sim = bit_val;
08689       ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C,
08690                                (uint8_t*)&ctrl3_c, 1);
08691     }
08692   }
08693 
08694   return ret;
08695 
08696 }
08697 
08698 /**
08699   * @brief  Get the bus operating mode.[get]
08700   *
08701   * @param  ctx          communication interface handler. Use NULL to ingnore
08702   *                      this interface.(ptr)
08703   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
08704   *                      to ingnore this interface.(ptr)
08705   * @param  val          retrieves the bus operating mode for both the main
08706   *                      and the auxiliary interface.(ptr)
08707   *
08708   */
08709 int32_t lsm6dso_bus_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
08710                               lsm6dso_bus_mode_t *val)
08711 {
08712   lsm6dso_ctrl1_ois_t ctrl1_ois;
08713   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
08714   lsm6dso_ctrl9_xl_t ctrl9_xl;
08715   lsm6dso_ctrl3_c_t ctrl3_c;
08716   lsm6dso_ctrl4_c_t ctrl4_c;
08717 
08718   int32_t ret = 0;
08719 
08720   if (aux_ctx != NULL) {
08721     ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS,
08722                             (uint8_t*)&ctrl1_ois, 1);
08723     switch ( ctrl1_ois.sim_ois ) {
08724       case LSM6DSO_SPI_4W_AUX:
08725         val->aux_bus_md = LSM6DSO_SPI_4W_AUX;
08726         break;
08727       case LSM6DSO_SPI_3W_AUX:
08728         val->aux_bus_md = LSM6DSO_SPI_3W_AUX;
08729         break;
08730       default:
08731         val->aux_bus_md = LSM6DSO_SPI_4W_AUX;
08732         break;
08733     }
08734   }
08735 
08736   if (ctx != NULL) {
08737     if (ret == 0) {
08738       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL9_XL,
08739                               (uint8_t*)&ctrl9_xl, 1);
08740     }
08741     if (ret == 0) {
08742       ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08743                               (uint8_t*)&i3c_bus_avb, 1);
08744     }
08745     if (ret == 0) {
08746       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C,
08747                               (uint8_t*)&ctrl4_c, 1);
08748     }
08749     if (ret == 0) {
08750       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C,
08751                               (uint8_t*)&ctrl3_c, 1);
08752 
08753       switch ( ( i3c_bus_avb.i3c_bus_avb_sel << 4 ) &
08754                ( ctrl9_xl.i3c_disable << 2 ) &
08755                ( ctrl4_c.i2c_disable << 1) & ctrl3_c.sim ) {
08756         case LSM6DSO_SEL_BY_HW:
08757           val->ui_bus_md = LSM6DSO_SEL_BY_HW;
08758           break;
08759         case LSM6DSO_SPI_4W:
08760           val->ui_bus_md = LSM6DSO_SPI_4W;
08761           break;
08762         case LSM6DSO_SPI_3W:
08763           val->ui_bus_md = LSM6DSO_SPI_3W;
08764           break;
08765         case LSM6DSO_I2C:
08766           val->ui_bus_md = LSM6DSO_I2C;
08767           break;
08768         case LSM6DSO_I3C_T_50us:
08769           val->ui_bus_md = LSM6DSO_I3C_T_50us;
08770           break;
08771         case LSM6DSO_I3C_T_2us:
08772           val->ui_bus_md = LSM6DSO_I3C_T_2us;
08773           break;
08774         case LSM6DSO_I3C_T_1ms:
08775           val->ui_bus_md = LSM6DSO_I3C_T_1ms;
08776           break;
08777         case LSM6DSO_I3C_T_25ms:
08778           val->ui_bus_md = LSM6DSO_I3C_T_25ms;
08779           break;
08780         default:
08781           val->ui_bus_md = LSM6DSO_SEL_BY_HW;
08782           break;
08783       }
08784     }
08785   }
08786   return ret;
08787 }
08788 
08789 /**
08790   * @brief  Get the status of the device.[get]
08791   *
08792   * @param  ctx          communication interface handler. Use NULL to ingnore
08793   *                      this interface.(ptr)
08794   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
08795   *                      to ingnore this interface.(ptr)
08796   * @param  val          the status of the device.(ptr)
08797   *
08798   */
08799 int32_t lsm6dso_status_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
08800                             lsm6dso_status_t *val)
08801 {
08802   lsm6dso_status_spiaux_t       status_spiaux;
08803   lsm6dso_status_reg_t          status_reg;
08804   lsm6dso_ctrl3_c_t             ctrl3_c;
08805   int32_t                       ret;
08806 
08807   ret = 0;
08808 
08809   if (aux_ctx != NULL){
08810     ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_STATUS_SPIAUX,
08811                             (uint8_t*)&status_spiaux, 1);
08812     val->ois_drdy_xl        = status_spiaux.xlda;
08813     val->ois_drdy_g         = status_spiaux.gda;
08814     val->ois_gyro_settling  = status_spiaux.gyro_settling;
08815   }
08816 
08817   if (ctx != NULL){
08818     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08819     val->sw_reset = ctrl3_c.sw_reset;
08820     val->boot = ctrl3_c.boot;
08821 
08822     if ( (ret == 0) && ( ctrl3_c.sw_reset == PROPERTY_DISABLE ) &&
08823          ( ctrl3_c.boot == PROPERTY_DISABLE ) ) {
08824       ret = lsm6dso_read_reg(ctx, LSM6DSO_STATUS_REG,
08825                               (uint8_t*)&status_reg, 1);
08826       val->drdy_xl   = status_reg.xlda;
08827       val->drdy_g    = status_reg.gda;
08828       val->drdy_temp = status_reg.tda;
08829     }
08830   }
08831   return ret;
08832 }
08833 
08834 /**
08835   * @brief  Electrical pin configuration.[set]
08836   *
08837   * @param  ctx          communication interface handler.(ptr)
08838   * @param  val          the electrical settings for the configurable
08839   *                      pins.
08840   *
08841   */
08842 int32_t lsm6dso_pin_conf_set(lsm6dso_ctx_t *ctx, lsm6dso_pin_conf_t val)
08843 {
08844   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
08845   lsm6dso_pin_ctrl_t pin_ctrl;
08846   lsm6dso_ctrl3_c_t ctrl3_c;
08847   int32_t ret;
08848 
08849   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&pin_ctrl, 1);
08850   if (ret == 0) {
08851     pin_ctrl.ois_pu_dis = ~val.aux_sdo_ocs_pull_up;
08852     pin_ctrl.sdo_pu_en  = val.sdo_sa0_pull_up;
08853     ret = lsm6dso_write_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&pin_ctrl, 1);
08854   }
08855   if (ret == 0) {
08856     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08857   }
08858   if (ret == 0) {
08859     ctrl3_c.pp_od = ~val.int1_int2_push_pull;
08860     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08861   }
08862   if (ret == 0) {
08863     ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08864                             (uint8_t*)&i3c_bus_avb, 1);
08865   }
08866   if (ret == 0) {
08867     i3c_bus_avb.pd_dis_int1 = ~val.int1_pull_down;
08868     ret = lsm6dso_write_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08869                              (uint8_t*)&i3c_bus_avb, 1);
08870   }
08871   return ret;
08872 }
08873 
08874 /**
08875   * @brief  Electrical pin configuration.[get]
08876   *
08877   * @param  ctx          communication interface handler.(ptr)
08878   * @param  val          the electrical settings for the configurable
08879   *                      pins.(ptr)
08880   *
08881   */
08882 int32_t lsm6dso_pin_conf_get(lsm6dso_ctx_t *ctx, lsm6dso_pin_conf_t *val)
08883 {
08884   lsm6dso_i3c_bus_avb_t i3c_bus_avb;
08885   lsm6dso_pin_ctrl_t pin_ctrl;
08886   lsm6dso_ctrl3_c_t ctrl3_c;
08887   int32_t ret;
08888 
08889   ret = lsm6dso_read_reg(ctx, LSM6DSO_PIN_CTRL, (uint8_t*)&pin_ctrl, 1);
08890   if (ret == 0) {
08891     val->aux_sdo_ocs_pull_up = ~pin_ctrl.ois_pu_dis;
08892     val->aux_sdo_ocs_pull_up =  pin_ctrl.sdo_pu_en;
08893     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08894   }
08895   if (ret == 0) {
08896     val->int1_int2_push_pull = ~ctrl3_c.pp_od;
08897     ret = lsm6dso_read_reg(ctx, LSM6DSO_I3C_BUS_AVB,
08898                             (uint8_t*)&i3c_bus_avb, 1);
08899   }
08900   if (ret == 0) {
08901     val->int1_pull_down = ~i3c_bus_avb.pd_dis_int1;
08902   }
08903   return ret;
08904 }
08905 
08906 /**
08907   * @brief  Interrupt pins hardware signal configuration.[set]
08908   *
08909   * @param  ctx          communication interface handler.(ptr)
08910   * @param  val          the pins hardware signal settings.
08911   *
08912   */
08913 int32_t lsm6dso_interrupt_mode_set(lsm6dso_ctx_t *ctx,
08914                                     lsm6dso_int_mode_t val)
08915 {
08916   lsm6dso_tap_cfg0_t tap_cfg0;
08917   lsm6dso_page_rw_t page_rw;
08918   lsm6dso_ctrl3_c_t ctrl3_c;
08919   int32_t ret;
08920 
08921   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08922   if (ret == 0) {
08923     ctrl3_c.h_lactive = val.active_low;
08924     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08925   }
08926   if (ret == 0) {
08927   ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
08928   }
08929   if (ret == 0) {
08930     tap_cfg0.lir = val.base_latched;
08931     tap_cfg0.int_clr_on_read = val.base_latched | val.emb_latched;
08932     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
08933   }
08934   if (ret == 0) {
08935     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
08936   }
08937   if (ret == 0) {
08938     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
08939   }
08940   if (ret == 0) {
08941     page_rw.emb_func_lir = val.emb_latched;
08942     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
08943   }
08944   if (ret == 0) {
08945     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08946   }
08947   return ret;
08948 }
08949 
08950 /**
08951   * @brief  Interrupt pins hardware signal configuration.[get]
08952   *
08953   * @param  ctx          communication interface handler.(ptr)
08954   * @param  val          the pins hardware signal settings.(ptr)
08955   *
08956   */
08957 int32_t lsm6dso_interrupt_mode_get(lsm6dso_ctx_t *ctx,
08958                                     lsm6dso_int_mode_t *val)
08959 {
08960   lsm6dso_tap_cfg0_t tap_cfg0;
08961   lsm6dso_page_rw_t page_rw;
08962   lsm6dso_ctrl3_c_t ctrl3_c;
08963   int32_t ret;
08964 
08965   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL3_C, (uint8_t*)&ctrl3_c, 1);
08966   if (ret == 0) {
08967     ctrl3_c.h_lactive = val->active_low;
08968     ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG0, (uint8_t*) &tap_cfg0, 1);
08969   }
08970   if (ret == 0) {
08971     tap_cfg0.lir = val->base_latched;
08972     tap_cfg0.int_clr_on_read = val->base_latched | val->emb_latched;
08973     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
08974   }
08975   if (ret == 0) {
08976     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
08977   }
08978   if (ret == 0) {
08979     page_rw.emb_func_lir = val->emb_latched;
08980     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
08981   }
08982   if (ret == 0) {
08983     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
08984   }
08985   return ret;
08986 }
08987 
08988 /**
08989   * @brief  Route interrupt signals on int1 pin.[set]
08990   *
08991   * @param  ctx          communication interface handler.(ptr)
08992   * @param  val          the signals to route on int1 pin.
08993   *
08994   */
08995 int32_t lsm6dso_pin_int1_route_set(lsm6dso_ctx_t *ctx,
08996                                     lsm6dso_pin_int1_route_t val)
08997 {
08998   lsm6dso_pin_int2_route_t  pin_int2_route;
08999   lsm6dso_emb_func_int1_t   emb_func_int1;
09000   lsm6dso_fsm_int1_a_t      fsm_int1_a;
09001   lsm6dso_fsm_int1_b_t      fsm_int1_b;
09002   lsm6dso_int1_ctrl_t       int1_ctrl;
09003   lsm6dso_int2_ctrl_t       int2_ctrl;
09004   lsm6dso_tap_cfg2_t        tap_cfg2;
09005   lsm6dso_md2_cfg_t         md2_cfg;
09006   lsm6dso_md1_cfg_t         md1_cfg;
09007   lsm6dso_ctrl4_c_t         ctrl4_c;
09008   int32_t                    ret;
09009 
09010   int1_ctrl.int1_drdy_xl   = val.drdy_xl;
09011   int1_ctrl.int1_drdy_g    = val.drdy_g;
09012   int1_ctrl.int1_boot      = val.boot;
09013   int1_ctrl.int1_fifo_th   = val.fifo_th;
09014   int1_ctrl.int1_fifo_ovr  = val.fifo_ovr;
09015   int1_ctrl.int1_fifo_full = val.fifo_full;
09016   int1_ctrl.int1_cnt_bdr   = val.fifo_bdr;
09017   int1_ctrl.den_drdy_flag  = val.den_flag;
09018 
09019   md1_cfg.int1_shub         = val.sh_endop;
09020   md1_cfg.int1_6d           = val.six_d;
09021   md1_cfg.int1_double_tap   = val.double_tap;
09022   md1_cfg.int1_ff           = val.free_fall;
09023   md1_cfg.int1_wu           = val.wake_up;
09024   md1_cfg.int1_single_tap   = val.single_tap;
09025   md1_cfg.int1_sleep_change = val.sleep_change;
09026 
09027   emb_func_int1.not_used_01 = 0;
09028   emb_func_int1.int1_step_detector = val.step_detector;
09029   emb_func_int1.int1_tilt          = val.tilt;
09030   emb_func_int1.int1_sig_mot       = val.sig_mot;
09031   emb_func_int1.not_used_02 = 0;
09032   emb_func_int1.int1_fsm_lc        = val.fsm_lc;
09033 
09034   fsm_int1_a.int1_fsm1 = val.fsm1;
09035   fsm_int1_a.int1_fsm2 = val.fsm2;
09036   fsm_int1_a.int1_fsm3 = val.fsm3;
09037   fsm_int1_a.int1_fsm4 = val.fsm4;
09038   fsm_int1_a.int1_fsm5 = val.fsm5;
09039   fsm_int1_a.int1_fsm6 = val.fsm6;
09040   fsm_int1_a.int1_fsm7 = val.fsm7;
09041   fsm_int1_a.int1_fsm8 = val.fsm8;
09042 
09043   fsm_int1_b.int1_fsm9  = val.fsm9 ;
09044   fsm_int1_b.int1_fsm10 = val.fsm10;
09045   fsm_int1_b.int1_fsm11 = val.fsm11;
09046   fsm_int1_b.int1_fsm12 = val.fsm12;
09047   fsm_int1_b.int1_fsm13 = val.fsm13;
09048   fsm_int1_b.int1_fsm14 = val.fsm14;
09049   fsm_int1_b.int1_fsm15 = val.fsm15;
09050   fsm_int1_b.int1_fsm16 = val.fsm16;
09051 
09052   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09053   if (ret == 0) {
09054     if( ( val.drdy_temp | val.timestamp ) != PROPERTY_DISABLE) {
09055       ctrl4_c.int2_on_int1 = PROPERTY_ENABLE;
09056     }
09057     else{
09058       ctrl4_c.int2_on_int1 = PROPERTY_DISABLE;
09059     }
09060     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09061   }
09062 
09063   if (ret == 0) {
09064     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
09065   }
09066   if (ret == 0) {
09067     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INT1,
09068                             (uint8_t*)&emb_func_int1, 1);
09069   }
09070   if (ret == 0) {
09071     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT1_A,
09072                             (uint8_t*)&fsm_int1_a, 1);
09073   }
09074   if (ret == 0) {
09075     ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT1_B,
09076                             (uint8_t*)&fsm_int1_b, 1);
09077   }
09078   if (ret == 0) {
09079     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
09080   }
09081 
09082   if (ret == 0) {
09083     if ( ( emb_func_int1.int1_fsm_lc
09084          | emb_func_int1.int1_sig_mot
09085          | emb_func_int1.int1_step_detector
09086          | emb_func_int1.int1_tilt
09087          | fsm_int1_a.int1_fsm1
09088          | fsm_int1_a.int1_fsm2
09089          | fsm_int1_a.int1_fsm3
09090          | fsm_int1_a.int1_fsm4
09091          | fsm_int1_a.int1_fsm5
09092          | fsm_int1_a.int1_fsm6
09093          | fsm_int1_a.int1_fsm7
09094          | fsm_int1_a.int1_fsm8
09095          | fsm_int1_b.int1_fsm9
09096          | fsm_int1_b.int1_fsm10
09097          | fsm_int1_b.int1_fsm11
09098          | fsm_int1_b.int1_fsm12
09099          | fsm_int1_b.int1_fsm13
09100          | fsm_int1_b.int1_fsm14
09101          | fsm_int1_b.int1_fsm15
09102          | fsm_int1_b.int1_fsm16) != PROPERTY_DISABLE){
09103       md1_cfg.int1_emb_func = PROPERTY_ENABLE;
09104     }
09105     else{
09106       md1_cfg.int1_emb_func = PROPERTY_DISABLE;
09107     }
09108     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT1_CTRL,
09109                             (uint8_t*)&int1_ctrl, 1);
09110   }
09111   if (ret == 0) {
09112     ret = lsm6dso_write_reg(ctx, LSM6DSO_MD1_CFG, (uint8_t*)&md1_cfg, 1);
09113   }
09114 
09115   if (ret == 0) {
09116     ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t*)&int2_ctrl, 1);
09117   }
09118   if (ret == 0) {
09119     int2_ctrl.int2_drdy_temp = val.drdy_temp;
09120     ret = lsm6dso_write_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t*)&int2_ctrl, 1);
09121   }
09122   if (ret == 0) {
09123     ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t*)&md2_cfg, 1);
09124   }
09125   if (ret == 0) {
09126     md2_cfg.int2_timestamp = val.timestamp;
09127     ret = lsm6dso_write_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t*)&md2_cfg, 1);
09128   }
09129 
09130   if (ret == 0) {
09131     ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
09132   }
09133   if (ret == 0) {
09134     ret = lsm6dso_pin_int2_route_get(ctx, NULL, &pin_int2_route);
09135   }
09136   if (ret == 0) {
09137     if ( ( pin_int2_route.fifo_bdr
09138          | pin_int2_route.drdy_g
09139          | pin_int2_route.drdy_temp
09140          | pin_int2_route.drdy_xl
09141          | pin_int2_route.fifo_full
09142          | pin_int2_route.fifo_ovr
09143          | pin_int2_route.fifo_th
09144          | pin_int2_route.six_d
09145          | pin_int2_route.double_tap
09146          | pin_int2_route.free_fall
09147          | pin_int2_route.wake_up
09148          | pin_int2_route.single_tap
09149          | pin_int2_route.sleep_change
09150          | int1_ctrl.den_drdy_flag
09151          | int1_ctrl.int1_boot
09152          | int1_ctrl.int1_cnt_bdr
09153          | int1_ctrl.int1_drdy_g
09154          | int1_ctrl.int1_drdy_xl
09155          | int1_ctrl.int1_fifo_full
09156          | int1_ctrl.int1_fifo_ovr
09157          | int1_ctrl.int1_fifo_th
09158          | md1_cfg.int1_shub
09159          | md1_cfg.int1_6d
09160          | md1_cfg.int1_double_tap
09161          | md1_cfg.int1_ff
09162          | md1_cfg.int1_wu
09163          | md1_cfg.int1_single_tap
09164          | md1_cfg.int1_sleep_change) != PROPERTY_DISABLE) {
09165       tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
09166     }
09167     else{
09168       tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
09169     }
09170     ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
09171   }
09172   return ret;
09173 }
09174 
09175 /**
09176   * @brief  Route interrupt signals on int1 pin.[get]
09177   *
09178   * @param  ctx          communication interface handler.(ptr)
09179   * @param  val          the signals that are routed on int1 pin.(ptr)
09180   *
09181   */
09182 int32_t lsm6dso_pin_int1_route_get(lsm6dso_ctx_t *ctx,
09183                                     lsm6dso_pin_int1_route_t *val)
09184 {
09185   lsm6dso_emb_func_int1_t   emb_func_int1;
09186   lsm6dso_fsm_int1_a_t      fsm_int1_a;
09187   lsm6dso_fsm_int1_b_t      fsm_int1_b;
09188   lsm6dso_int1_ctrl_t       int1_ctrl;
09189   lsm6dso_int2_ctrl_t       int2_ctrl;
09190   lsm6dso_md2_cfg_t         md2_cfg;
09191   lsm6dso_md1_cfg_t         md1_cfg;
09192   lsm6dso_ctrl4_c_t         ctrl4_c;
09193   int32_t                    ret;
09194 
09195   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
09196   if (ret == 0) {
09197     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INT1,
09198                            (uint8_t*)&emb_func_int1, 1);
09199   }
09200   if (ret == 0) {
09201     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT1_A,
09202                            (uint8_t*)&fsm_int1_a, 1);
09203   }
09204   if (ret == 0) {
09205     ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT1_B,
09206                            (uint8_t*)&fsm_int1_b, 1);
09207   }
09208   if (ret == 0) {
09209     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
09210   }
09211   if (ret == 0) {
09212     ret = lsm6dso_read_reg(ctx, LSM6DSO_INT1_CTRL,
09213                            (uint8_t*)&int1_ctrl, 1);
09214   }
09215   if (ret == 0) {
09216     ret = lsm6dso_read_reg(ctx, LSM6DSO_MD1_CFG, (uint8_t*)&md1_cfg, 1);
09217   }
09218   if (ret == 0) {
09219     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09220   }
09221   if (ctrl4_c.int2_on_int1 == PROPERTY_ENABLE){
09222     if (ret == 0) {
09223       ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL, (uint8_t*)&int2_ctrl, 1);
09224       val->drdy_temp = int2_ctrl.int2_drdy_temp;
09225     }
09226     if (ret == 0) {
09227       ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t*)&md2_cfg, 1);
09228       val->timestamp = md2_cfg.int2_timestamp;
09229     }
09230   }
09231   else {
09232     val->drdy_temp = PROPERTY_DISABLE;
09233     val->timestamp = PROPERTY_DISABLE;
09234   }
09235 
09236   val->drdy_xl   = int1_ctrl.int1_drdy_xl;
09237   val->drdy_g    = int1_ctrl.int1_drdy_g;
09238   val->boot      = int1_ctrl.int1_boot;
09239   val->fifo_th   = int1_ctrl.int1_fifo_th;
09240   val->fifo_ovr  = int1_ctrl.int1_fifo_ovr;
09241   val->fifo_full = int1_ctrl.int1_fifo_full;
09242   val->fifo_bdr  = int1_ctrl.int1_cnt_bdr;
09243   val->den_flag  = int1_ctrl.den_drdy_flag;
09244 
09245   val->sh_endop     = md1_cfg.int1_shub;
09246   val->six_d        = md1_cfg.int1_6d;
09247   val->double_tap   = md1_cfg.int1_double_tap;
09248   val->free_fall    = md1_cfg.int1_ff;
09249   val->wake_up      = md1_cfg.int1_wu;
09250   val->single_tap   = md1_cfg.int1_single_tap;
09251   val->sleep_change = md1_cfg.int1_sleep_change;
09252 
09253   val->step_detector = emb_func_int1.int1_step_detector;
09254   val->tilt          = emb_func_int1.int1_tilt;
09255   val->sig_mot       = emb_func_int1.int1_sig_mot;
09256   val->fsm_lc        = emb_func_int1.int1_fsm_lc;
09257 
09258   val->fsm1 = fsm_int1_a.int1_fsm1;
09259   val->fsm2 = fsm_int1_a.int1_fsm2;
09260   val->fsm3 = fsm_int1_a.int1_fsm3;
09261   val->fsm4 = fsm_int1_a.int1_fsm4;
09262   val->fsm5 = fsm_int1_a.int1_fsm5;
09263   val->fsm6 = fsm_int1_a.int1_fsm6;
09264   val->fsm7 = fsm_int1_a.int1_fsm7;
09265   val->fsm8 = fsm_int1_a.int1_fsm8;
09266 
09267   val->fsm9  = fsm_int1_b.int1_fsm9;
09268   val->fsm10 = fsm_int1_b.int1_fsm10;
09269   val->fsm11 = fsm_int1_b.int1_fsm11;
09270   val->fsm12 = fsm_int1_b.int1_fsm12;
09271   val->fsm13 = fsm_int1_b.int1_fsm13;
09272   val->fsm14 = fsm_int1_b.int1_fsm14;
09273   val->fsm15 = fsm_int1_b.int1_fsm15;
09274   val->fsm16 = fsm_int1_b.int1_fsm16;
09275 
09276   return ret;
09277 }
09278 
09279 /**
09280   * @brief  Route interrupt signals on int2 pin.[set]
09281   *
09282   * @param  ctx          communication interface handler. Use NULL to ingnore
09283   *                      this interface.(ptr)
09284   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
09285   *                      to ingnore this interface.(ptr)
09286   * @param  val          the signals to route on int2 pin.
09287   *
09288   */
09289 int32_t lsm6dso_pin_int2_route_set(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
09290                                     lsm6dso_pin_int2_route_t val)
09291 {
09292   lsm6dso_pin_int1_route_t pin_int1_route;
09293   lsm6dso_emb_func_int2_t  emb_func_int2;
09294   lsm6dso_fsm_int2_a_t     fsm_int2_a;
09295   lsm6dso_fsm_int2_b_t     fsm_int2_b;
09296   lsm6dso_int2_ctrl_t      int2_ctrl;
09297   lsm6dso_tap_cfg2_t       tap_cfg2;
09298   lsm6dso_md2_cfg_t        md2_cfg;
09299   lsm6dso_ctrl4_c_t        ctrl4_c;
09300   lsm6dso_int_ois_t        int_ois;
09301   int32_t                  ret;
09302 
09303   ret = 0;
09304 
09305   if( aux_ctx != NULL ) {
09306     ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_INT_OIS,
09307                             (uint8_t*)&int_ois, 1);
09308     if (ret == 0) {
09309       int_ois.int2_drdy_ois = val.drdy_ois;
09310       ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_INT_OIS,
09311                                (uint8_t*)&int_ois, 1);
09312     }
09313   }
09314 
09315   if( ctx != NULL ) {
09316     int2_ctrl.int2_drdy_xl   = val.drdy_xl;
09317     int2_ctrl.int2_drdy_g    = val.drdy_g;
09318     int2_ctrl.int2_drdy_temp = val.drdy_temp;
09319     int2_ctrl.int2_fifo_th   = val.fifo_th;
09320     int2_ctrl.int2_fifo_ovr  = val.fifo_ovr;
09321     int2_ctrl.int2_fifo_full = val.fifo_full;
09322     int2_ctrl.int2_cnt_bdr   = val.fifo_bdr;
09323     int2_ctrl.not_used_01    = 0;
09324 
09325     md2_cfg.int2_timestamp    = val.timestamp;
09326     md2_cfg.int2_6d           = val.six_d;
09327     md2_cfg.int2_double_tap   = val.double_tap;
09328     md2_cfg.int2_ff           = val.free_fall;
09329     md2_cfg.int2_wu           = val.wake_up;
09330     md2_cfg.int2_single_tap   = val.single_tap;
09331     md2_cfg.int2_sleep_change = val.sleep_change;
09332 
09333     emb_func_int2.not_used_01 = 0;
09334     emb_func_int2. int2_step_detector = val.step_detector;
09335     emb_func_int2.int2_tilt           = val.tilt;
09336     emb_func_int2.int2_sig_mot        = val.sig_mot;
09337     emb_func_int2.not_used_02 = 0;
09338     emb_func_int2.int2_fsm_lc         = val.fsm_lc;
09339 
09340     fsm_int2_a.int2_fsm1 = val.fsm1;
09341     fsm_int2_a.int2_fsm2 = val.fsm2;
09342     fsm_int2_a.int2_fsm3 = val.fsm3;
09343     fsm_int2_a.int2_fsm4 = val.fsm4;
09344     fsm_int2_a.int2_fsm5 = val.fsm5;
09345     fsm_int2_a.int2_fsm6 = val.fsm6;
09346     fsm_int2_a.int2_fsm7 = val.fsm7;
09347     fsm_int2_a.int2_fsm8 = val.fsm8;
09348 
09349     fsm_int2_b.int2_fsm9  = val.fsm9 ;
09350     fsm_int2_b.int2_fsm10 = val.fsm10;
09351     fsm_int2_b.int2_fsm11 = val.fsm11;
09352     fsm_int2_b.int2_fsm12 = val.fsm12;
09353     fsm_int2_b.int2_fsm13 = val.fsm13;
09354     fsm_int2_b.int2_fsm14 = val.fsm14;
09355     fsm_int2_b.int2_fsm15 = val.fsm15;
09356     fsm_int2_b.int2_fsm16 = val.fsm16;
09357 
09358     if (ret == 0) {
09359       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09360       if (ret == 0) {
09361         if ( ( val.drdy_temp | val.timestamp ) != PROPERTY_DISABLE ) {
09362           ctrl4_c.int2_on_int1 = PROPERTY_DISABLE;
09363         }
09364 
09365         ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09366       }
09367     }
09368 
09369     if (ret == 0) {
09370       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
09371     }
09372     if (ret == 0) {
09373       ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_INT2,
09374                               (uint8_t*)&emb_func_int2, 1);
09375     }
09376     if (ret == 0) {
09377       ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT2_A,
09378                               (uint8_t*)&fsm_int2_a, 1);
09379     }
09380     if (ret == 0) {
09381       ret = lsm6dso_write_reg(ctx, LSM6DSO_FSM_INT2_B,
09382                               (uint8_t*)&fsm_int2_b, 1);
09383     }
09384     if (ret == 0) {
09385       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
09386     }
09387 
09388     if (ret == 0) {
09389       if (( emb_func_int2.int2_fsm_lc
09390           | emb_func_int2.int2_sig_mot
09391           | emb_func_int2.int2_step_detector
09392           | emb_func_int2.int2_tilt
09393           | fsm_int2_a.int2_fsm1
09394           | fsm_int2_a.int2_fsm2
09395           | fsm_int2_a.int2_fsm3
09396           | fsm_int2_a.int2_fsm4
09397           | fsm_int2_a.int2_fsm5
09398           | fsm_int2_a.int2_fsm6
09399           | fsm_int2_a.int2_fsm7
09400           | fsm_int2_a.int2_fsm8
09401           | fsm_int2_b.int2_fsm9
09402           | fsm_int2_b.int2_fsm10
09403           | fsm_int2_b.int2_fsm11
09404           | fsm_int2_b.int2_fsm12
09405           | fsm_int2_b.int2_fsm13
09406           | fsm_int2_b.int2_fsm14
09407           | fsm_int2_b.int2_fsm15
09408           | fsm_int2_b.int2_fsm16)!= PROPERTY_DISABLE ){
09409         md2_cfg.int2_emb_func = PROPERTY_ENABLE;
09410       }
09411       else{
09412         md2_cfg.int2_emb_func = PROPERTY_DISABLE;
09413       }
09414       ret = lsm6dso_write_reg(ctx, LSM6DSO_INT2_CTRL,
09415                               (uint8_t*)&int2_ctrl, 1);
09416     }
09417     if (ret == 0) {
09418       ret = lsm6dso_write_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t*)&md2_cfg, 1);
09419     }
09420     if (ret == 0) {
09421       ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
09422     }
09423 
09424     if (ret == 0) {
09425       ret = lsm6dso_pin_int1_route_get(ctx, &pin_int1_route);
09426     }
09427 
09428     if (ret == 0) {
09429       if ( ( val.fifo_bdr
09430            | val.drdy_g
09431            | val.drdy_temp
09432            | val.drdy_xl
09433            | val.fifo_full
09434            | val.fifo_ovr
09435            | val.fifo_th
09436            | val.six_d
09437            | val.double_tap
09438            | val.free_fall
09439            | val.wake_up
09440            | val.single_tap
09441            | val.sleep_change
09442            | pin_int1_route.den_flag
09443            | pin_int1_route.boot
09444            | pin_int1_route.fifo_bdr
09445            | pin_int1_route.drdy_g
09446            | pin_int1_route.drdy_xl
09447            | pin_int1_route.fifo_full
09448            | pin_int1_route.fifo_ovr
09449            | pin_int1_route.fifo_th
09450            | pin_int1_route.six_d
09451            | pin_int1_route.double_tap
09452            | pin_int1_route.free_fall
09453            | pin_int1_route.wake_up
09454            | pin_int1_route.single_tap
09455            | pin_int1_route.sleep_change ) != PROPERTY_DISABLE) {
09456         tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
09457       }
09458       else{
09459         tap_cfg2.interrupts_enable = PROPERTY_DISABLE;
09460       }
09461       ret = lsm6dso_write_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
09462     }
09463   }
09464   return ret;
09465 }
09466 
09467 /**
09468   * @brief  Route interrupt signals on int2 pin.[get]
09469   *
09470   * @param  ctx          communication interface handler. Use NULL to ingnore
09471   *                      this interface.(ptr)
09472   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
09473   *                      to ingnore this interface.(ptr)
09474   * @param  val          the signals that are routed on int2 pin.(ptr)
09475   *
09476   */
09477 int32_t lsm6dso_pin_int2_route_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
09478                                     lsm6dso_pin_int2_route_t *val)
09479 {
09480   lsm6dso_emb_func_int2_t  emb_func_int2;
09481   lsm6dso_fsm_int2_a_t     fsm_int2_a;
09482   lsm6dso_fsm_int2_b_t     fsm_int2_b;
09483   lsm6dso_int2_ctrl_t      int2_ctrl;
09484   lsm6dso_md2_cfg_t        md2_cfg;
09485   lsm6dso_ctrl4_c_t        ctrl4_c;
09486   lsm6dso_int_ois_t        int_ois;
09487   int32_t                   ret;
09488 
09489   ret = 0;
09490 
09491   if( aux_ctx != NULL ) {
09492     ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_INT_OIS,
09493                             (uint8_t*)&int_ois, 1);
09494     val->drdy_ois = int_ois.int2_drdy_ois;
09495   }
09496 
09497   if( ctx != NULL ) {
09498     if (ret == 0) {
09499      ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
09500     }
09501     if (ret == 0) {
09502       ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_INT2,
09503                              (uint8_t*)&emb_func_int2, 1);
09504     }
09505     if (ret == 0) {
09506       ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT2_A,
09507                              (uint8_t*)&fsm_int2_a, 1);
09508     }
09509     if (ret == 0) {
09510       ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_INT2_B,
09511                              (uint8_t*)&fsm_int2_b, 1);
09512     }
09513     if (ret == 0) {
09514       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
09515     }
09516     if (ret == 0) {
09517 
09518       ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL,
09519                              (uint8_t*)&int2_ctrl, 1);
09520     }
09521     if (ret == 0) {
09522       ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG,
09523                               (uint8_t*)&md2_cfg, 1);
09524     }
09525 
09526     if (ret == 0) {
09527       ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL4_C, (uint8_t*)&ctrl4_c, 1);
09528     }
09529     if (ctrl4_c.int2_on_int1 == PROPERTY_DISABLE){
09530       if (ret == 0) {
09531         ret = lsm6dso_read_reg(ctx, LSM6DSO_INT2_CTRL,
09532                                 (uint8_t*)&int2_ctrl, 1);
09533         val->drdy_temp = int2_ctrl.int2_drdy_temp;
09534       }
09535       if (ret == 0) {
09536         ret = lsm6dso_read_reg(ctx, LSM6DSO_MD2_CFG, (uint8_t*)&md2_cfg, 1);
09537         val->timestamp = md2_cfg.int2_timestamp;
09538       }
09539     }
09540     else {
09541       val->drdy_temp = PROPERTY_DISABLE;
09542       val->timestamp = PROPERTY_DISABLE;
09543     }
09544 
09545     val->drdy_xl   = int2_ctrl.int2_drdy_xl;
09546     val->drdy_g    = int2_ctrl.int2_drdy_g;
09547     val->drdy_temp = int2_ctrl.int2_drdy_temp;
09548     val->fifo_th   = int2_ctrl.int2_fifo_th;
09549     val->fifo_ovr  = int2_ctrl.int2_fifo_ovr;
09550     val->fifo_full = int2_ctrl.int2_fifo_full;
09551     val->fifo_bdr   = int2_ctrl.int2_cnt_bdr;
09552 
09553     val->timestamp    = md2_cfg.int2_timestamp;
09554     val->six_d        = md2_cfg.int2_6d;
09555     val->double_tap   = md2_cfg.int2_double_tap;
09556     val->free_fall    = md2_cfg.int2_ff;
09557     val->wake_up      = md2_cfg.int2_wu;
09558     val->single_tap   = md2_cfg.int2_single_tap;
09559     val->sleep_change = md2_cfg.int2_sleep_change;
09560 
09561     val->step_detector = emb_func_int2. int2_step_detector;
09562     val->tilt          = emb_func_int2.int2_tilt;
09563     val->fsm_lc        = emb_func_int2.int2_fsm_lc;
09564 
09565     val->fsm1 = fsm_int2_a.int2_fsm1;
09566     val->fsm2 = fsm_int2_a.int2_fsm2;
09567     val->fsm3 = fsm_int2_a.int2_fsm3;
09568     val->fsm4 = fsm_int2_a.int2_fsm4;
09569     val->fsm5 = fsm_int2_a.int2_fsm5;
09570     val->fsm6 = fsm_int2_a.int2_fsm6;
09571     val->fsm7 = fsm_int2_a.int2_fsm7;
09572     val->fsm8 = fsm_int2_a.int2_fsm8;
09573 
09574     val->fsm9  = fsm_int2_b.int2_fsm9;
09575     val->fsm10 = fsm_int2_b.int2_fsm10;
09576     val->fsm11 = fsm_int2_b.int2_fsm11;
09577     val->fsm12 = fsm_int2_b.int2_fsm12;
09578     val->fsm13 = fsm_int2_b.int2_fsm13;
09579     val->fsm14 = fsm_int2_b.int2_fsm14;
09580     val->fsm15 = fsm_int2_b.int2_fsm15;
09581     val->fsm16 = fsm_int2_b.int2_fsm16;
09582 
09583   }
09584 
09585   return ret;
09586 }
09587 
09588 /**
09589   * @brief  Get the status of all the interrupt sources.[get]
09590   *
09591   * @param  ctx          communication interface handler.(ptr)
09592   * @param  val          the status of all the interrupt sources.(ptr)
09593   *
09594   */
09595 int32_t lsm6dso_all_sources_get(lsm6dso_ctx_t *ctx,
09596                                  lsm6dso_all_sources_t *val)
09597 {
09598   lsm6dso_emb_func_status_mainpage_t emb_func_status_mainpage;
09599   lsm6dso_status_master_mainpage_t   status_master_mainpage;
09600   lsm6dso_fsm_status_a_mainpage_t    fsm_status_a_mainpage;
09601   lsm6dso_fsm_status_b_mainpage_t    fsm_status_b_mainpage;
09602   lsm6dso_fifo_status1_t             fifo_status1;
09603   lsm6dso_fifo_status2_t             fifo_status2;
09604   lsm6dso_all_int_src_t              all_int_src;
09605   lsm6dso_wake_up_src_t              wake_up_src;
09606   lsm6dso_status_reg_t               status_reg;
09607   lsm6dso_tap_src_t                  tap_src;
09608   lsm6dso_d6d_src_t                  d6d_src;
09609   lsm6dso_ctrl5_c_t                  ctrl5_c;
09610   uint8_t                            reg[12];
09611   int32_t                            ret;
09612 
09613   ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&ctrl5_c, 1);
09614   if (ret == 0) {
09615     ctrl5_c.not_used_01 = PROPERTY_ENABLE;
09616     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&ctrl5_c, 1);
09617   }
09618   if (ret == 0) {
09619     ret = lsm6dso_read_reg(ctx, LSM6DSO_ALL_INT_SRC, reg, 12);
09620   }
09621 
09622   if (ret == 0) {
09623     bytecpy(( uint8_t*)&all_int_src, &reg[0]);
09624     bytecpy(( uint8_t*)&wake_up_src, &reg[1]);
09625     bytecpy(( uint8_t*)&tap_src, &reg[2]);
09626     bytecpy(( uint8_t*)&d6d_src, &reg[3]);
09627     bytecpy(( uint8_t*)&status_reg, &reg[4]);
09628     bytecpy(( uint8_t*)&emb_func_status_mainpage, &reg[5]);
09629     bytecpy(( uint8_t*)&fsm_status_a_mainpage, &reg[6]);
09630     bytecpy(( uint8_t*)&fsm_status_b_mainpage, &reg[7]);
09631     bytecpy(( uint8_t*)&status_master_mainpage, &reg[9]);
09632     bytecpy(( uint8_t*)&fifo_status1, &reg[10]);
09633     bytecpy(( uint8_t*)&fifo_status2, &reg[11]);
09634 
09635     val->timestamp = all_int_src.timestamp_endcount;
09636 
09637     val->wake_up_z    = wake_up_src.z_wu;
09638     val->wake_up_y    = wake_up_src.y_wu;
09639     val->wake_up_x    = wake_up_src.x_wu;
09640     val->wake_up      = wake_up_src.wu_ia;
09641     val->sleep_state  = wake_up_src.sleep_state;
09642     val->free_fall    = wake_up_src.ff_ia;
09643     val->sleep_change = wake_up_src.sleep_change_ia;
09644 
09645     val->tap_x      = tap_src.x_tap;
09646     val->tap_y      = tap_src.y_tap;
09647     val->tap_z      = tap_src.z_tap;
09648     val->tap_sign   = tap_src.tap_sign;
09649     val->double_tap = tap_src.double_tap;
09650     val->single_tap = tap_src.single_tap;
09651 
09652     val->six_d_xl = d6d_src.xl;
09653     val->six_d_xh = d6d_src.xh;
09654     val->six_d_yl = d6d_src.yl;
09655     val->six_d_yh = d6d_src.yh;
09656     val->six_d_zl = d6d_src.zl;
09657     val->six_d_zh = d6d_src.zh;
09658     val->six_d    = d6d_src.d6d_ia;
09659     val->den_flag = d6d_src.den_drdy;
09660 
09661     val->drdy_xl   = status_reg.xlda;
09662     val->drdy_g    = status_reg.gda;
09663     val->drdy_temp = status_reg.tda;
09664 
09665     val->step_detector = emb_func_status_mainpage.is_step_det;
09666     val->tilt          = emb_func_status_mainpage.is_tilt;
09667     val->sig_mot       = emb_func_status_mainpage.is_sigmot;
09668     val->fsm_lc        = emb_func_status_mainpage.is_fsm_lc;
09669 
09670     val->fsm1 = fsm_status_a_mainpage.is_fsm1;
09671     val->fsm2 = fsm_status_a_mainpage.is_fsm2;
09672     val->fsm3 = fsm_status_a_mainpage.is_fsm3;
09673     val->fsm4 = fsm_status_a_mainpage.is_fsm4;
09674     val->fsm5 = fsm_status_a_mainpage.is_fsm5;
09675     val->fsm6 = fsm_status_a_mainpage.is_fsm6;
09676     val->fsm7 = fsm_status_a_mainpage.is_fsm7;
09677     val->fsm8 = fsm_status_a_mainpage.is_fsm8;
09678 
09679     val->fsm9  = fsm_status_b_mainpage.is_fsm9;
09680     val->fsm10 = fsm_status_b_mainpage.is_fsm10;
09681     val->fsm11 = fsm_status_b_mainpage.is_fsm11;
09682     val->fsm12 = fsm_status_b_mainpage.is_fsm12;
09683     val->fsm13 = fsm_status_b_mainpage.is_fsm13;
09684     val->fsm14 = fsm_status_b_mainpage.is_fsm14;
09685     val->fsm15 = fsm_status_b_mainpage.is_fsm15;
09686     val->fsm16 = fsm_status_b_mainpage.is_fsm16;
09687 
09688     val->sh_endop       = status_master_mainpage.sens_hub_endop;
09689     val->sh_slave0_nack = status_master_mainpage.slave0_nack;
09690     val->sh_slave1_nack = status_master_mainpage.slave1_nack;
09691     val->sh_slave2_nack = status_master_mainpage.slave2_nack;
09692     val->sh_slave3_nack = status_master_mainpage.slave3_nack;
09693     val->sh_wr_once     = status_master_mainpage.wr_once_done;
09694 
09695     val->fifo_diff = (256U * fifo_status2.diff_fifo) + fifo_status1.diff_fifo;
09696 
09697     val->fifo_ovr_latched = fifo_status2.over_run_latched;
09698     val->fifo_bdr         = fifo_status2.counter_bdr_ia;
09699     val->fifo_full        = fifo_status2.fifo_full_ia;
09700     val->fifo_ovr         = fifo_status2.fifo_ovr_ia;
09701     val->fifo_th          = fifo_status2.fifo_wtm_ia;
09702 
09703     ctrl5_c.not_used_01 = PROPERTY_DISABLE;
09704     ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL5_C, (uint8_t*)&ctrl5_c, 1);
09705 
09706   }
09707 
09708   return ret;
09709 }
09710 
09711 /**
09712   * @brief  Sensor conversion parameters selection.[set]
09713   *
09714   * @param  ctx          communication interface handler. Use NULL to ingnore
09715   *                      this interface.(ptr)
09716   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
09717   *                      to ingnore this interface.(ptr)
09718   * @param  val          set the sensor conversion parameters by checking
09719   *                      the constraints of the device.(ptr)
09720   *
09721   */
09722 int32_t lsm6dso_mode_set(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
09723                           lsm6dso_md_t *val)
09724 {
09725   lsm6dso_func_cfg_access_t func_cfg_access;
09726   lsm6dso_ctrl1_ois_t ctrl1_ois;
09727   lsm6dso_ctrl2_ois_t ctrl2_ois;
09728   lsm6dso_ctrl3_ois_t ctrl3_ois;
09729   lsm6dso_ctrl1_xl_t ctrl1_xl;
09730   lsm6dso_ctrl8_xl_t ctrl8_xl;
09731   lsm6dso_ctrl2_g_t ctrl2_g;
09732   lsm6dso_ctrl3_c_t ctrl3_c;
09733   lsm6dso_ctrl4_c_t ctrl4_c;
09734   lsm6dso_ctrl5_c_t ctrl5_c;
09735   lsm6dso_ctrl6_c_t ctrl6_c;
09736   lsm6dso_ctrl7_g_t ctrl7_g;
09737   uint8_t xl_hm_mode;
09738   uint8_t g_hm_mode;
09739   uint8_t xl_ulp_en;
09740   uint8_t odr_gy;
09741   uint8_t odr_xl;
09742   uint8_t reg[8];
09743   int32_t ret;
09744 
09745   ret = 0;
09746 
09747   /* reading input configuration */
09748   xl_hm_mode = ( (uint8_t)val->ui.xl.odr & 0x10U ) >> 4;
09749   xl_ulp_en = ( (uint8_t)val->ui.xl.odr & 0x20U ) >> 5;
09750   odr_xl = (uint8_t)val->ui.xl.odr & 0x0FU;
09751 
09752   /* if enable xl ultra low power mode disable gy and OIS chain */
09753   if (xl_ulp_en == PROPERTY_ENABLE) {
09754     val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
09755     val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
09756     val->ui.gy.odr  = LSM6DSO_GY_UI_OFF;
09757   }
09758   /* if OIS xl is enabled also gyro OIS is enabled */
09759   if (val->ois.xl.odr == LSM6DSO_XL_OIS_6667Hz_HP){
09760     val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
09761   }
09762   g_hm_mode = ( (uint8_t)val->ui.gy.odr & 0x10U ) >> 4;
09763   odr_gy = (uint8_t)val->ui.gy.odr & 0x0FU;
09764 
09765   /* reading registers to be configured */
09766   if( ctx != NULL ) {
09767     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, reg, 8);
09768     bytecpy(( uint8_t*)&ctrl1_xl, &reg[0]);
09769     bytecpy(( uint8_t*)&ctrl2_g,  &reg[1]);
09770     bytecpy(( uint8_t*)&ctrl3_c,  &reg[2]);
09771     bytecpy(( uint8_t*)&ctrl4_c,  &reg[3]);
09772     bytecpy(( uint8_t*)&ctrl5_c,  &reg[4]);
09773     bytecpy(( uint8_t*)&ctrl6_c,  &reg[5]);
09774     bytecpy(( uint8_t*)&ctrl7_g,  &reg[6]);
09775     bytecpy(( uint8_t*)&ctrl8_xl, &reg[7]);
09776     if ( ret == 0 ) {
09777       ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
09778                               (uint8_t*)&func_cfg_access, 1);
09779     }
09780     /* if toggle xl ultra low power mode, turn off xl before reconfigure */
09781     if (ctrl5_c.xl_ulp_en != xl_ulp_en) {
09782         ctrl1_xl.odr_xl = (uint8_t) 0x00U;
09783         ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL,
09784                                  (uint8_t*)&ctrl1_xl, 1);
09785     }
09786   }
09787 
09788   /* reading OIS registers to be configured */
09789   if( aux_ctx != NULL ) {
09790     if (ret == 0) {
09791       ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
09792     }
09793     bytecpy(( uint8_t*)&ctrl1_ois, &reg[0]);
09794     bytecpy(( uint8_t*)&ctrl2_ois, &reg[1]);
09795     bytecpy(( uint8_t*)&ctrl3_ois, &reg[2]);
09796   }
09797   else {
09798     if( ctx != NULL ) {
09799       if (ret == 0) {
09800         ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, reg, 3);
09801       }
09802       bytecpy(( uint8_t*)&ctrl1_ois, &reg[0]);
09803       bytecpy(( uint8_t*)&ctrl2_ois, &reg[1]);
09804       bytecpy(( uint8_t*)&ctrl3_ois, &reg[2]);
09805     }
09806   }
09807 
09808   /* Check the Finite State Machine data rate constraints */
09809   if (val->fsm.sens != LSM6DSO_FSM_DISABLE) {
09810     switch (val->fsm.odr) {
09811       case LSM6DSO_FSM_12Hz5:
09812         if ( (val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl == 0x00U) ) {
09813           odr_xl = 0x01U;
09814         }
09815         if ( (val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy == 0x00U) ) {
09816           xl_ulp_en = PROPERTY_DISABLE;
09817           odr_gy = 0x01U;
09818         }
09819         break;
09820       case LSM6DSO_FSM_26Hz:
09821         if ( (val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x02U) ) {
09822           odr_xl = 0x02U;
09823         }
09824         if ( (val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x02U) ) {
09825           xl_ulp_en = PROPERTY_DISABLE;
09826           odr_gy = 0x02U;
09827         }
09828         break;
09829       case LSM6DSO_FSM_52Hz:
09830         if ( (val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x03U) ) {
09831           odr_xl = 0x03U;
09832         }
09833         if ( (val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x03U) ) {
09834           xl_ulp_en = PROPERTY_DISABLE;
09835           odr_gy = 0x03U;
09836         }
09837         break;
09838       case LSM6DSO_FSM_104Hz:
09839         if ( (val->fsm.sens != LSM6DSO_FSM_GY) && (odr_xl < 0x04U) ) {
09840           odr_xl = 0x04U;
09841         }
09842         if ( (val->fsm.sens != LSM6DSO_FSM_XL) && (odr_gy < 0x04U) ) {
09843           xl_ulp_en = PROPERTY_DISABLE;
09844           odr_gy = 0x04U;
09845         }
09846         break;
09847       default:
09848         odr_xl = 0x00U;
09849         odr_gy = 0x00U;
09850         break;
09851     }
09852   }
09853 
09854   /* Updating the accelerometer data rate configuration */
09855   switch ( ( ctrl5_c.xl_ulp_en << 5 ) | ( ctrl6_c.xl_hm_mode << 4 ) |
09856            ctrl1_xl.odr_xl ) {
09857     case LSM6DSO_XL_UI_OFF:
09858       val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
09859       break;
09860     case LSM6DSO_XL_UI_12Hz5_HP:
09861       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_HP;
09862       break;
09863     case LSM6DSO_XL_UI_26Hz_HP:
09864       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_HP;
09865       break;
09866     case LSM6DSO_XL_UI_52Hz_HP:
09867       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_HP;
09868       break;
09869     case LSM6DSO_XL_UI_104Hz_HP:
09870       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_HP;
09871       break;
09872     case LSM6DSO_XL_UI_208Hz_HP:
09873       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_HP;
09874       break;
09875     case LSM6DSO_XL_UI_416Hz_HP:
09876       val->ui.xl.odr = LSM6DSO_XL_UI_416Hz_HP;
09877       break;
09878     case LSM6DSO_XL_UI_833Hz_HP:
09879       val->ui.xl.odr = LSM6DSO_XL_UI_833Hz_HP;
09880       break;
09881     case LSM6DSO_XL_UI_1667Hz_HP:
09882       val->ui.xl.odr = LSM6DSO_XL_UI_1667Hz_HP;
09883       break;
09884     case LSM6DSO_XL_UI_3333Hz_HP:
09885       val->ui.xl.odr = LSM6DSO_XL_UI_3333Hz_HP;
09886       break;
09887     case LSM6DSO_XL_UI_6667Hz_HP:
09888       val->ui.xl.odr = LSM6DSO_XL_UI_6667Hz_HP;
09889       break;
09890     case LSM6DSO_XL_UI_1Hz6_LP:
09891       val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_LP;
09892       break;
09893     case LSM6DSO_XL_UI_12Hz5_LP:
09894       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_LP;
09895       break;
09896     case LSM6DSO_XL_UI_26Hz_LP:
09897       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_LP;
09898       break;
09899     case LSM6DSO_XL_UI_52Hz_LP:
09900       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_LP;
09901       break;
09902     case LSM6DSO_XL_UI_104Hz_NM:
09903       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_NM;
09904       break;
09905     case LSM6DSO_XL_UI_208Hz_NM:
09906       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_NM;
09907       break;
09908     case LSM6DSO_XL_UI_1Hz6_ULP:
09909       val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_ULP;
09910       break;
09911     case LSM6DSO_XL_UI_12Hz5_ULP:
09912       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_ULP;
09913       break;
09914     case LSM6DSO_XL_UI_26Hz_ULP:
09915       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_ULP;
09916       break;
09917     case LSM6DSO_XL_UI_52Hz_ULP:
09918       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_ULP;
09919       break;
09920     case LSM6DSO_XL_UI_104Hz_ULP:
09921       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_ULP;
09922       break;
09923     case LSM6DSO_XL_UI_208Hz_ULP:
09924       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_ULP;
09925       break;
09926     default:
09927       val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
09928       break;
09929   }
09930 
09931   /* Updating the accelerometer data rate configuration */
09932   switch ( (ctrl7_g.g_hm_mode << 4) | ctrl2_g.odr_g) {
09933     case LSM6DSO_GY_UI_OFF:
09934       val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
09935       break;
09936     case LSM6DSO_GY_UI_12Hz5_LP:
09937       val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_LP;
09938       break;
09939     case LSM6DSO_GY_UI_12Hz5_HP:
09940       val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_HP;
09941       break;
09942     case LSM6DSO_GY_UI_26Hz_LP:
09943       val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_LP;
09944       break;
09945     case LSM6DSO_GY_UI_26Hz_HP:
09946       val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_HP;
09947       break;
09948     case LSM6DSO_GY_UI_52Hz_LP:
09949       val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_LP;
09950       break;
09951     case LSM6DSO_GY_UI_52Hz_HP:
09952       val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_HP;
09953       break;
09954     case LSM6DSO_GY_UI_104Hz_NM:
09955       val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_NM;
09956       break;
09957     case LSM6DSO_GY_UI_104Hz_HP:
09958       val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_HP;
09959       break;
09960     case LSM6DSO_GY_UI_208Hz_NM:
09961       val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_NM;
09962       break;
09963     case LSM6DSO_GY_UI_208Hz_HP:
09964       val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_HP;
09965       break;
09966     case LSM6DSO_GY_UI_416Hz_HP:
09967       val->ui.gy.odr = LSM6DSO_GY_UI_416Hz_HP;
09968       break;
09969     case LSM6DSO_GY_UI_833Hz_HP:
09970       val->ui.gy.odr = LSM6DSO_GY_UI_833Hz_HP;
09971       break;
09972     case LSM6DSO_GY_UI_1667Hz_HP:
09973       val->ui.gy.odr = LSM6DSO_GY_UI_1667Hz_HP;
09974       break;
09975     case LSM6DSO_GY_UI_3333Hz_HP:
09976       val->ui.gy.odr = LSM6DSO_GY_UI_3333Hz_HP;
09977       break;
09978     case LSM6DSO_GY_UI_6667Hz_HP:
09979       val->ui.gy.odr = LSM6DSO_GY_UI_6667Hz_HP;
09980       break;
09981     default:
09982       val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
09983       break;
09984   }
09985 
09986   /* Check accelerometer full scale constraints */
09987   /* Full scale of 16g must be the same for UI and OIS */
09988   if ( (val->ui.xl.fs == LSM6DSO_XL_UI_16g) ||
09989        (val->ois.xl.fs == LSM6DSO_XL_OIS_16g) ){
09990     val->ui.xl.fs = LSM6DSO_XL_UI_16g;
09991     val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
09992   }
09993 
09994   /* prapare new configuration */
09995 
09996   /* Full scale of 16g must be the same for UI and OIS */
09997   if (val->ui.xl.fs == LSM6DSO_XL_UI_16g) {
09998     ctrl8_xl.xl_fs_mode = PROPERTY_DISABLE;
09999   }
10000   else {
10001     ctrl8_xl.xl_fs_mode = PROPERTY_ENABLE;
10002   }
10003 
10004   /* OIS new configuration */
10005   ctrl7_g.ois_on_en = val->ois.ctrl_md & 0x01U;
10006 
10007   switch (val->ois.ctrl_md) {
10008     case LSM6DSO_OIS_ONLY_AUX:
10009       ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
10010       ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr | (uint8_t)val->ois.xl.odr;
10011       ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
10012       ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
10013       break;
10014     case LSM6DSO_OIS_MIXED:
10015       ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
10016       ctrl7_g.ois_on = (uint8_t)val->ois.gy.odr | (uint8_t)val->ois.xl.odr;
10017       ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
10018       ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
10019       break;
10020     default:
10021       ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
10022       ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr | (uint8_t)val->ois.xl.odr;
10023       ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
10024       ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
10025       break;
10026   }
10027 
10028   /* UI new configuration */
10029   ctrl1_xl.odr_xl = odr_xl;
10030   ctrl1_xl.fs_xl = (uint8_t)val->ui.xl.fs;
10031   ctrl5_c.xl_ulp_en = xl_ulp_en;
10032   ctrl6_c.xl_hm_mode = xl_hm_mode;
10033   ctrl7_g.g_hm_mode = g_hm_mode;
10034   ctrl2_g.odr_g = odr_gy;
10035   ctrl2_g.fs_g = (uint8_t) val->ui.gy.fs;
10036 
10037   /* writing checked configuration */
10038   if( ctx != NULL ) {
10039     bytecpy(&reg[0], ( uint8_t*)&ctrl1_xl);
10040     bytecpy(&reg[1], ( uint8_t*)&ctrl2_g);
10041     bytecpy(&reg[2], ( uint8_t*)&ctrl3_c);
10042     bytecpy(&reg[3], ( uint8_t*)&ctrl4_c);
10043     bytecpy(&reg[4], ( uint8_t*)&ctrl5_c);
10044     bytecpy(&reg[5], ( uint8_t*)&ctrl6_c);
10045     bytecpy(&reg[6], ( uint8_t*)&ctrl7_g);
10046     bytecpy(&reg[7], ( uint8_t*)&ctrl8_xl);
10047     if ( ret == 0 ) {
10048       ret = lsm6dso_write_reg(ctx, LSM6DSO_CTRL1_XL, (uint8_t*)&reg, 8);
10049     }
10050     if ( ret == 0 ) {
10051       ret = lsm6dso_write_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
10052                                (uint8_t*)&func_cfg_access, 1);
10053     }
10054   }
10055 
10056   /* writing OIS checked configuration */
10057   if( aux_ctx != NULL ) {
10058     bytecpy(&reg[0], ( uint8_t*)&ctrl1_ois);
10059     bytecpy(&reg[1], ( uint8_t*)&ctrl2_ois);
10060     bytecpy(&reg[2], ( uint8_t*)&ctrl3_ois);
10061     if (ret == 0) {
10062       ret = lsm6dso_write_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
10063     }
10064   }
10065 
10066   return ret;
10067 }
10068 
10069 /**
10070   * @brief  Sensor conversion parameters selection.[get]
10071   *
10072   * @param  ctx          communication interface handler. Use NULL to ingnore
10073   *                      this interface.(ptr)
10074   * @param  aux_ctx      auxiliary communication interface handler. Use NULL
10075   *                      to ingnore this interface.(ptr)
10076   * @param  val          get the sensor conversion parameters.(ptr)
10077   *
10078   */
10079 int32_t lsm6dso_mode_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
10080                           lsm6dso_md_t *val)
10081 {
10082 
10083   lsm6dso_emb_func_odr_cfg_b_t emb_func_odr_cfg_b;
10084   lsm6dso_func_cfg_access_t func_cfg_access;
10085   lsm6dso_emb_func_en_b_t emb_func_en_b;
10086   lsm6dso_fsm_enable_a_t fsm_enable_a;
10087   lsm6dso_fsm_enable_b_t fsm_enable_b;
10088   lsm6dso_ctrl1_ois_t ctrl1_ois;
10089   lsm6dso_ctrl2_ois_t ctrl2_ois;
10090   lsm6dso_ctrl3_ois_t ctrl3_ois;
10091   lsm6dso_ctrl1_xl_t ctrl1_xl;
10092   lsm6dso_ctrl2_g_t ctrl2_g;
10093   lsm6dso_ctrl3_c_t ctrl3_c;
10094   lsm6dso_ctrl4_c_t ctrl4_c;
10095   lsm6dso_ctrl5_c_t ctrl5_c;
10096   lsm6dso_ctrl6_c_t ctrl6_c;
10097   lsm6dso_ctrl7_g_t ctrl7_g;
10098 
10099   uint8_t reg[8];
10100   int32_t ret;
10101 
10102   ret = 0;
10103 
10104   /* reading the registers of the device */
10105   if( ctx != NULL ) {
10106     ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_XL, reg, 7);
10107     bytecpy(( uint8_t*)&ctrl1_xl, &reg[0]);
10108     bytecpy(( uint8_t*)&ctrl2_g,  &reg[1]);
10109     bytecpy(( uint8_t*)&ctrl3_c,  &reg[2]);
10110     bytecpy(( uint8_t*)&ctrl4_c,  &reg[3]);
10111     bytecpy(( uint8_t*)&ctrl5_c,  &reg[4]);
10112     bytecpy(( uint8_t*)&ctrl6_c,  &reg[5]);
10113     bytecpy(( uint8_t*)&ctrl7_g,  &reg[6]);
10114     if ( ret == 0 ) {
10115       ret = lsm6dso_read_reg(ctx, LSM6DSO_FUNC_CFG_ACCESS,
10116                               (uint8_t*)&func_cfg_access, 1);
10117     }
10118     if (ret == 0) {
10119       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
10120     }
10121     if (ret == 0) {
10122       ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B, reg, 1);
10123       bytecpy(( uint8_t*)&emb_func_odr_cfg_b, &reg[0]);
10124     }
10125     if (ret == 0) {
10126       ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10127                               (uint8_t*)&emb_func_en_b, 1);
10128     }
10129     if (ret == 0) {
10130       ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_ENABLE_A, reg, 2);
10131       bytecpy(( uint8_t*)&fsm_enable_a, &reg[0]);
10132       bytecpy(( uint8_t*)&fsm_enable_b, &reg[1]);
10133     }
10134     if (ret == 0) {
10135       ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
10136     }
10137   }
10138 
10139   if( aux_ctx != NULL ) {
10140     if (ret == 0) {
10141       ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_CTRL1_OIS, reg, 3);
10142     }
10143     bytecpy(( uint8_t*)&ctrl1_ois, &reg[0]);
10144     bytecpy(( uint8_t*)&ctrl2_ois, &reg[1]);
10145     bytecpy(( uint8_t*)&ctrl3_ois, &reg[2]);
10146   }
10147   else {
10148     if( ctx != NULL ) {
10149       if (ret == 0) {
10150         ret = lsm6dso_read_reg(ctx, LSM6DSO_CTRL1_OIS, reg, 3);
10151       }
10152       bytecpy(( uint8_t*)&ctrl1_ois, &reg[0]);
10153       bytecpy(( uint8_t*)&ctrl2_ois, &reg[1]);
10154       bytecpy(( uint8_t*)&ctrl3_ois, &reg[2]);
10155     }
10156   }
10157   
10158   /* fill the input structure */
10159 
10160   /* get accelerometer configuration */
10161   switch ( (ctrl5_c.xl_ulp_en << 5) | (ctrl6_c.xl_hm_mode << 4) |
10162            ctrl1_xl.odr_xl ) {
10163     case LSM6DSO_XL_UI_OFF:
10164       val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
10165       break;
10166     case LSM6DSO_XL_UI_12Hz5_HP:
10167       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_HP;
10168       break;
10169     case LSM6DSO_XL_UI_26Hz_HP:
10170       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_HP;
10171       break;
10172     case LSM6DSO_XL_UI_52Hz_HP:
10173       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_HP;
10174       break;
10175     case LSM6DSO_XL_UI_104Hz_HP:
10176       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_HP;
10177       break;
10178     case LSM6DSO_XL_UI_208Hz_HP:
10179       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_HP;
10180       break;
10181     case LSM6DSO_XL_UI_416Hz_HP:
10182       val->ui.xl.odr = LSM6DSO_XL_UI_416Hz_HP;
10183       break;
10184     case LSM6DSO_XL_UI_833Hz_HP:
10185       val->ui.xl.odr = LSM6DSO_XL_UI_833Hz_HP;
10186       break;
10187     case LSM6DSO_XL_UI_1667Hz_HP:
10188       val->ui.xl.odr = LSM6DSO_XL_UI_1667Hz_HP;
10189       break;
10190     case LSM6DSO_XL_UI_3333Hz_HP:
10191       val->ui.xl.odr = LSM6DSO_XL_UI_3333Hz_HP;
10192       break;
10193     case LSM6DSO_XL_UI_6667Hz_HP:
10194       val->ui.xl.odr = LSM6DSO_XL_UI_6667Hz_HP;
10195       break;
10196     case LSM6DSO_XL_UI_1Hz6_LP:
10197       val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_LP;
10198       break;
10199     case LSM6DSO_XL_UI_12Hz5_LP:
10200       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_LP;
10201       break;
10202     case LSM6DSO_XL_UI_26Hz_LP:
10203       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_LP;
10204       break;
10205     case LSM6DSO_XL_UI_52Hz_LP:
10206       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_LP;
10207       break;
10208     case LSM6DSO_XL_UI_104Hz_NM:
10209       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_NM;
10210       break;
10211     case LSM6DSO_XL_UI_208Hz_NM:
10212       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_NM;
10213       break;
10214     case LSM6DSO_XL_UI_1Hz6_ULP:
10215       val->ui.xl.odr = LSM6DSO_XL_UI_1Hz6_ULP;
10216       break;
10217     case LSM6DSO_XL_UI_12Hz5_ULP:
10218       val->ui.xl.odr = LSM6DSO_XL_UI_12Hz5_ULP;
10219       break;
10220     case LSM6DSO_XL_UI_26Hz_ULP:
10221       val->ui.xl.odr = LSM6DSO_XL_UI_26Hz_ULP;
10222       break;
10223     case LSM6DSO_XL_UI_52Hz_ULP:
10224       val->ui.xl.odr = LSM6DSO_XL_UI_52Hz_ULP;
10225       break;
10226     case LSM6DSO_XL_UI_104Hz_ULP:
10227       val->ui.xl.odr = LSM6DSO_XL_UI_104Hz_ULP;
10228       break;
10229     case LSM6DSO_XL_UI_208Hz_ULP:
10230       val->ui.xl.odr = LSM6DSO_XL_UI_208Hz_ULP;
10231       break;
10232     default:
10233       val->ui.xl.odr = LSM6DSO_XL_UI_OFF;
10234       break;
10235   }
10236 
10237   switch ( ctrl1_xl.fs_xl ) {
10238     case LSM6DSO_XL_UI_2g:
10239       val->ui.xl.fs = LSM6DSO_XL_UI_2g;
10240       break;
10241     case LSM6DSO_XL_UI_4g:
10242       val->ui.xl.fs = LSM6DSO_XL_UI_4g;
10243       break;
10244     case LSM6DSO_XL_UI_8g:
10245       val->ui.xl.fs = LSM6DSO_XL_UI_8g;
10246       break;
10247     case LSM6DSO_XL_UI_16g:
10248       val->ui.xl.fs = LSM6DSO_XL_UI_16g;
10249       break;
10250     default:
10251       val->ui.xl.fs = LSM6DSO_XL_UI_2g;
10252       break;
10253   }
10254 
10255   /* get gyroscope configuration */
10256   switch ( (ctrl7_g.g_hm_mode << 4) | ctrl2_g.odr_g) {
10257     case LSM6DSO_GY_UI_OFF:
10258       val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
10259       break;
10260     case LSM6DSO_GY_UI_12Hz5_LP:
10261       val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_LP;
10262       break;
10263     case LSM6DSO_GY_UI_12Hz5_HP:
10264       val->ui.gy.odr = LSM6DSO_GY_UI_12Hz5_HP;
10265       break;
10266     case LSM6DSO_GY_UI_26Hz_LP:
10267       val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_LP;
10268       break;
10269     case LSM6DSO_GY_UI_26Hz_HP:
10270       val->ui.gy.odr = LSM6DSO_GY_UI_26Hz_HP;
10271       break;
10272     case LSM6DSO_GY_UI_52Hz_LP:
10273       val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_LP;
10274       break;
10275     case LSM6DSO_GY_UI_52Hz_HP:
10276       val->ui.gy.odr = LSM6DSO_GY_UI_52Hz_HP;
10277       break;
10278     case LSM6DSO_GY_UI_104Hz_NM:
10279       val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_NM;
10280       break;
10281     case LSM6DSO_GY_UI_104Hz_HP:
10282       val->ui.gy.odr = LSM6DSO_GY_UI_104Hz_HP;
10283       break;
10284     case LSM6DSO_GY_UI_208Hz_NM:
10285       val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_NM;
10286       break;
10287     case LSM6DSO_GY_UI_208Hz_HP:
10288       val->ui.gy.odr = LSM6DSO_GY_UI_208Hz_HP;
10289       break;
10290     case LSM6DSO_GY_UI_416Hz_HP:
10291       val->ui.gy.odr = LSM6DSO_GY_UI_416Hz_HP;
10292       break;
10293     case LSM6DSO_GY_UI_833Hz_HP:
10294       val->ui.gy.odr = LSM6DSO_GY_UI_833Hz_HP;
10295       break;
10296     case LSM6DSO_GY_UI_1667Hz_HP:
10297       val->ui.gy.odr = LSM6DSO_GY_UI_1667Hz_HP;
10298       break;
10299     case LSM6DSO_GY_UI_3333Hz_HP:
10300       val->ui.gy.odr = LSM6DSO_GY_UI_3333Hz_HP;
10301       break;
10302     case LSM6DSO_GY_UI_6667Hz_HP:
10303       val->ui.gy.odr = LSM6DSO_GY_UI_6667Hz_HP;
10304       break;
10305     default:
10306       val->ui.gy.odr = LSM6DSO_GY_UI_OFF;
10307       break;
10308   }
10309 
10310   switch (ctrl2_g.fs_g) {
10311     case LSM6DSO_GY_UI_125dps:
10312       val->ui.gy.fs = LSM6DSO_GY_UI_125dps;
10313       break;
10314     case LSM6DSO_GY_UI_250dps:
10315       val->ui.gy.fs = LSM6DSO_GY_UI_250dps;
10316       break;
10317     case LSM6DSO_GY_UI_500dps:
10318       val->ui.gy.fs = LSM6DSO_GY_UI_500dps;
10319       break;
10320     case LSM6DSO_GY_UI_1000dps:
10321       val->ui.gy.fs = LSM6DSO_GY_UI_1000dps;
10322       break;
10323     case LSM6DSO_GY_UI_2000dps:
10324       val->ui.gy.fs = LSM6DSO_GY_UI_2000dps;
10325       break;
10326     default:
10327       val->ui.gy.fs = LSM6DSO_GY_UI_125dps;
10328       break;
10329   }
10330 
10331   /* get finite state machine configuration */
10332   if ( (fsm_enable_a.fsm1_en | fsm_enable_a.fsm2_en | fsm_enable_a.fsm3_en |
10333         fsm_enable_a.fsm4_en | fsm_enable_a.fsm5_en | fsm_enable_a.fsm6_en |
10334         fsm_enable_a.fsm7_en | fsm_enable_a.fsm8_en | fsm_enable_b.fsm9_en |
10335         fsm_enable_b.fsm10_en | fsm_enable_b.fsm11_en |
10336         fsm_enable_b.fsm12_en | fsm_enable_b.fsm13_en |
10337         fsm_enable_b.fsm14_en | fsm_enable_b.fsm15_en |
10338         fsm_enable_b.fsm16_en) == PROPERTY_ENABLE ){
10339     switch (emb_func_odr_cfg_b.fsm_odr) {
10340       case LSM6DSO_FSM_12Hz5:
10341         val->fsm.odr = LSM6DSO_FSM_12Hz5;
10342         break;
10343       case LSM6DSO_FSM_26Hz:
10344         val->fsm.odr = LSM6DSO_FSM_26Hz;
10345         break;
10346       case LSM6DSO_FSM_52Hz:
10347         val->fsm.odr = LSM6DSO_FSM_52Hz;
10348         break;
10349       case LSM6DSO_FSM_104Hz:
10350         val->fsm.odr = LSM6DSO_FSM_104Hz;
10351         break;
10352       default:
10353         val->fsm.odr = LSM6DSO_FSM_12Hz5;
10354         break;
10355     }
10356     
10357     val->fsm.sens = LSM6DSO_FSM_XL_GY;
10358     if (val->ui.gy.odr == LSM6DSO_GY_UI_OFF) {
10359       val->fsm.sens = LSM6DSO_FSM_XL;
10360     }
10361     if (val->ui.xl.odr == LSM6DSO_XL_UI_OFF) {
10362       val->fsm.sens = LSM6DSO_FSM_GY;
10363     }
10364   }
10365   else {
10366     val->fsm.sens = LSM6DSO_FSM_DISABLE;
10367   }
10368 
10369   /* get ois configuration */
10370 
10371   /* OIS configuration mode */
10372   switch ( ctrl7_g.ois_on_en ) {
10373     case LSM6DSO_OIS_ONLY_AUX:
10374       switch ( ctrl3_ois.fs_xl_ois ) {
10375         case LSM6DSO_XL_OIS_2g:
10376           val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
10377           break;
10378         case LSM6DSO_XL_OIS_4g:
10379           val->ois.xl.fs = LSM6DSO_XL_OIS_4g;
10380           break;
10381         case LSM6DSO_XL_OIS_8g:
10382           val->ois.xl.fs = LSM6DSO_XL_OIS_8g;
10383           break;
10384         case LSM6DSO_XL_OIS_16g:
10385           val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
10386           break;
10387         default:
10388           val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
10389           break;
10390       }
10391       switch ( ctrl1_ois.mode4_en ) {
10392         case LSM6DSO_XL_OIS_OFF:
10393           val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
10394           break;
10395         case LSM6DSO_XL_OIS_6667Hz_HP:
10396           val->ois.xl.odr = LSM6DSO_XL_OIS_6667Hz_HP;
10397           break;
10398         default:
10399           val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
10400           break;
10401       }
10402       switch ( ctrl1_ois.fs_g_ois ) {
10403         case LSM6DSO_GY_OIS_250dps:
10404           val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
10405           break;
10406         case LSM6DSO_GY_OIS_500dps:
10407           val->ois.gy.fs = LSM6DSO_GY_OIS_500dps;
10408           break;
10409         case LSM6DSO_GY_OIS_1000dps:
10410           val->ois.gy.fs = LSM6DSO_GY_OIS_1000dps;
10411           break;
10412         case LSM6DSO_GY_OIS_2000dps:
10413           val->ois.gy.fs = LSM6DSO_GY_OIS_2000dps;
10414           break;
10415         default:
10416           val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
10417           break;
10418       }
10419       switch ( ctrl1_ois.ois_en_spi2 ) {
10420         case LSM6DSO_GY_OIS_OFF:
10421           val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
10422           break;
10423         case LSM6DSO_GY_OIS_6667Hz_HP:
10424           val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
10425           break;
10426         default:
10427           val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
10428           break;
10429       }
10430       val->ois.ctrl_md = LSM6DSO_OIS_ONLY_AUX;
10431       break;
10432     case LSM6DSO_OIS_MIXED:
10433       switch ( ctrl3_ois.fs_xl_ois ) {
10434         case LSM6DSO_XL_OIS_2g:
10435           val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
10436           break;
10437         case LSM6DSO_XL_OIS_4g:
10438           val->ois.xl.fs = LSM6DSO_XL_OIS_4g;
10439           break;
10440         case LSM6DSO_XL_OIS_8g:
10441           val->ois.xl.fs = LSM6DSO_XL_OIS_8g;
10442           break;
10443         case LSM6DSO_XL_OIS_16g:
10444           val->ois.xl.fs = LSM6DSO_XL_OIS_16g;
10445           break;
10446         default:
10447           val->ois.xl.fs = LSM6DSO_XL_OIS_2g;
10448           break;
10449       }
10450       switch ( ctrl1_ois.mode4_en ) {
10451         case LSM6DSO_XL_OIS_OFF:
10452           val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
10453           break;
10454         case LSM6DSO_XL_OIS_6667Hz_HP:
10455           val->ois.xl.odr = LSM6DSO_XL_OIS_6667Hz_HP;
10456           break;
10457         default:
10458           val->ois.xl.odr = LSM6DSO_XL_OIS_OFF;
10459           break;
10460       }
10461       switch ( ctrl1_ois.fs_g_ois ) {
10462         case LSM6DSO_GY_OIS_250dps:
10463           val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
10464           break;
10465         case LSM6DSO_GY_OIS_500dps:
10466           val->ois.gy.fs = LSM6DSO_GY_OIS_500dps;
10467           break;
10468         case LSM6DSO_GY_OIS_1000dps:
10469           val->ois.gy.fs = LSM6DSO_GY_OIS_1000dps;
10470           break;
10471         case LSM6DSO_GY_OIS_2000dps:
10472           val->ois.gy.fs = LSM6DSO_GY_OIS_2000dps;
10473           break;
10474         default:
10475           val->ois.gy.fs = LSM6DSO_GY_OIS_250dps;
10476           break;
10477       }
10478       switch ( ctrl1_ois.ois_en_spi2 ) {
10479         case LSM6DSO_GY_OIS_OFF:
10480           val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
10481           break;
10482         case LSM6DSO_GY_OIS_6667Hz_HP:
10483           val->ois.gy.odr = LSM6DSO_GY_OIS_6667Hz_HP;
10484           break;
10485         default:
10486           val->ois.gy.odr = LSM6DSO_GY_OIS_OFF;
10487           break;
10488       }
10489       val->ois.ctrl_md = LSM6DSO_OIS_MIXED;
10490       break;
10491     default:
10492       ctrl1_ois.fs_g_ois = (uint8_t)val->ois.gy.fs;
10493       ctrl1_ois.ois_en_spi2 = (uint8_t)val->ois.gy.odr | (uint8_t)val->ois.xl.odr;
10494       ctrl1_ois.mode4_en = (uint8_t) val->ois.xl.odr;
10495       ctrl3_ois.fs_xl_ois = (uint8_t)val->ois.xl.fs;
10496       val->ois.ctrl_md = LSM6DSO_OIS_ONLY_AUX;
10497       break;
10498   }
10499 
10500   return ret;
10501 }
10502 
10503 /**
10504   * @brief  Read data in engineering unit.[get]
10505   *
10506   * @param  ctx     communication interface handler.(ptr)
10507   * @param  md      the sensor conversion parameters.(ptr)
10508   *
10509   */
10510 int32_t lsm6dso_data_get(lsm6dso_ctx_t *ctx, lsm6dso_ctx_t *aux_ctx,
10511                           lsm6dso_md_t *md, lsm6dso_data_t *data)
10512 {
10513   uint8_t buff[14];
10514   int32_t ret;
10515   uint8_t i;
10516   uint8_t j;
10517   
10518   ret = 0;
10519   
10520   /* read data */
10521   if( ctx != NULL ) {
10522     ret = lsm6dso_read_reg(ctx, LSM6DSO_OUT_TEMP_L, buff, 14);
10523   }
10524   j = 0;
10525 
10526   /* temperature conversion */
10527   data->ui.heat.raw = (int16_t)buff[j+1U];
10528   data->ui.heat.raw = ( ((int16_t)data->ui.heat.raw * (int16_t)256) + (int16_t)buff[j] );
10529   j+=2U;
10530   data->ui.heat.deg_c = lsm6dso_from_lsb_to_celsius((int16_t)data->ui.heat.raw);
10531 
10532   /* angular rate conversion */
10533   for (i = 0U; i < 3U; i++) {
10534     data->ui.gy.raw[i] = (int16_t)buff[j+1U];
10535     data->ui.gy.raw[i] = (data->ui.gy.raw[i] * 256) + (int16_t) buff[j];
10536     j+=2U;
10537     switch ( md->ui.gy.fs ) {
10538       case LSM6DSO_GY_UI_250dps:
10539         data->ui.gy.mdps[i] = lsm6dso_from_fs250_to_mdps(data->ui.gy.raw[i]);
10540         break;
10541       case LSM6DSO_GY_UI_125dps:
10542         data->ui.gy.mdps[i] = lsm6dso_from_fs125_to_mdps(data->ui.gy.raw[i]);
10543         break;
10544       case LSM6DSO_GY_UI_500dps:
10545         data->ui.gy.mdps[i] = lsm6dso_from_fs500_to_mdps(data->ui.gy.raw[i]);
10546         break;
10547       case LSM6DSO_GY_UI_1000dps:
10548         data->ui.gy.mdps[i] = lsm6dso_from_fs1000_to_mdps(data->ui.gy.raw[i]);
10549         break;
10550       case LSM6DSO_GY_UI_2000dps:
10551         data->ui.gy.mdps[i] = lsm6dso_from_fs2000_to_mdps(data->ui.gy.raw[i]);
10552         break;
10553       default:
10554         data->ui.gy.mdps[i] = 0.0f;
10555         break;
10556     }
10557   }
10558 
10559   /* acceleration conversion */
10560   for (i = 0U; i < 3U; i++) {
10561     data->ui.xl.raw[i] = (int16_t)buff[j+1U];
10562     data->ui.xl.raw[i] = (data->ui.xl.raw[i] * 256) + (int16_t) buff[j];
10563     j+=2U;
10564     switch ( md->ui.xl.fs ) {
10565       case LSM6DSO_XL_UI_2g:
10566         data->ui.xl.mg[i] =lsm6dso_from_fs2_to_mg(data->ui.xl.raw[i]);
10567         break;
10568       case LSM6DSO_XL_UI_4g:
10569         data->ui.xl.mg[i] =lsm6dso_from_fs4_to_mg(data->ui.xl.raw[i]);
10570         break;
10571       case LSM6DSO_XL_UI_8g:
10572         data->ui.xl.mg[i] =lsm6dso_from_fs8_to_mg(data->ui.xl.raw[i]);
10573         break;
10574       case LSM6DSO_XL_UI_16g:
10575         data->ui.xl.mg[i] =lsm6dso_from_fs16_to_mg(data->ui.xl.raw[i]);
10576         break;
10577       default:
10578         data->ui.xl.mg[i] = 0.0f;
10579         break;
10580     }
10581     
10582   }
10583 
10584   /* read data from ois chain */
10585   if (aux_ctx != NULL) {
10586     if (ret == 0) {
10587       ret = lsm6dso_read_reg(aux_ctx, LSM6DSO_OUTX_L_G, buff, 12);
10588     }
10589   }
10590   j = 0;
10591 
10592   /* ois angular rate conversion */
10593   for (i = 0U; i < 3U; i++) {
10594     data->ois.gy.raw[i] = (int16_t) buff[j+1U];
10595     data->ois.gy.raw[i] = (data->ois.gy.raw[i] * 256) + (int16_t) buff[j];
10596     j+=2U;
10597     switch ( md->ois.gy.fs ) {
10598       case LSM6DSO_GY_UI_250dps:
10599         data->ois.gy.mdps[i] = lsm6dso_from_fs250_to_mdps(data->ois.gy.raw[i]);
10600         break;
10601       case LSM6DSO_GY_UI_125dps:
10602         data->ois.gy.mdps[i] = lsm6dso_from_fs125_to_mdps(data->ois.gy.raw[i]);
10603         break;
10604       case LSM6DSO_GY_UI_500dps:
10605         data->ois.gy.mdps[i] = lsm6dso_from_fs500_to_mdps(data->ois.gy.raw[i]);
10606         break;
10607       case LSM6DSO_GY_UI_1000dps:
10608         data->ois.gy.mdps[i] = lsm6dso_from_fs1000_to_mdps(data->ois.gy.raw[i]);
10609         break;
10610       case LSM6DSO_GY_UI_2000dps:
10611         data->ois.gy.mdps[i] = lsm6dso_from_fs2000_to_mdps(data->ois.gy.raw[i]);
10612         break;
10613       default:
10614         data->ois.gy.mdps[i] = 0.0f;
10615         break;
10616     }
10617   }
10618 
10619   /* ois acceleration conversion */
10620   for (i = 0U; i < 3U; i++) {
10621     data->ois.xl.raw[i] = (int16_t) buff[j+1U];
10622     data->ois.xl.raw[i] = (data->ois.xl.raw[i] * 256) + (int16_t) buff[j];
10623     j+=2U;
10624     switch ( md->ois.xl.fs ) {
10625       case LSM6DSO_XL_UI_2g:
10626         data->ois.xl.mg[i] =lsm6dso_from_fs2_to_mg(data->ois.xl.raw[i]);
10627         break;
10628       case LSM6DSO_XL_UI_4g:
10629         data->ois.xl.mg[i] =lsm6dso_from_fs4_to_mg(data->ois.xl.raw[i]);
10630         break;
10631       case LSM6DSO_XL_UI_8g:
10632         data->ois.xl.mg[i] =lsm6dso_from_fs8_to_mg(data->ois.xl.raw[i]);
10633         break;
10634       case LSM6DSO_XL_UI_16g:
10635         data->ois.xl.mg[i] =lsm6dso_from_fs16_to_mg(data->ois.xl.raw[i]);
10636         break;
10637       default:
10638         data->ois.xl.mg[i] = 0.0f;
10639         break;
10640     }
10641   }
10642 
10643   return ret;
10644 }
10645 
10646 /**
10647   * @brief  Embedded functions.[set]
10648   *
10649   * @param  ctx      read / write interface definitions
10650   * @param  val      change the values of registers
10651   *                  EMB_FUNC_EN_A e EMB_FUNC_EN_B.
10652   *
10653   */
10654 int32_t lsm6dso_embedded_sens_set(lsm6dso_ctx_t *ctx,
10655                                    lsm6dso_emb_sens_t *val)
10656 {
10657   lsm6dso_emb_func_en_a_t emb_func_en_a;
10658   lsm6dso_emb_func_en_b_t emb_func_en_b;
10659   int32_t ret;
10660 
10661   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
10662   if (ret == 0) {
10663     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
10664                             (uint8_t*)&emb_func_en_a, 1);
10665   }
10666   if (ret == 0) {
10667     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10668                            (uint8_t*)&emb_func_en_b, 1);
10669 
10670     emb_func_en_b.fsm_en = val->fsm;
10671     emb_func_en_a.tilt_en = val->tilt;
10672     emb_func_en_a.pedo_en = val->step;
10673     emb_func_en_b.pedo_adv_en = val->step_adv;
10674     emb_func_en_a.sign_motion_en = val->sig_mot;
10675     emb_func_en_b.fifo_compr_en = val->fifo_compr;
10676 
10677   }
10678   if (ret == 0) {
10679     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
10680                             (uint8_t*)&emb_func_en_a, 1);
10681   }
10682   if (ret == 0) {
10683     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10684                             (uint8_t*)&emb_func_en_b, 1);
10685   }
10686   if (ret == 0) {
10687     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
10688   }
10689 
10690   return ret;
10691 }
10692 
10693 /**
10694   * @brief  Embedded functions.[get]
10695   *
10696   * @param  ctx      read / write interface definitions
10697   * @param  val      get the values of registers
10698   *                  EMB_FUNC_EN_A e EMB_FUNC_EN_B.
10699   *
10700   */
10701 int32_t lsm6dso_embedded_sens_get(lsm6dso_ctx_t *ctx,
10702                                    lsm6dso_emb_sens_t *emb_sens)
10703 {
10704   lsm6dso_emb_func_en_a_t emb_func_en_a;
10705   lsm6dso_emb_func_en_b_t emb_func_en_b;
10706   int32_t ret;
10707 
10708   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
10709   if (ret == 0) {
10710     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
10711                            (uint8_t*)&emb_func_en_a, 1);
10712   }
10713   if (ret == 0) {
10714     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10715                            (uint8_t*)&emb_func_en_b, 1);
10716 
10717     emb_sens->fsm = emb_func_en_b.fsm_en;
10718     emb_sens->tilt = emb_func_en_a.tilt_en;
10719     emb_sens->step = emb_func_en_a.pedo_en;
10720     emb_sens->step_adv = emb_func_en_b.pedo_adv_en;
10721     emb_sens->sig_mot = emb_func_en_a.sign_motion_en;
10722     emb_sens->fifo_compr = emb_func_en_b.fifo_compr_en;
10723 
10724   }
10725   if (ret == 0) {
10726     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
10727   }
10728 
10729   return ret;
10730 }
10731 
10732 /**
10733   * @brief  turn off all embedded functions.[get]
10734   *
10735   * @param  ctx      read / write interface definitions
10736   * @param  val      get the values of registers
10737   *                  EMB_FUNC_EN_A e EMB_FUNC_EN_B.
10738   *
10739   */
10740 int32_t lsm6dso_embedded_sens_off(lsm6dso_ctx_t *ctx)
10741 {
10742   lsm6dso_emb_func_en_a_t emb_func_en_a;
10743   lsm6dso_emb_func_en_b_t emb_func_en_b;
10744   int32_t ret;
10745 
10746   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
10747   if (ret == 0) {
10748     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
10749                             (uint8_t*)&emb_func_en_a, 1);
10750   }
10751   if (ret == 0) {
10752     ret = lsm6dso_read_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10753                            (uint8_t*)&emb_func_en_b, 1);
10754 
10755     emb_func_en_b.fsm_en = PROPERTY_DISABLE;
10756     emb_func_en_a.tilt_en = PROPERTY_DISABLE;
10757     emb_func_en_a.pedo_en = PROPERTY_DISABLE;
10758     emb_func_en_b.pedo_adv_en = PROPERTY_DISABLE;
10759     emb_func_en_a.sign_motion_en = PROPERTY_DISABLE;
10760     emb_func_en_b.fifo_compr_en = PROPERTY_DISABLE;
10761 
10762   }
10763   if (ret == 0) {
10764     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_A,
10765                             (uint8_t*)&emb_func_en_a, 1);
10766   }
10767   if (ret == 0) {
10768     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_EN_B,
10769                             (uint8_t*)&emb_func_en_b, 1);
10770   }
10771   if (ret == 0) {
10772     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
10773   }
10774 
10775   return ret;
10776 }
10777 
10778 /**
10779   * @}
10780   *
10781   */
10782 
10783 /**
10784   * @}
10785   *
10786   */
10787 
10788 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/