You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2020/05/13 11:11:19 UTC

[incubator-nuttx] 01/03: arch: cxd56xx: Apply the latest cxd56_dma.c and cxd56_spi from SDK

This is an automated email from the ASF dual-hosted git repository.

jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 77f15c8b17a83e9dc10d990e16cb414bd0dd617e
Author: Masayuki Ishikawa <ma...@gmail.com>
AuthorDate: Wed May 13 11:41:04 2020 +0900

    arch: cxd56xx: Apply the latest cxd56_dma.c and cxd56_spi from SDK
    
    See the following commit in SDK:
    
      commit 62a2fb4fd3001aefad9ec3b2e2e7c47e5b0f21e1
      Author: SPRESENSE <41...@users.noreply.github.com>
      Date:   Fri Jan 24 13:32:04 2020 +0900
    
          Enable dummy transfer by SPI using DMA
    
    Signed-off-by: Masayuki Ishikawa <Ma...@jp.sony.com>
---
 arch/arm/src/cxd56xx/cxd56_dmac.c | 35 +++++++++++++---
 arch/arm/src/cxd56xx/cxd56_spi.c  | 85 +++------------------------------------
 2 files changed, 34 insertions(+), 86 deletions(-)

diff --git a/arch/arm/src/cxd56xx/cxd56_dmac.c b/arch/arm/src/cxd56xx/cxd56_dmac.c
index 7deb5a3..0035351 100644
--- a/arch/arm/src/cxd56xx/cxd56_dmac.c
+++ b/arch/arm/src/cxd56xx/cxd56_dmac.c
@@ -290,6 +290,7 @@ struct dma_channel_s
   dmac_lli_t * list;             /* Link list */
   dma_callback_t callback;       /* Callback invoked when the DMA completes */
   void *arg;                     /* Argument passed to callback function */
