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

commit 45d17551b36c13ce63a58bced3b3b42f7a08a8b2
Author: Tiago Medicci Serrano <[email protected]>
AuthorDate: Wed Aug 30 10:10:33 2023 -0300

    esp32s3/dma: Set the DMA descriptor according to RX or TX operation
    
    According to RX/TX operation, the DMA descriptors (inlink/outlink)
    should be set differently. When setting the inlink, the `suc_eof`
    field must be cleared by software (it will be set by hardware when
    a packet is received). Similarly, the `length` field will be set
    by hardware a packet is received.
---
 arch/xtensa/src/esp32s3/esp32s3_dma.c       | 30 +++++++++++++++++++++++------
 arch/xtensa/src/esp32s3/esp32s3_dma.h       |  5 +++--
 arch/xtensa/src/esp32s3/esp32s3_qspi.c      |  6 ++++--
 arch/xtensa/src/esp32s3/esp32s3_spi.c       |  6 ++++--
 arch/xtensa/src/esp32s3/esp32s3_spi_slave.c |  6 ++++--
 5 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/arch/xtensa/src/esp32s3/esp32s3_dma.c 
b/arch/xtensa/src/esp32s3/esp32s3_dma.c
index 829367e797..bbd3af5e55 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_dma.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_dma.c
@@ -178,6 +178,7 @@ int32_t esp32s3_dma_request(enum esp32s3_dma_periph_e 
periph,
  *   num     - Number of DMA descriptors
  *   pbuf    - RX/TX buffer pointer
  *   len     - RX/TX buffer length
+ *   tx      - true: TX mode (transmitter); false: RX mode (receiver)
  *
  * Returned Value:
  *   Bound pbuf data bytes
@@ -185,7 +186,7 @@ int32_t esp32s3_dma_request(enum esp32s3_dma_periph_e 
periph,
  ****************************************************************************/
 
 uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s *dmadesc, uint32_t num,
-                           uint8_t *pbuf, uint32_t len)
+                           uint8_t *pbuf, uint32_t len, bool tx)
 {
   int i;
   uint32_t regval;
@@ -207,9 +208,18 @@ uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s 
*dmadesc, uint32_t num,
 
       buf_len = ALIGN_UP(data_len, sizeof(uintptr_t));
 
-      dmadesc[i].ctrl = (data_len << ESP32S3_DMA_CTRL_DATALEN_S) |
-                        (buf_len << ESP32S3_DMA_CTRL_BUFLEN_S) |
-                        ESP32S3_DMA_CTRL_OWN;
+      dmadesc[i].ctrl = ESP32S3_DMA_CTRL_OWN;
+
+      /* Only set Data Length if it's a TX buffer. Otherwise, it will be
+       * written automatically by hardware.
+       */
+
+      if (tx)
+        {
+          dmadesc[i].ctrl |= (data_len << ESP32S3_DMA_CTRL_DATALEN_S);
+        }
+
+      dmadesc[i].ctrl |= (buf_len << ESP32S3_DMA_CTRL_BUFLEN_S);
       dmadesc[i].pbuf = pdata;
       dmadesc[i].next = &dmadesc[i + 1];
 
@@ -222,7 +232,15 @@ uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s 
*dmadesc, uint32_t num,
       pdata += data_len;
     }
 
-  dmadesc[i].ctrl |= ESP32S3_DMA_CTRL_EOF;
+  /* suc_eof (defined by ESP32S3_DMA_CTRL_EOF) is set by software
+   * only in transmit descriptor.
+   */
+
+  if (tx)
+    {
+      dmadesc[i].ctrl |= ESP32S3_DMA_CTRL_EOF;
+    }
+
   dmadesc[i].next  = NULL;
 
   return len - bytes;
@@ -236,9 +254,9 @@ uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s 
*dmadesc, uint32_t num,
  *   inlink/outlink to the corresponding GDMA_<IN/OUT>LINK_ADDR_CHn register
  *
  * Input Parameters:
+ *   dmadesc - Pointer of the previously bound inlink/outlink
  *   chan    - DMA channel of the receiver/transmitter
  *   tx      - true: TX mode (transmitter); false: RX mode (receiver)
- *   dmadesc - Pointer of the previously bound inlink/outlink
  *
  * Returned Value:
  *   None
