diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2009-07-01 21:49:13 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2009-07-01 21:49:13 +0000 |
commit | c0eb9aeb9e89ae33a9f084167147d8eacb9c7c60 (patch) | |
tree | 57e96460989d9cccc421486769befb5648601b8c /firmware/target/arm | |
parent | 93f6e3df246ff50c24524c9d329f27a06e1845db (diff) | |
download | rockbox-c0eb9aeb9e89ae33a9f084167147d8eacb9c7c60.tar.gz rockbox-c0eb9aeb9e89ae33a9f084167147d8eacb9c7c60.zip |
add firmware/driver/sd.c which contains common code between SD drivers
ingenic SD driver needs more cleanup so it still doesn't use the common code
correct a comment in hotswap.c: card_extract_bits assume most significant word of register first (so, use this order)
fix debug menu which used MMC specific commands / bits positions in csd/cid
move the default block size of 512 into sd.h
move the mantissa & exponent table into a single file (sd.c) to reduce binsize. we don't need to export it anymore anyway
TODO : ingenic cleanup (will happen soon so building sd.c is not conditional)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21601 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 66 | ||||
-rw-r--r-- | firmware/target/arm/ata-sd-pp.c | 73 |
2 files changed, 29 insertions, 110 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c index c0fad722b6..74bdb90ed0 100644 --- a/firmware/target/arm/as3525/ata_sd_as3525.c +++ b/firmware/target/arm/as3525/ata_sd_as3525.c @@ -94,9 +94,7 @@ static const int pl180_base[NUM_VOLUMES] = { static int sd_select_bank(signed char bank); static int sd_init_card(const int drive); static void init_pl180_controller(const int drive); -/* TODO : BLOCK_SIZE != SECTOR_SIZE ? */ -#define BLOCK_SIZE 512 -#define SECTOR_SIZE 512 +#define SECTOR_SIZE 512 /* XXX: different sector sizes ? */ #define BLOCKS_PER_BANK 0x7a7800 static tCardInfo card_info[NUM_VOLUMES]; @@ -241,12 +239,11 @@ static bool send_cmd(const int drive, const int cmd, const int arg, static int sd_init_card(const int drive) { - unsigned int c_size; - unsigned long c_mult; unsigned long response; int max_tries = 100; /* max acmd41 attemps */ bool sdhc; - unsigned char temp; + unsigned long temp_reg[4]; + int i; if(!send_cmd(drive, SD_GO_IDLE_STATE, 0, MCI_NO_FLAGS, NULL)) return -1; @@ -284,17 +281,11 @@ static int sd_init_card(const int drive) /* send CID */ if(!send_cmd(drive, SD_ALL_SEND_CID, 0, MCI_RESP|MCI_LONG_RESP|MCI_ARG, - card_info[drive].cid)) + temp_reg)) return -5; - /* ascii chars here */ - card_info[drive].cid[0] = htobe32(card_info[drive].cid[0]); - card_info[drive].cid[1] = htobe32(card_info[drive].cid[1]); - - /* adjust year<=>month, 1997 <=> 2000 */ - temp = *((char*)card_info[drive].cid+13); - *((char*)card_info[drive].cid+13) = - (unsigned char)((temp >> 4) | (temp << 4)) + 3; + for(i=0; i<4; i++) + card_info[drive].cid[3-i] = temp_reg[i]; /* send RCA */ if(!send_cmd(drive, SD_SEND_RELATIVE_ADDR, 0, MCI_RESP|MCI_ARG, @@ -303,29 +294,13 @@ static int sd_init_card(const int drive) /* send CSD */ if(!send_cmd(drive, SD_SEND_CSD, card_info[drive].rca, - MCI_RESP|MCI_LONG_RESP|MCI_ARG, card_info[drive].csd)) + MCI_RESP|MCI_LONG_RESP|MCI_ARG, temp_reg)) return -7; - /* These calculations come from the Sandisk SD card product manual */ - if( (card_info[drive].csd[3]>>30) == 0) - { - int max_read_bl_len; - /* CSD version 1.0 */ - c_size = ((card_info[drive].csd[2] & 0x3ff) << 2) + (card_info[drive].csd[1]>>30) + 1; - c_mult = 4 << ((card_info[drive].csd[1] >> 15) & 7); - max_read_bl_len = 1 << ((card_info[drive].csd[2] >> 16) & 15); - card_info[drive].blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */ - card_info[drive].numblocks = c_size * c_mult * (max_read_bl_len/512); - } -#ifdef HAVE_MULTIVOLUME - else if( (card_info[drive].csd[3]>>30) == 1) - { - /* CSD version 2.0 */ - c_size = ((card_info[drive].csd[2] & 0x3f) << 16) + (card_info[drive].csd[1]>>16) + 1; - card_info[drive].blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */ - card_info[drive].numblocks = c_size << 10; - } -#endif + for(i=0; i<4; i++) + card_info[drive].csd[3-i] = temp_reg[i]; + + sd_parse_csd(&card_info[drive]); if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) return -9; @@ -723,7 +698,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, /* Set bank_start to the correct unit (blocks or bytes) */ if(!(card_info[drive].ocr & (1<<30))) /* not SDHC */ - bank_start *= BLOCK_SIZE; + bank_start *= SD_BLOCK_SIZE; if(!send_cmd(drive, cmd, bank_start, MCI_ARG, NULL)) { @@ -877,22 +852,7 @@ void sd_enable(bool on) tCardInfo *card_get_info_target(int card_no) { - unsigned char temp; - tCardInfo *card = &card_info[card_no]; - - temp = card->csd[3]; - card->speed = sd_mantissa[temp & 7] * sd_exponent[(temp >> 3) & 0xf]; - - temp = card->csd[3] >> 8; - card->nsac = 100 * temp; - - temp = (card->csd[3] >> 16) & 0x7f; /* bit 7 reserved */ - card->taac = sd_mantissa[temp >> 3] * sd_exponent[temp & 7]; - - temp = (card->csd[0] >> 26) & 7; - card->r2w_factor = temp; - - return card; + return &card_info[card_no]; } bool card_detect_target(void) diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c index 8f30195791..df13a119f8 100644 --- a/firmware/target/arm/ata-sd-pp.c +++ b/firmware/target/arm/ata-sd-pp.c @@ -36,7 +36,6 @@ #include "sd.h" #include "storage.h" -#define BLOCK_SIZE 512 #define SECTOR_SIZE 512 #define BLOCKS_PER_BANK 0x7a7800 @@ -552,7 +551,7 @@ static int sd_select_bank(unsigned char bank) /* Write the card data */ write_buf = card_data; - for (i = 0; i < BLOCK_SIZE/2; i += FIFO_LEN) + for (i = 0; i < SD_BLOCK_SIZE/2; i += FIFO_LEN) { /* Wait for the FIFO to empty */ if (sd_poll_status(STAT_XMIT_FIFO_EMPTY, 10000)) @@ -652,10 +651,9 @@ static void sd_init_device(int card_no) unsigned long response = 0; #endif unsigned int i; - unsigned int c_size; - unsigned long c_mult; unsigned char carddata[512]; unsigned char *dataptr; + unsigned long temp_reg[4]; int ret; /* Enable and initialise controller */ @@ -733,38 +731,25 @@ static void sd_init_device(int card_no) } } - ret = sd_command(SD_ALL_SEND_CID, 0, currcard->cid, CMDAT_RES_TYPE2); + ret = sd_command(SD_ALL_SEND_CID, 0, temp_reg, CMDAT_RES_TYPE2); if (ret < 0) goto card_init_error; + for(i=0; i<4; i++) + currcard->cid[i] = temp_reg[3-i]; + ret = sd_command(SD_SEND_RELATIVE_ADDR, 0, &currcard->rca, CMDAT_RES_TYPE1); if (ret < 0) goto card_init_error; - ret = sd_command(SD_SEND_CSD, currcard->rca, currcard->csd, CMDAT_RES_TYPE2); + ret = sd_command(SD_SEND_CSD, currcard->rca, temp_reg, CMDAT_RES_TYPE2); if (ret < 0) goto card_init_error; - /* These calculations come from the Sandisk SD card product manual */ - if( (currcard->csd[3]>>30) == 0) - { - int max_read_bl_len; - /* CSD version 1.0 */ - c_size = ((currcard->csd[2] & 0x3ff) << 2) + (currcard->csd[1]>>30) + 1; - c_mult = 4 << ((currcard->csd[1] >> 15) & 7); - max_read_bl_len = 1 << ((currcard->csd[2] >> 16) & 15); - currcard->blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */ - currcard->numblocks = c_size * c_mult * (max_read_bl_len/512); - } -#ifdef HAVE_HOTSWAP - else if( (currcard->csd[3]>>30) == 1) - { - /* CSD version 2.0 */ - c_size = ((currcard->csd[2] & 0x3f) << 16) + (currcard->csd[1]>>16) + 1; - currcard->blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */ - currcard->numblocks = c_size << 10; - } -#endif /* HAVE_HOTSWAP */ + for(i=0; i<4; i++) + currcard->csd[i] = temp_reg[3-i]; + + sd_parse_csd(currcard); MMC_CLKRT = 0; /* switch to highest clock rate */ @@ -805,7 +790,7 @@ static void sd_init_device(int card_no) The first 512 bits contain the status information TODO: Do something useful with this! */ dataptr = carddata; - for (i = 0; i < BLOCK_SIZE/2; i += FIFO_LEN) + for (i = 0; i < SD_BLOCK_SIZE/2; i += FIFO_LEN) { /* Wait for the FIFO to be full */ if (sd_poll_status(STAT_RECV_FIFO_FULL, 100000)) @@ -924,13 +909,13 @@ sd_read_retry: else #endif { - ret = sd_command(SD_READ_MULTIPLE_BLOCK, start * BLOCK_SIZE, NULL, + ret = sd_command(SD_READ_MULTIPLE_BLOCK, start * SD_BLOCK_SIZE, NULL, 0x1c00 | CMDAT_BUSY | CMDAT_DATA_EN | CMDAT_RES_TYPE1); } if (ret < 0) goto sd_read_error; - /* TODO: Don't assume BLOCK_SIZE == SECTOR_SIZE */ + /* TODO: Don't assume SD_BLOCK_SIZE == SECTOR_SIZE */ buf_end = (unsigned char *)inbuf + incount * currcard->blocksize; for (buf = inbuf; buf < buf_end;) @@ -1042,7 +1027,7 @@ sd_write_retry: else #endif { - ret = sd_command(SD_WRITE_MULTIPLE_BLOCK, start*BLOCK_SIZE, NULL, + ret = sd_command(SD_WRITE_MULTIPLE_BLOCK, start*SD_BLOCK_SIZE, NULL, CMDAT_WR_RD | CMDAT_DATA_EN | CMDAT_RES_TYPE1); } if (ret < 0) @@ -1290,35 +1275,9 @@ int sd_init(void) return ret; } -/* move the sd-card info to mmc struct */ tCardInfo *card_get_info_target(int card_no) { - int i, temp; - static tCardInfo card; - static const char mantissa[] = { /* *10 */ - 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 }; - static const int exponent[] = { /* use varies */ - 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 }; - - card.initialized = card_info[card_no].initialized; - card.ocr = card_info[card_no].ocr; - for(i=0; i<4; i++) card.csd[i] = card_info[card_no].csd[3-i]; - for(i=0; i<4; i++) card.cid[i] = card_info[card_no].cid[3-i]; - card.numblocks = card_info[card_no].numblocks; - card.blocksize = card_info[card_no].blocksize; - temp = card_extract_bits(card.csd, 98, 3); - card.speed = mantissa[card_extract_bits(card.csd, 102, 4)] - * exponent[temp > 2 ? 7 : temp + 4]; - card.nsac = 100 * card_extract_bits(card.csd, 111, 8); - temp = card_extract_bits(card.csd, 114, 3); - card.taac = mantissa[card_extract_bits(card.csd, 118, 4)] - * exponent[temp] / 10; - card.cid[0] = htobe32(card.cid[0]); /* ascii chars here */ - card.cid[1] = htobe32(card.cid[1]); /* ascii chars here */ - temp = *((char*)card.cid+13); /* adjust year<=>month, 1997 <=> 2000 */ - *((char*)card.cid+13) = (unsigned char)((temp >> 4) | (temp << 4)) + 3; - - return &card; + return &card_info[card_no]; } bool card_detect_target(void) |