+  unsigned int dummy;            /* Dummy buffer */
 };
 
 /****************************************************************************
@@ -902,10 +903,21 @@ void cxd56_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   uintptr_t dst;
   size_t rest;
   int peri;
+  int di;
 
   DEBUGASSERT(dmach != NULL && dmach->inuse && dmach->list != NULL);
 
-  dst = maddr;
+  if (maddr)
+    {
+      dst = maddr;
+      di = 1;
+    }
+  else
+    {
+      dst = (uintptr_t)&dmach->dummy;
+      di = 0;
+    }
+
   rest = nbytes;
 
   list_num = (nbytes + CXD56_DMAC_MAX_SIZE - 1) / CXD56_DMAC_MAX_SIZE;
@@ -914,7 +926,7 @@ void cxd56_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
       dmach->list[i].src_addr = paddr;
       dmach->list[i].dest_addr = dst;
       dmach->list[i].nextlli = (uint32_t)&dmach->list[i + 1];
-      dmach->list[i].control = DMAC_EX_CTRL_HELPER(0, 1, 0,            /* interrupt / Dest inc / Src inc */
+      dmach->list[i].control = DMAC_EX_CTRL_HELPER(0, di, 0,           /* interrupt / Dest inc / Src inc */
                                CXD56_DMAC_MASTER1, CXD56_DMAC_MASTER2, /* AHB dst master / AHB src master (fixed) */
                                config.dest_width, config.src_width,    /* Dest / Src transfer width */
                                CXD56_DMAC_BSIZE4, CXD56_DMAC_BSIZE4,   /* Dest / Src burst size (fixed) */
@@ -927,7 +939,7 @@ void cxd56_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   dmach->list[i].src_addr = paddr;
   dmach->list[i].dest_addr = dst;
   dmach->list[i].nextlli = 0;
-  dmach->list[i].control = DMAC_EX_CTRL_HELPER(1, 1, 0,                /* interrupt / Dest inc / Src inc */
+  dmach->list[i].control = DMAC_EX_CTRL_HELPER(1, di, 0,               /* interrupt / Dest inc / Src inc */
                                CXD56_DMAC_MASTER1, CXD56_DMAC_MASTER2, /* AHB dst master / AHB src master (fixed) */
                                config.dest_width, config.src_width,    /* Dest / Src transfer width */
                                CXD56_DMAC_BSIZE4, CXD56_DMAC_BSIZE4,   /* Dest / Src burst size (fixed) */
@@ -961,10 +973,21 @@ void cxd56_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   uintptr_t src;
   size_t rest;
   int peri;
+  int si;
 
   DEBUGASSERT(dmach != NULL && dmach->inuse && dmach->list != NULL);
 
-  src = maddr;
+  if (maddr)
+    {
+      src = maddr;
+      si = 1;
+    }
+  else
+    {
+      src = (uintptr_t)&dmach->dummy;
+      si = 0;
+    }
+
   rest = nbytes;
 
   list_num = (nbytes + CXD56_DMAC_MAX_SIZE - 1) / CXD56_DMAC_MAX_SIZE;
@@ -973,7 +996,7 @@ void cxd56_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
       dmach->list[i].src_addr = src;
       dmach->list[i].dest_addr = paddr;
       dmach->list[i].nextlli = (uint32_t)&dmach->list[i + 1];
-      dmach->list[i].control = DMAC_EX_CTRL_HELPER(0, 0, 1,                /* interrupt / Dest inc / Src inc */
+      dmach->list[i].control = DMAC_EX_CTRL_HELPER(0, 0, si,               /* interrupt / Dest inc / Src inc */
                                    CXD56_DMAC_MASTER2, CXD56_DMAC_MASTER1, /* AHB dst master / AHB src master (fixed) */
                                    config.dest_width, config.src_width,    /* Dest / Src transfer width (fixed) */
                                    CXD56_DMAC_BSIZE1, CXD56_DMAC_BSIZE1,   /* Dest / Src burst size (fixed) */
@@ -986,7 +1009,7 @@ void cxd56_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   dmach->list[i].src_addr = src;
   dmach->list[i].dest_addr = paddr;
   dmach->list[i].nextlli = 0;
-  dmach->list[i].control = DMAC_EX_CTRL_HELPER(1, 0, 1,                    /* interrupt / Dest inc / Src inc */
+  dmach->list[i].control = DMAC_EX_CTRL_HELPER(1, 0, si,                   /* interrupt / Dest inc / Src inc */
                                    CXD56_DMAC_MASTER2, CXD56_DMAC_MASTER1, /* AHB dst master / AHB src master (fixed) */
                                    config.dest_width, config.src_width,    /* Dest / Src transfer width (fixed) */
                                    CXD56_DMAC_BSIZE4, CXD56_DMAC_BSIZE4,   /* Dest / Src burst size (fixed) */
diff --git a/arch/arm/src/cxd56xx/cxd56_spi.c b/arch/arm/src/cxd56xx/cxd56_spi.c
index 72caec9..2f2bbfc 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.c
+++ b/arch/arm/src/cxd56xx/cxd56_spi.c
@@ -126,8 +126,6 @@ static inline void spi_putreg(FAR struct cxd56_spidev_s *priv,
 static void __unused spi_dmaexchange(FAR struct spi_dev_s *dev,
                                      FAR const void *txbuffer,
                                      FAR void *rxbuffer, size_t nwords);
-static void spi_dmatxwait(FAR struct cxd56_spidev_s *priv);
-static void spi_dmarxwait(FAR struct cxd56_spidev_s *priv);
 static void spi_dmatrxwait(FAR struct cxd56_spidev_s *priv);
 static void spi_dmatxcallback(DMA_HANDLE handle, uint8_t status, void *data);
 static void spi_dmarxcallback(DMA_HANDLE handle, uint8_t status, void *data);
@@ -1438,42 +1436,17 @@ static void spi_dmaexchange(FAR struct spi_dev_s *dev,
 
   /* Setup DMAs */
 
-  if (txbuffer)
-    {
-      spi_dmatxsetup(priv, txbuffer, nwords);
-    }
-
-  if (rxbuffer)
-    {
-      spi_dmarxsetup(priv, rxbuffer, nwords);
-    }
+  spi_dmatxsetup(priv, txbuffer, nwords);
+  spi_dmarxsetup(priv, rxbuffer, nwords);
 
   /* Start the DMAs */
 
-  if (rxbuffer)
-    {
-      cxd56_dmastart(priv->rxdmach, spi_dmarxcallback, priv);
-    }
-
-  if (txbuffer)
-    {
-      cxd56_dmastart(priv->txdmach, spi_dmatxcallback, priv);
-    }
+  cxd56_dmastart(priv->rxdmach, spi_dmarxcallback, priv);
+  cxd56_dmastart(priv->txdmach, spi_dmatxcallback, priv);
 
   /* Then wait for each to complete */
 
-  if (txbuffer && rxbuffer)
-    {
-      spi_dmatrxwait(priv);
-    }
-  else if (txbuffer)
-    {
-      spi_dmatxwait(priv);
-    }
-  else if (rxbuffer)
-    {
-      spi_dmarxwait(priv);
-    }
+  spi_dmatrxwait(priv);
 
   if (priv->port == 3)
     {
@@ -1609,54 +1582,6 @@ static void spi_dmarxsetup(FAR struct cxd56_spidev_s *priv,
 }
 
 /****************************************************************************
- * Name: spi_dmatxwait
- *
- * Description:
- *   Wait for TX DMA to complete.
- *
- ****************************************************************************/
-
-static void spi_dmatxwait(FAR struct cxd56_spidev_s *priv)
-{
-  uint32_t val;
-
-  if (nxsem_wait(&priv->dmasem) != OK)
-    {
-      spierr("dma error\n");
-    }
-
-  cxd56_dmastop(priv->txdmach);
-
-  val = spi_getreg(priv, CXD56_SPI_DMACR_OFFSET);
-  val &= ~SPI_DMACR_TXDMAE;
-  spi_putreg(priv, CXD56_SPI_DMACR_OFFSET, val);
-}
-
-/****************************************************************************
- * Name: spi_dmarxwait
- *
- * Description:
- *   Wait for RX DMA to complete.
- *
- ****************************************************************************/
-
-static void spi_dmarxwait(FAR struct cxd56_spidev_s *priv)
-{
-  uint32_t val;
-
-  if (nxsem_wait(&priv->dmasem) != OK)
-    {
-      spierr("dma error\n");
-    }
-
-  cxd56_dmastop(priv->rxdmach);
-
-  val = spi_getreg(priv, CXD56_SPI_DMACR_OFFSET);
-  val &= ~SPI_DMACR_RXDMAE;
-  spi_putreg(priv, CXD56_SPI_DMACR_OFFSET, val);
-}
-
-/****************************************************************************
  * Name: spi_dmatrxwait
  *
  * Description: