summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2008-11-26 16:02:00 +0000
committerRafaël Carré <rafael.carre@gmail.com>2008-11-26 16:02:00 +0000
commita39e4e9962109e77482d85609fbc452bd163e620 (patch)
treeebabb96a3d45a71a9a9aa6e332fe51dd4c4e0600
parentaaaf609996bf8e5c651fcf3aa20399a27f953cbc (diff)
downloadrockbox-a39e4e9962109e77482d85609fbc452bd163e620.tar.gz
rockbox-a39e4e9962109e77482d85609fbc452bd163e620.zip
Sansa AMS: use non-busy wakeup to signal end of DMA transfer
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19233 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/config.h2
-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
4 files changed, 16 insertions, 10 deletions
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 7f72cde7d4..221e9a8124 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -434,7 +434,7 @@
434 434
435#endif /* BOOTLOADER */ 435#endif /* BOOTLOADER */
436 436
437#if defined(HAVE_USBSTACK) || (CONFIG_CPU == JZ4732) 437#if defined(HAVE_USBSTACK) || (CONFIG_CPU == JZ4732) || (CONFIG_CPU == AS3525)
438#define HAVE_WAKEUP_OBJECTS 438#define HAVE_WAKEUP_OBJECTS
439#endif 439#endif
440 440
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);