Need to use poll-waiting

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2254 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2009-11-13 23:47:36 +00:00
parent ad3467a844
commit 1c036b928f
+39 -6
View File
@@ -127,6 +127,10 @@ struct mmcsd_state_s
* Private Function Prototypes
****************************************************************************/
/* Command/response helpers *************************************************/
static int mmcsd_sendcmdpoll(struct mmcsd_state_s *priv, uint32 cmd, uint32 arg);
/* Transfer helpers *********************************************************/
static ssize_t mmcsd_doread(FAR void *dev, FAR ubyte *buffer,
@@ -185,6 +189,36 @@ static const struct block_operations g_bops =
* Private Functions
****************************************************************************/
/****************************************************************************
* Command/Response Helpers
****************************************************************************/
/****************************************************************************
* Name: mmcsd_sendcmdpoll
*
* Description:
* send a command and poll-wait for the response.
*
****************************************************************************/
static int mmcsd_sendcmdpoll(struct mmcsd_state_s *priv, uint32 cmd, uint32 arg)
{
int ret;
/* Send the command */
SDIO_SENDCMD(priv->dev, cmd, arg);
/* Then poll-wait until the response is available */
ret = SDIO_WAITRESPONSE(priv->dev, cmd);
if (ret != OK)
{
fdbg("ERROR: Wait for response to cmd=%08x failed: %d\n", cmd, ret);
}
return ret;
}
/****************************************************************************
* Transfer Helpers
****************************************************************************/
@@ -516,9 +550,8 @@ static inline int mmcsd_cardidentify(struct mmcsd_state_s *priv)
/* Then send CMD0 (twice just to be sure) */
SDIO_SENDCMD(priv->dev, MMCSD_CMD0, 0);
SDIO_WAITRESPONSE(priv->dev, MMCSD_CMD0);
SDIO_SENDCMD(priv->dev, MMCSD_CMD0, 0);
mmcsd_sendcmdpoll(priv, MMCSD_CMD0, 0);
mmcsd_sendcmdpoll(priv, MMCSD_CMD0, 0);
up_udelay(MMCSD_IDLE_DELAY);
/* Check for SDHC Version 2.x. Send CMD8 to verify SD card interface
@@ -530,7 +563,7 @@ static inline int mmcsd_cardidentify(struct mmcsd_state_s *priv)
* [7:0]: Check Pattern (recommended 0xaa)
* CMD8 Response: R7
*/
mmcsd_sendcmdpoll(priv, SD_CMD8, MMCSD_CMD8CHECKPATTERN|MMCSD_CMD8VOLTAGE_27);
ret = SDIO_RECVR7(priv->dev, SD_CMD8, &response);
if (ret == OK)
@@ -564,7 +597,7 @@ static inline int mmcsd_cardidentify(struct mmcsd_state_s *priv)
do
{
/* Send CMD55 */
mmcsd_sendcmdpoll(priv, SD_CMD55, 0);
ret = SDIO_RECVR1(priv->dev, SD_CMD55, &response);
if (ret != OK)
@@ -602,7 +635,7 @@ static inline int mmcsd_cardidentify(struct mmcsd_state_s *priv)
fvdbg("CMD55 R1: %08x\n", response);
/* Send ACMD41 */
mmcsd_sendcmdpoll(priv, SD_ACMD41, MMCD_ACMD41_VOLTAGEWINDOW|sdcapacity);
ret = SDIO_RECVR3(priv->dev, SD_CMD55, &response);
if (ret != OK)