#include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "../port/error.h" /* * DMA helper routines */ enum { NDMA = 6, /* Number of DMA channels */ DMAREGS = 0xb0000000, /* DMA registers, physical */ }; enum { /* Device Address Register, DDAR */ RW = 0, E = 1, BS = 2, DW = 3, DS = 4, /* bits 4 - 7 */ DA = 8 /* bits 8 - 31 */ }; enum { /* Device Control & Status Register, DCSR */ RUN = 0, IE = 1, ERROR = 2, DONEA = 3, STRTA = 4, DONEB = 5, STRTB = 6, BIU = 7 }; struct { Lock; Rendez r[6]; int channels; } dma; struct dmaregs { ulong ddar; ulong dcsr_set; ulong dcsr_clr; ulong dcsr_rd; void* dstrtA; ulong dxcntA; void* dstrtB; ulong dxcntB; } *dmaregs; void dmainit(void) { /* map the lcd regs into the kernel's virtual space */ dmaregs = (struct dmaregs*)mapspecial(DMAREGS, NDMA*sizeof(struct dmaregs));; } int dmaalloc(int rd, int bigendian, int burstsize, int datumsize, int device, void *port) { int i; lock(&dma); for (i = 0; i < NDMA; i++) { if (dma.channels & (1 << i)) continue; dma.channels |= 1 << i; unlock(&dma); dmaregs[i].ddar = (rd?1:0)<