diff options
Diffstat (limited to 'firmware/target/arm/as3525')
-rw-r--r-- | firmware/target/arm/as3525/ata_sd_as3525.c | 3 | ||||
-rw-r--r-- | firmware/target/arm/as3525/dma-pl081.c | 19 | ||||
-rw-r--r-- | firmware/target/arm/as3525/dma-target.h | 2 |
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 | ||
28 | volatile bool dma_finished; | 29 | static struct wakeup transfer_completion_signal[2]; /* 2 channels */ |
30 | |||
31 | inline void dma_wait_transfer(int channel) | ||
32 | { | ||
33 | wakeup_wait(&transfer_completion_signal[channel], TIMEOUT_BLOCK); | ||
34 | } | ||
29 | 35 | ||
30 | void dma_init(void) | 36 | void 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 | ||
39 | void dma_enable_channel(int channel, void *src, void *dst, int peri, | 48 | void 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 | ||
39 | extern volatile bool dma_finished; | 39 | inline void dma_wait_transfer(int channel); |