summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 0556cc0eb4..9ef8226019 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -571,7 +571,11 @@ static int sd_wait_for_state(const int drive, unsigned int state)
571 571
572static int sd_select_bank(signed char bank) 572static int sd_select_bank(signed char bank)
573{ 573{
574 unsigned char card_data[512]; 574 /* allocate card data buffer on the stack */
575 unsigned char card_data[512 + 31];
576 /* align it on cache line size */
577 unsigned char *aligned_card_data = (void*)(((int)&card_data[0] + 31) & ~31);
578 unsigned char *uncached_card_data = UNCACHED_ADDR(aligned_card_data);
575 int ret; 579 int ret;
576 580
577 do { 581 do {
@@ -592,19 +596,22 @@ static int sd_select_bank(signed char bank)
592 596
593 mci_delay(); 597 mci_delay();
594 598
595 memset(card_data, 0, 512); 599 memset(uncached_card_data, 0, 512);
596 if(bank == -1) 600 if(bank == -1)
597 { /* enable bank switching */ 601 { /* enable bank switching */
598 card_data[0] = 16; 602 uncached_card_data[0] = 16;
599 card_data[1] = 1; 603 uncached_card_data[1] = 1;
600 card_data[2] = 10; 604 uncached_card_data[2] = 10;
601 } 605 }
602 else 606 else
603 card_data[0] = bank; 607 uncached_card_data[0] = bank;
604 608
605 dma_retain(); 609 dma_retain();
606 dma_enable_channel(0, card_data, MCI_FIFO(INTERNAL_AS3525), DMA_PERI_SD, 610 /* we don't use the uncached card data for DMA, because we need the
607 DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); 611 * physical memory address for DMA transfers */
612 dma_enable_channel(0, aligned_card_data, MCI_FIFO(INTERNAL_AS3525),
613 DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8,
614 NULL);
608 615
609 MCI_DATA_TIMER(INTERNAL_AS3525) = SD_MAX_WRITE_TIMEOUT; 616 MCI_DATA_TIMER(INTERNAL_AS3525) = SD_MAX_WRITE_TIMEOUT;
610 MCI_DATA_LENGTH(INTERNAL_AS3525) = 512; 617 MCI_DATA_LENGTH(INTERNAL_AS3525) = 512;