diff --git a/arch/xtensa/src/esp32s3/esp32s3_dma.h 
b/arch/xtensa/src/esp32s3/esp32s3_dma.h
index 7666d50a8e..2200ad72cd 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_dma.h
+++ b/arch/xtensa/src/esp32s3/esp32s3_dma.h
@@ -150,6 +150,7 @@ int32_t esp32s3_dma_request(enum esp32s3_dma_periph_e 
periph,
  *   num     - Number of DMA descriptors
  *   pbuf    - RX/TX buffer pointer
  *   len     - RX/TX buffer length
+ *   tx      - true: TX mode (transmitter); false: RX mode (receiver)
  *
  * Returned Value:
  *   Bound pbuf data bytes
@@ -157,7 +158,7 @@ int32_t esp32s3_dma_request(enum esp32s3_dma_periph_e 
periph,
  ****************************************************************************/
 
 uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s *dmadesc, uint32_t num,
-                           uint8_t *pbuf, uint32_t len);
+                           uint8_t *pbuf, uint32_t len, bool tx);
 
 /****************************************************************************
  * Name: esp32s3_dma_load
@@ -167,9 +168,9 @@ uint32_t esp32s3_dma_setup(struct esp32s3_dmadesc_s 
*dmadesc, uint32_t num,
  *   inlink/outlink to the corresponding GDMA_<IN/OUT>LINK_ADDR_CHn register
  *
  * Input Parameters:
+ *   dmadesc - Pointer of the previously bound inlink/outlink
  *   chan    - DMA channel of the receiver/transmitter
  *   tx      - true: TX mode (transmitter); false: RX mode (receiver)
- *   dmadesc - Pointer of the previously bound inlink/outlink
  *
  * Returned Value:
  *   None
diff --git a/arch/xtensa/src/esp32s3/esp32s3_qspi.c 
b/arch/xtensa/src/esp32s3/esp32s3_qspi.c
index deffcee405..8ac4ba604c 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_qspi.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_qspi.c
@@ -978,7 +978,8 @@ static int esp32s3_qspi_memory(struct qspi_dev_s *dev,
       esp32s3_dma_setup(priv->dma_desc,
                         QSPI_DMA_DESC_NUM,
                         (uint8_t *)meminfo->buffer,
-                        meminfo->buflen);
+                        meminfo->buflen
+                        true);
       esp32s3_dma_load(priv->dma_desc, priv->dma_channel, true);
       esp32s3_dma_enable(priv->dma_channel, true);
     }
@@ -993,7 +994,8 @@ static int esp32s3_qspi_memory(struct qspi_dev_s *dev,
       esp32s3_dma_setup(priv->dma_desc,
                         QSPI_DMA_DESC_NUM,
                         (uint8_t *)meminfo->buffer,
-                        meminfo->buflen);
+                        meminfo->buflen
+                        false);
       esp32s3_dma_load(priv->dma_desc, priv->dma_channel, false);
       esp32s3_dma_enable(priv->dma_channel, false);
     }
diff --git a/arch/xtensa/src/esp32s3/esp32s3_spi.c 
b/arch/xtensa/src/esp32s3/esp32s3_spi.c
index 5e35abc960..80b5689fe9 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_spi.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_spi.c
@@ -904,7 +904,8 @@ static void esp32s3_spi_dma_exchange(struct 
esp32s3_spi_priv_s *priv,
       esp32s3_spi_set_regbits(SPI_DMA_CONF_REG(priv->config->id),
                               SPI_DMA_TX_ENA_M);
 
-      n = esp32s3_dma_setup(priv->dma_txdesc, SPI_DMA_DESC_NUM, tp, bytes);
+      n = esp32s3_dma_setup(priv->dma_txdesc, SPI_DMA_DESC_NUM,
+                            tp, bytes, true);
       esp32s3_dma_load(priv->dma_txdesc, channel, true);
       esp32s3_dma_enable(channel, true);
 
@@ -921,7 +922,8 @@ static void esp32s3_spi_dma_exchange(struct 
esp32s3_spi_priv_s *priv,
           esp32s3_spi_set_regbits(SPI_DMA_CONF_REG(priv->config->id),
                                   SPI_DMA_RX_ENA_M);
 
-          esp32s3_dma_setup(priv->dma_rxdesc, SPI_DMA_DESC_NUM, rp, bytes);
+          esp32s3_dma_setup(priv->dma_rxdesc, SPI_DMA_DESC_NUM,
+                            rp, bytes, false);
           esp32s3_dma_load(priv->dma_rxdesc, channel, false);
           esp32s3_dma_enable(channel, false);
 
diff --git a/arch/xtensa/src/esp32s3/esp32s3_spi_slave.c 
b/arch/xtensa/src/esp32s3/esp32s3_spi_slave.c
index 3dce48bab4..dea06c4592 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_spi_slave.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_spi_slave.c
@@ -903,7 +903,8 @@ static void spislave_setup_rx_dma(struct spislave_priv_s 
*priv)
   esp32s3_dma_setup(priv->dma_rxdesc,
                     SPI_DMA_DESC_NUM,
                     priv->rx_buffer + priv->rx_length,
-                    length);
+                    length
+                    false);
   esp32s3_dma_load(priv->dma_rxdesc, priv->dma_channel, false);
 
   priv->rx_dma_offset = priv->rx_length;
@@ -946,7 +947,8 @@ static void spislave_setup_tx_dma(struct spislave_priv_s 
*priv)
   esp32s3_dma_setup(priv->dma_txdesc,
                     SPI_DMA_DESC_NUM,
                     priv->tx_buffer,
-                    SPI_SLAVE_BUFSIZE);
+                    SPI_SLAVE_BUFSIZE
+                    true);
   esp32s3_dma_load(priv->dma_txdesc, priv->dma_channel, true);
 
   spislave_dma_tx_fifo_reset(priv);

Reply via email to