Add SDIO interrupt handling

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2263 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2009-11-16 23:22:36 +00:00
parent 0a24197444
commit 2142afe747
4 changed files with 731 additions and 366 deletions

File diff suppressed because it is too large Load Diff

View File

@ -224,8 +224,8 @@
#define SDIO_DATACOUNT_SHIFT (0) #define SDIO_DATACOUNT_SHIFT (0)
#define SDIO_DATACOUNT_MASK (0x01ffffff << SDIO_DATACOUNT_SHIFT) #define SDIO_DATACOUNT_MASK (0x01ffffff << SDIO_DATACOUNT_SHIFT)
#define SDIO_STA_CCRCFAIL (1 << 0) /* Bit 0: Command response received (CRC fail) */ #define SDIO_STA_CCRCFAIL (1 << 0) /* Bit 0: Command response CRC fail */
#define SDIO_STA_DCRCFAIL (1 << 1) /* Bit 1: Data block sent/received */ #define SDIO_STA_DCRCFAIL (1 << 1) /* Bit 1: Data block CRC fail */
#define SDIO_STA_CTIMEOUT (1 << 2) /* Bit 2: Command response timeout */ #define SDIO_STA_CTIMEOUT (1 << 2) /* Bit 2: Command response timeout */
#define SDIO_STA_DTIMEOUT (1 << 3) /* Bit 3: Data timeout */ #define SDIO_STA_DTIMEOUT (1 << 3) /* Bit 3: Data timeout */
#define SDIO_STA_TXUNDERR (1 << 4) /* Bit 4: Transmit FIFO underrun error */ #define SDIO_STA_TXUNDERR (1 << 4) /* Bit 4: Transmit FIFO underrun error */

View File

