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 d87ae6beed0 risc-v/espressif: Fix I2C SCL/SDA pin attribute masks.
d87ae6beed0 is described below

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

    risc-v/espressif: Fix I2C SCL/SDA pin attribute masks.
    
    esp_i2c.c composes the pin attribute masks handed to esp_configgpio()
    using the logical OR operator instead of the bitwise OR operator:
    
        #define SCL_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
        #define SDA_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
    
    Every operand is a non-zero bit field, so the expression collapses to 1
    rather than to the intended combination.  With the encodings defined in
    esp_gpio.h the mask must be 171 (0xab):
    
        FUNCTION_2        (2 << FUNCTION_SHIFT) = 128
        INPUT_PULLUP      (INPUT | PULLUP)      = 9
        OUTPUT_OPEN_DRAIN (OUTPUT | OPEN_DRAIN) = 34
    
    Passing 1 to esp_configgpio() selects input mode only: output and
    open-drain remain disabled, the pull-up is not enabled and the function
    field does not match, so the pin falls back to plain GPIO function.  The
    I2C peripheral signal then never reaches the pads; the bus is left
    floating while the transfer state machine still reports completion.
    
    Every other pin attribute mask in this directory (esp_i2c_slave.c,
    esp_i2c_bitbang.c, esp_spi.c, esp_twai.c) already uses the bitwise
    operator for the same encodings, so esp_i2c.c was the only outlier.
    
    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 | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 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..6b9194473d7 100644
--- a/arch/risc-v/src/common/espressif/esp_i2c.c
+++ b/arch/risc-v/src/common/espressif/esp_i2c.c
@@ -156,8 +156,8 @@
 #  define LP_I2C_BUS_CLK_ATOMIC()    PERIPH_RCC_ATOMIC()
 #endif
 
-#define SCL_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
-#define SDA_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
+#define SCL_PIN_ATTR (FUNCTION_2 | INPUT_PULLUP | OUTPUT_OPEN_DRAIN)
+#define SDA_PIN_ATTR (FUNCTION_2 | INPUT_PULLUP | OUTPUT_OPEN_DRAIN)
 
 /****************************************************************************
  * Private Types
@@ -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