nuclear@0: /* nuclear@0: Copyright 2004 John Tsiombikas nuclear@0: nuclear@0: This file is part of libgba, a library for GameBoy Advance development. nuclear@0: nuclear@0: This program is free software; you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@0: the Free Software Foundation; either version 2 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@0: along with this program; if not, write to the Free Software nuclear@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA nuclear@0: */ nuclear@0: nuclear@0: #include "libgba_config.h" nuclear@0: #include "dma.h" nuclear@0: nuclear@0: /* DMA Options */ nuclear@0: #define DMA_ENABLE 0x80000000 nuclear@0: #define DMA_INT_ENABLE 0x40000000 nuclear@0: #define DMA_TIMING_IMMED 0x00000000 nuclear@0: #define DMA_TIMING_VBLANK 0x10000000 nuclear@0: #define DMA_TIMING_HBLANK 0x20000000 nuclear@0: #define DMA_TIMING_DISPSYNC 0x30000000 nuclear@0: #define DMA_16 0x00000000 nuclear@0: #define DMA_32 0x04000000 nuclear@0: #define DMA_REPEAT 0x02000000 nuclear@0: #define DMA_SRC_INC 0x00000000 nuclear@0: #define DMA_SRC_DEC 0x00800000 nuclear@0: #define DMA_SRC_FIX 0x01000000 nuclear@0: #define DMA_DST_INC 0x00000000 nuclear@0: #define DMA_DST_DEC 0x00200000 nuclear@0: #define DMA_DST_FIX1 0x00400000 nuclear@0: #define DMA_DST_RELOAD 0x00600000 nuclear@0: nuclear@0: /* DMA Register Parts */ nuclear@0: #define DMA_SRC 0 nuclear@0: #define DMA_DST 1 nuclear@0: #define DMA_CTRL 2 nuclear@0: nuclear@0: static volatile unsigned long *reg_dma[4] = {(void*)0x040000b0, (void*)0x040000bc, (void*)0x040000c8, (void*)0x040000d4 }; nuclear@0: nuclear@0: /* --- perform a copy of words or halfwords using DMA --- */ nuclear@0: nuclear@0: void dma_copy32(int channel, void *dst, void *src, int words) { nuclear@0: reg_dma[channel][DMA_SRC] = (unsigned long)src; nuclear@0: reg_dma[channel][DMA_DST] = (unsigned long)dst; nuclear@0: reg_dma[channel][DMA_CTRL] = words | DMA_TIMING_IMMED | DMA_32 | DMA_ENABLE; nuclear@0: } nuclear@0: nuclear@0: void dma_copy16(int channel, void *dst, void *src, int halfwords) { nuclear@0: reg_dma[channel][DMA_SRC] = (unsigned long)src; nuclear@0: reg_dma[channel][DMA_DST] = (unsigned long)dst; nuclear@0: reg_dma[channel][DMA_CTRL] = halfwords | DMA_TIMING_IMMED | DMA_16 | DMA_ENABLE; nuclear@0: } nuclear@0: nuclear@0: /* --- fill a buffer with an ammount of words and halfwords using DMA --- */ nuclear@0: nuclear@0: void dma_fill32(int channel, void *dst, unsigned long val, int words) { nuclear@0: unsigned long valmem = val; nuclear@0: reg_dma[channel][DMA_SRC] = (unsigned long)&valmem; nuclear@0: reg_dma[channel][DMA_DST] = (unsigned long)dst; nuclear@0: reg_dma[channel][DMA_CTRL] = words | DMA_SRC_FIX | DMA_TIMING_IMMED | DMA_32 | DMA_ENABLE; nuclear@0: } nuclear@0: nuclear@0: void dma_fill16(int channel, void *dst, unsigned short val, int halfwords) { nuclear@0: unsigned short valmem = val; nuclear@0: reg_dma[channel][DMA_SRC] = (unsigned long)&valmem; nuclear@0: reg_dma[channel][DMA_DST] = (unsigned long)dst; nuclear@0: reg_dma[channel][DMA_CTRL] = halfwords | DMA_SRC_FIX | DMA_TIMING_IMMED | DMA_16 | DMA_ENABLE; nuclear@0: }