summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
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] = {
94static int sd_select_bank(signed char bank); 94static int sd_select_bank(signed char bank);
95static int sd_init_card(const int drive); 95static int sd_init_card(const int drive);
96static void init_pl180_controller(const int drive); 96static void init_pl180_controller(const int drive);
97/* TODO : BLOCK_SIZE != SECTOR_SIZE ? */ 97#define SECTOR_SIZE 512 /* XXX: different sector sizes ? */
98#define BLOCK_SIZE 512
99#define SECTOR_SIZE 512
100#define BLOCKS_PER_BANK 0x7a7800 98#define BLOCKS_PER_BANK 0x7a7800
101 99
102static tCardInfo card_info[NUM_VOLUMES]; 100static tCardInfo card_info[NUM_VOLUMES];
@@ -241,12 +239,11 @@ static bool send_cmd(const int drive, const int cmd, const int arg,
241 239
242static int sd_init_card(const int drive) 240static int sd_init_card(const int drive)
243{ 241{
244 unsigned int c_size;
245 unsigned long c_mult;
246 unsigned long response; 242 unsigned long response;
247 int max_tries = 100; /* max acmd41 attemps */ 243 int max_tries = 100; /* max acmd41 attemps */
248 bool sdhc; 244 bool sdhc;
249 unsigned char temp; 245 unsigned long temp_reg[4];
246 int i;
250 247
251 if(!send_cmd(drive, SD_GO_IDLE_STATE, 0, MCI_NO_FLAGS, NULL)) 248 if(!send_cmd(drive, SD_GO_IDLE_STATE, 0, MCI_NO_FLAGS, NULL))
252 return -1; 249 return -1;
@@ -284,17 +281,11 @@ static int sd_init_card(const int drive)
284 281
285 /* send CID */ 282 /* send CID */
286 if(!send_cmd(drive, SD_ALL_SEND_CID, 0, MCI_RESP|MCI_LONG_RESP|MCI_ARG, 283 if(!send_cmd(drive, SD_ALL_SEND_CID, 0, MCI_RESP|MCI_LONG_RESP|MCI_ARG,
287 card_info[drive].cid)) 284 temp_reg))
288 return -5; 285 return -5;
289 286
290 /* ascii chars here */ 287 for(i=0; i<4; i++)
291 card_info[drive].cid[0] = htobe32(card_info[drive].cid[0]); 288 card_info[drive].cid[3-i] = temp_reg[i];
292 card_info[drive].cid[1] = htobe32(card_info[drive].cid[1]);
293
294 /* adjust year<=>month, 1997 <=> 2000 */
295 temp = *((char*)card_info[drive].cid+13);
296 *((char*)card_info[drive].cid+13) =
297 (unsigned char)((temp >> 4) | (temp << 4)) + 3;
298 289
299 /* send RCA */ 290 /* send RCA */
300 if(!send_cmd(drive, SD_SEND_RELATIVE_ADDR, 0, MCI_RESP|MCI_ARG, 291 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)
303 294
304 /* send CSD */ 295 /* send CSD */
305 if(!send_cmd(drive, SD_SEND_CSD, card_info[drive].rca, 296 if(!send_cmd(drive, SD_SEND_CSD, card_info[drive].rca,
306 MCI_RESP|MCI_LONG_RESP|MCI_ARG, card_info[drive].csd)) 297 MCI_RESP|MCI_LONG_RESP|MCI_ARG, temp_reg))
307 return -7; 298 return -7;
308 299
309 /* These calculations come from the Sandisk SD card product manual */ 300 for(i=0; i<4; i++)
310 if( (card_info[drive].csd[3]>>30) == 0) 301 card_info[drive].csd[3-i] = temp_reg[i];
311 { 302
312 int max_read_bl_len; 303 sd_parse_csd(&card_info[drive]);
313 /* CSD version 1.0 */
314 c_size = ((card_info[drive].csd[2] & 0x3ff) << 2) + (card_info[drive].csd[1]>>30) + 1;
315 c_mult = 4 << ((card_info[drive].csd[1] >> 15) & 7);
316 max_read_bl_len = 1 << ((card_info[drive].csd[2] >> 16) & 15);
317 card_info[drive].blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */
318 card_info[drive].numblocks = c_size * c_mult * (max_read_bl_len/512);
319 }
320#ifdef HAVE_MULTIVOLUME
321 else if( (card_info[drive].csd[3]>>30) == 1)
322 {
323 /* CSD version 2.0 */
324 c_size = ((card_info[drive].csd[2] & 0x3f) << 16) + (card_info[drive].csd[1]>>16) + 1;
325 card_info[drive].blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */
326 card_info[drive].numblocks = c_size << 10;
327 }
328#endif
329 304
330 if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) 305 if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL))
331 return -9; 306 return -9;
@@ -723,7 +698,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start,
723 698
724 /* Set bank_start to the correct unit (blocks or bytes) */ 699 /* Set bank_start to the correct unit (blocks or bytes) */
725 if(!(card_info[drive].ocr & (1<<30))) /* not SDHC */ 700 if(!(card_info[drive].ocr & (1<<30))) /* not SDHC */
726 bank_start *= BLOCK_SIZE; 701 bank_start *= SD_BLOCK_SIZE;
727 702
728 if(!send_cmd(drive, cmd, bank_start, MCI_ARG, NULL)) 703 if(!send_cmd(drive, cmd, bank_start, MCI_ARG, NULL))
729 { 704 {
@@ -877,22 +852,7 @@ void sd_enable(bool on)
877 852
878tCardInfo *card_get_info_target(int card_no) 853tCardInfo *card_get_info_target(int card_no)
879{ 854{
880 unsigned char temp; 855 return &card_info[card_no];
881 tCardInfo *card = &card_info[card_no];
882
883 temp = card->csd[3];
884 card->speed = sd_mantissa[temp & 7] * sd_exponent[(temp >> 3) & 0xf];
885
886 temp = card->csd[3] >> 8;
887 card->nsac = 100 * temp;
888
889 temp = (card->csd[3] >> 16) & 0x7f; /* bit 7 reserved */
890 card->taac = sd_mantissa[temp >> 3] * sd_exponent[temp & 7];
891
892 temp = (card->csd[0] >> 26) & 7;
893 card->r2w_factor = temp;
894
895 return card;
896} 856}
897 857
898bool card_detect_target(void) 858bool 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 @@
36#include "sd.h" 36#include "sd.h"
37#include "storage.h" 37#include "storage.h"
38 38
39#define BLOCK_SIZE 512
40#define SECTOR_SIZE 512 39#define SECTOR_SIZE 512
41#define BLOCKS_PER_BANK 0x7a7800 40#define BLOCKS_PER_BANK 0x7a7800
42 41
@@ -552,7 +551,7 @@ static int sd_select_bank(unsigned char bank)
552 551
553 /* Write the card data */ 552 /* Write the card data */
554 write_buf = card_data; 553 write_buf = card_data;
555 for (i = 0; i < BLOCK_SIZE/2; i += FIFO_LEN) 554 for (i = 0; i < SD_BLOCK_SIZE/2; i += FIFO_LEN)
556 { 555 {
557 /* Wait for the FIFO to empty */ 556 /* Wait for the FIFO to empty */
558 if (sd_poll_status(STAT_XMIT_FIFO_EMPTY, 10000)) 557 if (sd_poll_status(STAT_XMIT_FIFO_EMPTY, 10000))
@@ -652,10 +651,9 @@ static void sd_init_device(int card_no)
652 unsigned long response = 0; 651 unsigned long response = 0;
653#endif 652#endif
654 unsigned int i; 653 unsigned int i;
655 unsigned int c_size;
656 unsigned long c_mult;
657 unsigned char carddata[512]; 654 unsigned char carddata[512];
658 unsigned char *dataptr; 655 unsigned char *dataptr;
656 unsigned long temp_reg[4];
659 int ret; 657 int ret;
660 658
661/* Enable and initialise controller */ 659/* Enable and initialise controller */
@@ -733,38 +731,25 @@ static void sd_init_device(int card_no)
733 } 731 }
734 } 732 }
735 733
736 ret = sd_command(SD_ALL_SEND_CID, 0, currcard->cid, CMDAT_RES_TYPE2); 734 ret = sd_command(SD_ALL_SEND_CID, 0, temp_reg, CMDAT_RES_TYPE2);
737 if (ret < 0) 735 if (ret < 0)
738 goto card_init_error; 736 goto card_init_error;
739 737
738 for(i=0; i<4; i++)
739 currcard->cid[i] = temp_reg[3-i];
740
740 ret = sd_command(SD_SEND_RELATIVE_ADDR, 0, &currcard->rca, CMDAT_RES_TYPE1); 741 ret = sd_command(SD_SEND_RELATIVE_ADDR, 0, &currcard->rca, CMDAT_RES_TYPE1);
741 if (ret < 0) 742 if (ret < 0)
742 goto card_init_error; 743 goto card_init_error;
743 744
744 ret = sd_command(SD_SEND_CSD, currcard->rca, currcard->csd, CMDAT_RES_TYPE2); 745 ret = sd_command(SD_SEND_CSD, currcard->rca, temp_reg, CMDAT_RES_TYPE2);
745 if (ret < 0) 746 if (ret < 0)
746 goto card_init_error; 747 goto card_init_error;
747 748
748 /* These calculations come from the Sandisk SD card product manual */ 749 for(i=0; i<4; i++)
749 if( (currcard->csd[3]>>30) == 0) 750 currcard->csd[i] = temp_reg[3-i];
750 { 751
751 int max_read_bl_len; 752 sd_parse_csd(currcard);
752 /* CSD version 1.0 */
753 c_size = ((currcard->csd[2] & 0x3ff) << 2) + (currcard->csd[1]>>30) + 1;
754 c_mult = 4 << ((currcard->csd[1] >> 15) & 7);
755 max_read_bl_len = 1 << ((currcard->csd[2] >> 16) & 15);
756 currcard->blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */
757 currcard->numblocks = c_size * c_mult * (max_read_bl_len/512);
758 }
759#ifdef HAVE_HOTSWAP
760 else if( (currcard->csd[3]>>30) == 1)
761 {
762 /* CSD version 2.0 */
763 c_size = ((currcard->csd[2] & 0x3f) << 16) + (currcard->csd[1]>>16) + 1;
764 currcard->blocksize = BLOCK_SIZE; /* Always use 512 byte blocks */
765 currcard->numblocks = c_size << 10;
766 }
767#endif /* HAVE_HOTSWAP */
768 753
769 MMC_CLKRT = 0; /* switch to highest clock rate */ 754 MMC_CLKRT = 0; /* switch to highest clock rate */
770 755
@@ -805,7 +790,7 @@ static void sd_init_device(int card_no)
805 The first 512 bits contain the status information 790 The first 512 bits contain the status information
806 TODO: Do something useful with this! */ 791 TODO: Do something useful with this! */
807 dataptr = carddata; 792 dataptr = carddata;
808 for (i = 0; i < BLOCK_SIZE/2; i += FIFO_LEN) 793 for (i = 0; i < SD_BLOCK_SIZE/2; i += FIFO_LEN)
809 { 794 {
810 /* Wait for the FIFO to be full */ 795 /* Wait for the FIFO to be full */
811 if (sd_poll_status(STAT_RECV_FIFO_FULL, 100000)) 796 if (sd_poll_status(STAT_RECV_FIFO_FULL, 100000))
@@ -924,13 +909,13 @@ sd_read_retry:
924 else 909 else
925#endif 910#endif
926 { 911 {
927 ret = sd_command(SD_READ_MULTIPLE_BLOCK, start * BLOCK_SIZE, NULL, 912 ret = sd_command(SD_READ_MULTIPLE_BLOCK, start * SD_BLOCK_SIZE, NULL,
928 0x1c00 | CMDAT_BUSY | CMDAT_DATA_EN | CMDAT_RES_TYPE1); 913 0x1c00 | CMDAT_BUSY | CMDAT_DATA_EN | CMDAT_RES_TYPE1);
929 } 914 }
930 if (ret < 0) 915 if (ret < 0)
931 goto sd_read_error; 916 goto sd_read_error;
932 917
933 /* TODO: Don't assume BLOCK_SIZE == SECTOR_SIZE */ 918 /* TODO: Don't assume SD_BLOCK_SIZE == SECTOR_SIZE */
934 919
935 buf_end = (unsigned char *)inbuf + incount * currcard->blocksize; 920 buf_end = (unsigned char *)inbuf + incount * currcard->blocksize;
936 for (buf = inbuf; buf < buf_end;) 921 for (buf = inbuf; buf < buf_end;)
@@ -1042,7 +1027,7 @@ sd_write_retry:
1042 else 1027 else
1043#endif 1028#endif
1044 { 1029 {
1045 ret = sd_command(SD_WRITE_MULTIPLE_BLOCK, start*BLOCK_SIZE, NULL, 1030 ret = sd_command(SD_WRITE_MULTIPLE_BLOCK, start*SD_BLOCK_SIZE, NULL,
1046 CMDAT_WR_RD | CMDAT_DATA_EN | CMDAT_RES_TYPE1); 1031 CMDAT_WR_RD | CMDAT_DATA_EN | CMDAT_RES_TYPE1);
1047 } 1032 }
1048 if (ret < 0) 1033 if (ret < 0)
@@ -1290,35 +1275,9 @@ int sd_init(void)
1290 return ret; 1275 return ret;
1291} 1276}
1292 1277
1293/* move the sd-card info to mmc struct */
1294tCardInfo *card_get_info_target(int card_no) 1278tCardInfo *card_get_info_target(int card_no)
1295{ 1279{
1296 int i, temp; 1280 return &card_info[card_no];
1297 static tCardInfo card;
1298 static const char mantissa[] = { /* *10 */
1299 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80 };
1300 static const int exponent[] = { /* use varies */
1301 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 };
1302
1303 card.initialized = card_info[card_no].initialized;
1304 card.ocr = card_info[card_no].ocr;
1305 for(i=0; i<4; i++) card.csd[i] = card_info[card_no].csd[3-i];
1306 for(i=0; i<4; i++) card.cid[i] = card_info[card_no].cid[3-i];
1307 card.numblocks = card_info[card_no].numblocks;
1308 card.blocksize = card_info[card_no].blocksize;
1309 temp = card_extract_bits(card.csd, 98, 3);
1310 card.speed = mantissa[card_extract_bits(card.csd, 102, 4)]
1311 * exponent[temp > 2 ? 7 : temp + 4];
1312 card.nsac = 100 * card_extract_bits(card.csd, 111, 8);
1313 temp = card_extract_bits(card.csd, 114, 3);
1314 card.taac = mantissa[card_extract_bits(card.csd, 118, 4)]
1315 * exponent[temp] / 10;
1316 card.cid[0] = htobe32(card.cid[0]); /* ascii chars here */
1317 card.cid[1] = htobe32(card.cid[1]); /* ascii chars here */
1318 temp = *((char*)card.cid+13); /* adjust year<=>month, 1997 <=> 2000 */
1319 *((char*)card.cid+13) = (unsigned char)((temp >> 4) | (temp << 4)) + 3;
1320
1321 return &card;
1322} 1281}
1323 1282
1324bool card_detect_target(void) 1283bool card_detect_target(void)