ref: f801657f77f3923ec2388c25bdcb036c8019ba89
dir: /prog/dma2q.c/
#include <u.h>
#include "dat.h"
#include "fns.h"
#include "mem.h"
#include "libkern/kern.h"
#include "prog/prog.h"
#include "prog/progfns.h"
typedef
struct DmaQ
{
Queue* din;
Queue* dout;
char* buf;
} DmaQ;
void
dma2q(void *dmaqptr)
{
DmaQ *dmaq = dmaqptr;
int n;
kprint("dma2q: started");
while(1) {
n = dma_read(DMAINCH, dmaq->buf, DMAQ_BUFSIZE);
if(n > 0) {
qwrite(dmaq->din, dmaq->buf, n);
}
n = qlen(dmaq->dout);
if(n > DMAQ_BUFSIZE) n = DMAQ_BUFSIZE;
if(n > 0) {
n = qread(dmaq->dout, dmaq->buf, n);
dma_write(DMAOUTCH, dmaq->buf, n);
}
}
kprint("dma2q: queues closed; exit\n");
}
Proc*
prog_dma2q(Queue* dmaiq, Queue* dmaoq)
{
Proc *dmaproc;
DmaQ *dmaq = malloc(sizeof(DmaQ));
dmaq->din = dmaiq;
dmaq->dout = dmaoq;
dmaq->buf = malloc(DMAQ_BUFSIZE);
dmaproc = newprog("dma2q", dma2q, dmaq, 0, 1280);
return dmaproc;
}