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.c3
-rw-r--r--firmware/target/arm/as3525/dma-pl081.c19
-rw-r--r--firmware/target/arm/as3525/dma-target.h2
3 files changed, 15 insertions, 9 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 2437faf76c..726dffc6ab 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -553,8 +553,7 @@ static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start,
553 (1<<3) /* DMA */ | 553 (1<<3) /* DMA */ |
554 (9<<4) /* 2^9 = 512 */ ; 554 (9<<4) /* 2^9 = 512 */ ;
555 555
556 while(!dma_finished) 556 dma_wait_transfer(0);
557 yield();
558 557
559 buf += transfer * SECTOR_SIZE; 558 buf += transfer * SECTOR_SIZE;
560 start += transfer; 559 start += transfer;
diff --git a/firmware/target/arm/as3525/dma-pl081.c b/firmware/target/arm/as3525/dma-pl081.c
index 31021e1560..fbe488ce05 100644
--- a/firmware/target/arm/as3525/dma-pl081.c
+++ b/firmware/target/arm/as3525/dma-pl081.c
@@ -19,21 +19,30 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22#include <stdbool.h>
22#include "as3525.h" 23#include "as3525.h"
23#include "pl081.h" 24#include "pl081.h"
24#include "dma-target.h" 25#include "dma-target.h"
25#include <stdbool.h>
26#include "panic.h" 26#include "panic.h"
27#include "kernel.h"
27 28
28volatile bool dma_finished; 29static struct wakeup transfer_completion_signal[2]; /* 2 channels */
30
31inline void dma_wait_transfer(int channel)
32{
33 wakeup_wait(&transfer_completion_signal[channel], TIMEOUT_BLOCK);
34}
29 35
30void dma_init(void) 36void dma_init(void)
31{ 37{
32 /* Enable DMA controller */ 38 /* Enable DMA controller */
33 CGU_PERI |= CGU_DMA_CLOCK_ENABLE; 39 CGU_PERI |= CGU_DMA_CLOCK_ENABLE;
34 DMAC_CONFIGURATION |= (1<<0); 40 DMAC_CONFIGURATION |= (1<<0); /* TODO: disable controller when not used */
35 DMAC_SYNC = 0; 41 DMAC_SYNC = 0;
36 VIC_INT_ENABLE |= INTERRUPT_DMAC; 42 VIC_INT_ENABLE |= INTERRUPT_DMAC;
43
44 wakeup_init(&transfer_completion_signal[0]);
45 wakeup_init(&transfer_completion_signal[1]);
37} 46}
38 47
39void dma_enable_channel(int channel, void *src, void *dst, int peri, 48void dma_enable_channel(int channel, void *src, void *dst, int peri,
@@ -65,8 +74,6 @@ void dma_enable_channel(int channel, void *src, void *dst, int peri,
65 74
66 DMAC_CH_CONTROL(channel) = control; 75 DMAC_CH_CONTROL(channel) = control;
67 76
68 dma_finished = false;
69
70 /* only needed if DMAC and Peripheral do not run at the same clock speed */ 77 /* only needed if DMAC and Peripheral do not run at the same clock speed */
71 DMAC_SYNC |= (1<<peri); 78 DMAC_SYNC |= (1<<peri);
72 79
@@ -92,5 +99,5 @@ void INT_DMAC(void)
92 99
93 DMAC_INT_TC_CLEAR |= (1<<channel); /* clear terminal count interrupt */ 100 DMAC_INT_TC_CLEAR |= (1<<channel); /* clear terminal count interrupt */
94 101
95 dma_finished = true; /* TODO : use struct wakeup ? */ 102 wakeup_signal(&transfer_completion_signal[channel]);
96} 103}
diff --git a/firmware/target/arm/as3525/dma-target.h b/firmware/target/arm/as3525/dma-target.h
index 74dff730ad..cd307b7b2a 100644
--- a/firmware/target/arm/as3525/dma-target.h
+++ b/firmware/target/arm/as3525/dma-target.h
@@ -36,4 +36,4 @@ void dma_enable_channel(int channel, void *src, void *dst, int peri,
36 int flow_controller, bool src_inc, bool dst_inc, 36 int flow_controller, bool src_inc, bool dst_inc,
37 size_t size, int nwords); 37 size_t size, int nwords);
38 38
39extern volatile bool dma_finished; 39inline void dma_wait_transfer(int channel);