This is an automated email from the ASF dual-hosted git repository.
xiaoxiang 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 1519d6c80bd risc-v/espressif/i2c: Update common source code functions
1519d6c80bd is described below
commit 1519d6c80bd24ef4b8b61b7f32b047e0d9563aa8
Author: Tiago Medicci Serrano <[email protected]>
AuthorDate: Wed Sep 24 15:19:50 2025 -0300
risc-v/espressif/i2c: Update common source code functions
Updates the common source code for the I2C peripheral used by
Espressif's RISC-Vs SoCs. This enables newer SoCs to be supported
in the future while maintaining backwards compatibility.
Signed-off-by: Tiago Medicci Serrano <[email protected]>
---
arch/risc-v/src/common/espressif/Kconfig | 101 ++++++++----
arch/risc-v/src/common/espressif/esp_i2c.c | 200 ++++++++++++-----------
arch/risc-v/src/common/espressif/esp_i2c_slave.c | 89 +++++-----
arch/risc-v/src/common/espressif/esp_i2c_slave.h | 9 +-
boards/risc-v/esp32c3/common/src/esp_board_i2c.c | 6 +
boards/risc-v/esp32c6/common/src/esp_board_i2c.c | 9 +-
boards/risc-v/esp32h2/common/src/esp_board_i2c.c | 32 ++--
7 files changed, 244 insertions(+), 202 deletions(-)
diff --git a/arch/risc-v/src/common/espressif/Kconfig
b/arch/risc-v/src/common/espressif/Kconfig
index 844fd197ee3..8cd5f6f4d2f 100644
--- a/arch/risc-v/src/common/espressif/Kconfig
+++ b/arch/risc-v/src/common/espressif/Kconfig
@@ -441,40 +441,6 @@ config ESPRESSIF_LP_I2C0
select ESPRESSIF_I2C_PERIPH_MASTER_MODE
select I2C
-choice ESPRESSIF_I2C0_MODE
- prompt "I2C0 Mode"
- depends on ESPRESSIF_I2C0
- default ESPRESSIF_I2C0_MASTER_MODE
-
-config ESPRESSIF_I2C0_MASTER_MODE
- bool "I2C0 Master Mode"
- select ESPRESSIF_I2C_PERIPH_MASTER_MODE
-
-config ESPRESSIF_I2C0_SLAVE_MODE
- bool "I2C0 Slave Mode"
- select I2C_SLAVE
- select I2C_SLAVE_DRIVER
- select ESPRESSIF_I2C_PERIPH_SLAVE_MODE
-
-endchoice # ESPRESSIF_I2C0_MODE
-
-choice ESPRESSIF_I2C1_MODE
- prompt "I2C1 Mode"
- depends on ESPRESSIF_I2C1
- default ESPRESSIF_I2C1_MASTER_MODE
-
-config ESPRESSIF_I2C1_MASTER_MODE
- bool "I2C1 Master Mode"
- select ESPRESSIF_I2C_PERIPH_MASTER_MODE
-
-config ESPRESSIF_I2C1_SLAVE_MODE
- bool "I2C1 Slave Mode"
- select I2C_SLAVE
- select I2C_SLAVE_DRIVER
- select ESPRESSIF_I2C_PERIPH_SLAVE_MODE
-
-endchoice # ESPRESSIF_I2C1_MODE
-
config ESPRESSIF_I2C_BITBANG
bool "I2C Bitbang"
default n
@@ -2229,6 +2195,23 @@ menu "I2C Configuration"
if ESPRESSIF_I2C0
+choice ESPRESSIF_I2C0_MODE
+ prompt "I2C0 Mode"
+ depends on ESPRESSIF_I2C0
+ default ESPRESSIF_I2C0_MASTER_MODE
+
+config ESPRESSIF_I2C0_MASTER_MODE
+ bool "I2C0 Master Mode"
+ select ESPRESSIF_I2C_PERIPH_MASTER_MODE
+
+config ESPRESSIF_I2C0_SLAVE_MODE
+ bool "I2C0 Slave Mode"
+ select I2C_SLAVE
+ select I2C_SLAVE_DRIVER
+ select ESPRESSIF_I2C_PERIPH_SLAVE_MODE
+
+endchoice # ESPRESSIF_I2C0_MODE
+
config ESPRESSIF_I2C0_SCLPIN
int "I2C0 SCL Pin"
default 6 if !ESPRESSIF_LPI2C
@@ -2244,6 +2227,23 @@ endif # ESPRESSIF_I2C0
if ESPRESSIF_I2C1
+choice ESPRESSIF_I2C1_MODE
+ prompt "I2C1 Mode"
+ depends on ESPRESSIF_I2C1
+ default ESPRESSIF_I2C1_MASTER_MODE
+
+config ESPRESSIF_I2C1_MASTER_MODE
+ bool "I2C1 Master Mode"
+ select ESPRESSIF_I2C_PERIPH_MASTER_MODE
+
+config ESPRESSIF_I2C1_SLAVE_MODE
+ bool "I2C1 Slave Mode"
+ select I2C_SLAVE
+ select I2C_SLAVE_DRIVER
+ select ESPRESSIF_I2C_PERIPH_SLAVE_MODE
+
+endchoice # ESPRESSIF_I2C1_MODE
+
config ESPRESSIF_I2C1_SCLPIN
int "I2C1 SCL Pin"
default 2
@@ -2256,8 +2256,41 @@ config ESPRESSIF_I2C1_SDAPIN
endif # ESPRESSIF_I2C1
+if ESPRESSIF_LPI2C
+
+choice ESPRESSIF_LPI2C_MODE
+ prompt "LPI2C Mode"
+ default ESPRESSIF_LPI2C_MASTER_MODE
+
+config ESPRESSIF_LPI2C_MASTER_MODE
+ bool "I2C0 Master Mode"
+ select ESPRESSIF_I2C_PERIPH_MASTER_MODE
+
+endchoice # ESPRESSIF_LPI2C_MODE
+
+config ESPRESSIF_LPI2C_SCLPIN
+ int "LPI2C SCL Pin"
+ default 7
+ range 7 7
+
+config ESPRESSIF_LPI2C_SDAPIN
+ int "LPI2C SDA Pin"
+ default 6
+ range 6 6
+
+endif # ESPRESSIF_LPI2C
+
if ESPRESSIF_I2C_BITBANG
+choice ESPRESSIF_I2C_BITBANG_MODE
+ prompt "I2C Bitbang Mode"
+ default ESPRESSIF_I2C_BITBANG_MASTER_MODE
+
+config ESPRESSIF_I2C_BITBANG_MASTER_MODE
+ bool "I2C Bitbang Master Mode"
+
+endchoice # ESPRESSIF_I2C_BITBANG_MODE
+
config ESPRESSIF_I2C_BITBANG_SCLPIN
int "I2C Bitbang SCL Pin"
default 0
diff --git a/arch/risc-v/src/common/espressif/esp_i2c.c
b/arch/risc-v/src/common/espressif/esp_i2c.c
index ea4a8bcc2cb..1b4a4a7bee1 100644
--- a/arch/risc-v/src/common/espressif/esp_i2c.c
+++ b/arch/risc-v/src/common/espressif/esp_i2c.c
@@ -82,18 +82,6 @@
# define ESP_LP_I2C0_ID I2C_NUM_MAX
#endif
-#ifdef CONFIG_ARCH_CHIP_ESP32H2
-# define SYSTEM_I2C_EXT0_CLK_EN PCR_I2C0_CLK_EN
-# define SYSTEM_I2C_EXT0_RST PCR_I2C0_RST_EN
-# define SYSTEM_I2C_EXT1_CLK_EN PCR_I2C1_CLK_EN
-# define SYSTEM_I2C_EXT1_RST PCR_I2C1_RST_EN
-#endif
-
-#ifdef CONFIG_ARCH_CHIP_ESP32C6
-# define SYSTEM_I2C_EXT0_CLK_EN PCR_I2C_CLK_EN
-# define SYSTEM_I2C_EXT0_RST PCR_I2C_RST_EN
-#endif
-
#define GET_STATUS(hw) hw->sr.val
#define ESPRESSIF_I2CTIMEOTICKS \
@@ -147,6 +135,26 @@
#define SCL_TIMEOUT_VAL_US (CONFIG_ESPRESSIF_I2CTIMEOMS * 1000)
+#if SOC_PERIPH_CLK_CTRL_SHARED
+# define I2C_CLOCK_SRC_ATOMIC() PERIPH_RCC_ATOMIC()
+#else
+# define I2C_CLOCK_SRC_ATOMIC()
+#endif
+
+#if !SOC_RCC_IS_INDEPENDENT
+# define I2C_RCC_ATOMIC() PERIPH_RCC_ATOMIC()
+#else
+# define I2C_RCC_ATOMIC()
+#endif
+
+#if SOC_LP_I2C_SUPPORTED
+# define LP_I2C_SRC_CLK_ATOMIC() PERIPH_RCC_ATOMIC()
+# 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)
+
/****************************************************************************
* Private Types
****************************************************************************/
@@ -208,23 +216,8 @@ struct esp_trace_s
struct esp_i2c_config_s
{
uint32_t clk_freq; /* Clock frequency */
-
uint8_t scl_pin; /* GPIO configuration for SCL as SCL */
uint8_t sda_pin; /* GPIO configuration for SDA as SDA */
-
-#ifndef CONFIG_I2C_POLLED
- uint8_t periph; /* Peripheral ID */
- uint8_t irq; /* Interrupt ID */
-#endif
-
- uint32_t clk_bit; /* Clock enable bit */
- uint32_t rst_bit; /* I2C reset bit */
-
- uint32_t scl_insig; /* I2C SCL input signal index */
- uint32_t scl_outsig; /* I2C SCL output signal index */
-
- uint32_t sda_insig; /* I2C SDA input signal index */
- uint32_t sda_outsig; /* I2C SDA output signal index */
};
/* I2C Device Private Data */
@@ -239,7 +232,7 @@ struct esp_i2c_priv_s
/* Port configuration */
- const struct esp_i2c_config_s *config;
+ struct esp_i2c_config_s *config;
int refs; /* Reference count */
mutex_t lock; /* Mutual exclusion mutex */
@@ -351,21 +344,11 @@ i2c_hal_context_t i2c0_ctx =
/* I2C device structure */
-static const struct esp_i2c_config_s esp_i2c0_config =
+static struct esp_i2c_config_s esp_i2c0_config =
{
.clk_freq = I2C_CLK_FREQ_DEF,
.scl_pin = CONFIG_ESPRESSIF_I2C0_SCLPIN,
.sda_pin = CONFIG_ESPRESSIF_I2C0_SDAPIN,
-#ifndef CONFIG_I2C_POLLED
- .periph = ETS_I2C_EXT0_INTR_SOURCE,
- .irq = ESP_IRQ_I2C_EXT0,
-#endif
- .clk_bit = SYSTEM_I2C_EXT0_CLK_EN,
- .rst_bit = SYSTEM_I2C_EXT0_RST,
- .scl_insig = I2CEXT0_SCL_IN_IDX,
- .scl_outsig = I2CEXT0_SCL_OUT_IDX,
- .sda_insig = I2CEXT0_SDA_IN_IDX,
- .sda_outsig = I2CEXT0_SDA_OUT_IDX
};
static struct esp_i2c_priv_s esp_i2c0_priv =
@@ -395,7 +378,7 @@ static struct esp_i2c_priv_s esp_i2c0_priv =
#endif
#ifdef CONFIG_ESPRESSIF_I2C1_MASTER_MODE
-
+# if SOC_HP_I2C_NUM > 1
i2c_hal_context_t i2c1_ctx =
{
0
@@ -403,21 +386,11 @@ i2c_hal_context_t i2c1_ctx =
/* I2C device structure */
-static const struct esp_i2c_config_s esp_i2c1_config =
+static struct esp_i2c_config_s esp_i2c1_config =
{
.clk_freq = I2C_CLK_FREQ_DEF,
.scl_pin = CONFIG_ESPRESSIF_I2C1_SCLPIN,
.sda_pin = CONFIG_ESPRESSIF_I2C1_SDAPIN,
-#ifndef CONFIG_I2C_POLLED
- .periph = ETS_I2C_EXT1_INTR_SOURCE,
- .irq = ESP_IRQ_I2C_EXT1,
-#endif
- .clk_bit = SYSTEM_I2C_EXT1_CLK_EN,
- .rst_bit = SYSTEM_I2C_EXT1_RST,
- .scl_insig = I2CEXT1_SCL_IN_IDX,
- .scl_outsig = I2CEXT1_SCL_OUT_IDX,
- .sda_insig = I2CEXT1_SDA_IN_IDX,
- .sda_outsig = I2CEXT1_SDA_OUT_IDX
};
static struct esp_i2c_priv_s esp_i2c1_priv =
@@ -444,9 +417,13 @@ static struct esp_i2c_priv_s esp_i2c1_priv =
.clk_freq = 0,
.ctx = &i2c1_ctx
};
+# else
+# error "This device contains only a single HP I2C port."
+# endif /* SOC_HP_I2C_NUM > 0 */
#endif /* CONFIG_ESPRESSIF_I2C1 */
#ifdef CONFIG_ESPRESSIF_LP_I2C0
+# if SOC_LP_I2C_NUM > 0
i2c_hal_context_t lp_i2c0_ctx =
{
0
@@ -454,21 +431,11 @@ i2c_hal_context_t lp_i2c0_ctx =
/* I2C device structure */
-static const struct esp_i2c_config_s esp_lp_i2c0_config =
+static struct esp_i2c_config_s esp_lp_i2c0_config =
{
.clk_freq = I2C_CLK_FREQ_DEF,
.scl_pin = 7,
.sda_pin = 6,
-#ifndef CONFIG_I2C_POLLED
- .periph = ETS_LP_I2C_INTR_SOURCE,
- .irq = ESP_IRQ_LP_I2C,
-#endif
- .clk_bit = SYSTEM_I2C_EXT0_CLK_EN,
- .rst_bit = SYSTEM_I2C_EXT0_RST,
- .scl_insig = 0,
- .scl_outsig = 0,
- .sda_insig = 0,
- .sda_outsig = 0
};
static struct esp_i2c_priv_s esp_lp_i2c0_priv =
@@ -495,6 +462,9 @@ static struct esp_i2c_priv_s esp_lp_i2c0_priv =
.clk_freq = 0,
.ctx = &lp_i2c0_ctx
};
+# else
+# error "This device does not contain a LP I2C port."
+# endif /* SOC_LP_I2C_NUM > 0 */
#endif /* CONFIG_ESPRESSIF_LP_I2C0 */
/* Trace events strings */
@@ -796,16 +766,26 @@ static void esp_i2c_init_clock(struct esp_i2c_priv_s
*priv,
esp_clk_tree_src_get_freq_hz(priv->clk_src,
ESP_CLK_TREE_SRC_FREQ_PRECISION_APPROX,
&src_clk_frequency);
- i2c_hal_set_bus_timing(priv->ctx, priv->config->clk_freq,
- priv->clk_src, src_clk_frequency);
+
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_set_bus_timing(priv->ctx, priv->config->clk_freq,
+ priv->clk_src, src_clk_frequency);
+ }
+
i2c_hal_master_set_scl_timeout_val(priv->ctx, SCL_TIMEOUT_VAL_US,
src_clk_frequency);
#ifdef CONFIG_ESPRESSIF_LPI2C
- PERIPH_RCC_ATOMIC()
+ LP_I2C_SRC_CLK_ATOMIC()
{
lp_i2c_ll_set_source_clk(priv->ctx->dev, priv->clk_src);
}
+#else
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_ll_set_source_clk(priv->ctx->dev, priv->clk_src);
+ }
#endif
i2c_ll_update(priv->ctx->dev);
@@ -861,27 +841,39 @@ static void esp_i2c_init(struct esp_i2c_priv_s *priv)
if (priv->id < ESP_LP_I2C0_ID)
{
+ uint32_t scl_in_sig = i2c_periph_signal[priv->id].scl_in_sig;
+ uint32_t scl_out_sig = i2c_periph_signal[priv->id].scl_out_sig;
+ uint32_t sda_in_sig = i2c_periph_signal[priv->id].sda_in_sig;
+ uint32_t sda_out_sig = i2c_periph_signal[priv->id].sda_out_sig;
+
+ I2C_RCC_ATOMIC()
+ {
+ i2c_ll_enable_bus_clock(priv->id, true);
+ i2c_ll_reset_register(priv->id);
+ }
+
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_init(priv->ctx, priv->id);
+ }
+
/* Configure GPIO signals for I2C SCL and SDA pins */
esp_gpiowrite(config->scl_pin, 1);
esp_gpiowrite(config->sda_pin, 1);
- esp_configgpio(config->scl_pin, INPUT_PULLUP | OUTPUT_OPEN_DRAIN);
- esp_gpio_matrix_out(config->scl_pin, config->scl_outsig, 0, 0);
- esp_gpio_matrix_in(config->scl_pin, config->scl_insig, 0);
+ esp_configgpio(config->scl_pin, SCL_PIN_ATTR);
+ esp_gpio_matrix_out(config->scl_pin, scl_out_sig, 0, 0);
+ esp_gpio_matrix_in(config->scl_pin, scl_in_sig, 0);
- esp_configgpio(config->sda_pin, INPUT_PULLUP | OUTPUT_OPEN_DRAIN);
- esp_gpio_matrix_out(config->sda_pin, config->sda_outsig, 0, 0);
- esp_gpio_matrix_in(config->sda_pin, config->sda_insig, 0);
-
- /* Enable I2C hardware */
-
- periph_module_enable(priv->module);
+ esp_configgpio(config->sda_pin, SDA_PIN_ATTR);
+ esp_gpio_matrix_out(config->sda_pin, sda_out_sig, 0, 0);
+ esp_gpio_matrix_in(config->sda_pin, sda_in_sig, 0);
}
#ifdef CONFIG_ESPRESSIF_LPI2C
else
{
- PERIPH_RCC_ATOMIC()
+ LP_I2C_BUS_CLK_ATOMIC()
{
/* Enable LP I2C bus clock */
@@ -892,6 +884,11 @@ static void esp_i2c_init(struct esp_i2c_priv_s *priv)
lp_i2c_ll_reset_register(priv->id - LP_I2C_NUM_0);
}
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_init(priv->ctx, priv->id);
+ }
+
esp_lp_i2c_config_io(priv, config->scl_pin);
esp_lp_i2c_config_io(priv, config->sda_pin);
const i2c_signal_conn_t *p_i2c_pin = &i2c_periph_signal[priv->id];
@@ -907,15 +904,19 @@ static void esp_i2c_init(struct esp_i2c_priv_s *priv)
}
#endif
- i2c_hal_init(priv->ctx, priv->id);
+ /* Initialize I2C Master */
- /* Disable I2C interrupts */
+ i2c_hal_master_init(priv->ctx);
- esp_i2c_intr_disable(priv);
+ i2c_ll_update(priv->ctx->dev);
- /* Initialize I2C Master */
+ /* Initialize I2C bus clock */
- i2c_hal_master_init(priv->ctx);
+ esp_i2c_init_clock(priv, config->clk_freq);
+
+ /* Disable I2C interrupts */
+
+ esp_i2c_intr_disable(priv);
/* Configure the hardware filter function */
@@ -931,10 +932,6 @@ static void esp_i2c_init(struct esp_i2c_priv_s *priv)
i2c_ll_master_rx_full_ack_level(priv->ctx->dev, 1);
#endif
-
- /* Initialize I2C bus clock */
-
- esp_i2c_init_clock(priv, config->clk_freq);
}
/****************************************************************************
@@ -950,11 +947,17 @@ static void esp_i2c_init(struct esp_i2c_priv_s *priv)
static void esp_i2c_deinit(struct esp_i2c_priv_s *priv)
{
- const struct esp_i2c_config_s *config = priv->config;
-
priv->clk_freq = 0;
- i2c_hal_deinit(priv->ctx);
- periph_module_disable(priv->module);
+
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_deinit(priv->ctx);
+ }
+
+ I2C_RCC_ATOMIC()
+ {
+ i2c_ll_enable_bus_clock(priv->id, false);
+ }
}
/****************************************************************************
@@ -1665,7 +1668,6 @@ struct i2c_master_s *esp_i2cbus_initialize(int port)
{
struct esp_i2c_priv_s *priv;
#ifndef CONFIG_I2C_POLLED
- const struct esp_i2c_config_s *config;
int ret;
#endif
@@ -1703,16 +1705,15 @@ struct i2c_master_s *esp_i2cbus_initialize(int port)
}
#ifndef CONFIG_I2C_POLLED
- config = priv->config;
if (priv->cpuint != -ENOMEM)
{
/* Disable the previous IRQ */
- up_disable_irq(config->irq);
- esp_teardown_irq(config->periph, priv->cpuint);
+ up_disable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
}
- priv->cpuint = esp_setup_irq(config->periph,
+ priv->cpuint = esp_setup_irq(i2c_periph_signal[priv->id].irq,
ESP_IRQ_PRIORITY_DEFAULT,
ESP_IRQ_TRIGGER_LEVEL);
if (priv->cpuint < 0)
@@ -1725,12 +1726,13 @@ struct i2c_master_s *esp_i2cbus_initialize(int port)
return NULL;
}
- ret = irq_attach(config->irq, esp_i2c_irq, priv);
+ ret = irq_attach(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq),
+ esp_i2c_irq, priv);
if (ret != OK)
{
/* Failed to attach IRQ, free the allocated CPU interrupt */
- esp_teardown_irq(config->periph, priv->cpuint);
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
priv->cpuint = -ENOMEM;
priv->refs--;
nxmutex_unlock(&priv->lock);
@@ -1740,7 +1742,7 @@ struct i2c_master_s *esp_i2cbus_initialize(int port)
/* Enable the CPU interrupt that is linked to the I2C device. */
- up_enable_irq(config->irq);
+ up_enable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
#endif
esp_i2c_init(priv);
@@ -1786,8 +1788,8 @@ int esp_i2cbus_uninitialize(struct i2c_master_s *dev)
}
#ifndef CONFIG_I2C_POLLED
- up_disable_irq(priv->config->irq);
- esp_teardown_irq(priv->config->periph, priv->cpuint);
+ up_disable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
priv->cpuint = -ENOMEM;
#endif
diff --git a/arch/risc-v/src/common/espressif/esp_i2c_slave.c
b/arch/risc-v/src/common/espressif/esp_i2c_slave.c
index 3fed25d0f69..764dbfcc3b1 100644
--- a/arch/risc-v/src/common/espressif/esp_i2c_slave.c
+++ b/arch/risc-v/src/common/espressif/esp_i2c_slave.c
@@ -80,12 +80,21 @@
#define I2C_SLAVE_POLL_RATE 10
#endif
+#if SOC_PERIPH_CLK_CTRL_SHARED
+#define I2C_CLOCK_SRC_ATOMIC() PERIPH_RCC_ATOMIC()
+#else
+#define I2C_CLOCK_SRC_ATOMIC()
+#endif
+
#if !SOC_RCC_IS_INDEPENDENT
# define I2C_RCC_ATOMIC() PERIPH_RCC_ATOMIC()
#else
# define I2C_RCC_ATOMIC()
#endif
+#define SCL_PIN_ATTR (FUNCTION_2 | INPUT_PULLUP)
+#define SDA_PIN_ATTR (FUNCTION_2 | INPUT_PULLUP | OUTPUT_OPEN_DRAIN)
+
/****************************************************************************
* Private Types
****************************************************************************/
@@ -96,16 +105,6 @@ struct esp_i2c_config_s
{
uint8_t scl_pin; /* GPIO configuration for SCL as SCL */
uint8_t sda_pin; /* GPIO configuration for SDA as SDA */
-
-#ifndef CONFIG_I2C_POLLED
- uint8_t periph; /* Peripheral ID */
- uint8_t irq; /* Interrupt ID */
-#endif
-
- uint32_t scl_insig; /* I2C SCL input signal index */
-
- uint32_t sda_insig; /* I2C SDA input signal index */
- uint32_t sda_outsig; /* I2C SDA output signal index */
};
/* I2C Device Private Data */
@@ -193,13 +192,6 @@ static const struct esp_i2c_config_s esp_i2c0_config =
{
.scl_pin = CONFIG_ESPRESSIF_I2C0_SCLPIN,
.sda_pin = CONFIG_ESPRESSIF_I2C0_SDAPIN,
-#ifndef CONFIG_I2C_POLLED
- .periph = ETS_I2C_EXT0_INTR_SOURCE,
- .irq = ESP_IRQ_I2C_EXT0,
-#endif
- .scl_insig = I2CEXT0_SCL_IN_IDX,
- .sda_insig = I2CEXT0_SDA_IN_IDX,
- .sda_outsig = I2CEXT0_SDA_OUT_IDX
};
static struct esp_i2c_priv_s esp_i2c0_priv =
@@ -249,13 +241,6 @@ static const struct esp_i2c_config_s esp_i2c1_config =
{
.scl_pin = CONFIG_ESPRESSIF_I2C1_SCLPIN,
.sda_pin = CONFIG_ESPRESSIF_I2C1_SDAPIN,
-#ifndef CONFIG_I2C_POLLED
- .periph = ETS_I2C_EXT1_INTR_SOURCE,
- .irq = ESP_IRQ_I2C_EXT1,
-#endif
- .scl_insig = I2CEXT1_SCL_IN_IDX,
- .sda_insig = I2CEXT1_SDA_IN_IDX,
- .sda_outsig = I2CEXT1_SDA_OUT_IDX
};
static struct esp_i2c_priv_s esp_i2c1_priv =
@@ -532,17 +517,22 @@ static void esp_i2c_slave_init(struct esp_i2c_priv_s
*priv)
{
const struct esp_i2c_config_s *config = priv->config;
+ uint32_t scl_in_sig = i2c_periph_signal[priv->id].scl_in_sig;
+ uint32_t scl_out_sig = i2c_periph_signal[priv->id].scl_out_sig;
+ uint32_t sda_in_sig = i2c_periph_signal[priv->id].sda_in_sig;
+ uint32_t sda_out_sig = i2c_periph_signal[priv->id].sda_out_sig;
+
/* Configure GPIO signals for I2C SCL and SDA pins */
esp_gpiowrite(config->scl_pin, 1);
esp_gpiowrite(config->sda_pin, 1);
- esp_configgpio(config->scl_pin, INPUT_PULLUP);
- esp_gpio_matrix_in(config->scl_pin, config->scl_insig, 0);
+ esp_configgpio(config->scl_pin, SCL_PIN_ATTR);
+ esp_gpio_matrix_in(config->scl_pin, scl_in_sig, 0);
- esp_configgpio(config->sda_pin, INPUT_PULLUP | OUTPUT_OPEN_DRAIN);
- esp_gpio_matrix_out(config->sda_pin, config->sda_outsig, 0, 0);
- esp_gpio_matrix_in(config->sda_pin, config->sda_insig, 0);
+ esp_configgpio(config->sda_pin, SDA_PIN_ATTR);
+ esp_gpio_matrix_out(config->sda_pin, sda_out_sig, 0, 0);
+ esp_gpio_matrix_in(config->sda_pin, sda_in_sig, 0);
/* Enable I2C hardware */
@@ -552,7 +542,10 @@ static void esp_i2c_slave_init(struct esp_i2c_priv_s *priv)
i2c_ll_reset_register(priv->id);
}
- i2c_hal_init(priv->ctx, priv->id);
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_init(priv->ctx, priv->id);
+ }
/* Disable I2C interrupts */
@@ -562,7 +555,11 @@ static void esp_i2c_slave_init(struct esp_i2c_priv_s *priv)
i2c_hal_slave_init(priv->ctx);
i2c_ll_slave_enable_auto_start(priv->ctx->dev, true);
- i2c_ll_set_source_clk(priv->ctx->dev, I2C_CLK_SRC_DEFAULT);
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_ll_set_source_clk(priv->ctx->dev, I2C_CLK_SRC_DEFAULT);
+ }
+
i2c_ll_set_slave_addr(priv->ctx->dev, priv->addr, false);
i2c_ll_set_rxfifo_full_thr(priv->ctx->dev, I2C_FIFO_FULL_THRESH_VAL);
i2c_ll_set_txfifo_empty_thr(priv->ctx->dev, I2C_FIFO_EMPTY_THRESH_VAL);
@@ -590,9 +587,11 @@ static void esp_i2c_slave_init(struct esp_i2c_priv_s *priv)
static void esp_i2c_slave_deinit(struct esp_i2c_priv_s *priv)
{
- const struct esp_i2c_config_s *config = priv->config;
+ I2C_CLOCK_SRC_ATOMIC()
+ {
+ i2c_hal_deinit(priv->ctx);
+ }
- i2c_hal_deinit(priv->ctx);
I2C_RCC_ATOMIC()
{
i2c_ll_enable_bus_clock(priv->id, false);
@@ -834,12 +833,6 @@ struct i2c_slave_s *esp_i2cbus_slave_initialize(int port,
int addr)
{
struct esp_i2c_priv_s *priv;
int ret;
-#ifndef CONFIG_I2C_POLLED
- const struct esp_i2c_config_s *config;
-#else
- char *argv[2];
- char arg1[32];
-#endif
switch (port)
{
@@ -870,16 +863,15 @@ struct i2c_slave_s *esp_i2cbus_slave_initialize(int port,
int addr)
}
#ifndef CONFIG_I2C_POLLED
- config = priv->config;
if (priv->cpuint != -ENOMEM)
{
/* Disable the previous IRQ */
- up_disable_irq(config->irq);
- esp_teardown_irq(config->periph, priv->cpuint);
+ up_disable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
}
- priv->cpuint = esp_setup_irq(config->periph,
+ priv->cpuint = esp_setup_irq(i2c_periph_signal[priv->id].irq,
ESP_IRQ_PRIORITY_DEFAULT,
ESP_IRQ_TRIGGER_LEVEL);
if (priv->cpuint < 0)
@@ -892,12 +884,13 @@ struct i2c_slave_s *esp_i2cbus_slave_initialize(int port,
int addr)
return NULL;
}
- ret = irq_attach(config->irq, esp_i2c_slave_irq, priv);
+ ret = irq_attach(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq),
+ esp_i2c_slave_irq, priv);
if (ret != OK)
{
/* Failed to attach IRQ, free the allocated CPU interrupt */
- esp_teardown_irq(config->periph, priv->cpuint);
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
priv->cpuint = -ENOMEM;
priv->refs--;
nxmutex_unlock(&priv->lock);
@@ -907,7 +900,7 @@ struct i2c_slave_s *esp_i2cbus_slave_initialize(int port,
int addr)
/* Enable the CPU interrupt that is linked to the I2C device. */
- up_enable_irq(config->irq);
+ up_enable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
#else
/* Create thread for polling sensor data */
@@ -976,8 +969,8 @@ int esp_i2cbus_slave_uninitialize(struct i2c_slave_s *dev)
}
#ifndef CONFIG_I2C_POLLED
- up_disable_irq(priv->config->irq);
- esp_teardown_irq(priv->config->periph, priv->cpuint);
+ up_disable_irq(ESP_SOURCE2IRQ(i2c_periph_signal[priv->id].irq));
+ esp_teardown_irq(i2c_periph_signal[priv->id].irq, priv->cpuint);
priv->cpuint = -ENOMEM;
#endif
diff --git a/arch/risc-v/src/common/espressif/esp_i2c_slave.h
b/arch/risc-v/src/common/espressif/esp_i2c_slave.h
index b814eb078a8..3c76a28c6b2 100644
--- a/arch/risc-v/src/common/espressif/esp_i2c_slave.h
+++ b/arch/risc-v/src/common/espressif/esp_i2c_slave.h
@@ -37,13 +37,8 @@
#ifndef __ASSEMBLY__
-#ifdef CONFIG_ESPRESSIF_I2C0_SLAVE_MODE
-# define ESPRESSIF_I2C0_SLAVE 0
-#endif
-
-#ifdef CONFIG_ESPRESSIF_I2C1_SLAVE_MODE
-# define ESPRESSIF_I2C1_SLAVE 1
-#endif
+#define ESPRESSIF_I2C0_SLAVE 0
+#define ESPRESSIF_I2C1_SLAVE 1
/****************************************************************************
* Public Function Prototypes
diff --git a/boards/risc-v/esp32c3/common/src/esp_board_i2c.c
b/boards/risc-v/esp32c3/common/src/esp_board_i2c.c
index 07182aed6db..a844ff59f9f 100644
--- a/boards/risc-v/esp32c3/common/src/esp_board_i2c.c
+++ b/boards/risc-v/esp32c3/common/src/esp_board_i2c.c
@@ -149,15 +149,21 @@ int board_i2c_init(void)
int ret = OK;
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_MASTER_MODE
+# ifdef CONFIG_ESPRESSIF_I2C0_MASTER_MODE
ret = i2c_driver_init(ESPRESSIF_I2C0);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_BITBANG
+# ifdef CONFIG_ESPRESSIF_I2C_BITBANG_MASTER_MODE
ret = i2c_bitbang_driver_init(ESPRESSIF_I2C_BITBANG);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_SLAVE_MODE
+# ifdef CONFIG_ESPRESSIF_I2C0_SLAVE_MODE
ret = i2c_slave_driver_init(ESPRESSIF_I2C0_SLAVE, I2C0_SLAVE_ADDR);
+# endif
#endif
return ret;
diff --git a/boards/risc-v/esp32c6/common/src/esp_board_i2c.c
b/boards/risc-v/esp32c6/common/src/esp_board_i2c.c
index 115b3d4339a..c57dafc2256 100644
--- a/boards/risc-v/esp32c6/common/src/esp_board_i2c.c
+++ b/boards/risc-v/esp32c6/common/src/esp_board_i2c.c
@@ -148,17 +148,22 @@ int board_i2c_init(void)
{
int ret = OK;
-#if defined(CONFIG_ESPRESSIF_I2C_PERIPH_MASTER_MODE) && \
- defined(CONFIG_ESPRESSIF_I2C0)
+#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_MASTER_MODE
+# ifdef CONFIG_ESPRESSIF_I2C0_MASTER_MODE
ret = i2c_driver_init(ESPRESSIF_I2C0);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_BITBANG
+# ifdef CONFIG_ESPRESSIF_I2C_BITBANG_MASTER_MODE
ret = i2c_bitbang_driver_init(ESPRESSIF_I2C_BITBANG);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_SLAVE_MODE
+# ifdef CONFIG_ESPRESSIF_I2C0_SLAVE_MODE
ret = i2c_slave_driver_init(ESPRESSIF_I2C0_SLAVE, I2C0_SLAVE_ADDR);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_LP_I2C0
diff --git a/boards/risc-v/esp32h2/common/src/esp_board_i2c.c
b/boards/risc-v/esp32h2/common/src/esp_board_i2c.c
index c56b61c6e25..bb39e68b32b 100644
--- a/boards/risc-v/esp32h2/common/src/esp_board_i2c.c
+++ b/boards/risc-v/esp32h2/common/src/esp_board_i2c.c
@@ -47,8 +47,10 @@
****************************************************************************/
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_SLAVE_MODE
-#define I2C0_SLAVE_ADDR 0x28
-#define I2C0_SLAVE_NBITS 7
+# define I2C0_SLAVE_ADDR 0x28
+# define I2C0_SLAVE_NBITS 7
+# define I2C1_SLAVE_ADDR 0x28
+# define I2C1_SLAVE_NBITS 7
#endif
/****************************************************************************
@@ -115,12 +117,14 @@ static int i2c_slave_driver_init(int bus, int addr)
i2c = esp_i2cbus_slave_initialize(bus, addr);
if (i2c == NULL)
{
- syslog(LOG_ERR, "Failed to get I2C%d interface\n", bus);
+ syslog(LOG_ERR, "Failed to get I2C%d slave interface\n", bus);
return -ENODEV;
}
#ifdef CONFIG_I2C_DRIVER
- ret = i2c_slave_register(i2c, bus, addr, I2C0_SLAVE_NBITS);
+ ret = i2c_slave_register(i2c, bus, addr,
+ bus == ESPRESSIF_I2C0_SLAVE ? \
+ I2C0_SLAVE_NBITS : I2C1_SLAVE_NBITS);
if (ret < 0)
{
syslog(LOG_ERR, "Failed to register I2C%d driver: %d\n", bus, ret);
@@ -149,25 +153,29 @@ int board_i2c_init(void)
int ret = OK;
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_MASTER_MODE
-#ifdef CONFIG_ESPRESSIF_I2C0
+# ifdef CONFIG_ESPRESSIF_I2C0_MASTER_MODE
ret = i2c_driver_init(ESPRESSIF_I2C0);
- if (ret != OK)
- {
- return ret;
- }
-#endif
+# endif
-#ifdef CONFIG_ESPRESSIF_I2C1
+# ifdef CONFIG_ESPRESSIF_I2C1_MASTER_MODE
ret = i2c_driver_init(ESPRESSIF_I2C1);
-#endif
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_BITBANG
+# ifdef CONFIG_ESPRESSIF_I2C_BITBANG_MASTER_MODE
ret = i2c_bitbang_driver_init(ESPRESSIF_I2C_BITBANG);
+# endif
#endif
#ifdef CONFIG_ESPRESSIF_I2C_PERIPH_SLAVE_MODE
+# ifdef CONFIG_ESPRESSIF_I2C0_SLAVE_MODE
ret = i2c_slave_driver_init(ESPRESSIF_I2C0_SLAVE, I2C0_SLAVE_ADDR);
+# endif
+
+# ifdef CONFIG_ESPRESSIF_I2C1_SLAVE_MODE
+ ret = i2c_slave_driver_init(ESPRESSIF_I2C1_SLAVE, I2C1_SLAVE_ADDR);
+# endif
#endif
return ret;