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: