git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2910 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
d5fb75afc4
commit
b33b5201ad
|
@ -36,14 +36,18 @@
|
|||
/*===========================================================================*/
|
||||
|
||||
#define SDC_CMD_GO_IDLE_STATE 0
|
||||
#define SDC_CMD_ALL_SEND_CID 2
|
||||
#define SDC_CMD_SEND_RELATIVE_ADDR 3
|
||||
#define SDC_CMD_SEL_DESEL_CARD 7
|
||||
#define SDC_CMD_SEND_IF_COND 8
|
||||
#define SDC_CMD_SEND_CSD 9
|
||||
#define SDC_CMD_APP_OP_COND 41
|
||||
#define SDC_CMD_APP_CMD 55
|
||||
|
||||
#define SDC_MODE_CARDTYPE_MASK 0xF
|
||||
#define SDC_MODE_CARDTYPE_SD 0 /**< Old SD card. */
|
||||
#define SDC_MODE_CARDTYPE_SDV11 0 /**< Card is V1.1 compliant. */
|
||||
#define SDC_MODE_CARDTYPE_SDV20 1 /**< Card is V2.0 compliant. */
|
||||
#define SDC_MODE_CARDTYPE_MMC 2 /**< Card is MMC. */
|
||||
#define SDC_MODE_CARDTYPE_MMC 2 /**< Card is MMC compliant. */
|
||||
|
||||
#define SDC_CMD8_PATTERN 0x000001AA
|
||||
|
||||
|
|
|
@ -132,6 +132,14 @@ struct SDCDriver {
|
|||
* @brief Various flags regarding the mounted card.
|
||||
*/
|
||||
sdcmode_t cardmode;
|
||||
/**
|
||||
* @brief Card CID.
|
||||
*/
|
||||
uint32_t cid[4];
|
||||
/**
|
||||
* @brief Card CSD.
|
||||
*/
|
||||
uint32_t csd[4];
|
||||
/* End of the mandatory fields.*/
|
||||
};
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ void sdcStop(SDCDriver *sdcp) {
|
|||
* @api
|
||||
*/
|
||||
bool_t sdcConnect(SDCDriver *sdcp) {
|
||||
uint32_t resp;
|
||||
uint32_t resp[1];
|
||||
|
||||
chDbgCheck(sdcp != NULL, "sdcConnect");
|
||||
|
||||
|
@ -136,9 +136,6 @@ bool_t sdcConnect(SDCDriver *sdcp) {
|
|||
sdcp->state = SDC_INITNG;
|
||||
chSysUnlock();
|
||||
|
||||
/* Resets card attributes.*/
|
||||
sdcp->cardmode = 0;
|
||||
|
||||
/* Card clock initialization.*/
|
||||
sdc_lld_start_clk(sdcp);
|
||||
|
||||
|
@ -147,17 +144,19 @@ bool_t sdcConnect(SDCDriver *sdcp) {
|
|||
|
||||
/* V2.0 cards detection.*/
|
||||
if (!sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_SEND_IF_COND,
|
||||
SDC_CMD8_PATTERN, &resp))
|
||||
sdcp->cardmode |= SDC_MODE_CARDTYPE_SDV20;
|
||||
SDC_CMD8_PATTERN, resp))
|
||||
sdcp->cardmode = SDC_MODE_CARDTYPE_SDV20;
|
||||
/* Voltage verification.*/
|
||||
if (((resp >> 8) & 0xF) != 1)
|
||||
if (((resp[0] >> 8) & 0xF) != 1)
|
||||
goto failed;
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, &resp))
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, resp))
|
||||
goto failed;
|
||||
else {
|
||||
/* MMC or SD detection.*/
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, &resp))
|
||||
sdcp->cardmode |= SDC_MODE_CARDTYPE_MMC;
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, resp))
|
||||
sdcp->cardmode = SDC_MODE_CARDTYPE_MMC;
|
||||
else
|
||||
sdcp->cardmode = SDC_MODE_CARDTYPE_SDV11;
|
||||
}
|
||||
|
||||
if ((sdcp->cardmode & SDC_MODE_CARDTYPE_MASK) == SDC_MODE_CARDTYPE_MMC) {
|
||||
|
@ -173,17 +172,36 @@ bool_t sdcConnect(SDCDriver *sdcp) {
|
|||
i = 0;
|
||||
while (TRUE) {
|
||||
chThdSleepMilliseconds(10);
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, &resp))
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_APP_CMD, 0, resp))
|
||||
goto failed;
|
||||
if (sdc_lld_send_cmd_short(sdcp, SDC_CMD_APP_OP_COND, ocr, &resp))
|
||||
if (sdc_lld_send_cmd_short(sdcp, SDC_CMD_APP_OP_COND, ocr, resp))
|
||||
goto failed;
|
||||
if ((resp & 0x80000000) != 0)
|
||||
if ((resp[0] & 0x80000000) != 0)
|
||||
break;
|
||||
if (++i >= SDC_ACMD41_RETRY)
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
/* Reads CID.*/
|
||||
if (sdc_lld_send_cmd_long_crc(sdcp, SDC_CMD_ALL_SEND_CID, 0, sdcp->cid))
|
||||
goto failed;
|
||||
|
||||
/* Asks for the RCA.*/
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_SEND_RELATIVE_ADDR, 0, resp))
|
||||
goto failed;
|
||||
|
||||
/* Reads CSD.*/
|
||||
if (sdc_lld_send_cmd_long_crc(sdcp, SDC_CMD_SEND_CSD, resp[0], sdcp->csd))
|
||||
goto failed;
|
||||
|
||||
/* Switches to high speed.*/
|
||||
sdc_lld_set_data_clk(sdcp);
|
||||
|
||||
/* Selects the card for operations.*/
|
||||
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_SEL_DESEL_CARD, resp[0], resp))
|
||||
goto failed;
|
||||
|
||||
sdcp->state = SDC_ACTIVE;
|
||||
return FALSE;
|
||||
failed:
|
||||
|
|
Loading…
Reference in New Issue