software/litesdcard: use new clocking and use slow clock during initialization.
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Tue, 7 Jul 2020 17:59:34 +0000 (19:59 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Tue, 7 Jul 2020 17:59:50 +0000 (19:59 +0200)
litex/soc/software/liblitesdcard/sdcard.c

index 4361fe49af21ae92ceba177efb0fe74035a16acc..6b6d838a6081eea8c6798ecf8c6d5a9964e47f1e 100644 (file)
 //#define SDCARD_DEBUG
 //#define SDCARD_CMD23_SUPPORT
 
+#ifndef SDCARD_CLK_FREQ_INIT
+#define SDCARD_CLK_FREQ_INIT 400000
+#endif
+
 #ifndef SDCARD_CLK_FREQ
-#define SDCARD_CLK_FREQ 16000000
+#define SDCARD_CLK_FREQ 25000000
 #endif
 
 unsigned int sdcard_response[SD_CMD_RESPONSE_SIZE/4];
@@ -120,17 +124,14 @@ static void sdcard_set_clk_freq(uint32_t clk_freq) {
     uint32_t divider;
     divider = CONFIG_CLOCK_FREQUENCY/clk_freq + 1;
     divider = (1 << log2(divider));
-//#ifdef SDCARD_DEBUG
-
+#ifdef SDCARD_DEBUG
     printf("Setting SDCard clk freq to ");
     if (clk_freq > 1000000)
         printf("%d MHz\n", (CONFIG_CLOCK_FREQUENCY/divider)/1000000);
     else
         printf("%d KHz\n", (CONFIG_CLOCK_FREQUENCY/divider)/1000);
-//#endif
-    sdphy_clocker_enable_write(0);
+#endif
     sdphy_clocker_divider_write(divider);
-    sdphy_clocker_enable_write(1);
 }
 
 /*-----------------------------------------------------------------------*/
@@ -453,8 +454,8 @@ int sdcard_init(void) {
        unsigned short rca;
        uint16_t timeout;
 
-       /* Set SD clk freq to operational frequency */
-       sdcard_set_clk_freq(SDCARD_CLK_FREQ);
+       /* Set SD clk freq to Initialization frequency */
+       sdcard_set_clk_freq(SDCARD_CLK_FREQ_INIT);
        busy_wait(1);
 
        for (timeout=1000; timeout>0; timeout--) {
@@ -474,6 +475,10 @@ int sdcard_init(void) {
        if (sdcard_send_ext_csd() != SD_OK)
                return 0;
 
+       /* Set SD clk freq to Operational frequency */
+       sdcard_set_clk_freq(SDCARD_CLK_FREQ);
+       busy_wait(1);
+
        /* Set SDCard in Operational state */
        for (timeout=1000; timeout>0; timeout--) {
                sdcard_app_cmd(0);