aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-05-01 14:33:22 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-05-01 14:33:22 +0000
commit82b9e1cf4c0de6be44e273f3e49c3efbd0895d3f (patch)
tree9f50e811b083e1bbf0ba78a1bd53dac336367442
parentb33b5201ad65ed0dafb2b9e0a2c40bf06fe27dfc (diff)
downloadChibiOS-82b9e1cf4c0de6be44e273f3e49c3efbd0895d3f.tar.gz
ChibiOS-82b9e1cf4c0de6be44e273f3e49c3efbd0895d3f.tar.bz2
ChibiOS-82b9e1cf4c0de6be44e273f3e49c3efbd0895d3f.zip
SDC card initialization works.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2911 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/hal/include/sdc.h8
-rw-r--r--os/hal/src/sdc.c17
2 files changed, 21 insertions, 4 deletions
diff --git a/os/hal/include/sdc.h b/os/hal/include/sdc.h
index 4c43fe505..802145525 100644
--- a/os/hal/include/sdc.h
+++ b/os/hal/include/sdc.h
@@ -41,13 +41,15 @@
#define SDC_CMD_SEL_DESEL_CARD 7
#define SDC_CMD_SEND_IF_COND 8
#define SDC_CMD_SEND_CSD 9
+#define SDC_CMD_SET_BLOCKLEN 16
#define SDC_CMD_APP_OP_COND 41
#define SDC_CMD_APP_CMD 55
#define SDC_MODE_CARDTYPE_MASK 0xF
-#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 compliant. */
+#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 compliant. */
+#define SDC_MODE_HIGH_CAPACITY 0x10 /**< High capacity card. */
#define SDC_CMD8_PATTERN 0x000001AA
diff --git a/os/hal/src/sdc.c b/os/hal/src/sdc.c
index 2fd4e7f7b..a4b80e60b 100644
--- a/os/hal/src/sdc.c
+++ b/os/hal/src/sdc.c
@@ -176,8 +176,11 @@ bool_t sdcConnect(SDCDriver *sdcp) {
goto failed;
if (sdc_lld_send_cmd_short(sdcp, SDC_CMD_APP_OP_COND, ocr, resp))
goto failed;
- if ((resp[0] & 0x80000000) != 0)
+ if ((resp[0] & 0x80000000) != 0) {
+ if (resp[0] & 0x40000000)
+ sdcp->cardmode |= SDC_MODE_HIGH_CAPACITY;
break;
+ }
if (++i >= SDC_ACMD41_RETRY)
goto failed;
}
@@ -202,6 +205,17 @@ bool_t sdcConnect(SDCDriver *sdcp) {
if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_SEL_DESEL_CARD, resp[0], resp))
goto failed;
+ /* Block lenght fixed at 512 bytes.*/
+ if (sdc_lld_send_cmd_short_crc(sdcp, SDC_CMD_SET_BLOCKLEN, 512, resp))
+ goto failed;
+
+ /* Switches to wide bus mode.*/
+ switch (sdcp->cardmode & SDC_MODE_CARDTYPE_MASK) {
+ case SDC_MODE_CARDTYPE_SDV11:
+ case SDC_MODE_CARDTYPE_SDV20:
+ SDIO->CLKCR |= SDIO_CLKCR_WIDBUS_0;
+ }
+
sdcp->state = SDC_ACTIVE;
return FALSE;
failed:
@@ -228,6 +242,7 @@ bool_t sdcDisconnect(SDCDriver *sdcp) {
chSysLock();
chDbgAssert(sdcp->state == SDC_ACTIVE,
"sdcDisconnect(), #1", "invalid state");
+ sdc_lld_stop_clk(sdcp);
sdcp->state = SDC_READY;
chSysUnlock();
return FALSE;