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

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


The following commit(s) were added to refs/heads/master by this push:
     new e4cc7b72581 boards/esp32s3: the LSM6DS3TR-C INT1 is a level, not an 
edge
e4cc7b72581 is described below

commit e4cc7b72581d72f6a41f10f52ff6feb964cb843a
Author: Felipe Moura <[email protected]>
AuthorDate: Sat Sep 19 17:57:47 2026 -0300

    boards/esp32s3: the LSM6DS3TR-C INT1 is a level, not an edge
    
    The FIFO watermark flag is a level: it stays high until the worker
    actually drains the FIFO below the threshold.  Configuring INT1 as RISING
    made that a race the driver could lose permanently.
    
    lsm6ds3trc_interrupt() disables its IRQ on entry and re-enables it after
    the worker has run.  With an edge trigger, if the line is still high when
    the IRQ is re-enabled -- which is precisely what happens whenever a drain
    does not take the FIFO below the watermark -- there is no new low-to-high
    transition left to detect, and the line goes mute forever.  Observed as a
    board that serviced exactly one watermark after boot and then never
    again, reproducible 2 out of 2 reflashes.
    
    ONHIGH matches the physical meaning of the pin and is immune to it: a
    level trigger re-asserts on its own for as long as the condition holds,
    and the disable/enable pairing around servicing is what stops that from
    live-locking.
    
    Validated with more than 900 consecutive drains (~100 min) including real
    sleep -> GPIO-wake -> resume transitions, the exact case that used to
    wedge.
    
    Signed-off-by: Felipe Moura <[email protected]>
    Assisted-by: Claude:claude-opus-5
---
 boards/xtensa/esp32s3/common/src/esp32s3_board_lsm6ds3trc.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/boards/xtensa/esp32s3/common/src/esp32s3_board_lsm6ds3trc.c 
b/boards/xtensa/esp32s3/common/src/esp32s3_board_lsm6ds3trc.c
index f7588b99fcc..e4a0df016e3 100644
--- a/boards/xtensa/esp32s3/common/src/esp32s3_board_lsm6ds3trc.c
+++ b/boards/xtensa/esp32s3/common/src/esp32s3_board_lsm6ds3trc.c
@@ -110,13 +110,13 @@ int board_lsm6ds3trc_initialize(int devno, int busno)
     .attach = board_lsm6ds3trc_attach,
   };
 
-  /* The IMU drives INT1 push-pull, active high by default (CTRL3_C
-   * H_LACTIVE reset value) -- rising edge signals data ready. No pull
-   * needed once the sensor drives the line, but PULLDOWN gives a defined
-   * idle state before CTRL registers are written during registration.
+  /* INT1 is a level (FIFO over watermark), not a pulse -- ONHIGH, not
+   * RISING, or the disable/re-enable around servicing can miss the line
+   * already back high and never fire again. PULLDOWN just gives a defined
+   * idle state before CTRL registers are written.
    */
 
-  esp_configgpio(LSM6DS3TRC_IRQ_PIN, INPUT_FUNCTION_2 | PULLDOWN | RISING);
+  esp_configgpio(LSM6DS3TRC_IRQ_PIN, INPUT_FUNCTION_2 | PULLDOWN | ONHIGH);
 
   i2c = esp32s3_i2cbus_initialize(busno);
   if (i2c == NULL)

Reply via email to