@ -366,9 +366,9 @@ static int mmcsd_getSCR(struct mmcsd_state_s *priv, uint32 scr[2])
return ret; return ret;
} }
/* Setup up to receive data */ /* Setup up to receive data with interrupt mode */
SDIO_RECVSETUP(priv->dev, 8); SDIO_RECVSETUP(priv->dev, (FAR ubyte*)scr, 8);
/* Send ACMD51 SD_APP_SEND_SCR with argument as 0 to start data receipt */ /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 to start data receipt */
@ -381,21 +381,14 @@ static int mmcsd_getSCR(struct mmcsd_state_s *priv, uint32 scr[2])
return ret; return ret;
} }
/* Wait for data available */ /* Wait for data to be transferred */
ret = SDIO_EVENTWAIT(priv->dev, MMCSD_SCR_DATADELAY); ret = SDIO_EVENTWAIT(priv->dev, MMCSD_SCR_DATADELAY);
if (ret != OK) if (ret != OK)
{ {
fdbg("ERROR: WAITEVENT for READ DATA failed: %d\n", ret); fdbg("ERROR: WAITEVENT for READ DATA failed: %d\n", ret);
return ret;
} }
return ret;
/* Receive the SCR data from the SD card. Card data is sent big-endian;
* if we are running on a little-endian machine, then we need to swap
* some bytes (should this be a configuration option?)
*/
return SDIO_RECVDATA(priv->dev, (FAR ubyte *)scr);
} }
/**************************************************************************** /****************************************************************************

View File

@ -47,7 +47,7 @@
* Pre-Processor Definitions * Pre-Processor Definitions
****************************************************************************/ ****************************************************************************/
/* MMC/SD events needed by the driver /* SDIO events needed by the driver
* *
* Wait events are used for event-waiting by SDIO_WAITENABLE and SDIO_EVENTWAIT * Wait events are used for event-waiting by SDIO_WAITENABLE and SDIO_EVENTWAIT
*/ */
@ -290,10 +290,10 @@
* Name: SDIO_RESET * Name: SDIO_RESET
* *
* Description: * Description:
* Reset the MMC/SD controller. Undo all setup and initialization. * Reset the SDIO controller. Undo all setup and initialization.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* *
* Returned Value: * Returned Value:
* None * None
@ -306,7 +306,7 @@
* Name: SDIO_STATUS * Name: SDIO_STATUS
* *
* Description: * Description:
* Get MMC/SD status. * Get SDIO status.
* *
* Input Parameters: * Input Parameters:
* dev - Device-specific state data * dev - Device-specific state data
@ -318,10 +318,10 @@
#define SDIO_STATUS(dev) ((dev)->status(dev)) #define SDIO_STATUS(dev) ((dev)->status(dev))
/* MMC/SD status bits */ /* SDIO status bits */
#define SDIO_STATUS_PRESENT 0x01 /* Bit 0=1: MMC/SD card present */ #define SDIO_STATUS_PRESENT 0x01 /* Bit 0=1: SDIO card present */
#define SDIO_STATUS_WRPROTECTED 0x02 /* Bit 1=1: MMC/SD card write protected */ #define SDIO_STATUS_WRPROTECTED 0x02 /* Bit 1=1: SDIO card write protected */
#define SDIO_PRESENT(dev) ((SDIO_STATUS(dev) & SDIO_STATUS_PRESENT) != 0) #define SDIO_PRESENT(dev) ((SDIO_STATUS(dev) & SDIO_STATUS_PRESENT) != 0)
#define SDIO_WRPROTECTED(dev) ((SDIO_STATUS(dev) & SDIO_STATUS_WRPROTECTED) != 0) #define SDIO_WRPROTECTED(dev) ((SDIO_STATUS(dev) & SDIO_STATUS_WRPROTECTED) != 0)
@ -335,7 +335,7 @@
* correctly in the new bus mode. * correctly in the new bus mode.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* wide - TRUE: wide bus (4-bit) bus mode enabled * wide - TRUE: wide bus (4-bit) bus mode enabled
* *
* Returned Value: * Returned Value:
@ -349,10 +349,10 @@
* Name: SDIO_CLOCK * Name: SDIO_CLOCK
* *
* Description: * Description:
* Enable/disable MMC/SD clocking * Enable/disable SDIO clocking
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* rate - Specifies the clocking to use (see enum sdio_clock_e) * rate - Specifies the clocking to use (see enum sdio_clock_e)
* *
* Returned Value: * Returned Value:
@ -369,7 +369,7 @@
* Attach and prepare interrupts * Attach and prepare interrupts
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* *
* Returned Value: * Returned Value:
* OK on success; A negated errno on failure. * OK on success; A negated errno on failure.
@ -382,10 +382,10 @@
* Name: SDIO_SENDCMD * Name: SDIO_SENDCMD
* *
* Description: * Description:
* Send the MMC/SD command * Send the SDIO command
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* cmd - The command to send. See 32-bit command definitions above. * cmd - The command to send. See 32-bit command definitions above.
* arg - 32-bit argument required with some commands * arg - 32-bit argument required with some commands
* data - A reference to data required with some commands * data - A reference to data required with some commands
@ -397,6 +397,29 @@
#define SDIO_SENDCMD(dev,cmd,arg) ((dev)->sendcmd(dev,cmd,arg)) #define SDIO_SENDCMD(dev,cmd,arg) ((dev)->sendcmd(dev,cmd,arg))
/****************************************************************************
* Name: SDIO_RECVSETUP
*
* Description:
* Setup hardware in preparation for data trasfer from the card in non-DMA
* (interrupt driven mode). This method will do whatever controller setup
* is necessary. This would be called for SD memory just BEFORE sending
* CMD13 (SEND_STATUS), CMD17 (READ_SINGLE_BLOCK), CMD18
* (READ_MULTIPLE_BLOCKS), ACMD51 (SEND_SCR), etc. Normally, SDIO_WAITEVENT
* will be called to receive the indication that the transfer is complete.
*
* Input Parameters:
* dev - An instance of the SDIO device interface
* buffer - Address of the buffer in which to receive the data
* nbytes - The number of bytes in the transfer
*
* Returned Value:
* Number of bytes sent on success; a negated errno on failure
*
****************************************************************************/
#define SDIO_RECVSETUP(dev,buffer,nbytes) ((dev)->recvsetup(dev,buffer,nbytes))
/**************************************************************************** /****************************************************************************
* Name: SDIO_SENDSETUP * Name: SDIO_SENDSETUP
* *
@ -407,7 +430,8 @@
* (WRITE_MULTIPLE_BLOCK), ... and before SDIO_SENDDATA is called. * (WRITE_MULTIPLE_BLOCK), ... and before SDIO_SENDDATA is called.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* buffer - Address of the buffer containing the data to send
* nbytes - The number of bytes in the transfer * nbytes - The number of bytes in the transfer
* *
* Returned Value: * Returned Value:
@ -415,24 +439,7 @@
* *
****************************************************************************/ ****************************************************************************/
#define SDIO_SENDSETUP(dev,nbytes) ((dev)->sendsetup(dev,nbytes)) #define SDIO_SENDSETUP(dev,buffer,nbytes) ((dev)->sendsetup(dev,buffer,nbytes))
/****************************************************************************
* Name: SDIO_SENDDATA
*
* Description:
* Send more MMC/SD data
*
* Input Parameters:
* dev - An instance of the MMC/SD device interface
* data - Data to be sent
*
* Returned Value:
* Number of bytes sent on success; a negated errno on failure
*
****************************************************************************/
#define SDIO_SENDDATA(dev,data) ((dev)->senddata(dev,data))
/**************************************************************************** /****************************************************************************
* Name: SDIO_WAITRESPONSE * Name: SDIO_WAITRESPONSE
@ -441,7 +448,7 @@
* Poll-wait for the response to the last command to be ready. * Poll-wait for the response to the last command to be ready.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* cmd - The command that was sent. See 32-bit command definitions above. * cmd - The command that was sent. See 32-bit command definitions above.
* *
* Returned Value: * Returned Value:
@ -455,13 +462,13 @@
* Name: SDIO_RECVRx * Name: SDIO_RECVRx
* *
* Description: * Description:
* Receive response to MMC/SD command. Only the critical payload is * Receive response to SDIO command. Only the critical payload is
* returned -- that is 32 bits for 48 bit status and 128 bits for 136 bit * returned -- that is 32 bits for 48 bit status and 128 bits for 136 bit
* status. The driver implementation should verify the correctness of * status. The driver implementation should verify the correctness of
* the remaining, non-returned bits (CRCs, CMD index, etc.). * the remaining, non-returned bits (CRCs, CMD index, etc.).
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* Rx - Buffer in which to receive the response * Rx - Buffer in which to receive the response
* *
* Returned Value: * Returned Value:
@ -481,49 +488,11 @@
#define SDIO_RECVR6(dev,cmd,R6) ((dev)->recvR6(dev,cmd,R6)) /* 48-bit */ #define SDIO_RECVR6(dev,cmd,R6) ((dev)->recvR6(dev,cmd,R6)) /* 48-bit */
#define SDIO_RECVR7(dev,cmd,R7) ((dev)->recvR7(dev,cmd,R7)) /* 48-bit */ #define SDIO_RECVR7(dev,cmd,R7) ((dev)->recvR7(dev,cmd,R7)) /* 48-bit */
/****************************************************************************
* Name: SDIO_RECVSETUP
*
* Description:
* Setup hardware in preparation for data trasfer from the card. This method
* will do whatever controller setup is necessary. This would be called
* for SD memory just BEFORE sending CMD13 (SEND_STATUS), CMD17
* (READ_SINGLE_BLOCK), CMD18 (READ_MULTIPLE_BLOCKS), ACMD51 (SEND_SCR), ...
* and before SDIO_RECVDATA is called.
*
* Input Parameters:
* dev - An instance of the MMC/SD device interface
* nbytes - The number of bytes in the transfer
*
* Returned Value:
* Number of bytes sent on success; a negated errno on failure
*
****************************************************************************/
#define SDIO_RECVSETUP(dev,nbytes) ((dev)->recvsetup(dev,nbytes))
/****************************************************************************
* Name: SDIO_RECVDATA
*
* Description:
* Receive data from MMC/SD
*
* Input Parameters:
* dev - An instance of the MMC/SD device interface
* buffer - Buffer in which to receive the data
*
* Returned Value:
* Number of bytes sent on success; a negated errno on failure
*
****************************************************************************/
#define SDIO_RECVDATA(dev,buffer) ((dev)->recvdata(dev,buffer))
/**************************************************************************** /****************************************************************************
* Name: SDIO_WAITENABLE * Name: SDIO_WAITENABLE
* *
* Description: * Description:
* Enable/disable of a set of MMC/SD wait events. This is part of the * Enable/disable of a set of SDIO wait events. This is part of the
* the SDIO_WAITEVENT sequence. The set of to-be-waited-for events is * the SDIO_WAITEVENT sequence. The set of to-be-waited-for events is
* configured before calling SDIO_EVENTWAIT. This is done in this way * configured before calling SDIO_EVENTWAIT. This is done in this way
* to help the driver to eliminate race conditions between the command * to help the driver to eliminate race conditions between the command
@ -534,7 +503,7 @@
* returns. * returns.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* eventset - A bitset of events to enable or disable (see SDIOWAIT_* * eventset - A bitset of events to enable or disable (see SDIOWAIT_*
* definitions). 0=disable; 1=enable. * definitions). 0=disable; 1=enable.
* *
@ -555,7 +524,7 @@
* can be used again. * can be used again.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* timeout - Maximum time in milliseconds to wait. Zero means no timeout. * timeout - Maximum time in milliseconds to wait. Zero means no timeout.
* *
* Returned Value: * Returned Value:
@ -571,11 +540,11 @@
* Name: SDIO_EVENTS * Name: SDIO_EVENTS
* *
* Description: * Description:
* Return the current event set. This supports polling for MMC/SD (vs. * Return the current event set. This supports polling for SDIO (vs.
* waiting). Only enabled events need be reported. * waiting). Only enabled events need be reported.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* *
* Returned Value: * Returned Value:
* Event set containing the current events (All pending events are cleared * Event set containing the current events (All pending events are cleared
@ -589,7 +558,7 @@
* Name: SDIO_CALLBACKENABLE * Name: SDIO_CALLBACKENABLE
* *
* Description: * Description:
* Enable/disable of a set of MMC/SD callback events. This is part of the * Enable/disable of a set of SDIO callback events. This is part of the
* the SDIO callback sequence. The set of events is configured to enabled * the SDIO callback sequence. The set of events is configured to enabled
* callbacks to the function provided in SDIO_REGISTERCALLBACK. * callbacks to the function provided in SDIO_REGISTERCALLBACK.
* *
@ -598,7 +567,7 @@
* calling this methos. * calling this methos.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* eventset - A bitset of events to enable or disable (see SDIOMEDIA_* * eventset - A bitset of events to enable or disable (see SDIOMEDIA_*
* definitions). 0=disable; 1=enable. * definitions). 0=disable; 1=enable.
* *
@ -640,7 +609,7 @@
* Return TRUE if the hardware can support DMA * Return TRUE if the hardware can support DMA
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* *
* Returned Value: * Returned Value:
* TRUE if DMA is supported. * TRUE if DMA is supported.
@ -654,7 +623,7 @@
#endif #endif
/**************************************************************************** /****************************************************************************
* Name: SDIO_DMAREADSETUP * Name: SDIO_DMARECVSETUP
* *
* Description: * Description:
* Setup to perform a read DMA. If the processor supports a data cache, * Setup to perform a read DMA. If the processor supports a data cache,
@ -663,7 +632,7 @@
* invalidating the data cache. * invalidating the data cache.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* buffer - The memory to DMA from * buffer - The memory to DMA from
* buflen - The size of the DMA transfer in bytes * buflen - The size of the DMA transfer in bytes
* *
@ -673,13 +642,13 @@
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_SDIO_DMA #ifdef CONFIG_SDIO_DMA
# define SDIO_DMAREADSETUP(dev,buffer,len) ((dev)->dmareadsetup(dev,buffer,len)) # define SDIO_DMARECVSETUP(dev,buffer,len) ((dev)->dmarecvsetup(dev,buffer,len))
#else #else
# define SDIO_DMAREADSETUP(dev,buffer,len) (-ENOSYS) # define SDIO_DMARECVSETUP(dev,buffer,len) (-ENOSYS)
#endif #endif
/**************************************************************************** /****************************************************************************
* Name: SDIO_DMAWRITESETUP * Name: SDIO_DMASENDSETUP
* *
* Description: * Description:
* Setup to perform a write DMA. If the processor supports a data cache, * Setup to perform a write DMA. If the processor supports a data cache,
@ -688,7 +657,7 @@
* flushing the data cache. * flushing the data cache.
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* buffer - The memory to DMA into * buffer - The memory to DMA into
* buflen - The size of the DMA transfer in bytes * buflen - The size of the DMA transfer in bytes
* *
@ -698,9 +667,9 @@
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_SDIO_DMA #ifdef CONFIG_SDIO_DMA
# define SDIO_DMAWRITESETUP(dev,buffer,len) ((dev)->dmawritesetup(dev,buffer,len)) # define SDIO_DMASENDSETUP(dev,buffer,len) ((dev)->dmasendsetup(dev,buffer,len))
#else #else
# define SDIO_DMAWRITESETUP(dev,buffer,len) (-ENOSYS) # define SDIO_DMASENDSETUP(dev,buffer,len) (-ENOSYS)
#endif #endif
/**************************************************************************** /****************************************************************************
@ -710,7 +679,7 @@
* Start the DMA * Start the DMA
* *
* Input Parameters: * Input Parameters:
* dev - An instance of the MMC/SD device interface * dev - An instance of the SDIO device interface
* *
* Returned Value: * Returned Value:
* OK on success; a negated errno on failure * OK on success; a negated errno on failure
@ -723,28 +692,6 @@
# define SDIO_DMASTART(dev) (-ENOSYS) # define SDIO_DMASTART(dev) (-ENOSYS)
#endif #endif
/****************************************************************************
* Name: SDIO_DMASTATUS
*
* Description:
* Return the number of bytes remaining in the DMA transfer
*
* Input Parameters:
* dev - An instance of the MMC/SD device interface
* remaining - A pointer to location in which to return the number of bytes
* remaining in the transfer.
*
* Returned Value:
* OK on success; a negated errno on failure
*
****************************************************************************/
#ifdef CONFIG_SDIO_DMA
# define SDIO_DMASTATUS(dev,remaining) ((dev)->dmastatus(dev,remaining))
#else
# define SDIO_DMASTATUS(dev,remaining) (-ENOSYS)
#endif
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
@ -753,7 +700,7 @@
typedef void (*sdio_mediachange_t)(FAR void *arg); typedef void (*sdio_mediachange_t)(FAR void *arg);
/* Various clocking used by the MMC/SD driver */ /* Various clocking used by the SDIO driver */
enum sdio_clock_e enum sdio_clock_e
{ {
@ -770,11 +717,11 @@ enum sdio_clock_e
typedef ubyte sdio_eventset_t; typedef ubyte sdio_eventset_t;
/* This structure defines the interface between the NuttX MMC/SD /* This structure defines the interface between the NuttX SDIO
* driver and the chip- or board-specific MMC/SD interface. This * driver and the chip- or board-specific SDIO interface. This
* interface is only used in architectures that support SDIO * interface is only used in architectures that support SDIO
* 1- or 4-bit data busses. For MMC/SD support this interface is * 1- or 4-bit data busses. For SDIO support this interface is
* registered with the NuttX MMC/SD driver by calling * registered with the NuttX SDIO driver by calling
* sdio_slotinitialize(). * sdio_slotinitialize().
*/ */
@ -795,8 +742,10 @@ struct sdio_dev_s
/* Command/Status/Data Transfer */ /* Command/Status/Data Transfer */
void (*sendcmd)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 arg); void (*sendcmd)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 arg);
int (*sendsetup)(FAR struct sdio_dev_s *dev, uint32 nbytes); int (*recvsetup)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer,
int (*senddata)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer); size_t nbytes);
int (*sendsetup)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer,
size_t nbytes);
int (*waitresponse)(FAR struct sdio_dev_s *dev, uint32 cmd); int (*waitresponse)(FAR struct sdio_dev_s *dev, uint32 cmd);
int (*recvR1)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R1); int (*recvR1)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R1);
@ -806,26 +755,24 @@ struct sdio_dev_s
int (*recvR5)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R5); int (*recvR5)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R5);
int (*recvR6)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R6); int (*recvR6)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R6);
int (*recvR7)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R7); int (*recvR7)(FAR struct sdio_dev_s *dev, uint32 cmd, uint32 *R7);
int (*recvsetup)(FAR struct sdio_dev_s *dev, uint32 nbytes);
int (*recvdata)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer);
/* EVENT handler */ /* EVENT handler */
void (*waitenable)(FAR struct sdio_dev_s *dev, sdio_eventset_t eventset); void (*waitenable)(FAR struct sdio_dev_s *dev, sdio_eventset_t eventset);
ubyte (*eventwait)(FAR struct sdio_dev_s *dev, uint32 timeout); ubyte (*eventwait)(FAR struct sdio_dev_s *dev, uint32 timeout);
ubyte (*events)(FAR struct sdio_dev_s *dev); ubyte (*events)(FAR struct sdio_dev_s *dev);
void (*callbackenable)(FAR struct sdio_dev_s *dev, sdio_eventset_t eventset);
int (*registercallback)(FAR struct sdio_dev_s *dev, sdio_mediachange_t callback, void *arg); int (*registercallback)(FAR struct sdio_dev_s *dev, sdio_mediachange_t callback, void *arg);
/* DMA */ /* DMA */
#ifdef CONFIG_SDIO_DMA #ifdef CONFIG_SDIO_DMA
boolean (*dmasupported)(FAR struct sdio_dev_s *dev); boolean (*dmasupported)(FAR struct sdio_dev_s *dev);
int (*dmareadsetup)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer, int (*dmarecvsetup)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer,
size_t buflen); size_t buflen);
int (*dmawritesetup)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer, int (*dmasendsetup)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer,
size_t buflen); size_t buflen);
int (*dmastart)(FAR struct sdio_dev_s *dev); int (*dmastart)(FAR struct sdio_dev_s *dev);
int (*dmastatus)(FAR struct sdio_dev_s *dev, size_t *remaining);
#endif #endif
}; };