You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2020/01/08 10:27:26 UTC
[incubator-nuttx] 01/08: arch: cxd56xx: Enable DMA settings
dynamically
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch pr54
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 00a6f1d8353f54b666119e67340677c2a471b4d8
Author: Alin Jerpelea <al...@sony.com>
AuthorDate: Sat Dec 28 09:07:21 2019 +0900
arch: cxd56xx: Enable DMA settings dynamically
---
arch/arm/src/cxd56xx/cxd56_spi.c | 198 ++++++++++++++--------
arch/arm/src/cxd56xx/cxd56_spi.h | 28 +++
boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c | 129 ++++++++------
boards/arm/cxd56xx/common/src/cxd56_ili9340.c | 27 +++
boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c | 27 +++
boards/arm/cxd56xx/spresense/Kconfig | 4 +
boards/arm/cxd56xx/spresense/include/board.h | 14 ++
boards/arm/cxd56xx/spresense/src/cxd56_spi.c | 6 -
8 files changed, 302 insertions(+), 131 deletions(-)
diff --git a/arch/arm/src/cxd56xx/cxd56_spi.c b/arch/arm/src/cxd56xx/cxd56_spi.c
index 98a85c8..fb9724a 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.c
+++ b/arch/arm/src/cxd56xx/cxd56_spi.c
@@ -46,6 +46,7 @@
#include <semaphore.h>
#include <errno.h>
#include <debug.h>
+#include <string.h>
#include <arch/board/board.h>
#include <nuttx/irq.h>
@@ -58,7 +59,7 @@
#include "chip.h"
#include "cxd56_spi.h"
-#include "chip/cxd56_spi.h"
+#include "hardware/cxd56_spi.h"
#include "cxd56_clock.h"
#include "cxd56_pinconfig.h"
#include "cxd56_powermgr.h"
@@ -99,6 +100,7 @@ struct cxd56_spidev_s
uint8_t port; /* Port number */
int initialized; /* Initialized flag */
#ifdef CONFIG_CXD56_DMAC
+ bool dmaenable; /* Use DMA or not */
DMA_HANDLE rxdmach; /* RX DMA channel handle */
DMA_HANDLE txdmach; /* TX DMA channel handle */
sem_t dmasem; /* Wait for DMA to complete */
@@ -187,19 +189,10 @@ static const struct spi_ops_s g_spi4ops =
#endif
.send = spi_send,
#ifdef CONFIG_SPI_EXCHANGE
-# if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
- .exchange = spi_dmaexchange,
-# else
.exchange = spi_exchange,
-# endif
#else
-# if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
- .sndblock = spi_dmasndblock,
- .recvblock = spi_dmarecvblock,
-# else
.sndblock = spi_sndblock,
.recvblock = spi_recvblock,
-# endif
#endif
#ifdef CONFIG_SPI_CALLBACK
.registercallback = cxd56_spi4register, /* Provided externally */
@@ -236,19 +229,10 @@ static const struct spi_ops_s g_spi5ops =
#endif
.send = spi_send,
#ifdef CONFIG_SPI_EXCHANGE
-# if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
- .exchange = spi_dmaexchange,
-# else
.exchange = spi_exchange,
-# endif
#else
-# if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
- .sndblock = spi_dmasndblock,
- .recvblock = spi_dmarecvblock,
-# else
.sndblock = spi_sndblock,
.recvblock = spi_recvblock,
-# endif
#endif
#ifdef CONFIG_SPI_CALLBACK
.registercallback = cxd56_spi5register, /* Provided externally */
@@ -623,6 +607,7 @@ static void spi_setbits(FAR struct spi_dev_s *dev, int nbits)
*/
priv->nbits = nbits;
+#ifdef CONFIG_CXD56_DMAC
if (priv->nbits > 8)
{
priv->txconfig.dest_width = CXD56_DMAC_WIDTH16;
@@ -637,6 +622,7 @@ static void spi_setbits(FAR struct spi_dev_s *dev, int nbits)
priv->rxconfig.dest_width = CXD56_DMAC_WIDTH8;
priv->rxconfig.src_width = CXD56_DMAC_WIDTH8;
}
+#endif
}
}
@@ -706,10 +692,10 @@ static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd)
}
/****************************************************************************
- * Name: spi_exchange
+ * Name: spi_do_exchange
*
* Description:
- * Exahange a block of data from SPI. Required.
+ * Exchange a block of data from SPI. Required.
*
* Input Parameters:
* dev - Device-specific state data
@@ -726,8 +712,8 @@ static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd)
*
****************************************************************************/
-static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
- FAR void *rxbuffer, size_t nwords)
+static void spi_do_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
+ FAR void *rxbuffer, size_t nwords)
{
FAR struct cxd56_spidev_s *priv = (FAR struct cxd56_spidev_s *)dev;
uint32_t regval = 0;
@@ -829,6 +815,44 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
}
/****************************************************************************
+ * Name: spi_exchange
+ *
+ * Description:
+ * Wrapper function of exchange a block of data from SPI.
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ * txbuffer - A pointer to the buffer of data to be sent
+ * rxbuffer - A pointer to the buffer in which to receive data
+ * nwords - the length of data that to be exchanged in units of words.
+ * The wordsize is determined by the number of bits-per-word
+ * selected for the SPI interface. If nbits <= 8, the data is
+ * packed into uint8_t's; if nbits >8, the data is packed into
+ * uint16_t's
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
+ FAR void *rxbuffer, size_t nwords)
+{
+#ifdef CONFIG_CXD56_DMAC
+ FAR struct cxd56_spidev_s *priv = (FAR struct cxd56_spidev_s *)dev;
+
+ if (priv->dmaenable)
+ {
+ spi_dmaexchange(dev, txbuffer, rxbuffer, nwords);
+ }
+ else
+#endif
+ {
+ spi_do_exchange(dev, txbuffer, rxbuffer, nwords);
+ }
+}
+
+/****************************************************************************
* Name: spi_sndblock
*
* Description:
@@ -1143,55 +1167,10 @@ FAR struct spi_dev_s *cxd56_spibus_initialize(int port)
priv->spibasefreq = cxd56_get_spi_baseclock(port);
/* DMA settings */
-
-#if defined(CONFIG_CXD56_DMAC_SPI4_TX) || defined(CONFIG_CXD56_DMAC_SPI4_RX)
- if (port == 4)
- {
-#if defined(CONFIG_CXD56_DMAC_SPI4_TX)
- priv->txconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI4_TX;
- priv->txdmach = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI4_TX_CH,
- CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE);
- if (priv->txdmach == NULL)
- {
- return NULL;
- }
-#endif
-#if defined(CONFIG_CXD56_DMAC_SPI4_RX)
- priv->rxconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI4_RX;
- priv->rxdmach = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI4_RX_CH,
- CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE);
- if (priv->rxdmach == NULL)
- {
- return NULL;
- }
-#endif
- nxsem_init(&priv->dmasem, 0, 0);
- }
-#endif
-
-#if defined(CONFIG_CXD56_DMAC_SPI5_TX) || defined(CONFIG_CXD56_DMAC_SPI5_RX)
- if (port == 5)
- {
-#if defined(CONFIG_CXD56_DMAC_SPI5_TX)
- priv->txconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI5_TX;
- priv->txdmach = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI5_TX_CH,
- CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE);
- if (priv->txdmach == NULL)
- {
- return NULL;
- }
-#endif
-#if defined(CONFIG_CXD56_DMAC_SPI5_RX)
- priv->rxconfig.channel_cfg = CXD56_DMA_PERIPHERAL_SPI5_RX;
- priv->rxdmach = cxd56_dmachannel(CONFIG_CXD56_DMAC_SPI5_RX_CH,
- CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE);
- if (priv->rxdmach == NULL)
- {
- return NULL;
- }
-#endif
- nxsem_init(&priv->dmasem, 0, 0);
- }
+#ifdef CONFIG_CXD56_DMAC
+ priv->dmaenable = false;
+ priv->txdmach = NULL;
+ priv->rxdmach = NULL;
#endif
/* CS control */
@@ -1263,6 +1242,81 @@ FAR struct spi_dev_s *cxd56_spibus_initialize(int port)
return &priv->spidev;
}
+#ifdef CONFIG_CXD56_DMAC
+
+/****************************************************************************
+ * Name: cxd56_spi_dmaconfig
+ *
+ * Description:
+ * Enable DMA configuration.
+ *
+ * Input Parameter:
+ * port - Port number
+ * chtype - Channel type(TX or RX)
+ * handle - DMA channel handle
+ * conf - DMA configuration
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void cxd56_spi_dmaconfig(int port, int chtype, DMA_HANDLE handle,
+ FAR dma_config_t *conf)
+{
+ FAR struct cxd56_spidev_s *priv = NULL;
+
+ switch (port)
+ {
+#if defined(CONFIG_CXD56_SPI4) && defined(CONFIG_CXD56_DMAC_SPI4_TX)
+ case 4:
+ priv = &g_spi4dev;
+ break;
+#endif
+
+#if defined(CONFIG_CXD56_SPI5) && defined(CONFIG_CXD56_DMAC_SPI5_TX)
+ case 5:
+ priv = &g_spi5dev;
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ if (priv && priv->initialized)
+ {
+ if ((chtype == CXD56_SPI_DMAC_CHTYPE_TX) && (!priv->txdmach))
+ {
+ /* TX DMA setting */
+
+ priv->txdmach = handle;
+ memcpy(&priv->txconfig, conf, sizeof(dma_config_t));
+
+ if (!priv->dmaenable)
+ {
+ sem_init(&priv->dmasem, 0, 0);
+ priv->dmaenable = true;
+ }
+ }
+ else if ((chtype == CXD56_SPI_DMAC_CHTYPE_RX) && (!priv->rxdmach))
+ {
+ /* RX DMA setting */
+
+ priv->rxdmach = handle;
+ memcpy(&priv->rxconfig, conf, sizeof(dma_config_t));
+
+ if (!priv->dmaenable)
+ {
+ sem_init(&priv->dmasem, 0, 0);
+ priv->dmaenable = true;
+ }
+ }
+ }
+}
+
+#endif
+
/****************************************************************************
* Name: spi_flush
*
diff --git a/arch/arm/src/cxd56xx/cxd56_spi.h b/arch/arm/src/cxd56xx/cxd56_spi.h
index c33ba9f..656efff 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.h
+++ b/arch/arm/src/cxd56xx/cxd56_spi.h
@@ -44,6 +44,9 @@
#include <nuttx/config.h>
#include <nuttx/spi/spi.h>
#include "hardware/cxd56_spi.h"
+#ifdef CONFIG_CXD56_DMAC
+#include "cxd56_dmac.h"
+#endif
#if defined(CONFIG_CXD56_SPI0) || defined(CONFIG_CXD56_SPI3) || \
defined(CONFIG_CXD56_SPI4) || defined(CONFIG_CXD56_SPI5)
@@ -68,6 +71,9 @@
* for example, will bind the SPI driver to the SPI MMC/SD driver).
*/
+#define CXD56_SPI_DMAC_CHTYPE_TX (0)
+#define CXD56_SPI_DMAC_CHTYPE_RX (1)
+
/****************************************************************************
* Public Types
****************************************************************************/
@@ -108,6 +114,28 @@ extern "C"
FAR struct spi_dev_s *cxd56_spibus_initialize(int port);
/****************************************************************************
+ * Name: cxd56_spi_dmaconfig
+ *
+ * Description:
+ * Enable DMA configuration.
+ *
+ * Input Parameter:
+ * port - Port number
+ * chtype - Channel type(TX or RX)
+ * handle - DMA channel handle
+ * conf - DMA configuration
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_CXD56_DMAC
+void cxd56_spi_dmaconfig(int port, int chtype, DMA_HANDLE handle,
+ FAR dma_config_t *conf);
+#endif
+
+/****************************************************************************
* Name: cxd56_spiXselect, cxd56_spiXstatus, and cxd56_spiXcmddata
*
* Description:
diff --git a/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c b/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
index 41bcace..e8d7ccd 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_altmdm_spi.c
@@ -50,6 +50,7 @@
#include <nuttx/modem/altmdm.h>
#include <arch/board/cxd56_altmdm.h>
#include "cxd56_spi.h"
+#include "cxd56_dmac.h"
#include "cxd56_pinconfig.h"
/****************************************************************************
@@ -57,29 +58,27 @@
****************************************************************************/
#if defined(CONFIG_CXD56_LTE_SPI4)
-#define SPI_CH (4)
-#if defined(CONFIG_CXD56_LTE_SPI4_DMAC)
-# if defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
-# if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE)
-# error CONFIG_CXD56_DMAC_SPI4_TX_MAXSIZE too small
-# endif
-# if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE)
-# error CONFIG_CXD56_DMAC_SPI4_RX_MAXSIZE too small
+# define SPI_CH (4)
+# if defined(CONFIG_CXD56_LTE_SPI4_DMAC)
+# define DMA_TXCH (2)
+# define DMA_RXCH (3)
+# define DMA_TXCHCHG (CXD56_DMA_PERIPHERAL_SPI4_TX)
+# define DMA_RXCHCFG (CXD56_DMA_PERIPHERAL_SPI4_RX)
+# if !defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
+# error CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE is not set
# endif
# endif
-#endif
#elif defined(CONFIG_CXD56_LTE_SPI5)
-#define SPI_CH (5)
-#if defined(CONFIG_CXD56_LTE_SPI5_DMAC)
-# if defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
-# if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE)
-# error CONFIG_CXD56_DMAC_SPI5_TX_MAXSIZE too small
-# endif
-# if (CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE > CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE)
-# error CONFIG_CXD56_DMAC_SPI5_RX_MAXSIZE too small
+# define SPI_CH (5)
+# if defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+# define DMA_TXCH (4)
+# define DMA_RXCH (5)
+# define DMA_TXCHCHG (CXD56_DMA_PERIPHERAL_SPI5_TX)
+# define DMA_RXCHCFG (CXD56_DMA_PERIPHERAL_SPI5_RX)
+# if !defined(CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE)
+# error CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE is not set
# endif
# endif
-#endif
#else
# error "Select LTE SPI 4 or 5"
#endif
@@ -110,44 +109,44 @@ static void spi_pincontrol(int bus, bool on)
switch (bus)
{
#ifdef CONFIG_CXD56_SPI4
- case 4:
- if (on)
- {
- CXD56_PIN_CONFIGS(PINCONFS_SPI4);
- }
- else
- {
- CXD56_PIN_CONFIGS(PINCONFS_SPI4_GPIO);
- }
- break;
-#endif /* CONFIG_CXD56_SPI4 */
+ case 4:
+ if (on)
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_SPI4);
+ }
+ else
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_SPI4_GPIO);
+ }
+ break;
+#endif /* CONFIG_CXD56_SPI4 */
#ifdef CONFIG_CXD56_SPI5
- case 5:
+ case 5:
#ifdef CONFIG_CXD56_SPI5_PINMAP_EMMC
- if (on)
- {
- CXD56_PIN_CONFIGS(PINCONFS_EMMCA_SPI5);
- }
- else
- {
- CXD56_PIN_CONFIGS(PINCONFS_EMMCA_GPIO);
- }
-#endif /* CONFIG_CXD56_SPI5_PINMAP_EMMC */
+ if (on)
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_EMMCA_SPI5);
+ }
+ else
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_EMMCA_GPIO);
+ }
+#endif /* CONFIG_CXD56_SPI5_PINMAP_EMMC */
#ifdef CONFIG_CXD56_SPI5_PINMAP_SDIO
- if (on)
- {
- CXD56_PIN_CONFIGS(PINCONFS_SDIOA_SPI5);
- }
- else
- {
- CXD56_PIN_CONFIGS(PINCONFS_SDIOA_GPIO);
- }
-#endif /* CONFIG_CXD56_SPI5_PINMAP_SDIO */
- break;
-#endif /* CONFIG_CXD56_SPI5 */
- default:
- break;
+ if (on)
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_SDIOA_SPI5);
+ }
+ else
+ {
+ CXD56_PIN_CONFIGS(PINCONFS_SDIOA_GPIO);
+ }
+#endif /* CONFIG_CXD56_SPI5_PINMAP_SDIO */
+ break;
+#endif /* CONFIG_CXD56_SPI5 */
+ default:
+ break;
}
}
@@ -166,7 +165,11 @@ static void spi_pincontrol(int bus, bool on)
int board_altmdm_initialize(FAR const char *devpath)
{
FAR struct spi_dev_s *spi;
- int spi_ch = SPI_CH;
+ int spi_ch = SPI_CH;
+#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+ DMA_HANDLE hdl;
+ dma_config_t conf;
+#endif
m_info("Initializing ALTMDM..\n");
@@ -181,6 +184,26 @@ int board_altmdm_initialize(FAR const char *devpath)
return -ENODEV;
}
+#if defined(CONFIG_CXD56_LTE_SPI4_DMAC) || defined(CONFIG_CXD56_LTE_SPI5_DMAC)
+ hdl = cxd56_dmachannel(DMA_TXCH, CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DMA_TXCHCHG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(spi_ch, CXD56_SPI_DMAC_CHTYPE_TX, hdl, &conf);
+ }
+
+ hdl = cxd56_dmachannel(DMA_RXCH, CONFIG_MODEM_ALTMDM_MAX_PACKET_SIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DMA_RXCHCFG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(spi_ch, CXD56_SPI_DMAC_CHTYPE_RX, hdl, &conf);
+ }
+#endif
+
spi_pincontrol(spi_ch, false);
g_devhandle = altmdm_register(devpath, spi);
diff --git a/boards/arm/cxd56xx/common/src/cxd56_ili9340.c b/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
index 9a0e4e9..1202887 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_ili9340.c
@@ -334,6 +334,10 @@ int board_lcd_initialize(void)
{
FAR struct ili93404ws_lcd_s *priv = &g_lcddev;
FAR struct spi_dev_s *spi;
+#if defined(CONFIG_CXD56_DMAC)
+ DMA_HANDLE hdl;
+ dma_config_t conf;
+#endif
lcdinfo("Initializing lcd\n");
@@ -347,6 +351,29 @@ int board_lcd_initialize(void)
}
priv->spi = spi;
+#if defined(CONFIG_CXD56_DMAC)
+ /* DMA settings */
+
+ hdl = cxd56_dmachannel(DISPLAY_DMA_TXCH, DISPLAY_DMA_TX_MAXSIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DISPLAY_DMA_TXCH_CFG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_TX,
+ hdl, &conf);
+ }
+ hdl = cxd56_dmachannel(DISPLAY_DMA_RXCH, DISPLAY_DMA_RX_MAXSIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DISPLAY_DMA_RXCH_CFG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_RX,
+ hdl, &conf);
+ }
+#endif
+
/* Reset ILI9340 */
up_mdelay(10);
diff --git a/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c b/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
index 9a6baa8..5052423 100644
--- a/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
+++ b/boards/arm/cxd56xx/common/src/cxd56_lpm013m091a.c
@@ -334,6 +334,10 @@ int board_lcd_initialize(void)
{
FAR struct lpm013m091a_lcd_s *priv = &g_lcddev;
FAR struct spi_dev_s *spi;
+#if defined(CONFIG_CXD56_DMAC)
+ DMA_HANDLE hdl;
+ dma_config_t conf;
+#endif
lcdinfo("Initializing lcd\n");
@@ -347,6 +351,29 @@ int board_lcd_initialize(void)
}
priv->spi = spi;
+#if defined(CONFIG_CXD56_DMAC)
+ /* DMA settings */
+
+ hdl = cxd56_dmachannel(DISPLAY_DMA_TXCH, DISPLAY_DMA_TX_MAXSIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DISPLAY_DMA_TXCH_CFG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_TX,
+ hdl, &conf);
+ }
+ hdl = cxd56_dmachannel(DISPLAY_DMA_RXCH, DISPLAY_DMA_RX_MAXSIZE);
+ if (hdl)
+ {
+ conf.channel_cfg = DISPLAY_DMA_RXCH_CFG;
+ conf.dest_width = CXD56_DMAC_WIDTH8;
+ conf.src_width = CXD56_DMAC_WIDTH8;
+ cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_RX,
+ hdl, &conf);
+ }
+#endif
+
/* Reset LPM013M091A */
up_mdelay(10);
diff --git a/boards/arm/cxd56xx/spresense/Kconfig b/boards/arm/cxd56xx/spresense/Kconfig
index 30a1001..d43655f 100644
--- a/boards/arm/cxd56xx/spresense/Kconfig
+++ b/boards/arm/cxd56xx/spresense/Kconfig
@@ -59,12 +59,16 @@ choice
config LCD_ON_EXTENSION_BOARD
bool "Extension board: SPI4"
select CXD56_SPI4
+ select CXD56_DMAC_SPI4_TX
+ select CXD56_DMAC_SPI4_RX
---help---
Display connected to extension board.
config LCD_ON_MAIN_BOARD
bool "Main board: SPI5"
select CXD56_SPI5
+ select CXD56_DMAC_SPI5_TX
+ select CXD56_DMAC_SPI5_RX
---help---
Display connected to main board.
diff --git a/boards/arm/cxd56xx/spresense/include/board.h b/boards/arm/cxd56xx/spresense/include/board.h
index a1df198..3343fea 100644
--- a/boards/arm/cxd56xx/spresense/include/board.h
+++ b/boards/arm/cxd56xx/spresense/include/board.h
@@ -254,6 +254,13 @@ enum board_power_device
#define DISPLAY_SPI 5
+#define DISPLAY_DMA_TXCH (4)
+#define DISPLAY_DMA_RXCH (5)
+#define DISPLAY_DMA_TXCH_CFG CXD56_DMA_PERIPHERAL_SPI5_TX
+#define DISPLAY_DMA_RXCH_CFG CXD56_DMA_PERIPHERAL_SPI5_RX
+#define DISPLAY_DMA_TX_MAXSIZE (192000)
+#define DISPLAY_DMA_RX_MAXSIZE (192000)
+
#else /* Display is connected through extension board. */
#define DISPLAY_RST PIN_SPI2_MISO
@@ -261,6 +268,13 @@ enum board_power_device
#define DISPLAY_SPI 4
+#define DISPLAY_DMA_TXCH (2)
+#define DISPLAY_DMA_RXCH (3)
+#define DISPLAY_DMA_TXCH_CFG CXD56_DMA_PERIPHERAL_SPI4_TX
+#define DISPLAY_DMA_RXCH_CFG CXD56_DMA_PERIPHERAL_SPI4_RX
+#define DISPLAY_DMA_TX_MAXSIZE (192000)
+#define DISPLAY_DMA_RX_MAXSIZE (192000)
+
#endif
/* Sensor device bus definitions *******************************************/
diff --git a/boards/arm/cxd56xx/spresense/src/cxd56_spi.c b/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
index 7435aa3..54ffba5 100644
--- a/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
+++ b/boards/arm/cxd56xx/spresense/src/cxd56_spi.c
@@ -54,12 +54,6 @@
#include "cxd56_gpio.h"
/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define MMCSD_DETECT PIN_AP_CLK
-
-/****************************************************************************
* Public Functions
****************************************************************************/