summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-03-29 17:36:17 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-03-29 17:36:17 +0000
commitada03ef1d1fef07264c7b187648f3655f75365f0 (patch)
tree1ac9c6e9737231d6c1880f54519027b4540882c5 /nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c
parentfd7c0194d583e6f7d60e29f5fdd88b3a68b0d0de (diff)
downloadpx4-nuttx-ada03ef1d1fef07264c7b187648f3655f75365f0.tar.gz
px4-nuttx-ada03ef1d1fef07264c7b187648f3655f75365f0.tar.bz2
px4-nuttx-ada03ef1d1fef07264c7b187648f3655f75365f0.zip
Fixes for LPC1788 compile when SDCARD DMA is enabled (still missing DMA logic)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5799 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c')
-rw-r--r--nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c80
1 files changed, 44 insertions, 36 deletions
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c b/nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c
index ec2190348..14ba07bf6 100644
--- a/nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c
+++ b/nuttx/arch/arm/src/lpc17xx/lpc17_sdcard.c
@@ -152,16 +152,21 @@
* - Memory burst size (F4 only)
*/
-/* Stream configuration register (SCR) settings. */
+/* DMA control register settings */
-#define SDCARD_RXDMA32_CONFIG (DMA_SCR_PFCTRL|DMA_SCR_DIR_P2M|DMA_SCR_MINC|\
- DMA_SCR_PSIZE_32BITS|DMA_SCR_MSIZE_32BITS|\
- CONFIG_SDCARD_DMAPRIO|DMA_SCR_PBURST_INCR4|\
- DMA_SCR_MBURST_INCR4)
-#define SDCARD_TXDMA32_CONFIG (DMA_SCR_PFCTRL|DMA_SCR_DIR_M2P|DMA_SCR_MINC|\
- DMA_SCR_PSIZE_32BITS|DMA_SCR_MSIZE_32BITS|\
- CONFIG_SDCARD_DMAPRIO|DMA_SCR_PBURST_INCR4|\
- DMA_SCR_MBURST_INCR4)
+#define SDCARD_RXDMA32_CONTROL (DMACH_CONTROL_SBSIZE_4|DMACH_CONTROL_DBSIZE_4|\
+ DMACH_CONTROL_SWIDTH_32BIT|DMACH_CONTROL_DWIDTH_32BIT|\
+ DMACH_CONTROL_DI)
+#define SDCARD_TXDMA32_CONTROL (DMACH_CONTROL_SBSIZE_4|DMACH_CONTROL_DBSIZE_4|\
+ DMACH_CONTROL_SWIDTH_32BIT|DMACH_CONTROL_DWIDTH_32BIT|\
+ DMACH_CONTROL_SI)
+
+/* DMA configuration register settings */
+
+#define SDCARD_RXDMA32_CONFIG (DMACH_CONFIG_E|DMACH_CONFIG_SRCPER_SDCARD|\
+ DMACH_CONFIG_XFRTYPE_P2M)
+#define SDCARD_TXDMA32_CONFIG (DMACH_CONFIG_E|DMACH_CONFIG_DSTPER_SDCARD|\
+ DMACH_CONFIG_XFRTYPE_M2P)
/* SD card DMA Channel/Stream selection. For the the case of the LPC17XX F4, there
* are multiple DMA stream options that must be dis-ambiguated in the board.h
@@ -336,7 +341,7 @@ static void lpc17_dumpsamples(struct lpc17_dev_s *priv);
#endif
#ifdef CONFIG_SDIO_DMA
-static void lpc17_dmacallback(DMA_HANDLE handle, uint8_t status, void *arg);
+static void lpc17_dmacallback(DMA_HANDLE handle, void *arg, int status);
#endif
/* Data Transfer Helpers ****************************************************/
@@ -800,7 +805,7 @@ static void lpc17_dumpsamples(struct lpc17_dev_s *priv)
****************************************************************************/
#ifdef CONFIG_SDIO_DMA
-static void lpc17_dmacallback(DMA_HANDLE handle, uint8_t status, void *arg)
+static void lpc17_dmacallback(DMA_HANDLE handle, void *arg, int status)
{
FAR struct lpc17_dev_s *priv = (FAR struct lpc17_dev_s *)arg;
DEBUGASSERT(priv->dmamode);
@@ -816,9 +821,9 @@ static void lpc17_dmacallback(DMA_HANDLE handle, uint8_t status, void *arg)
/* Get the result of the DMA transfer */
- if ((status & DMA_STATUS_ERROR) != 0)
+ if (status < 0)
{
- flldbg("DMA error %02x, remaining: %d\n", status, priv->remaining);
+ flldbg("DMA error %d, remaining: %d\n", status, priv->remaining);
result = SDIOWAIT_ERROR;
}
else
@@ -2468,15 +2473,17 @@ static int lpc17_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
regval |= SDCARD_DCTRL_DMAEN;
putreg32(regval, LPC17_SDCARD_DCTRL);
- lpc17_dmasetup(priv->dma, LPC17_SDCARD_FIFO, (uint32_t)buffer,
- (buflen + 3) >> 2, SDCARD_RXDMA32_CONFIG);
-
- /* Start the DMA */
+ ret = lpc17_dmasetup(priv->dma, SDCARD_RXDMA32_CONTROL,
+ SDCARD_RXDMA32_CONFIG, LPC17_SDCARD_FIFO,
+ (uint32_t)buffer, buflen);
+ if (ret == OK)
+ {
+ /* Start the DMA */
- lpc17_sample(priv, SAMPLENDX_BEFORE_ENABLE);
- lpc17_dmastart(priv->dma, lpc17_dmacallback, priv, false);
- lpc17_sample(priv, SAMPLENDX_AFTER_SETUP);
- ret = OK;
+ lpc17_sample(priv, SAMPLENDX_BEFORE_ENABLE);
+ lpc17_dmastart(priv->dma, lpc17_dmacallback, priv);
+ lpc17_sample(priv, SAMPLENDX_AFTER_SETUP);
+ }
}
return ret;
@@ -2538,25 +2545,26 @@ static int lpc17_dmasendsetup(FAR struct sdio_dev_s *dev,
/* Configure the TX DMA */
- lpc17_dmasetup(priv->dma, LPC17_SDCARD_FIFO, (uint32_t)buffer,
- (buflen + 3) >> 2, SDCARD_TXDMA32_CONFIG);
-
- lpc17_sample(priv, SAMPLENDX_BEFORE_ENABLE);
-
- regval = getreg32(LPC17_SDCARD_DCTRL);
- regval |= SDCARD_DCTRL_DMAEN;
- putreg32(regval, LPC17_SDCARD_DCTRL);
+ ret = lpc17_dmasetup(priv->dma, SDCARD_TXDMA32_CONTROL,
+ SDCARD_TXDMA32_CONFIG, (uint32_t)buffer,
+ LPC17_SDCARD_FIFO, buflen);
+ if (ret == OK)
+ {
+ lpc17_sample(priv, SAMPLENDX_BEFORE_ENABLE);
- /* Start the DMA */
+ regval = getreg32(LPC17_SDCARD_DCTRL);
+ regval |= SDCARD_DCTRL_DMAEN;
+ putreg32(regval, LPC17_SDCARD_DCTRL);
- lpc17_dmastart(priv->dma, lpc17_dmacallback, priv, false);
- lpc17_sample(priv, SAMPLENDX_AFTER_SETUP);
+ /* Start the DMA */
- /* Enable TX interrrupts */
+ lpc17_dmastart(priv->dma, lpc17_dmacallback, priv);
+ lpc17_sample(priv, SAMPLENDX_AFTER_SETUP);
- lpc17_configxfrints(priv, SDCARD_DMASEND_MASK);
+ /* Enable TX interrrupts */
- ret = OK;
+ lpc17_configxfrints(priv, SDCARD_DMASEND_MASK);
+ }
}
return ret;
@@ -2706,7 +2714,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
/* Allocate a DMA channel */
#ifdef CONFIG_SDIO_DMA
- priv->dma = lpc17_dmachannel(SDCARD_DMACHAN);
+ priv->dma = lpc17_dmachannel();
DEBUGASSERT(priv->dma);
#endif