From 84b7747069bae8849111c2d8dd3c69c182b7ec38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C3=ABl=20Carr=C3=A9?= Date: Fri, 14 May 2010 21:41:29 +0000 Subject: as3525v1: detect correctly internal storage capacity check if SD transfers fit with the card capacity git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26029 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/as3525/sd-as3525.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/firmware/target/arm/as3525/sd-as3525.c b/firmware/target/arm/as3525/sd-as3525.c index 9c3ff0b5fe..0cdc56f2c6 100644 --- a/firmware/target/arm/as3525/sd-as3525.c +++ b/firmware/target/arm/as3525/sd-as3525.c @@ -374,6 +374,25 @@ static int sd_init_card(const int drive) const int ret = sd_select_bank(-1); if(ret < 0) return ret -16; + + /* CMD7 w/rca = 0: Select card to put it in STBY state */ + if(!send_cmd(drive, SD_SELECT_CARD, 0, MCI_ARG, NULL)) + return -17; + mci_delay(); + + /* CMD9 send CSD again, so we got the correct number of blocks */ + if(!send_cmd(drive, SD_SEND_CSD, card_info[drive].rca, + MCI_RESP|MCI_LONG_RESP|MCI_ARG, card_info[drive].csd)) + return -18; + + sd_parse_csd(&card_info[drive]); + /* The OF is stored in the first blocks */ + card_info[INTERNAL_AS3525].numblocks -= AMS_OF_SIZE; + + /* CMD7 w/rca: Select card to put it in TRAN state */ + if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) + return -19; + mci_delay(); } card_info[drive].initialized = 1; @@ -667,6 +686,12 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start, goto sd_transfer_error; } + if((start+count) > card_info[drive].numblocks) + { + ret = -20; + goto sd_transfer_error; + } + last_disk_activity = current_tick; dma_retain(); -- cgit v1.2.3