You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2019/07/25 19:05:40 UTC

[mynewt-core] branch master updated: sensors/bma253: Use FIFO mode for streaming (#1931)

This is an automated email from the ASF dual-hosted git repository.

vipulrahane pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a6aa68  sensors/bma253: Use FIFO mode for streaming (#1931)
5a6aa68 is described below

commit 5a6aa6837e8165ae6e39179118aa0d08d90d90de
Author: Vipul Rahane <vi...@apache.org>
AuthorDate: Thu Jul 25 12:05:34 2019 -0700

    sensors/bma253: Use FIFO mode for streaming (#1931)
    
    - Use FIFO mode for streaming
    - Fix timeout on reading FIFOs
    - Remove the FIFO read outer loop since bma253_read_and_handle_fifo_data() already dumps the FIFO
---
 hw/drivers/sensors/bma253/src/bma253.c | 82 +++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 40 deletions(-)

diff --git a/hw/drivers/sensors/bma253/src/bma253.c b/hw/drivers/sensors/bma253/src/bma253.c
index e97dcd4..e7cd0e8 100644
--- a/hw/drivers/sensors/bma253/src/bma253.c
+++ b/hw/drivers/sensors/bma253/src/bma253.c
@@ -3443,11 +3443,12 @@ bma253_set_fifo_cfg(const struct bma253 * bma253,
     return set_register((struct bma253 *)bma253, REG_ADDR_FIFO_CONFIG_1, data);
 }
 
-    int
-bma253_read_and_handle_fifo_data(
-        struct bma253           *bma253,
-        enum fifo_data          fifo_data,
-        struct sensor_read_ctx  *sdsi)
+int
+bma253_read_and_handle_fifo_data(struct bma253 *bma253,
+                                 enum fifo_data fifo_data,
+                                 struct sensor_read_ctx *sdsi,
+                                 os_time_t stop_ticks,
+                                 uint32_t time_ms)
 {
     int     rc;
     uint32_t i;
@@ -3457,6 +3458,7 @@ bma253_read_and_handle_fifo_data(
     uint8_t *ff_buf = bma253->pdd.fifo_buf;
     uint32_t size;
     uint32_t frm_size;
+    os_time_t curr_ticks;
 
     /* current fifo frame counter */
     uint8_t ff_frm_cnt = 0;
@@ -3518,6 +3520,12 @@ bma253_read_and_handle_fifo_data(
     }
 
     for (i = 0; i < ff_frm_cnt; i++) {
+
+        curr_ticks = os_time_get();
+        if (time_ms != 0 && OS_TIME_TICK_GT(curr_ticks, stop_ticks)) {
+            return SYS_ETIMEOUT;
+        }
+
         compute_accel_data(bma253, accel_data,
                 (frm_size >> 1),
                 ff_buf + i * frm_size,
@@ -3536,7 +3544,6 @@ bma253_read_and_handle_fifo_data(
         }
     }
 
-
     return 0;
 }
 
@@ -3722,8 +3729,13 @@ reset_and_recfg(struct bma253 * bma253)
         return rc;
     }
 
-    fifo_cfg.fifo_mode = FIFO_MODE_BYPASS;
-    fifo_cfg.fifo_data = FIFO_DATA_X_AND_Y_AND_Z;
+    if (cfg->read_mode == BMA253_READ_M_POLL) {
+        fifo_cfg.fifo_mode = FIFO_MODE_BYPASS;
+        fifo_cfg.fifo_data = FIFO_DATA_X_AND_Y_AND_Z;
+    } else {
+        fifo_cfg.fifo_mode = FIFO_MODE_FIFO;
+        fifo_cfg.fifo_data = FIFO_DATA_X_AND_Y_AND_Z;
+    }
 
     rc = bma253_set_fifo_cfg(bma253, &fifo_cfg);
     if (rc != 0) {
@@ -4498,7 +4510,6 @@ bma253_stream_read(struct sensor *sensor,
     struct int_enable int_enable = { 0 };
     os_time_t time_ticks;
     os_time_t stop_ticks;
-    os_time_t curr_ticks;
     struct bma253_private_driver_data *pdd;
 
     struct sensor_read_ctx sdsi;
@@ -4558,55 +4569,47 @@ bma253_stream_read(struct sensor *sensor,
     sdsi.user_func = read_func;
     sdsi.user_arg = read_arg;
 
-    for (;;) {
 #if MYNEWT_VAL(BMA253_INT_ENABLE)
         wait_interrupt(&bma253->intr, pdd->int_num);
         BMA253_UNUSED_VAR(cfg);
 #else
         switch (cfg->filter_bandwidth) {
-        case BMA253_FILTER_BANDWIDTH_7_81_HZ:
-            delay_msec(128);
+            case BMA253_FILTER_BANDWIDTH_7_81_HZ:
+                delay_msec(128);
             break;
-        case BMA253_FILTER_BANDWIDTH_15_63_HZ:
-            delay_msec(64);
+            case BMA253_FILTER_BANDWIDTH_15_63_HZ:
+                delay_msec(64);
             break;
-        case BMA253_FILTER_BANDWIDTH_31_25_HZ:
-            delay_msec(32);
+            case BMA253_FILTER_BANDWIDTH_31_25_HZ:
+                delay_msec(32);
             break;
-        case BMA253_FILTER_BANDWIDTH_62_5_HZ:
-            delay_msec(16);
+            case BMA253_FILTER_BANDWIDTH_62_5_HZ:
+                delay_msec(16);
             break;
-        case BMA253_FILTER_BANDWIDTH_125_HZ:
-            delay_msec(8);
+            case BMA253_FILTER_BANDWIDTH_125_HZ:
+                delay_msec(8);
             break;
-        case BMA253_FILTER_BANDWIDTH_250_HZ:
-            delay_msec(4);
+            case BMA253_FILTER_BANDWIDTH_250_HZ:
+                delay_msec(4);
             break;
-        case BMA253_FILTER_BANDWIDTH_500_HZ:
-            delay_msec(2);
+            case BMA253_FILTER_BANDWIDTH_500_HZ:
+                delay_msec(2);
             break;
-        case BMA253_FILTER_BANDWIDTH_1000_HZ:
-            delay_msec(1);
+            case BMA253_FILTER_BANDWIDTH_1000_HZ:
+                delay_msec(1);
             break;
-        default:
-            delay_msec(1000);
+            default:
+                delay_msec(1000);
             break;
-    }
+        }
 #endif
         rc = bma253_read_and_handle_fifo_data(bma253,
-                FIFO_DATA_X_AND_Y_AND_Z,
-                &sdsi);
+                 FIFO_DATA_X_AND_Y_AND_Z,
+                 &sdsi, stop_ticks, time_ms);
         if (rc != 0) {
             goto done;
         }
 
-
-        curr_ticks = os_time_get();
-        if (time_ms != 0 && OS_TIME_TICK_GT(curr_ticks, stop_ticks)) {
-            break;
-        }
-
-
         if (bma253->hw_cfg_pending) {
             rc = bma253_exec_pending_hw_cfg(bma253);
         }
@@ -4615,7 +4618,6 @@ bma253_stream_read(struct sensor *sensor,
             sensor_driver_handle_interrupt(&bma253->sensor);
         }
 
-    }
 
     rc = bma253_set_int_enable(bma253, &int_enable_org);
     if (rc != 0) {
@@ -5111,7 +5113,7 @@ sensor_driver_read(struct sensor *sensor,
     if (cfg->read_mode == BMA253_READ_M_POLL) {
         rc = bma253_poll_read(sensor, sensor_type, data_func, data_arg, timeout);
     } else {
-        fifo_cfg.fifo_mode = FIFO_MODE_STREAM;
+        fifo_cfg.fifo_mode = FIFO_MODE_FIFO;
         fifo_cfg.fifo_data = FIFO_DATA_X_AND_Y_AND_Z;
         rc = bma253_set_fifo_cfg(bma253, &fifo_cfg);
         BMA253_DRV_CHECK_RC(rc);