diff --git a/sdhc.c b/sdhc.c index a4cf88d..4b009d0 100644 --- a/sdhc.c +++ b/sdhc.c @@ -126,6 +126,7 @@ #define SD_CMD_SEND_RELATIVE_ADDR 3 #define SD_CMD_SELECT_CARD 7 #define SD_CMD_SEND_IF_COND 8 +#define SD_CMD_SEND_CSD 9 #define SD_CMD_SEND_STATUS 13 #define SD_CMD_SET_BLOCKLEN 16 #define SD_CMD_READ_MULTIPLE_BLOCK 18 @@ -877,7 +878,7 @@ int sd_mount(sdhci_t *sdhci) retval = __sd_cmd(sdhci, SD_CMD_APP_SEND_OP_COND, SD_R3, sdhci->ocr, 0, NULL, resp, 6); if(resp[0] & OCR_POWERUP_STATUS) { - sdhc_debug(sdhci->reg_base, "card power up is done."); + sdhc_error(sdhci->reg_base, "card power up is done."); break; } udelay(SDHC_WAIT_TIMEOUT_OUTER); @@ -904,7 +905,7 @@ int sd_mount(sdhci_t *sdhci) } sdhc_debug(sdhci->reg_base, "sending ALL_SEND_CID command to get connected card"); - retval = __sd_cmd(sdhci, SD_CMD_ALL_SEND_CID, SD_R3, 0, 0, NULL, resp, 6); + retval = __sd_cmd(sdhci, SD_CMD_ALL_SEND_CID, SD_R3, 0, 0, NULL, resp, 16); if(retval < 0) { sdhc_error(sdhci->reg_base, "__sd_cmd returned %d, resetting controller.", retval); @@ -912,9 +913,13 @@ int sd_mount(sdhci_t *sdhci) return SDHC_EIO; } - sdhci->cid = resp[0]; + memcpy(sdhci->cid, resp, 128/8); - sdhc_debug(sdhci->reg_base, "CID: %08X, requesting RCA", sdhci->cid); + sdhc_debug(sdhci->reg_base, "CID: %08X%08x%08x%08x, requesting RCA", + sdhci->cid[0], + sdhci->cid[1], + sdhci->cid[2], + sdhci->cid[3]); retval = __sd_cmd(sdhci, SD_CMD_SEND_RELATIVE_ADDR, SD_R6, 0, 0, NULL, resp, 6); if(retval < 0) { @@ -943,6 +948,22 @@ int sd_mount(sdhci_t *sdhci) sd_select(sdhci); +#if 0 + sdhc_debug(sdhci->reg_base, "requesting CSD noW!!"); + retval = __sd_cmd(sdhci, SD_CMD_SEND_CSD, SD_R2, sdhci->rca << 16, 0, NULL, resp, + 16); + if (retval < 0) { + sdhc_error(sdhci->reg_base, "failed to get CSD register (%d)", retval); + __sd_reset(sdhci, 1); + } + memcpy(sdhci->csd, resp, 128/8); + sdhc_debug(sdhci->reg_base, "CSD: %08X%08x%08x%08x", + sdhci->csd[0], + sdhci->csd[1], + sdhci->csd[2], + sdhci->csd[3]); +#endif + sdhc_debug(sdhci->reg_base, "setting bus width to 4"); __sd_write8(sdhci->reg_base + SDHC_HOST_CONTROL, __sd_read8(sdhci->reg_base + SDHC_HOST_CONTROL) | SDHC_HCR_BUSWIDTH_4); retval = __sd_cmd(sdhci, SD_CMD_APP_SET_BUS_WIDTH, SD_R1, 2, 0, NULL, NULL, 0); diff --git a/sdhc.h b/sdhc.h index 083c476..8d01ffd 100644 --- a/sdhc.h +++ b/sdhc.h @@ -21,7 +21,9 @@ typedef struct u16 rca; u32 ocr; - u32 cid; + + u32 cid[4]; + u32 csd[4]; } sdhci_t; int sd_init(sdhci_t *sdhci, int slot);