summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-08-06 11:29:53 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-08-06 11:29:53 -0600
commit069400647b14eaa42b6f4d48b50f27133fe54c40 (patch)
tree7065afc59fb2a412b259f933330ae60cce53274c
parente6ec4e102eeec5de869db6eea6a5093abdb7782c (diff)
downloadnuttx-069400647b14eaa42b6f4d48b50f27133fe54c40.tar.gz
nuttx-069400647b14eaa42b6f4d48b50f27133fe54c40.tar.bz2
nuttx-069400647b14eaa42b6f4d48b50f27133fe54c40.zip
SAMA5: A few early, easy bug fixes. The rest will all be difficult
-rw-r--r--nuttx/arch/arm/src/sama5/sam_hsmci.c66
-rw-r--r--nuttx/configs/sama5d3x-ek/src/sam_hsmci.c20
-rw-r--r--nuttx/drivers/mmcsd/mmcsd_sdio.c1
3 files changed, 47 insertions, 40 deletions
diff --git a/nuttx/arch/arm/src/sama5/sam_hsmci.c b/nuttx/arch/arm/src/sama5/sam_hsmci.c
index 69ad49533..71a2d0b4b 100644
--- a/nuttx/arch/arm/src/sama5/sam_hsmci.c
+++ b/nuttx/arch/arm/src/sama5/sam_hsmci.c
@@ -494,38 +494,37 @@ static void sam_callback(void *arg);
* Private Data
****************************************************************************/
-struct sam_dev_s g_sdiodev =
+/* Callbacks */
+
+static const struct sdio_dev_s g_callbacks =
{
- .dev =
- {
- .reset = sam_reset,
- .status = sam_status,
- .widebus = sam_widebus,
- .clock = sam_clock,
- .attach = sam_attach,
- .sendcmd = sam_sendcmd,
- .blocksetup = sam_blocksetup,
- .recvsetup = sam_dmarecvsetup,
- .sendsetup = sam_dmasendsetup,
- .cancel = sam_cancel,
- .waitresponse = sam_waitresponse,
- .recvR1 = sam_recvshort,
- .recvR2 = sam_recvlong,
- .recvR3 = sam_recvshort,
- .recvR4 = sam_recvnotimpl,
- .recvR5 = sam_recvnotimpl,
- .recvR6 = sam_recvshort,
- .recvR7 = sam_recvshort,
- .waitenable = sam_waitenable,
- .eventwait = sam_eventwait,
- .callbackenable = sam_callbackenable,
- .registercallback = sam_registercallback,
+ .reset = sam_reset,
+ .status = sam_status,
+ .widebus = sam_widebus,
+ .clock = sam_clock,
+ .attach = sam_attach,
+ .sendcmd = sam_sendcmd,
+ .blocksetup = sam_blocksetup,
+ .recvsetup = sam_dmarecvsetup,
+ .sendsetup = sam_dmasendsetup,
+ .cancel = sam_cancel,
+ .waitresponse = sam_waitresponse,
+ .recvR1 = sam_recvshort,
+ .recvR2 = sam_recvlong,
+ .recvR3 = sam_recvshort,
+ .recvR4 = sam_recvnotimpl,
+ .recvR5 = sam_recvnotimpl,
+ .recvR6 = sam_recvshort,
+ .recvR7 = sam_recvshort,
+ .waitenable = sam_waitenable,
+ .eventwait = sam_eventwait,
+ .callbackenable = sam_callbackenable,
+ .registercallback = sam_registercallback,
#ifdef CONFIG_SDIO_DMA
- .dmasupported = sam_dmasupported,
- .dmarecvsetup = sam_dmarecvsetup,
- .dmasendsetup = sam_dmasendsetup,
+ .dmasupported = sam_dmasupported,
+ .dmarecvsetup = sam_dmarecvsetup,
+ .dmasendsetup = sam_dmasendsetup,
#endif
- },
};
/* Pre-allocate memory for each HSMCI device */
@@ -2809,12 +2808,19 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
return NULL;
}
+ fvdbg("priv: %p base: %08x hsmci: %d dmac: %d pid: %d\n",
+ priv, priv->base, priv->hsmci, dmac, pid);
+
/* Initialize the HSMCI slot structure */
sem_init(&priv->waitsem, 0, 0);
priv->waitwdog = wd_create();
DEBUGASSERT(priv->waitwdog);
+ /* Initialize the callbacks */
+
+ memcpy(&priv->dev, &g_callbacks, sizeof(struct sdio_dev_s ));
+
/* Allocate a DMA channel */
priv->dma = sam_dmachannel(dmac, DMA_FLAGS(pid));
@@ -2825,7 +2831,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
*/
sam_reset(&priv->dev);
- return &g_sdiodev.dev;
+ return &priv->dev;
}
/****************************************************************************
diff --git a/nuttx/configs/sama5d3x-ek/src/sam_hsmci.c b/nuttx/configs/sama5d3x-ek/src/sam_hsmci.c
index cdef2940b..42b9ef521 100644
--- a/nuttx/configs/sama5d3x-ek/src/sam_hsmci.c
+++ b/nuttx/configs/sama5d3x-ek/src/sam_hsmci.c
@@ -136,10 +136,10 @@
struct sam_hsmci_info_s
{
- pio_pinset_t pincfg;
- uint8_t irq;
- xcpt_t handler;
- struct sdio_dev_s **hsmci;
+ pio_pinset_t pincfg; /* Card detect PIO pin configuratin */
+ uint8_t irq; /* Interrupt number (same as pid) */
+ xcpt_t handler; /* Interrupt handler */
+ struct sdio_dev_s **hsmci; /* R/W device handle */
};
/****************************************************************************
@@ -264,9 +264,9 @@ int sam_hsmci_initialize(int slotno, int minor)
/* Get the HSMI description */
info = sam_hsmci_info(slotno);
- if (info)
+ if (!info)
{
- fdbg("No info for slotno &d\n", slotno);
+ fdbg("No info for slotno %d\n", slotno);
return -EINVAL;
}
@@ -325,16 +325,16 @@ bool sam_cardinserted(int slotno)
/* Get the HSMI description */
info = sam_hsmci_info(slotno);
- if (info)
+ if (!info)
{
- fdbg("No info for slotno &d\n", slotno);
+ fdbg("No info for slotno %d\n", slotno);
return false;
}
/* Get the state of the PIO pin */
- inserted = sam_pioread(PIO_MCI0_CD);
- fvdbg("Slot 0 inserted: %s\n", slotno, inserted ? "NO" : "YES");
+ inserted = sam_pioread(info->pincfg);
+ fvdbg("Slot %d inserted: %s\n", slotno, inserted ? "NO" : "YES");
return !inserted;
#else /* HAVE_MMCSD */
diff --git a/nuttx/drivers/mmcsd/mmcsd_sdio.c b/nuttx/drivers/mmcsd/mmcsd_sdio.c
index 3caa61583..b265fab4a 100644
--- a/nuttx/drivers/mmcsd/mmcsd_sdio.c
+++ b/nuttx/drivers/mmcsd/mmcsd_sdio.c
@@ -2982,6 +2982,7 @@ static int mmcsd_hwinitialize(FAR struct mmcsd_state_s *priv)
mmcsd_givesem(priv);
return -EBUSY;
}
+
fvdbg("Attached MMC/SD interrupts\n");
/* Register a callback so that we get informed if media is inserted or