nuclear@1: #include "copper.h" nuclear@1: #include "hwregs.h" nuclear@1: nuclear@1: uint32_t *copperlist, *copperlist_end; nuclear@1: static uint32_t *copmem, *curlist; nuclear@1: static int mode, copmem_size; nuclear@1: nuclear@1: extern uint32_t _mem_start; nuclear@1: nuclear@1: int init_copper(int maxlist, int nlists) nuclear@1: { nuclear@1: /* allocate and set new copper lists */ nuclear@1: if(maxlist <= 0) maxlist = 256; nuclear@1: mode = nlists >= COPPER_DOUBLE ? COPPER_DOUBLE : COPPER_SINGLE; nuclear@1: nuclear@1: copmem_size = maxlist * 4 * mode; nuclear@1: copmem = (uint32_t*)_mem_start; nuclear@1: nuclear@1: curlist = copperlist = copmem; nuclear@1: *curlist = COPPER_END; nuclear@1: nuclear@1: if(mode == COPPER_DOUBLE) { nuclear@1: copperlist = curlist + maxlist; nuclear@1: *copperlist = COPPER_END; nuclear@1: } nuclear@1: copperlist_end = copperlist; nuclear@1: nuclear@1: REG32_COP1LC = (uint32_t)curlist; nuclear@1: REG_COPJMP1 = 0; /* causes copper to read COP1LC */ nuclear@1: return 0; nuclear@1: } nuclear@1: nuclear@1: void cleanup_copper(void) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: void enable_copper(void) nuclear@1: { nuclear@1: REG_DMACON = SETBITS(DMA_COPPER); nuclear@1: } nuclear@1: nuclear@1: void disable_copper(void) nuclear@1: { nuclear@1: REG_DMACON = CLRBITS(DMA_COPPER); nuclear@1: } nuclear@1: nuclear@1: void clear_copper(void) nuclear@1: { nuclear@1: copperlist_end = copperlist; nuclear@1: *copperlist_end = COPPER_END; nuclear@1: } nuclear@1: nuclear@1: void add_copper(uint32_t cmd) nuclear@1: { nuclear@1: *copperlist_end++ = cmd; nuclear@1: } nuclear@1: nuclear@1: void sort_copper(void) nuclear@1: { nuclear@1: /* TODO */ nuclear@1: } nuclear@1: nuclear@1: void swap_copper(void) nuclear@1: { nuclear@1: if(mode == COPPER_DOUBLE) { nuclear@1: uint32_t *tmpptr; nuclear@1: tmpptr = curlist; nuclear@1: curlist = copperlist; nuclear@1: copperlist = copperlist_end = tmpptr; nuclear@1: nuclear@1: REG32_COP1LC = (uint32_t)curlist; nuclear@1: REG_COPJMP1 = 0; nuclear@1: } else { nuclear@1: copperlist_end = curlist; nuclear@1: } nuclear@1: *copperlist_end = COPPER_END; nuclear@1: }