lpc43/lpc54 SDMDC: Don't enable internal DMA in the control register if not doing internal DMA. Clear pending DMA-related interrupts before enabling them.
This commit is contained in:
parent
1117a6e8ce
commit
6fa734457d
@ -196,6 +196,7 @@
|
||||
|
||||
/* Card type register CTYPE */
|
||||
|
||||
#define SDMMC_CTYPE_WIDTH1 (0) /* 1-bit mode */
|
||||
#define SDMMC_CTYPE_WIDTH4 (1 << 0) /* Bit 0: 4-bit mode */
|
||||
/* Bits 1-15: Reserved */
|
||||
#define SDMMC_CTYPE_WIDTH8 (1 << 16) /* Bit 16: 8-bit mode */
|
||||
@ -391,6 +392,7 @@
|
||||
#define SDMMC_IDINTEN_NIS (1 << 8) /* Bit 8: Normal Interrupt Summary */
|
||||
#define SDMMC_IDINTEN_AIS (1 << 9) /* Bit 9: Abnormal Interrupt Summary */
|
||||
/* Bits 10-31: Reserved */
|
||||
#define SDMMC_IDINTEN_ALL 0x00000333
|
||||
|
||||
/************************************************************************************************
|
||||
* Public Types
|
||||
|
@ -268,7 +268,6 @@ static void lpc43_checksetup(void);
|
||||
static void lpc43_takesem(struct lpc43_dev_s *priv);
|
||||
#define lpc43_givesem(priv) (sem_post(&priv->waitsem))
|
||||
static inline void lpc43_setclock(uint32_t clkdiv);
|
||||
static inline void lpc43_settype(uint32_t ctype);
|
||||
static inline void lpc43_sdcard_clock(bool enable);
|
||||
static int lpc43_ciu_sendcmd(uint32_t cmd, uint32_t arg);
|
||||
static void lpc43_configwaitints(struct lpc43_dev_s *priv, uint32_t waitmask,
|
||||
@ -572,25 +571,6 @@ static inline void lpc43_setclock(uint32_t clkdiv)
|
||||
lpc43_ciu_sendcmd(SDMMC_CMD_UPDCLOCK | SDMMC_CMD_WAITPREV, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lpc43_settype
|
||||
*
|
||||
* Description: Define the Bus Size of SDCard (1, 4 or 8-bit)
|
||||
*
|
||||
* Input Parameters:
|
||||
* ctype - A new CTYPE (Card Type Register) value
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static inline void lpc43_settype(uint32_t ctype)
|
||||
{
|
||||
mcinfo("cteype=%08lx\n", (unsigned long)ctype);
|
||||
lpc43_putreg(ctype, LPC43_SDMMC_CTYPE);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lpc43_sdcard_clock
|
||||
*
|
||||
@ -1252,8 +1232,10 @@ static void lpc43_reset(FAR struct sdio_dev_s *dev)
|
||||
lpc43_putreg(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET |
|
||||
SDMMC_CTRL_DMARESET, LPC43_SDMMC_CTRL);
|
||||
|
||||
while ((regval = lpc43_getreg(LPC43_SDMMC_CTRL)) &
|
||||
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET));
|
||||
while ((lpc43_getreg(LPC43_SDMMC_CTRL) &
|
||||
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET)) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
/* Reset data */
|
||||
|
||||
@ -1277,18 +1259,17 @@ static void lpc43_reset(FAR struct sdio_dev_s *dev)
|
||||
priv->widebus = true; /* Required for DMA support */
|
||||
priv->cdstatus = 0; /* Card status is unknown */
|
||||
|
||||
regval = 0;
|
||||
|
||||
#ifdef CONFIG_LPC43_SDMMC_DMA
|
||||
priv->dmamode = false; /* true: DMA mode transfer */
|
||||
|
||||
/* Use the Internal DMA */
|
||||
|
||||
regval = SDMMC_CTRL_INTDMA;
|
||||
#endif
|
||||
|
||||
/* Select 1-bit wide bus */
|
||||
|
||||
lpc43_putreg(SDMMC_CTYPE_WIDTH1, LPC43_SDMMC_CTYPE);
|
||||
|
||||
/* Enable interrupts */
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTENABLE;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
|
||||
@ -1400,8 +1381,6 @@ static void lpc43_widebus(FAR struct sdio_dev_s *dev, bool wide)
|
||||
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
|
||||
|
||||
mcinfo("wide=%d\n", wide);
|
||||
|
||||
priv->widebus = wide;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -1421,9 +1400,11 @@ static void lpc43_widebus(FAR struct sdio_dev_s *dev, bool wide)
|
||||
|
||||
static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
{
|
||||
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
|
||||
uint8_t clkdiv;
|
||||
uint8_t ctype;
|
||||
bool enabled = false;
|
||||
bool widebus = false;
|
||||
|
||||
switch (rate)
|
||||
{
|
||||
@ -1434,6 +1415,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = false;
|
||||
widebus = false;
|
||||
return;
|
||||
break;
|
||||
|
||||
@ -1443,6 +1425,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
|
||||
/* Enable in MMC normal operation clocking */
|
||||
@ -1451,6 +1434,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_MMCXFR);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
|
||||
/* SD normal operation clocking (wide 4-bit mode) */
|
||||
@ -1460,6 +1444,7 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDWIDEXFR);
|
||||
ctype = SDCARD_BUS_D4;
|
||||
enabled = true;
|
||||
widebus = true;
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -1469,12 +1454,16 @@ static void lpc43_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDXFR);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Setup the type of card bus wide */
|
||||
/* Setup the card bus width */
|
||||
|
||||
lpc43_settype(ctype);
|
||||
mcinfo("widebus=%d\n", widebus);
|
||||
|
||||
priv->widebus = widebus;
|
||||
lpc43_putreg(ctype, LPC43_SDMMC_CTYPE);
|
||||
|
||||
/* Set the new clock frequency division */
|
||||
|
||||
@ -1516,7 +1505,7 @@ static int lpc43_attach(FAR struct sdio_dev_s *dev)
|
||||
*/
|
||||
|
||||
lpc43_putreg(0, LPC43_SDMMC_INTMASK);
|
||||
lpc43_putreg(SDMMC_INT_ALL , LPC43_SDMMC_RINTSTS);
|
||||
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
|
||||
|
||||
/* Enable Interrupts to happen when the INTMASK is activated */
|
||||
|
||||
@ -1647,6 +1636,9 @@ static int lpc43_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
|
||||
uint32_t blocksize;
|
||||
uint32_t bytecnt;
|
||||
#ifdef CONFIG_LPC43_SDMMC_DMA
|
||||
uint32_t regval;
|
||||
#endif
|
||||
|
||||
mcinfo("nbytes=%ld\n", (long) nbytes);
|
||||
|
||||
@ -1685,10 +1677,16 @@ static int lpc43_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
|
||||
lpc43_putreg(SDMMC_FIFOTH_RXWMARK(1), LPC43_SDMMC_FIFOTH);
|
||||
|
||||
#ifdef CONFIG_LPC43_SDMMC_DMA
|
||||
/* Make sure that internal DMA is disabled */
|
||||
|
||||
lpc43_putreg(0, LPC43_SDMMC_BMOD);
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval &= ~SDMMC_CTRL_INTDMA;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
#endif
|
||||
|
||||
/* Configure the transfer interrupts */
|
||||
|
||||
lpc43_configxfrints(priv, SDCARD_RECV_MASK);
|
||||
@ -1718,6 +1716,9 @@ static int lpc43_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
|
||||
size_t nbytes)
|
||||
{
|
||||
struct lpc43_dev_s *priv = (struct lpc43_dev_s *)dev;
|
||||
#ifdef CONFIG_LPC43_SDMMC_DMA
|
||||
uint32_t regval;
|
||||
#endif
|
||||
|
||||
mcinfo("nbytes=%ld\n", (long)nbytes);
|
||||
|
||||
@ -1740,10 +1741,16 @@ static int lpc43_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
|
||||
lpc43_putreg(SDMMC_FIFOTH_TXWMARK(LPC43_TXFIFO_DEPTH / 2),
|
||||
LPC43_SDMMC_FIFOTH);
|
||||
|
||||
#ifdef CONFIG_LPC43_SDMMC_DMA
|
||||
/* Make sure that internal DMA is disabled */
|
||||
|
||||
lpc43_putreg(0, LPC43_SDMMC_BMOD);
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval &= ~SDMMC_CTRL_INTDMA;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
#endif
|
||||
|
||||
/* Configure the transfer interrupts */
|
||||
|
||||
lpc43_configxfrints(priv, SDCARD_SEND_MASK);
|
||||
@ -2388,13 +2395,13 @@ static int lpc43_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
priv->wrdir = false;
|
||||
priv->dmamode = true;
|
||||
|
||||
/* Reset DMA */
|
||||
/* Reset the FIFO and DMA */
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
|
||||
while (lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
|
||||
while ((lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -2461,11 +2468,18 @@ static int lpc43_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
|
||||
/* Enable internal DMA, burst size of 4, fixed burst */
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTDMA;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
|
||||
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
|
||||
lpc43_putreg(regval, LPC43_SDMMC_BMOD);
|
||||
|
||||
/* Setup DMA error interrupts */
|
||||
|
||||
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
|
||||
lpc43_putreg(SDMMC_IDINTEN_ALL, LPC43_SDMMC_IDSTS);
|
||||
|
||||
lpc43_configxfrints(priv, SDCARD_DMARECV_MASK);
|
||||
lpc43_configdmaints(priv, SDCARD_DMAERROR_MASK);
|
||||
return OK;
|
||||
@ -2527,12 +2541,13 @@ static int lpc43_dmasendsetup(FAR struct sdio_dev_s *dev,
|
||||
priv->wrdir = true;
|
||||
priv->dmamode = true;
|
||||
|
||||
/* Reset DMA */
|
||||
/* Reset the FIFO and DMA */
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
while (lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
|
||||
|
||||
while ((lpc43_getreg(LPC43_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -2555,11 +2570,18 @@ static int lpc43_dmasendsetup(FAR struct sdio_dev_s *dev,
|
||||
|
||||
/* Enable internal DMA, burst size of 4, fixed burst */
|
||||
|
||||
regval = lpc43_getreg(LPC43_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTDMA;
|
||||
lpc43_putreg(regval, LPC43_SDMMC_CTRL);
|
||||
|
||||
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
|
||||
lpc43_putreg(regval, LPC43_SDMMC_BMOD);
|
||||
|
||||
/* Setup DMA error interrupts */
|
||||
|
||||
lpc43_putreg(SDMMC_INT_ALL, LPC43_SDMMC_RINTSTS);
|
||||
lpc43_putreg(SDMMC_IDINTEN_ALL, LPC43_SDMMC_IDSTS);
|
||||
|
||||
lpc43_configxfrints(priv, SDCARD_DMASEND_MASK);
|
||||
lpc43_configdmaints(priv, SDCARD_DMAERROR_MASK);
|
||||
return OK;
|
||||
|
@ -186,6 +186,7 @@
|
||||
|
||||
/* Card type register CTYPE */
|
||||
|
||||
#define SDMMC_CTYPE_WIDTH1 (0) /* 1-bit mode */
|
||||
#define SDMMC_CTYPE_WIDTH4 (1 << 0) /* Bit 0: 4-bit mode */
|
||||
/* Bits 1-15: Reserved */
|
||||
#define SDMMC_CTYPE_WIDTH8 (1 << 16) /* Bit 16: 8-bit mode */
|
||||
@ -383,6 +384,7 @@
|
||||
#define SDMMC_IDINTEN_NIS (1 << 8) /* Bit 8: Normal Interrupt Summary */
|
||||
#define SDMMC_IDINTEN_AIS (1 << 9) /* Bit 9: Abnormal Interrupt Summary */
|
||||
/* Bits 10-31: Reserved */
|
||||
#define SDMMC_IDINTEN_ALL 0x00000333
|
||||
|
||||
/* Card threshold control */
|
||||
|
||||
|
@ -272,7 +272,6 @@ static void lpc54_checksetup(void);
|
||||
static void lpc54_takesem(struct lpc54_dev_s *priv);
|
||||
#define lpc54_givesem(priv) (sem_post(&priv->waitsem))
|
||||
static inline void lpc54_setclock(uint32_t clkdiv);
|
||||
static inline void lpc54_settype(uint32_t ctype);
|
||||
static inline void lpc54_sdcard_clock(bool enable);
|
||||
static int lpc54_ciu_sendcmd(uint32_t cmd, uint32_t arg);
|
||||
static void lpc54_configwaitints(struct lpc54_dev_s *priv, uint32_t waitmask,
|
||||
@ -572,25 +571,6 @@ static inline void lpc54_setclock(uint32_t clkdiv)
|
||||
lpc54_ciu_sendcmd(SDMMC_CMD_UPDCLOCK | SDMMC_CMD_WAITPREV, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lpc54_settype
|
||||
*
|
||||
* Description: Define the Bus Size of SDCard (1, 4 or 8-bit)
|
||||
*
|
||||
* Input Parameters:
|
||||
* ctype - A new CTYPE (Card Type Register) value
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static inline void lpc54_settype(uint32_t ctype)
|
||||
{
|
||||
mcinfo("cteype=%08lx\n", (unsigned long)ctype);
|
||||
lpc54_putreg(ctype, LPC54_SDMMC_CTYPE);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lpc54_sdcard_clock
|
||||
*
|
||||
@ -1252,8 +1232,10 @@ static void lpc54_reset(FAR struct sdio_dev_s *dev)
|
||||
lpc54_putreg(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET |
|
||||
SDMMC_CTRL_DMARESET, LPC54_SDMMC_CTRL);
|
||||
|
||||
while ((regval = lpc54_getreg(LPC54_SDMMC_CTRL)) &
|
||||
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET));
|
||||
while ((lpc54_getreg(LPC54_SDMMC_CTRL) &
|
||||
(SDMMC_CTRL_CNTLRRESET | SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET)) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
/* Reset data */
|
||||
|
||||
@ -1277,18 +1259,17 @@ static void lpc54_reset(FAR struct sdio_dev_s *dev)
|
||||
priv->widebus = true; /* Required for DMA support */
|
||||
priv->cdstatus = 0; /* Card status is unknown */
|
||||
|
||||
regval = 0;
|
||||
|
||||
#ifdef CONFIG_LPC54_SDMMC_DMA
|
||||
priv->dmamode = false; /* true: DMA mode transfer */
|
||||
|
||||
/* Use the Internal DMA */
|
||||
|
||||
regval = SDMMC_CTRL_INTDMA;
|
||||
#endif
|
||||
|
||||
/* Select 1-bit wide bus */
|
||||
|
||||
lpc54_putreg(SDMMC_CTYPE_WIDTH1, LPC54_SDMMC_CTYPE);
|
||||
|
||||
/* Enable interrupts */
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTENABLE;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
|
||||
@ -1400,8 +1381,6 @@ static void lpc54_widebus(FAR struct sdio_dev_s *dev, bool wide)
|
||||
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
|
||||
|
||||
mcinfo("wide=%d\n", wide);
|
||||
|
||||
priv->widebus = wide;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -1421,9 +1400,11 @@ static void lpc54_widebus(FAR struct sdio_dev_s *dev, bool wide)
|
||||
|
||||
static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
{
|
||||
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
|
||||
uint8_t clkdiv;
|
||||
uint8_t ctype;
|
||||
bool enabled = false;
|
||||
bool widebus = false;
|
||||
|
||||
switch (rate)
|
||||
{
|
||||
@ -1434,6 +1415,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = false;
|
||||
widebus = false;
|
||||
return;
|
||||
break;
|
||||
|
||||
@ -1443,6 +1425,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_INIT);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
|
||||
/* Enable in MMC normal operation clocking */
|
||||
@ -1451,6 +1434,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_MMCXFR);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
|
||||
/* SD normal operation clocking (wide 4-bit mode) */
|
||||
@ -1460,6 +1444,7 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDWIDEXFR);
|
||||
ctype = SDCARD_BUS_D4;
|
||||
enabled = true;
|
||||
widebus = true;
|
||||
break;
|
||||
#endif
|
||||
|
||||
@ -1469,12 +1454,16 @@ static void lpc54_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
||||
clkdiv = SDMMC_CLKDIV0(BOARD_CLKDIV_SDXFR);
|
||||
ctype = SDCARD_BUS_D1;
|
||||
enabled = true;
|
||||
widebus = false;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Setup the type of card bus wide */
|
||||
/* Setup the card bus width */
|
||||
|
||||
lpc54_settype(ctype);
|
||||
mcinfo("widebus=%d\n", widebus);
|
||||
|
||||
priv->widebus = widebus;
|
||||
lpc54_putreg(ctype, LPC54_SDMMC_CTYPE);
|
||||
|
||||
/* Set the new clock frequency division */
|
||||
|
||||
@ -1516,7 +1505,7 @@ static int lpc54_attach(FAR struct sdio_dev_s *dev)
|
||||
*/
|
||||
|
||||
lpc54_putreg(0, LPC54_SDMMC_INTMASK);
|
||||
lpc54_putreg(SDMMC_INT_ALL , LPC54_SDMMC_RINTSTS);
|
||||
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
|
||||
|
||||
/* Enable Interrupts to happen when the INTMASK is activated */
|
||||
|
||||
@ -1647,6 +1636,9 @@ static int lpc54_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
|
||||
uint32_t blocksize;
|
||||
uint32_t bytecnt;
|
||||
#ifdef CONFIG_LPC54_SDMMC_DMA
|
||||
uint32_t regval;
|
||||
#endif
|
||||
|
||||
mcinfo("nbytes=%ld\n", (long) nbytes);
|
||||
|
||||
@ -1685,10 +1677,16 @@ static int lpc54_recvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
|
||||
lpc54_putreg(SDMMC_FIFOTH_RXWMARK(1), LPC54_SDMMC_FIFOTH);
|
||||
|
||||
#ifdef CONFIG_LPC54_SDMMC_DMA
|
||||
/* Make sure that internal DMA is disabled */
|
||||
|
||||
lpc54_putreg(0, LPC54_SDMMC_BMOD);
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval &= ~SDMMC_CTRL_INTDMA;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
#endif
|
||||
|
||||
/* Configure the transfer interrupts */
|
||||
|
||||
lpc54_configxfrints(priv, SDCARD_RECV_MASK);
|
||||
@ -1718,6 +1716,9 @@ static int lpc54_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
|
||||
size_t nbytes)
|
||||
{
|
||||
struct lpc54_dev_s *priv = (struct lpc54_dev_s *)dev;
|
||||
#ifdef CONFIG_LPC54_SDMMC_DMA
|
||||
uint32_t regval;
|
||||
#endif
|
||||
|
||||
mcinfo("nbytes=%ld\n", (long)nbytes);
|
||||
|
||||
@ -1740,10 +1741,16 @@ static int lpc54_sendsetup(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer
|
||||
lpc54_putreg(SDMMC_FIFOTH_TXWMARK(LPC54_TXFIFO_DEPTH / 2),
|
||||
LPC54_SDMMC_FIFOTH);
|
||||
|
||||
#ifdef CONFIG_LPC54_SDMMC_DMA
|
||||
/* Make sure that internal DMA is disabled */
|
||||
|
||||
lpc54_putreg(0, LPC54_SDMMC_BMOD);
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval &= ~SDMMC_CTRL_INTDMA;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
#endif
|
||||
|
||||
/* Configure the transfer interrupts */
|
||||
|
||||
lpc54_configxfrints(priv, SDCARD_SEND_MASK);
|
||||
@ -2388,13 +2395,13 @@ static int lpc54_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
priv->wrdir = false;
|
||||
priv->dmamode = true;
|
||||
|
||||
/* Reset DMA */
|
||||
/* Reset the FIFO and DMA */
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
|
||||
while (lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
|
||||
while ((lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -2461,11 +2468,18 @@ static int lpc54_dmarecvsetup(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer,
|
||||
|
||||
/* Enable internal DMA, burst size of 4, fixed burst */
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTDMA;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
|
||||
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
|
||||
lpc54_putreg(regval, LPC54_SDMMC_BMOD);
|
||||
|
||||
/* Setup DMA error interrupts */
|
||||
|
||||
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
|
||||
lpc54_putreg(SDMMC_IDINTEN_ALL, LPC54_SDMMC_IDSTS);
|
||||
|
||||
lpc54_configxfrints(priv, SDCARD_DMARECV_MASK);
|
||||
lpc54_configdmaints(priv, SDCARD_DMAERROR_MASK);
|
||||
return OK;
|
||||
@ -2527,12 +2541,13 @@ static int lpc54_dmasendsetup(FAR struct sdio_dev_s *dev,
|
||||
priv->wrdir = true;
|
||||
priv->dmamode = true;
|
||||
|
||||
/* Reset DMA */
|
||||
/* Reset the FIFO and DMA */
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_FIFORESET | SDMMC_CTRL_DMARESET;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
while (lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET)
|
||||
|
||||
while ((lpc54_getreg(LPC54_SDMMC_CTRL) & SDMMC_CTRL_DMARESET) != 0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -2555,11 +2570,18 @@ static int lpc54_dmasendsetup(FAR struct sdio_dev_s *dev,
|
||||
|
||||
/* Enable internal DMA, burst size of 4, fixed burst */
|
||||
|
||||
regval = lpc54_getreg(LPC54_SDMMC_CTRL);
|
||||
regval |= SDMMC_CTRL_INTDMA;
|
||||
lpc54_putreg(regval, LPC54_SDMMC_CTRL);
|
||||
|
||||
regval = SDMMC_BMOD_DE | SDMMC_BMOD_PBL_4XFRS | SDMMC_BMOD_DSL(4);
|
||||
lpc54_putreg(regval, LPC54_SDMMC_BMOD);
|
||||
|
||||
/* Setup DMA error interrupts */
|
||||
|
||||
lpc54_putreg(SDMMC_INT_ALL, LPC54_SDMMC_RINTSTS);
|
||||
lpc54_putreg(SDMMC_IDINTEN_ALL, LPC54_SDMMC_IDSTS);
|
||||
|
||||
lpc54_configxfrints(priv, SDCARD_DMASEND_MASK);
|
||||
lpc54_configdmaints(priv, SDCARD_DMAERROR_MASK);
|
||||
return OK;
|
||||
|
Loading…
x
Reference in New Issue
Block a user