You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/18 04:23:13 UTC
[nuttx] branch master updated: xtensa/esp32: Fix SPI bugs
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 f35f32d4ee xtensa/esp32: Fix SPI bugs
f35f32d4ee is described below
commit f35f32d4ee66425385a149fa2291951777fcc51a
Author: Dong Heng <do...@espressif.com>
AuthorDate: Mon Jan 16 14:52:05 2023 +0800
xtensa/esp32: Fix SPI bugs
1. Fix SPI master/slave clock init/deinit error
2. Fix SPI slave RX process error
---
arch/xtensa/src/esp32/esp32_spi.c | 5 +++--
arch/xtensa/src/esp32/esp32_spi_slave.c | 12 +++++++++---
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/arch/xtensa/src/esp32/esp32_spi.c b/arch/xtensa/src/esp32/esp32_spi.c
index fdf25654b3..59691b0e97 100644
--- a/arch/xtensa/src/esp32/esp32_spi.c
+++ b/arch/xtensa/src/esp32/esp32_spi.c
@@ -834,7 +834,7 @@ static void esp32_spi_dma_exchange(struct esp32_spi_priv_s *priv,
struct esp32_dmadesc_s *dma_tx_desc;
struct esp32_dmadesc_s *dma_rx_desc;
#ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
- uint8_t *alloctp;
+ uint8_t *alloctp = NULL;
uint8_t *allocrp;
#endif
@@ -1419,10 +1419,11 @@ static void esp32_spi_deinit(struct spi_dev_s *dev)
if (priv->config->use_dma)
{
+ modifyreg32(DPORT_PERIP_RST_EN_REG, 0, priv->config->dma_rst_bit);
modifyreg32(DPORT_PERIP_CLK_EN_REG, priv->config->dma_clk_bit, 0);
}
- modifyreg32(DPORT_PERIP_RST_EN_REG, 0, priv->config->clk_bit);
+ modifyreg32(DPORT_PERIP_RST_EN_REG, 0, priv->config->rst_bit);
modifyreg32(DPORT_PERIP_CLK_EN_REG, priv->config->clk_bit, 0);
priv->frequency = 0;
diff --git a/arch/xtensa/src/esp32/esp32_spi_slave.c b/arch/xtensa/src/esp32/esp32_spi_slave.c
index b57893f8c6..acf5422328 100644
--- a/arch/xtensa/src/esp32/esp32_spi_slave.c
+++ b/arch/xtensa/src/esp32/esp32_spi_slave.c
@@ -830,8 +830,6 @@ static int esp32_spislv_interrupt(int irq, void *context, void *arg)
n = (esp32_spi_get_reg(priv, SPI_SLV_RD_BIT_OFFSET) + 1) / 8;
- esp32_spi_set_regbits(priv, SPI_USER_OFFSET, SPI_USR_MOSI_M);
-
/* RX process */
if (!priv->dma_chan)
@@ -843,7 +841,7 @@ static int esp32_spislv_interrupt(int irq, void *context, void *arg)
for (i = 0; i < n; i += 4)
{
tmp = esp32_spi_get_reg(priv, SPI_W0_OFFSET + i);
- memcpy(priv->rxbuffer + priv->rxlen + i, &tmp, n);
+ memcpy(priv->rxbuffer + priv->rxlen + i, &tmp, 4);
}
}
@@ -879,6 +877,8 @@ static int esp32_spislv_interrupt(int irq, void *context, void *arg)
{
priv->process = false;
SPIS_DEV_SELECT(priv->dev, false);
+
+ esp32_spi_reset_regbits(priv, SPI_SLAVE_OFFSET, SPI_TRANS_DONE_M);
}
return 0;
@@ -1052,6 +1052,12 @@ static void esp32_spislv_deinit(struct spi_slave_ctrlr_s *ctrlr)
esp32_gpioirqdisable(ESP32_PIN2IRQ(priv->config->cs_pin));
esp32_spi_reset_regbits(priv, SPI_SLAVE_OFFSET, SPI_INT_EN_M);
+ if (priv->dma_chan)
+ {
+ modifyreg32(DPORT_PERIP_RST_EN_REG, 0, priv->config->dma_rst_bit);
+ modifyreg32(DPORT_PERIP_CLK_EN_REG, priv->config->dma_clk_bit, 0);
+ }
+
modifyreg32(DPORT_PERIP_RST_EN_REG, 0, priv->config->clk_bit);
modifyreg32(DPORT_PERIP_CLK_EN_REG, priv->config->clk_bit, 0);