From 81d2ba9b83536f0dd2ab40babc38ec1ee48b3aab Mon Sep 17 00:00:00 2001 From: schodet Date: Sat, 24 May 2003 11:46:50 +0000 Subject: Version non bloquante. Ne bloque plus. Correctif interruptions. --- 2003/i/buzz/src/kernel/pbus.c | 39 ++++++++++++++++++--------------------- 2003/i/buzz/src/kernel/pbus.h | 1 + 2 files changed, 19 insertions(+), 21 deletions(-) (limited to '2003/i') diff --git a/2003/i/buzz/src/kernel/pbus.c b/2003/i/buzz/src/kernel/pbus.c index 3935199..4d16589 100644 --- a/2003/i/buzz/src/kernel/pbus.c +++ b/2003/i/buzz/src/kernel/pbus.c @@ -48,10 +48,10 @@ struct cfattach pbus_ca = { sizeof(struct pbus_softc), pbusprobe, pbusattach }; -#define BUFSYNC_PRE \ - bus_dmamap_sync(sc->dmat,sc->sc_dmam,0,DMASIZE,BUS_DMASYNC_PREREAD) -#define BUFSYNC_POST \ - bus_dmamap_sync(sc->dmat,sc->sc_dmam,0,DMASIZE,BUS_DMASYNC_POSTREAD) +#define BUFSYNC_PRE(n) \ + bus_dmamap_sync(sc->dmat,sc->sc_dmam,(n)*BUFSZ,BUFSZ,BUS_DMASYNC_PREREAD) +#define BUFSYNC_POST(n) \ + bus_dmamap_sync(sc->dmat,sc->sc_dmam,(n)*BUFSZ,BUFSZ,BUS_DMASYNC_POSTREAD) #define PBUS_WRITE_4(reg, val) \ bus_space_write_4(sc->iot, sc->ioh, reg, val) @@ -202,25 +202,19 @@ pbusread(dev, uio, flags) { int bufok,remain; int resid=uio->uio_resid; - int s,err; + int s; struct pbus_softc *sc= pbus_cd.cd_devs[0]; s=splhigh(); bufok=*((volatile int *)(&sc->buf_ok)); - if ((!bufok)&&(!sc->in_dma)) + if (!bufok) { - BUFSYNC_PRE; - PBUS_WRITE_4(0x4,sc->sc_bonitodma); + BUFSYNC_PRE(0); sc->in_dma=1; + PBUS_WRITE_4(0x4,sc->sc_bonitodma); } splx(s); if (!resid) return 0; - - while (!bufok) - { - err=tsleep(sc,PUSER | PCATCH,"camera",0); - if (err) return err; - bufok=*((volatile int *)(&sc->buf_ok)); - } + if (!bufok) return 0; remain=sc->framesize-sc->buf_consumed; if (resid>remain) resid=remain; @@ -235,9 +229,9 @@ pbusread(dev, uio, flags) sc->buf_ok=0; if (!sc->in_dma) { - BUFSYNC_PRE; - PBUS_WRITE_4(0x4,sc->sc_bonitodma); + BUFSYNC_PRE(0); sc->in_dma=1; + PBUS_WRITE_4(0x4,sc->sc_bonitodma); } splx(s); } @@ -257,7 +251,7 @@ int pbus_intr(void *p) { struct pbus_softc *sc = (struct pbus_softc *)p; unsigned long status=PBUS_READ_4(0); - if (status&0x20000000) + if ((status&0x20000000)&&(sc->pbusinten)) { /* Désactive les interuptions. */ PBUS_WRITE_4(8,PBUS_READ_4(8)&0x3FFF); @@ -268,7 +262,7 @@ int pbus_intr(void *p) if (status&0x40000000) { /* Frame Ok */ - BUFSYNC_POST; + BUFSYNC_POST(0); sc->buf_ok=1; sc->in_dma=0; wakeup(sc); @@ -361,6 +355,9 @@ pbusioctl(dev, cmd, addr, flag, proc) int s; switch (cmd) { + case CAM_SETHCOUNT: + PBUS_WRITE_4(0xC,*fsize); + break; case CAM_SETFRAMESIZE: s=splhigh(); PBUS_WRITE_4(0x0,1); @@ -369,9 +366,9 @@ pbusioctl(dev, cmd, addr, flag, proc) sc->buf_ok=0; if (!sc->in_dma) { - BUFSYNC_PRE; - PBUS_WRITE_4(0x4,sc->sc_bonitodma); + BUFSYNC_PRE(0); sc->in_dma=1; + PBUS_WRITE_4(0x4,sc->sc_bonitodma); } splx(s); break; diff --git a/2003/i/buzz/src/kernel/pbus.h b/2003/i/buzz/src/kernel/pbus.h index 8e4a67e..351b144 100644 --- a/2003/i/buzz/src/kernel/pbus.h +++ b/2003/i/buzz/src/kernel/pbus.h @@ -31,4 +31,5 @@ struct sccb_io #define CAM_SETFRAMESIZE _IOW('R', 10, unsigned long) #define CAM_SCCBREAD _IOWR('R',11, struct sccb_io) #define CAM_SCCBWRITE _IOWR('R',12, struct sccb_io) +#define CAM_SETHCOUNT _IOW('R', 13, unsigned long) #endif -- cgit v1.2.3