/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright © 2008 Rafaël Carré * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include #include "as3525.h" #include "pl081.h" #include "dma-target.h" #include "panic.h" static int dma_used = 0; static void (*dma_callback[2])(void); /* 2 channels */ void dma_retain(void) { if(++dma_used == 1) { CGU_PERI |= CGU_DMA_CLOCK_ENABLE; DMAC_CONFIGURATION |= (1<<0); } } void dma_release(void) { if(--dma_used == 0) { DMAC_CONFIGURATION &= ~(1<<0); CGU_PERI &= ~CGU_DMA_CLOCK_ENABLE; } } void dma_init(void) { DMAC_SYNC = 0xffff; /* disable synchronisation logic */ VIC_INT_ENABLE |= INTERRUPT_DMAC; } 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, void (*callback)(void)) { dma_callback[channel] = callback; /* Clear any pending interrupts leftover from previous operation */ DMAC_INT_TC_CLEAR = (1<