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

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit b8c5cf7357291daa493841d79ea0f85a88aceb5f
Author: Felipe Moura <[email protected]>
AuthorDate: Sat Aug 29 14:49:43 2026 -0300

    drivers/sensors/lsm6ds3trc: remember last ODR across activations
    
    Previously, activate() always fell back to a hardcoded ODR_52HZ (or the
    other sub-sensor's rate, in FIFO mode) whenever a sub-sensor went from
    disabled to enabled, discarding whatever rate the application had
    explicitly requested via set_interval() before disabling it. An
    application that only ever wants, say, 25Hz would see the sensor
    restart at 52Hz on every re-activation, and in FIFO mode this fills the
    FIFO faster than intended, defeating the point of choosing a lower ODR
    for power savings.
    
    Add last_odr, which -- unlike odr -- survives being disabled. activate()
    now restores it on the next enable, only falling back to ODR_52HZ on a
    sub-sensor's genuine first-ever activation.
    
    Signed-off-by: Felipe Moura <[email protected]>
---
 drivers/sensors/lsm6ds3trc_uorb.c | 39 ++++++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/drivers/sensors/lsm6ds3trc_uorb.c 
b/drivers/sensors/lsm6ds3trc_uorb.c
index b2b5317b28b..8d686dac107 100644
--- a/drivers/sensors/lsm6ds3trc_uorb.c
+++ b/drivers/sensors/lsm6ds3trc_uorb.c
@@ -174,7 +174,14 @@ struct lsm6ds3trc_sens_s
   FAR struct lsm6ds3trc_dev_s *dev;    /* Reference to parent device */
   bool enabled;                        /* If this sensor is enabled */
   enum lsm6ds3trc_odr_e odr;           /* Measurement interval of this
-                                        * sensor */
+                                        * sensor, ODR_OFF while disabled */
+  enum lsm6ds3trc_odr_e last_odr;      /* Last ODR explicitly requested
+                                        * via set_interval(), ODR_OFF if
+                                        * never -- unlike odr, this
+                                        * survives being disabled, so
+                                        * activate() can restore it on
+                                        * the next enable instead of
+                                        * resetting to a fixed default */
   int fsr;                             /* Full scale range of this sensor.
                                         * Can be from either gyro or accel
                                         * FSR enum. */
@@ -1043,15 +1050,24 @@ static int lsm6ds3trc_activate(FAR struct 
sensor_lowerhalf_s *lower,
 
       start_thread = true;
 
+      /* Restore whatever ODR was last explicitly requested for this
+       * sub-sensor (via set_interval()), if any -- ODR_52HZ only
+       * applies the first time this sub-sensor is ever activated.
+       */
+
+      odr = sens->last_odr != ODR_OFF ? sens->last_odr : ODR_52HZ;
+
 #ifdef CONFIG_SENSORS_LSM6DS3TRC_FIFO
-      /* Both sub-sensors share one FIFO write rate: join whatever the
-       * other one is already running at, if it's enabled, instead of
-       * disrupting an existing subscriber's rate.
+      /* ...but both sub-sensors share one FIFO write rate: joining
+       * whatever the other one is already running at takes priority
+       * over this sub-sensor's own remembered rate, since FIFO mode
+       * doesn't allow them to differ.
        */
 
-      odr = other->enabled ? other->odr : ODR_52HZ;
-#else
-      odr = ODR_52HZ;
+      if (other->enabled)
+        {
+          odr = other->odr;
+        }
 #endif
 
       err = is_gyro ? gyro_set_odr(dev, odr) : accel_set_odr(dev, odr);
@@ -1205,6 +1221,13 @@ static int lsm6ds3trc_set_interval(FAR struct 
sensor_lowerhalf_s *lower,
       goto early_ret;
     }
 
+  /* Remember this explicit request so activate() can restore it on the
+   * next enable, instead of resetting to a fixed default -- unlike
+   * sens->odr, this isn't touched by disabling the sensor.
+   */
+
+  sens->last_odr = odr;
+
 #ifdef CONFIG_SENSORS_LSM6DS3TRC_FIFO
   /* Both sub-sensors share one FIFO write rate -- re-pace whichever one
    * this call didn't target, if it's currently enabled, then let
@@ -1468,6 +1491,7 @@ int lsm6ds3trc_register(FAR struct i2c_master_s *i2c, 
uint8_t addr,
   priv->gyro.lower.nbuffer = CONFIG_SENSORS_LSM6DS3TRC_GYRO_ORB_BUFSIZE;
   priv->gyro.enabled = false;
   priv->gyro.odr = ODR_OFF;
+  priv->gyro.last_odr = ODR_OFF;
   priv->gyro.fsr = LSM6DS3TRC_FSR_GY_245DPS;
   priv->gyro.dev = priv;
 
@@ -1486,6 +1510,7 @@ int lsm6ds3trc_register(FAR struct i2c_master_s *i2c, 
uint8_t addr,
   priv->accel.lower.nbuffer = CONFIG_SENSORS_LSM6DS3TRC_ACCEL_ORB_BUFSIZE;
   priv->accel.enabled = false;
   priv->accel.odr = ODR_OFF;
+  priv->accel.last_odr = ODR_OFF;
   priv->accel.fsr = LSM6DS3TRC_FSR_XL_4G; /* Default 4g, per project notes */
   priv->accel.dev = priv;
 

Reply via email to