summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorJack Halpin <jack.halpin@gmail.com>2009-10-11 03:11:13 +0000
committerJack Halpin <jack.halpin@gmail.com>2009-10-11 03:11:13 +0000
commit14079c39f0525e4ddb3951e3cf8a2aa52b170d77 (patch)
tree28211cd51c81ac07867df9ed562af1dd4335b658 /firmware
parent178337970e7e09c68d3b4ff1b7bce61fb45ff321 (diff)
downloadrockbox-14079c39f0525e4ddb3951e3cf8a2aa52b170d77.tar.gz
rockbox-14079c39f0525e4ddb3951e3cf8a2aa52b170d77.zip
AMS Sansa: If SD card is HS capable set High Speed timings.
This still doesn't solve the problem of the cards being overclocked at 62MHz but we can mitigate this a bit by switching to HS timings. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23088 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index c848ba1dca..33816d4e61 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -94,6 +94,7 @@ static const int pl180_base[NUM_DRIVES] = {
#endif
};
+static int sd_wait_for_state(const int drive, unsigned int state);
static int sd_select_bank(signed char bank);
static int sd_init_card(const int drive);
static void init_pl180_controller(const int drive);
@@ -321,6 +322,15 @@ static int sd_init_card(const int drive)
MCI_CLOCK(drive) |= MCI_CLOCK_BYPASS; /* full speed for controller clock */
mci_delay();
+ /* If card is HS capable switch to HS timings */
+ if(card_info[drive].speed > 125000)
+ {
+ if(sd_wait_for_state(drive, SD_TRAN))
+ return -13;
+ if(!send_cmd(drive, SD_SWITCH_FUNC, 0x80fffff1, MCI_ARG, NULL))
+ return -14;
+ }
+
/*
* enable bank switching
* without issuing this command, we only have access to 1/4 of the blocks
@@ -331,7 +341,7 @@ static int sd_init_card(const int drive)
{
const int ret = sd_select_bank(-1);
if(ret < 0)
- return ret - 13;
+ return ret - 15;
}
return 0;