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

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


The following commit(s) were added to refs/heads/releases/13.1 by this push:
     new bd197918a1f risc-v/espressif: Fix I2C polling wait timeout comparison.
bd197918a1f is described below

commit bd197918a1f3993bdc866a3189cb2d7eddcf47ba
Author: Aurora-QIU0 <[email protected]>
AuthorDate: Thu Sep 17 12:20:26 2026 +0800

    risc-v/espressif: Fix I2C polling wait timeout comparison.
    
    clock_t is an unsigned type unless CONFIG_SYSTEM_TIME64 is selected, as
    documented in sys/types.h.  The difference in
    
        while (current - timeout < 0 && priv->error == 0)
    
    therefore underflows to a large positive value instead of being
    negative, the comparison is always false, and the loop body never runs.
    status keeps its initial value of zero and the function returns OK
    without having waited for the transfer at all.
    
    Because the polling path reports completion immediately, every transfer
    looks successful: no timeout is ever raised and register reads return
    whatever the RX FIFO happens to contain.  The function is compiled in
    under CONFIG_I2C_POLLED, which boards use when the I2C interrupt is not
    wired up.
    
    Cast the difference to int32_t to get the intended signed comparison.
    The result also stays correct across the counter wrap, as long as the
    timeout is shorter than the counter range, which SEC2TICK(10) satisfies.
    
    Since this file is modified by this commit, the pre-existing nxstyle
    violations reported by the check job are fixed as well, as asked in
    CONTRIBUTING.md section 2.1 (adapt all modified files even if you did
    not introduce the problem yourself):
    
    * esp_i2c.c:1267      - statement over-indented inside its enclosing
                            block (8 spaces where the block body is at 6)
    * esp_i2c.c:1303      - missing blank line after declarations
    * esp_i2c.c:1592      - missing blank line after declarations
    * esp_i2c.c:1710-1725 - 'case'/'default' labels inside switch(port)
                            sat at the same indent as the brace opening
                            the switch body; they belong one level further
                            in, with the case logic one more level in from
                            the label
    
    Assisted-by: WorkBuddy:DeepSeek-V4.1-Flash
    Signed-off-by: Aurora-QIU0 <[email protected]>
---
 arch/risc-v/src/common/espressif/esp_i2c.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/risc-v/src/common/espressif/esp_i2c.c 
b/arch/risc-v/src/common/espressif/esp_i2c.c
index 6b9194473d7..6bbec4726d7 100644
--- a/arch/risc-v/src/common/espressif/esp_i2c.c
+++ b/arch/risc-v/src/common/espressif/esp_i2c.c
@@ -1064,7 +1064,7 @@ static int esp_i2c_polling_waitdone(struct esp_i2c_priv_s 
*priv)
    * and an error didn't occur within the timeout
    */
 
-  while (current - timeout < 0 && priv->error == 0)
+  while ((int32_t)(current - timeout) < 0 && priv->error == 0)
     {
       /* Check if any interrupt triggered, clear them
        * process the operation.

Reply via email to