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


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

commit 86159f3353b4013d6321a4096a7f30a896319f17
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 | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/arch/risc-v/src/common/espressif/esp_i2c.c 
b/arch/risc-v/src/common/espressif/esp_i2c.c
index 3dc652c9916..cc8a9fc4cc6 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.
@@ -1264,7 +1264,7 @@ static int esp_i2c_transfer(struct i2c_master_s *dev,
         }
 #endif
 
-        i2cinfo("Message %" PRIu8 " transfer complete.\n", priv->msgid);
+      i2cinfo("Message %" PRIu8 " transfer complete.\n", priv->msgid);
     }
 
   /* Dump the trace result */
@@ -1300,6 +1300,7 @@ static void esp_i2c_clear_bus(struct esp_i2c_priv_s *priv)
 
   clock_t start = clock_systime_ticks();
   clock_t timeout = start + MSEC2TICK(I2C_CLR_BUS_TIMEOUT_MS);
+
   while (i2c_ll_master_is_bus_clear_done(priv->ctx->dev))
     {
       if (clock_systime_ticks() >= timeout)
@@ -1589,6 +1590,7 @@ static inline void esp_i2c_process(struct esp_i2c_priv_s 
*priv,
   struct i2c_msg_s *msg = &priv->msgv[priv->msgid];
 #ifdef CONFIG_I2C_TRACE
   uint32_t status = 0;
+
   status = GET_STATUS(priv->ctx->dev);
 #endif
   /* Check for any errors */
@@ -1707,22 +1709,22 @@ struct i2c_master_s *esp_i2cbus_initialize(int port)
   switch (port)
     {
 #ifdef CONFIG_ESPRESSIF_I2C0_MASTER_MODE
-    case ESPRESSIF_I2C0:
-      priv = &esp_i2c0_priv;
-      break;
+      case ESPRESSIF_I2C0:
+        priv = &esp_i2c0_priv;
+        break;
 #endif
 #ifdef CONFIG_ESPRESSIF_I2C1_MASTER_MODE
-    case ESPRESSIF_I2C1:
-      priv = &esp_i2c1_priv;
-      break;
+      case ESPRESSIF_I2C1:
+        priv = &esp_i2c1_priv;
+        break;
 #endif
 #ifdef CONFIG_ESPRESSIF_LP_I2C0
-    case ESPRESSIF_LP_I2C0:
-      priv = &esp_lp_i2c0_priv;
-      break;
+      case ESPRESSIF_LP_I2C0:
+        priv = &esp_lp_i2c0_priv;
+        break;
 #endif
-    default:
-      return NULL;
+      default:
+        return NULL;
     }
 
   nxmutex_lock(&priv->lock);

Reply via email to