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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3

Files at this revision

API Documentation at this revision

Comitter:
cparata
Date:
Mon Jun 03 09:16:08 2019 +0000
Parent:
1:888ac5f8d970
Child:
3:4274d9103f1d
Commit message:
Disable by default I3C

Changed in this revision

LSM6DSOSensor.cpp Show annotated file Show diff for this revision Revisions of this file
lsm6dso_reg.c Show annotated file Show diff for this revision Revisions of this file
lsm6dso_reg.h Show annotated file Show diff for this revision Revisions of this file
--- a/LSM6DSOSensor.cpp	Wed Mar 06 12:37:22 2019 +0000
+++ b/LSM6DSOSensor.cpp	Mon Jun 03 09:16:08 2019 +0000
@@ -100,6 +100,12 @@
  */
 int LSM6DSOSensor::init(void *init)
 {
+  /* Disable I3C */
+  if (lsm6dso_i3c_disable_set(&_reg_ctx, LSM6DSO_I3C_DISABLE) != 0)
+  {
+    return 1;
+  }
+
   /* Enable register address automatically incremented during a multiple byte
   access with a serial interface. */
   if (lsm6dso_auto_increment_set(&_reg_ctx, PROPERTY_ENABLE) != 0)
--- a/lsm6dso_reg.c	Wed Mar 06 12:37:22 2019 +0000
+++ b/lsm6dso_reg.c	Mon Jun 03 09:16:08 2019 +0000
@@ -100,59 +100,59 @@
   * @{
   *
 */
-float lsm6dso_from_fs2_to_mg(int16_t lsb)
-{
-  return ((float)lsb) * 0.061f;
-}
-
-float lsm6dso_from_fs4_to_mg(int16_t lsb)
-{
-  return ((float)lsb) * 0.122f;
-}
-
-float lsm6dso_from_fs8_to_mg(int16_t lsb)
-{
-  return ((float)lsb) * 0.244f;
-}
-
-float lsm6dso_from_fs16_to_mg(int16_t lsb)
-{
-  return ((float)lsb) *0.488f;
-}
-
-float lsm6dso_from_fs125_to_mdps(int16_t lsb)
-{
-  return ((float)lsb) *4.375f;
-}
-
-float lsm6dso_from_fs500_to_mdps(int16_t lsb)
-{
-  return ((float)lsb) *1.750f;
-}
-
-float lsm6dso_from_fs250_to_mdps(int16_t lsb)
-{
-  return ((float)lsb) *0.875f;
-}
-
-float lsm6dso_from_fs1000_to_mdps(int16_t lsb)
-{
-  return ((float)lsb) *0.035f;
-}
-
-float lsm6dso_from_fs2000_to_mdps(int16_t lsb)
-{
-  return ((float)lsb) *0.070f;
-}
-
-float lsm6dso_from_lsb_to_celsius(int16_t lsb)
-{
-  return (((float)lsb / 256.0f) + 25.0f);
-}
-
-float lsm6dso_from_lsb_to_nsec(int16_t lsb)
-{
-  return ((float)lsb * 25000.0f);
+float_t lsm6dso_from_fs2_to_mg(int16_t lsb)
+{
+  return ((float_t)lsb) * 0.061f;
+}
+
+float_t lsm6dso_from_fs4_to_mg(int16_t lsb)
+{
+  return ((float_t)lsb) * 0.122f;
+}
+
+float_t lsm6dso_from_fs8_to_mg(int16_t lsb)
+{
+  return ((float_t)lsb) * 0.244f;
+}
+
+float_t lsm6dso_from_fs16_to_mg(int16_t lsb)
+{
+  return ((float_t)lsb) *0.488f;
+}
+
+float_t lsm6dso_from_fs125_to_mdps(int16_t lsb)
+{
+  return ((float_t)lsb) *4.375f;
+}
+
+float_t lsm6dso_from_fs500_to_mdps(int16_t lsb)
+{
+  return ((float_t)lsb) *17.50f;
+}
+
+float_t lsm6dso_from_fs250_to_mdps(int16_t lsb)
+{
+  return ((float_t)lsb) *8.750f;
+}
+
+float_t lsm6dso_from_fs1000_to_mdps(int16_t lsb)
+{
+  return ((float_t)lsb) *35.0f;
+}
+
+float_t lsm6dso_from_fs2000_to_mdps(int16_t lsb)
+{
+  return ((float_t)lsb) *70.0f;
+}
+
+float_t lsm6dso_from_lsb_to_celsius(int16_t lsb)
+{
+  return (((float_t)lsb / 256.0f) + 25.0f);
+}
+
+float_t lsm6dso_from_lsb_to_nsec(int16_t lsb)
+{
+  return ((float_t)lsb * 25000.0f);
 }
 
 /**
@@ -1275,7 +1275,7 @@
   }
 
   if (ret == 0) {
-    page_sel.page_sel = (((uint8_t)address >> 8) & 0x0FU);
+    page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
     page_sel.not_used_01 = 1;
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
@@ -1316,12 +1316,11 @@
   lsm6dso_page_rw_t page_rw;
   lsm6dso_page_sel_t page_sel;
   lsm6dso_page_address_t  page_address;
-  int32_t ret;
-  uint8_t msb, lsb;
+  uint16_t addr_pointed;
+  int32_t ret;
   uint8_t i ;
 
-  msb = (((uint8_t)address >> 8) & 0x0fU);
-  lsb = (uint8_t)address & 0xFFU;
+  addr_pointed = address;
 
   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
   if (ret == 0) {
@@ -1336,29 +1335,25 @@
     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
   if (ret == 0) {
-    page_sel.page_sel = msb;
+    page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
     page_sel.not_used_01 = 1;
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
   if (ret == 0) {
-    page_address.page_addr = lsb;
+    page_address.page_addr = (uint8_t)(addr_pointed & 0x00FFU);
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_ADDRESS,
                             (uint8_t*)&page_address, 1);
   }
 
   if (ret == 0) {
-
-    for (i = 0; ( (i < len) && (ret == 0) ); i++)
-    {
+    for (i = 0; ( (i < len) && (ret == 0) ); i++) {
       ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_VALUE, &buf[i], 1);
-
+      addr_pointed++;
       /* Check if page wrap */
-      if ( (lsb == 0x00U) && (ret == 0) ) {
-        lsb++;
-        msb++;
+      if ( ( (addr_pointed % 0x0100U) == 0x00U ) && (ret == 0) ) {
         ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*)&page_sel, 1);
         if (ret == 0) {
-          page_sel.page_sel = msb;
+          page_sel.page_sel = ((uint8_t)(addr_pointed >> 8) & 0x0FU);
           page_sel.not_used_01 = 1;
           ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL,
                                   (uint8_t*)&page_sel, 1);
@@ -1370,16 +1365,13 @@
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
   if (ret == 0) {
-
     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
   }
   if (ret == 0) {
     page_rw.page_rw = 0x00; /* page_write disable */
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_RW, (uint8_t*) &page_rw, 1);
   }
-
-  if (ret == 0) {
-
+  if (ret == 0) {
     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
   }
   return ret;
@@ -1415,7 +1407,7 @@
     ret = lsm6dso_read_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
   if (ret == 0) {
-    page_sel.page_sel = (((uint8_t)address >> 8) & 0x0FU);
+    page_sel.page_sel = ((uint8_t)(address >> 8) & 0x0FU);
     page_sel.not_used_01 = 1;
     ret = lsm6dso_write_reg(ctx, LSM6DSO_PAGE_SEL, (uint8_t*) &page_sel, 1);
   }
@@ -3514,6 +3506,7 @@
 int32_t lsm6dso_pin_int1_route_set(lsm6dso_ctx_t *ctx,
                                    lsm6dso_pin_int1_route_t *val)
 {
+  lsm6dso_pin_int2_route_t pin_int2_route;
   lsm6dso_tap_cfg2_t tap_cfg2;
   int32_t ret;
 
@@ -3533,27 +3526,28 @@
   if (ret == 0) {
     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
   }
-  if (ret == 0) {
-    if ( (val->emb_func_int1.int1_fsm_lc |
-          val->emb_func_int1.int1_sig_mot |
-          val->emb_func_int1.int1_step_detector |
-          val->emb_func_int1.int1_tilt |
-          val->fsm_int1_a.int1_fsm1 |
-          val->fsm_int1_a.int1_fsm2 |
-          val->fsm_int1_a.int1_fsm3 |
-          val->fsm_int1_a.int1_fsm4 |
-          val->fsm_int1_a.int1_fsm5 |
-          val->fsm_int1_a.int1_fsm6 |
-          val->fsm_int1_a.int1_fsm7 |
-          val->fsm_int1_a.int1_fsm8 |
-          val->fsm_int1_b.int1_fsm9 |
-          val->fsm_int1_b.int1_fsm10 |
-          val->fsm_int1_b.int1_fsm11 |
-          val->fsm_int1_b.int1_fsm12 |
-          val->fsm_int1_b.int1_fsm13 |
-          val->fsm_int1_b.int1_fsm14 |
-          val->fsm_int1_b.int1_fsm15 |
-          val->fsm_int1_b.int1_fsm16) != PROPERTY_DISABLE  ){
+
+  if (ret == 0) {
+    if ( ( val->emb_func_int1.int1_fsm_lc
+         | val->emb_func_int1.int1_sig_mot
+         | val->emb_func_int1.int1_step_detector
+         | val->emb_func_int1.int1_tilt
+         | val->fsm_int1_a.int1_fsm1
+         | val->fsm_int1_a.int1_fsm2
+         | val->fsm_int1_a.int1_fsm3
+         | val->fsm_int1_a.int1_fsm4
+         | val->fsm_int1_a.int1_fsm5
+         | val->fsm_int1_a.int1_fsm6
+         | val->fsm_int1_a.int1_fsm7
+         | val->fsm_int1_a.int1_fsm8
+         | val->fsm_int1_b.int1_fsm9
+         | val->fsm_int1_b.int1_fsm10
+         | val->fsm_int1_b.int1_fsm11
+         | val->fsm_int1_b.int1_fsm12
+         | val->fsm_int1_b.int1_fsm13
+         | val->fsm_int1_b.int1_fsm14
+         | val->fsm_int1_b.int1_fsm15
+         | val->fsm_int1_b.int1_fsm16) != PROPERTY_DISABLE){
       val->md1_cfg.int1_emb_func = PROPERTY_ENABLE;
     }
     else{
@@ -3568,23 +3562,38 @@
   if (ret == 0) {
     ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
   }
-  if (ret == 0) {
-
-    if ( (val->int1_ctrl.den_drdy_flag |
-        val->int1_ctrl.int1_boot |
-        val->int1_ctrl.int1_cnt_bdr |
-        val->int1_ctrl.int1_drdy_g |
-        val->int1_ctrl.int1_drdy_xl |
-        val->int1_ctrl.int1_fifo_full |
-        val->int1_ctrl.int1_fifo_ovr |
-        val->int1_ctrl.int1_fifo_th |
-        val->md1_cfg.int1_6d |
-        val->md1_cfg.int1_double_tap|
-        val->md1_cfg.int1_ff |
-        val->md1_cfg.int1_wu |
-        val->md1_cfg.int1_single_tap |
-        val->md1_cfg.int1_sleep_change) != PROPERTY_DISABLE)
-    {
+
+  if (ret == 0) {
+    ret = lsm6dso_pin_int2_route_get(ctx, &pin_int2_route);
+  }
+  if (ret == 0) {
+    if ( ( pin_int2_route.int2_ctrl.int2_cnt_bdr
+         | pin_int2_route.int2_ctrl.int2_drdy_g
+         | pin_int2_route.int2_ctrl.int2_drdy_temp
+         | pin_int2_route.int2_ctrl.int2_drdy_xl
+         | pin_int2_route.int2_ctrl.int2_fifo_full
+         | pin_int2_route.int2_ctrl.int2_fifo_ovr
+         | pin_int2_route.int2_ctrl.int2_fifo_th
+         | pin_int2_route.md2_cfg.int2_6d
+         | pin_int2_route.md2_cfg.int2_double_tap
+         | pin_int2_route.md2_cfg.int2_ff
+         | pin_int2_route.md2_cfg.int2_wu
+         | pin_int2_route.md2_cfg.int2_single_tap
+         | pin_int2_route.md2_cfg.int2_sleep_change
+         | val->int1_ctrl.den_drdy_flag
+         | val->int1_ctrl.int1_boot
+         | val->int1_ctrl.int1_cnt_bdr
+         | val->int1_ctrl.int1_drdy_g
+         | val->int1_ctrl.int1_drdy_xl
+         | val->int1_ctrl.int1_fifo_full
+         | val->int1_ctrl.int1_fifo_ovr
+         | val->int1_ctrl.int1_fifo_th
+         | val->md1_cfg.int1_6d
+         | val->md1_cfg.int1_double_tap
+         | val->md1_cfg.int1_ff
+         | val->md1_cfg.int1_wu
+         | val->md1_cfg.int1_single_tap
+         | val->md1_cfg.int1_sleep_change) != PROPERTY_DISABLE) {
       tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
     }
     else{
@@ -3647,6 +3656,7 @@
 int32_t lsm6dso_pin_int2_route_set(lsm6dso_ctx_t *ctx,
                                    lsm6dso_pin_int2_route_t *val)
 {
+  lsm6dso_pin_int1_route_t pin_int1_route;
   lsm6dso_tap_cfg2_t tap_cfg2;
   int32_t ret;
 
@@ -3666,28 +3676,28 @@
   if (ret == 0) {
     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
   }
+
   if (ret == 0) {
     if (( val->emb_func_int2.int2_fsm_lc
-         | val->emb_func_int2.int2_sig_mot
-         | val->emb_func_int2.int2_step_detector
-         | val->emb_func_int2.int2_tilt
-         | val->fsm_int2_a.int2_fsm1
-         | val->fsm_int2_a.int2_fsm2
-         | val->fsm_int2_a.int2_fsm3
-         | val->fsm_int2_a.int2_fsm4
-         | val->fsm_int2_a.int2_fsm5
-         | val->fsm_int2_a.int2_fsm6
-         | val->fsm_int2_a.int2_fsm7
-         | val->fsm_int2_a.int2_fsm8
-         | val->fsm_int2_b.int2_fsm9
-         | val->fsm_int2_b.int2_fsm10
-         | val->fsm_int2_b.int2_fsm11
-         | val->fsm_int2_b.int2_fsm12
-         | val->fsm_int2_b.int2_fsm13
-         | val->fsm_int2_b.int2_fsm14
-         | val->fsm_int2_b.int2_fsm15
-         | val->fsm_int2_b.int2_fsm16 )!= PROPERTY_DISABLE)
-    {
+        | val->emb_func_int2.int2_sig_mot
+        | val->emb_func_int2.int2_step_detector
+        | val->emb_func_int2.int2_tilt
+        | val->fsm_int2_a.int2_fsm1
+        | val->fsm_int2_a.int2_fsm2
+        | val->fsm_int2_a.int2_fsm3
+        | val->fsm_int2_a.int2_fsm4
+        | val->fsm_int2_a.int2_fsm5
+        | val->fsm_int2_a.int2_fsm6
+        | val->fsm_int2_a.int2_fsm7
+        | val->fsm_int2_a.int2_fsm8
+        | val->fsm_int2_b.int2_fsm9
+        | val->fsm_int2_b.int2_fsm10
+        | val->fsm_int2_b.int2_fsm11
+        | val->fsm_int2_b.int2_fsm12
+        | val->fsm_int2_b.int2_fsm13
+        | val->fsm_int2_b.int2_fsm14
+        | val->fsm_int2_b.int2_fsm15
+        | val->fsm_int2_b.int2_fsm16 )!= PROPERTY_DISABLE ){
       val->md2_cfg.int2_emb_func = PROPERTY_ENABLE;
     }
     else{
@@ -3702,6 +3712,11 @@
   if (ret == 0) {
     ret = lsm6dso_read_reg(ctx, LSM6DSO_TAP_CFG2, (uint8_t*) &tap_cfg2, 1);
   }
+
+  if (ret == 0) {
+    ret = lsm6dso_pin_int1_route_get(ctx, &pin_int1_route);
+  }
+
   if (ret == 0) {
     if ( ( val->int2_ctrl.int2_cnt_bdr
          | val->int2_ctrl.int2_drdy_g
@@ -3712,9 +3727,24 @@
          | val->int2_ctrl.int2_fifo_th
          | val->md2_cfg.int2_6d
          | val->md2_cfg.int2_double_tap
-         | val->md2_cfg.int2_ff | val->md2_cfg.int2_wu
+         | val->md2_cfg.int2_ff
+         | val->md2_cfg.int2_wu
          | val->md2_cfg.int2_single_tap
-         | val->md2_cfg.int2_sleep_change) != PROPERTY_DISABLE ){
+         | val->md2_cfg.int2_sleep_change
+         | pin_int1_route.int1_ctrl.den_drdy_flag
+         | pin_int1_route.int1_ctrl.int1_boot
+         | pin_int1_route.int1_ctrl.int1_cnt_bdr
+         | pin_int1_route.int1_ctrl.int1_drdy_g
+         | pin_int1_route.int1_ctrl.int1_drdy_xl
+         | pin_int1_route.int1_ctrl.int1_fifo_full
+         | pin_int1_route.int1_ctrl.int1_fifo_ovr
+         | pin_int1_route.int1_ctrl.int1_fifo_th
+         | pin_int1_route.md1_cfg.int1_6d
+         | pin_int1_route.md1_cfg.int1_double_tap
+         | pin_int1_route.md1_cfg.int1_ff
+         | pin_int1_route.md1_cfg.int1_wu
+         | pin_int1_route.md1_cfg.int1_single_tap
+         | pin_int1_route.md1_cfg.int1_sleep_change ) != PROPERTY_DISABLE) {
       tap_cfg2.interrupts_enable = PROPERTY_ENABLE;
     }
     else{
@@ -7689,21 +7719,21 @@
   }
   if (ret == 0) {
     if ( (val->fsm_enable_a.fsm1_en   |
-         val->fsm_enable_a.fsm2_en  |
-         val->fsm_enable_a.fsm3_en  |
-         val->fsm_enable_a.fsm4_en  |
-         val->fsm_enable_a.fsm5_en  |
-         val->fsm_enable_a.fsm6_en  |
-         val->fsm_enable_a.fsm7_en  |
-         val->fsm_enable_a.fsm8_en  |
-         val->fsm_enable_b.fsm9_en  |
-         val->fsm_enable_b.fsm10_en  |
-         val->fsm_enable_b.fsm11_en  |
-         val->fsm_enable_b.fsm12_en  |
-         val->fsm_enable_b.fsm13_en  |
-         val->fsm_enable_b.fsm14_en  |
-         val->fsm_enable_b.fsm15_en  |
-         val->fsm_enable_b.fsm16_en  )
+          val->fsm_enable_a.fsm2_en   |
+          val->fsm_enable_a.fsm3_en   |
+          val->fsm_enable_a.fsm4_en   |
+          val->fsm_enable_a.fsm5_en   |
+          val->fsm_enable_a.fsm6_en   |
+          val->fsm_enable_a.fsm7_en   |
+          val->fsm_enable_a.fsm8_en   |
+          val->fsm_enable_b.fsm9_en   |
+          val->fsm_enable_b.fsm10_en  |
+          val->fsm_enable_b.fsm11_en  |
+          val->fsm_enable_b.fsm12_en  |
+          val->fsm_enable_b.fsm13_en  |
+          val->fsm_enable_b.fsm14_en  |
+          val->fsm_enable_b.fsm15_en  |
+          val->fsm_enable_b.fsm16_en  )
         != PROPERTY_DISABLE)
     {
       reg.fsm_en = PROPERTY_ENABLE;
@@ -7874,7 +7904,7 @@
 
   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_EMBEDDED_FUNC_BANK);
   if (ret == 0) {
-    ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_OUTS1, (uint8_t*) &val, 16);
+    ret = lsm6dso_read_reg(ctx, LSM6DSO_FSM_OUTS1, (uint8_t*)val, 16);
   }
   if (ret == 0) {
     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
@@ -7902,7 +7932,7 @@
   }
   if (ret == 0) {
     reg.not_used_01 = 3; /* set default values */
-    reg.not_used_02 = 1; /* set default values */
+    reg.not_used_02 = 2; /* set default values */
     reg.fsm_odr = (uint8_t)val;
     ret = lsm6dso_write_reg(ctx, LSM6DSO_EMB_FUNC_ODR_CFG_B,
                             (uint8_t*)&reg, 1);
@@ -7944,12 +7974,6 @@
       case LSM6DSO_ODR_FSM_104Hz:
         *val = LSM6DSO_ODR_FSM_104Hz;
         break;
-      case LSM6DSO_ODR_FSM_208Hz:
-        *val = LSM6DSO_ODR_FSM_208Hz;
-        break;
-      case LSM6DSO_ODR_FSM_416Hz:
-        *val = LSM6DSO_ODR_FSM_416Hz;
-        break;
       default:
         *val = LSM6DSO_ODR_FSM_12Hz5;
         break;
@@ -8017,20 +8041,21 @@
   *         the FSM generates an interrupt.[set]
   *
   * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that contains data to write
-  *
-  */
-int32_t lsm6dso_long_cnt_int_value_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-  uint8_t index;
-
-  index = 0x00U;
-  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &buff[index]);
-  if (ret == 0) {
-    index++;
-    ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H,
-                                   &buff[index]);
+  * @param  val      the value of long counter
+  *
+  */
+int32_t lsm6dso_long_cnt_int_value_set(lsm6dso_ctx_t *ctx, uint16_t val)
+{
+  int32_t ret;
+  uint8_t add_l;
+  uint8_t add_h;
+
+  add_h = (uint8_t)( ( val & 0xFF00U ) >> 8 );
+  add_l = (uint8_t)( val & 0x00FFU );
+
+  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &add_l);
+  if (ret == 0) {
+    ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H, &add_h);
   }
 
   return ret;
@@ -8042,21 +8067,22 @@
   *         When the long counter value reached this value,
   *         the FSM generates an interrupt.[get]
   *
-  * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that stores data read
-  *
-  */
-int32_t lsm6dso_long_cnt_int_value_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-  uint8_t index;
-
-  index = 0x00U;
-  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &buff[index]);
-  if (ret == 0) {
-    index++;
-    ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H,
-                                  &buff[index]);
+  * @param  ctx     read / write interface definitions
+  * @param  val     buffer that stores the value of long counter
+  *
+  */
+int32_t lsm6dso_long_cnt_int_value_get(lsm6dso_ctx_t *ctx, uint16_t *val)
+{
+  int32_t ret;
+  uint8_t add_l;
+  uint8_t add_h;
+
+  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_L, &add_l);
+  if (ret == 0) {
+    ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_LC_TIMEOUT_H, &add_h);
+    *val = add_h;
+    *val = *val << 8;
+    *val += add_l;
   }
 
   return ret;
@@ -8066,14 +8092,14 @@
   * @brief  FSM number of programs register.[set]
   *
   * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that contains data to write
-  *
-  */
-int32_t lsm6dso_fsm_number_of_programs_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-
-  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_PROGRAMS, buff);
+  * @param  val      value to write
+  *
+  */
+int32_t lsm6dso_fsm_number_of_programs_set(lsm6dso_ctx_t *ctx, uint8_t val)
+{
+  int32_t ret;
+
+  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_PROGRAMS, &val);
 
   return ret;
 }
@@ -8082,14 +8108,14 @@
   * @brief  FSM number of programs register.[get]
   *
   * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that stores data read
-  *
-  */
-int32_t lsm6dso_fsm_number_of_programs_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-
-  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_PROGRAMS, buff);
+  * @param  val      buffer that stores data read.
+  *
+  */
+int32_t lsm6dso_fsm_number_of_programs_get(lsm6dso_ctx_t *ctx, uint8_t *val)
+{
+  int32_t ret;
+
+  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_PROGRAMS, val);
 
   return ret;
 }
@@ -8099,20 +8125,21 @@
   *         First available address is 0x033C.[set]
   *
   * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that contains data to write
-  *
-  */
-int32_t lsm6dso_fsm_start_address_set(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-  uint8_t index;
-
-  index = 0x00U;
-  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_L, &buff[index]);
-  if (ret == 0) {
-    index++;
-    ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_H,
-                                   &buff[index]);
+  * @param  val      the value of start address
+  *
+  */
+int32_t lsm6dso_fsm_start_address_set(lsm6dso_ctx_t *ctx, uint16_t val)
+{
+  int32_t ret;
+  uint8_t add_l;
+  uint8_t add_h;
+
+  add_h = (uint8_t)( ( val & 0xFF00U ) >> 8 );
+  add_l = (uint8_t)( val & 0x00FFU );
+
+  ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_L, &add_l);
+  if (ret == 0) {
+    ret = lsm6dso_ln_pg_write_byte(ctx, LSM6DSO_FSM_START_ADD_H, &add_h);
   }
   return ret;
 }
@@ -8122,19 +8149,21 @@
   *         First available address is 0x033C.[get]
   *
   * @param  ctx      read / write interface definitions
-  * @param  buff     buffer that stores data read
-  *
-  */
-int32_t lsm6dso_fsm_start_address_get(lsm6dso_ctx_t *ctx, uint8_t *buff)
-{
-  int32_t ret;
-  uint8_t index;
-
-  index = 0x00U;
-  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_L, buff);
-  if (ret == 0) {
-    index++;
-    ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_H, buff);
+  * @param  val      buffer the value of start address.
+  *
+  */
+int32_t lsm6dso_fsm_start_address_get(lsm6dso_ctx_t *ctx, uint16_t *val)
+{
+  int32_t ret;
+  uint8_t add_l;
+  uint8_t add_h;
+
+  ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_L, &add_l);
+  if (ret == 0) {
+    ret = lsm6dso_ln_pg_read_byte(ctx, LSM6DSO_FSM_START_ADD_H, &add_h);
+    *val = add_h;
+    *val = *val << 8;
+    *val += add_l;
   }
   return ret;
 }
@@ -8153,20 +8182,21 @@
 */
 
 /**
-* @brief  Sensor hub output registers.[get]
-*
-* @param  ctx      read / write interface definitions
-* @param  val      union of registers from SENSOR_HUB_1 to SENSOR_HUB_18
-*
-  */
-int32_t lsm6dso_sh_read_data_raw_get(lsm6dso_ctx_t *ctx,
-                                     lsm6dso_emb_sh_read_t *val)
+  * @brief  Sensor hub output registers.[get]
+  *
+  * @param  ctx      read / write interface definitions
+  * @param  val      values read from registers SENSOR_HUB_1 to SENSOR_HUB_18
+  * @param  len      number of consecutive register to read (max 18)
+  *
+  */
+int32_t lsm6dso_sh_read_data_raw_get(lsm6dso_ctx_t *ctx, uint8_t *val,
+                                     uint8_t len)
 {
   int32_t ret;
 
   ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_SENSOR_HUB_BANK);
   if (ret == 0) {
-    ret = lsm6dso_read_reg(ctx, LSM6DSO_SENSOR_HUB_1, (uint8_t*) val, 18U);
+    ret = lsm6dso_read_reg(ctx, LSM6DSO_SENSOR_HUB_1, (uint8_t*) val, len);
   }
   if (ret == 0) {
     ret = lsm6dso_mem_bank_set(ctx, LSM6DSO_USER_BANK);
--- a/lsm6dso_reg.h	Wed Mar 06 12:37:22 2019 +0000
+++ b/lsm6dso_reg.h	Mon Jun 03 09:16:08 2019 +0000
@@ -159,49 +159,6 @@
   *
   */
 
-/**
-  * @addtogroup  LSM6DSO_Sensitivity
-  * @brief       These macro are maintained for back compatibility.
-  *              in order to convert data into engineering units please
-  *              use functions:
-  *                -> _from_fs2_to_mg(int16_t lsb);
-  *                -> _from_fs4_to_mg(int16_t lsb);
-  *                -> _from_fs8_to_mg(int16_t lsb);
-  *                -> _from_fs16_to_mg(int16_t lsb);
-  *                -> _from_fs125_to_mdps(int16_t lsb);
-  *                -> _from_fs500_to_mdps(int16_t lsb);
-  *                -> _from_fs250_to_mdps(int16_t lsb);
-  *                -> _from_fs1000_to_mdps(int16_t lsb);
-  *                -> _from_fs2000_to_mdps(int16_t lsb);
-  *                -> _from_lsb_to_celsius(int16_t lsb);
-  *                -> _from_lsb_to_nsec(int16_t lsb);
-  *
-  *              REMOVING the MACRO you are compliant with:
-  *              MISRA-C 2012 [Dir 4.9] -> " avoid function-like macros "
-  * @{
-  *
-  */
-
-#define LSM6DSO_FROM_FS_2g_TO_mg(lsb)    (float)(lsb *  61.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_4g_TO_mg(lsb)    (float)(lsb * 122.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_8g_TO_mg(lsb)    (float)(lsb * 244.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_16g_TO_mg(lsb)   (float)(lsb * 488.0f) / 1000.0f
-
-#define LSM6DSO_FROM_FS_125dps_TO_mdps(lsb)    (float)(lsb *  4375.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_250dps_TO_mdps(lsb)    (float)(lsb *  8750.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_500dps_TO_mdps(lsb)    (float)(lsb * 17500.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_1000dps_TO_mdps(lsb)   (float)(lsb * 35000.0f) / 1000.0f
-#define LSM6DSO_FROM_FS_2000dps_TO_mdps(lsb)   (float)(lsb * 70000.0f) / 1000.0f
-
-#define LSM6DSO_FROM_LSB_TO_degC(lsb)    ((float)((int16_t)lsb>>8)*1.0f + 25.0f)
-
-#define LSM6DSO_TIMESTAMP_LSB_TO_NSEC        25000ULL
-
-/**
-  * @}
-  *
-  */
-
 #define LSM6DSO_FUNC_CFG_ACCESS              0x01U
 typedef struct {
   uint8_t not_used_01              : 6;
@@ -1048,8 +1005,8 @@
 #define LSM6DSO_EMB_FUNC_ODR_CFG_B           0x5FU
 typedef struct {
   uint8_t not_used_01              : 3;
-  uint8_t fsm_odr                  : 3;
-  uint8_t not_used_02              : 2;
+  uint8_t fsm_odr                  : 2;
+  uint8_t not_used_02              : 3;
 } lsm6dso_emb_func_odr_cfg_b_t;
 
 #define LSM6DSO_STEP_COUNTER_L               0x62U
@@ -1449,6 +1406,8 @@
   uint8_t wr_once_done             : 1;
 } lsm6dso_status_master_t;
 
+#define LSM6DSO_START_FSM_ADD                0x0400U
+
 /**
   * @defgroup LSM6DSO_Register_Union
   * @brief    This union group all the registers that has a bitfield
@@ -1596,17 +1555,17 @@
 int32_t lsm6dso_write_reg(lsm6dso_ctx_t *ctx, uint8_t reg, uint8_t* data,
                           uint16_t len);
 
-extern float lsm6dso_from_fs2_to_mg(int16_t lsb);
-extern float lsm6dso_from_fs4_to_mg(int16_t lsb);
-extern float lsm6dso_from_fs8_to_mg(int16_t lsb);
-extern float lsm6dso_from_fs16_to_mg(int16_t lsb);
-extern float lsm6dso_from_fs125_to_mdps(int16_t lsb);
-extern float lsm6dso_from_fs500_to_mdps(int16_t lsb);
-extern float lsm6dso_from_fs250_to_mdps(int16_t lsb);
-extern float lsm6dso_from_fs1000_to_mdps(int16_t lsb);
-extern float lsm6dso_from_fs2000_to_mdps(int16_t lsb);
-extern float lsm6dso_from_lsb_to_celsius(int16_t lsb);
-extern float lsm6dso_from_lsb_to_nsec(int16_t lsb);
+extern float_t lsm6dso_from_fs2_to_mg(int16_t lsb);
+extern float_t lsm6dso_from_fs4_to_mg(int16_t lsb);
+extern float_t lsm6dso_from_fs8_to_mg(int16_t lsb);
+extern float_t lsm6dso_from_fs16_to_mg(int16_t lsb);
+extern float_t lsm6dso_from_fs125_to_mdps(int16_t lsb);
+extern float_t lsm6dso_from_fs500_to_mdps(int16_t lsb);
+extern float_t lsm6dso_from_fs250_to_mdps(int16_t lsb);
+extern float_t lsm6dso_from_fs1000_to_mdps(int16_t lsb);
+extern float_t lsm6dso_from_fs2000_to_mdps(int16_t lsb);
+extern float_t lsm6dso_from_lsb_to_celsius(int16_t lsb);
+extern float_t lsm6dso_from_lsb_to_nsec(int16_t lsb);
 
 typedef enum {
   LSM6DSO_2g   = 0,
@@ -1825,10 +1784,10 @@
   LSM6DSO_VERY_LIGHT   = 1,
   LSM6DSO_LIGHT        = 2,
   LSM6DSO_MEDIUM       = 3,
-  LSM6DSO_STRONG       = 4,
-  LSM6DSO_VERY_STRONG  = 5,
-  LSM6DSO_AGGRESSIVE   = 6,
-  LSM6DSO_XTREME       = 7,
+  LSM6DSO_STRONG       = 4, /* not available for data rate > 1k670Hz */
+  LSM6DSO_VERY_STRONG  = 5, /* not available for data rate > 1k670Hz */
+  LSM6DSO_AGGRESSIVE   = 6, /* not available for data rate > 1k670Hz */
+  LSM6DSO_XTREME       = 7, /* not available for data rate > 1k670Hz */
 } lsm6dso_ftype_t;
 int32_t lsm6dso_gy_lp1_bandwidth_set(lsm6dso_ctx_t *ctx,
                                      lsm6dso_ftype_t val);
@@ -2077,11 +2036,11 @@
                                   lsm6dso_i2c_disable_t *val);
 
 typedef enum {
-  LSM6DSO_I3C_DISABLE         = 0x00,
-  LSM6DSO_I3C_ENABLE_T_50us   = 0x80,
-  LSM6DSO_I3C_ENABLE_T_2us    = 0x81,
-  LSM6DSO_I3C_ENABLE_T_1ms    = 0x82,
-  LSM6DSO_I3C_ENABLE_T_25ms   = 0x83,
+  LSM6DSO_I3C_DISABLE         = 0x80,
+  LSM6DSO_I3C_ENABLE_T_50us   = 0x00,
+  LSM6DSO_I3C_ENABLE_T_2us    = 0x01,
+  LSM6DSO_I3C_ENABLE_T_1ms    = 0x02,
+  LSM6DSO_I3C_ENABLE_T_25ms   = 0x03,
 } lsm6dso_i3c_disable_t;
 int32_t lsm6dso_i3c_disable_set(lsm6dso_ctx_t *ctx,
                                 lsm6dso_i3c_disable_t val);
@@ -2595,14 +2554,14 @@
     lsm6dso_fsm_outs6_t    fsm_outs6;
     lsm6dso_fsm_outs7_t    fsm_outs7;
     lsm6dso_fsm_outs8_t    fsm_outs8;
-    lsm6dso_fsm_outs1_t    fsm_outs9;
-    lsm6dso_fsm_outs2_t    fsm_outs10;
-    lsm6dso_fsm_outs3_t    fsm_outs11;
-    lsm6dso_fsm_outs4_t    fsm_outs12;
-    lsm6dso_fsm_outs5_t    fsm_outs13;
-    lsm6dso_fsm_outs6_t    fsm_outs14;
-    lsm6dso_fsm_outs7_t    fsm_outs15;
-    lsm6dso_fsm_outs8_t    fsm_outs16;
+    lsm6dso_fsm_outs9_t    fsm_outs9;
+    lsm6dso_fsm_outs10_t   fsm_outs10;
+    lsm6dso_fsm_outs11_t   fsm_outs11;
+    lsm6dso_fsm_outs12_t   fsm_outs12;
+    lsm6dso_fsm_outs13_t   fsm_outs13;
+    lsm6dso_fsm_outs14_t   fsm_outs14;
+    lsm6dso_fsm_outs15_t   fsm_outs15;
+    lsm6dso_fsm_outs16_t   fsm_outs16;
 } lsm6dso_fsm_out_t;
 int32_t lsm6dso_fsm_out_get(lsm6dso_ctx_t *ctx, lsm6dso_fsm_out_t *val);
 
@@ -2611,8 +2570,6 @@
   LSM6DSO_ODR_FSM_26Hz  = 1,
   LSM6DSO_ODR_FSM_52Hz  = 2,
   LSM6DSO_ODR_FSM_104Hz = 3,
-  LSM6DSO_ODR_FSM_208Hz = 4,
-  LSM6DSO_ODR_FSM_416Hz = 5,
 } lsm6dso_fsm_odr_t;
 int32_t lsm6dso_fsm_data_rate_set(lsm6dso_ctx_t *ctx, lsm6dso_fsm_odr_t val);
 int32_t lsm6dso_fsm_data_rate_get(lsm6dso_ctx_t *ctx, lsm6dso_fsm_odr_t *val);
@@ -2620,37 +2577,17 @@
 int32_t lsm6dso_fsm_init_set(lsm6dso_ctx_t *ctx, uint8_t val);
 int32_t lsm6dso_fsm_init_get(lsm6dso_ctx_t *ctx, uint8_t *val);
 
-int32_t lsm6dso_long_cnt_int_value_set(lsm6dso_ctx_t *ctx, uint8_t *buff);
-int32_t lsm6dso_long_cnt_int_value_get(lsm6dso_ctx_t *ctx, uint8_t *buff);
+int32_t lsm6dso_long_cnt_int_value_set(lsm6dso_ctx_t *ctx, uint16_t val);
+int32_t lsm6dso_long_cnt_int_value_get(lsm6dso_ctx_t *ctx, uint16_t *val);
 
-int32_t lsm6dso_fsm_number_of_programs_set(lsm6dso_ctx_t *ctx, uint8_t *buff);
-int32_t lsm6dso_fsm_number_of_programs_get(lsm6dso_ctx_t *ctx, uint8_t *buff);
-
-int32_t lsm6dso_fsm_start_address_set(lsm6dso_ctx_t *ctx, uint8_t *buff);
-int32_t lsm6dso_fsm_start_address_get(lsm6dso_ctx_t *ctx, uint8_t *buff);
+int32_t lsm6dso_fsm_number_of_programs_set(lsm6dso_ctx_t *ctx, uint8_t val);
+int32_t lsm6dso_fsm_number_of_programs_get(lsm6dso_ctx_t *ctx, uint8_t *val);
 
-typedef struct {
-    lsm6dso_sensor_hub_1_t   sh_byte_1;
-    lsm6dso_sensor_hub_2_t   sh_byte_2;
-    lsm6dso_sensor_hub_3_t   sh_byte_3;
-    lsm6dso_sensor_hub_4_t   sh_byte_4;
-    lsm6dso_sensor_hub_5_t   sh_byte_5;
-    lsm6dso_sensor_hub_6_t   sh_byte_6;
-    lsm6dso_sensor_hub_7_t   sh_byte_7;
-    lsm6dso_sensor_hub_8_t   sh_byte_8;
-    lsm6dso_sensor_hub_9_t   sh_byte_9;
-    lsm6dso_sensor_hub_10_t  sh_byte_10;
-    lsm6dso_sensor_hub_11_t  sh_byte_11;
-    lsm6dso_sensor_hub_12_t  sh_byte_12;
-    lsm6dso_sensor_hub_13_t  sh_byte_13;
-    lsm6dso_sensor_hub_14_t  sh_byte_14;
-    lsm6dso_sensor_hub_15_t  sh_byte_15;
-    lsm6dso_sensor_hub_16_t  sh_byte_16;
-    lsm6dso_sensor_hub_17_t  sh_byte_17;
-    lsm6dso_sensor_hub_18_t  sh_byte_18;
-} lsm6dso_emb_sh_read_t;
-int32_t lsm6dso_sh_read_data_raw_get(lsm6dso_ctx_t *ctx,
-                                     lsm6dso_emb_sh_read_t *val);
+int32_t lsm6dso_fsm_start_address_set(lsm6dso_ctx_t *ctx, uint16_t val);
+int32_t lsm6dso_fsm_start_address_get(lsm6dso_ctx_t *ctx, uint16_t *val);
+
+int32_t lsm6dso_sh_read_data_raw_get(lsm6dso_ctx_t *ctx, uint8_t *val,
+                                     uint8_t len);
 
 typedef enum {
   LSM6DSO_SLV_0       = 0,