summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-08-21 11:12:36 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-08-21 20:18:36 +0200
commit902306378e38ce571f4595ae8dabb2acd2412faa (patch)
tree8a22bebcde5fee02921fc33b2449fc42dc94d121 /firmware
parent96d355abba19f3f099f94a8b2d3e95be32c39be7 (diff)
downloadrockbox-902306378e38ce571f4595ae8dabb2acd2412faa.tar.gz
rockbox-902306378e38ce571f4595ae8dabb2acd2412faa.zip
imx233: add support for 50MHz clock with SD cards
Now that the drive strength problem has been fixed, we can safely drive sd cards at 48MHz in HS mode to get the best possible transfer speed at 3.3V. Change-Id: I0291589c399fb4880deba97895ff578451a32f99
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/imx233/sdmmc-imx233.c59
1 files changed, 25 insertions, 34 deletions
diff --git a/firmware/target/arm/imx233/sdmmc-imx233.c b/firmware/target/arm/imx233/sdmmc-imx233.c
index 164bf79eee..0d078229a8 100644
--- a/firmware/target/arm/imx233/sdmmc-imx233.c
+++ b/firmware/target/arm/imx233/sdmmc-imx233.c
@@ -316,7 +316,7 @@ static int init_sd_card(int drive)
316 imx233_ssp_set_block_size(ssp, 9); 316 imx233_ssp_set_block_size(ssp, 9);
317 317
318 SDMMC_RCA(drive) = 0; 318 SDMMC_RCA(drive) = 0;
319 bool sd_v2 = false; 319 bool sd_v2 = false, sd_hs = false;
320 uint32_t resp; 320 uint32_t resp;
321 long init_timeout; 321 long init_timeout;
322 /* go to idle state */ 322 /* go to idle state */
@@ -349,35 +349,6 @@ static int init_sd_card(int drive)
349 if(!send_cmd(drive, SD_SEND_RELATIVE_ADDR, 0, MCI_RESP, &SDMMC_INFO(drive).rca)) 349 if(!send_cmd(drive, SD_SEND_RELATIVE_ADDR, 0, MCI_RESP, &SDMMC_INFO(drive).rca))
350 return -4; 350 return -4;
351 351
352 /* Try to switch V2 cards to HS timings, non HS seem to ignore this */
353 if(sd_v2)
354 {
355 /* CMD7 w/rca: Select card to put it in TRAN state */
356 if(!send_cmd(drive, SD_SELECT_CARD, SDMMC_RCA(drive), MCI_RESP, NULL))
357 return -5;
358
359 if(wait_for_state(drive, SD_TRAN))
360 return -6;
361
362 /* CMD6 */
363 {
364 /* only transfer 64 bytes */
365 imx233_ssp_set_block_size(ssp, /*log2(64)*/6);
366 if(imx233_ssp_sd_mmc_transfer(ssp, SD_SWITCH_FUNC, 0x80fffff1,
367 SSP_SHORT_RESP, aligned_buffer[drive], 1, true, true, NULL))
368 {
369 imx233_ssp_set_block_size(ssp, /*log2(512)*/9);
370 return -12;
371 }
372 imx233_ssp_set_block_size(ssp, /*log2(512)*/9);
373 }
374
375 /* go back to STBY state so we can read csd */
376 /* CMD7 w/rca=0: Deselect card to put it in STBY state */
377 if(!send_cmd(drive, SD_DESELECT_CARD, 0, MCI_NO_RESP, NULL))
378 return -8;
379 }
380
381 /* CMD9 send CSD */ 352 /* CMD9 send CSD */
382 if(!send_cmd(drive, SD_SEND_CSD, SDMMC_RCA(drive), MCI_RESP|MCI_LONG_RESP, 353 if(!send_cmd(drive, SD_SEND_CSD, SDMMC_RCA(drive), MCI_RESP|MCI_LONG_RESP,
383 SDMMC_INFO(drive).csd)) 354 SDMMC_INFO(drive).csd))
@@ -387,10 +358,6 @@ static int init_sd_card(int drive)
387 window_start[drive] = 0; 358 window_start[drive] = 0;
388 window_end[drive] = SDMMC_INFO(drive).numblocks; 359 window_end[drive] = SDMMC_INFO(drive).numblocks;
389 360
390 /* SSPCLK @ 96MHz
391 * gives bitrate of 96 / 4 / 1 = 24MHz */
392 imx233_ssp_set_timings(ssp, 4, 0, 0xffff);
393
394 /* CMD7 w/rca: Select card to put it in TRAN state */ 361 /* CMD7 w/rca: Select card to put it in TRAN state */
395 if(!send_cmd(drive, SD_SELECT_CARD, SDMMC_RCA(drive), MCI_RESP, &resp)) 362 if(!send_cmd(drive, SD_SELECT_CARD, SDMMC_RCA(drive), MCI_RESP, &resp))
396 return -12; 363 return -12;
@@ -407,6 +374,22 @@ static int init_sd_card(int drive)
407 /* Switch to 4-bit */ 374 /* Switch to 4-bit */
408 imx233_ssp_set_bus_width(ssp, 4); 375 imx233_ssp_set_bus_width(ssp, 4);
409 376
377 /* Try to switch V2 cards to HS timings, non HS seem to ignore this */
378 if(sd_v2)
379 {
380 /* CMD6 switch to HS */
381 {
382 /* only transfer 64 bytes */
383 imx233_ssp_set_block_size(ssp, /*log2(64)*/6);
384 if(imx233_ssp_sd_mmc_transfer(ssp, SD_SWITCH_FUNC, 0x80fffff1,
385 SSP_SHORT_RESP, aligned_buffer[drive], 1, true, true, NULL))
386 return -12;
387 imx233_ssp_set_block_size(ssp, /*log2(512)*/9);
388 if((aligned_buffer[drive][16] & 0xf) == 1)
389 sd_hs = true;
390 }
391 }
392
410 /* probe for CMD23 support */ 393 /* probe for CMD23 support */
411 support_set_block_count[drive] = false; 394 support_set_block_count[drive] = false;
412 /* ACMD51, only transfer 8 bytes */ 395 /* ACMD51, only transfer 8 bytes */
@@ -422,6 +405,14 @@ static int init_sd_card(int drive)
422 } 405 }
423 imx233_ssp_set_block_size(ssp, /*log2(512)*/9); 406 imx233_ssp_set_block_size(ssp, /*log2(512)*/9);
424 407
408 /* SSPCLK @ 96MHz
409 * gives bitrate of 96 / 4 / 1 = 24MHz
410 * gives bitrate of 96 / 2 / 1 = 48MHz */
411 if(sd_hs)
412 imx233_ssp_set_timings(ssp, 2, 0, 0xffff);
413 else
414 imx233_ssp_set_timings(ssp, 4, 0, 0xffff);
415
425 SDMMC_INFO(drive).initialized = 1; 416 SDMMC_INFO(drive).initialized = 1;
426 417
427 return 0; 418 return 0;