From 1ab08e6879b1fe50102fe68a1326db05891e6faa Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Thu, 4 Dec 2008 20:48:19 +0000 Subject: Sansa AMS: updates DMA API * Adds a callback to be called on end of transfer * Add a function to disable a channel * Services the 2 channels if both are active in the isr SD driver: panics on error git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19333 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/as3525/dma-pl081.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'firmware/target/arm/as3525/dma-pl081.c') diff --git a/firmware/target/arm/as3525/dma-pl081.c b/firmware/target/arm/as3525/dma-pl081.c index fbe488ce05..3de4e73c12 100644 --- a/firmware/target/arm/as3525/dma-pl081.c +++ b/firmware/target/arm/as3525/dma-pl081.c @@ -27,6 +27,7 @@ #include "kernel.h" static struct wakeup transfer_completion_signal[2]; /* 2 channels */ +static void (*dma_callback[2])(void); /* 2 channels */ inline void dma_wait_transfer(int channel) { @@ -45,10 +46,17 @@ void dma_init(void) wakeup_init(&transfer_completion_signal[1]); } +inline void dma_disable_channel(int channel) +{ + DMAC_CH_CONFIGURATION(channel) &= ~(1<<0); +} + void dma_enable_channel(int channel, void *src, void *dst, int peri, int flow_controller, bool src_inc, bool dst_inc, - size_t size, int nwords) + size_t size, int nwords, void (*callback)(void)) { + dma_callback[channel] = callback; + int control = 0; DMAC_CH_SRC_ADDR(channel) = (int)src; @@ -92,12 +100,21 @@ void dma_enable_channel(int channel, void *src, void *dst, int peri, /* isr */ void INT_DMAC(void) { - int channel = (DMAC_INT_STATUS & (1<<0)) ? 0 : 1; + unsigned int channel; + + /* SD channel is serviced first */ + for(channel = 0; channel < 2; channel++) + if(DMAC_INT_STATUS & (1<