summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2009-07-01 21:49:13 +0000
committerRafaël Carré <rafael.carre@gmail.com>2009-07-01 21:49:13 +0000
commitc0eb9aeb9e89ae33a9f084167147d8eacb9c7c60 (patch)
tree57e96460989d9cccc421486769befb5648601b8c /firmware/target/arm
parent93f6e3df246ff50c24524c9d329f27a06e1845db (diff)
downloadrockbox-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.c66
-rw-r--r--firmware/target/arm/ata-sd-pp.c73
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)