diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 23 |
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 | ||
572 | static int sd_select_bank(signed char bank) | 572 | static 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; |