summaryrefslogtreecommitdiff
path: root/2003/i/buzz
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz')
-rw-r--r--2003/i/buzz/src/kernel/pbus.c39
-rw-r--r--2003/i/buzz/src/kernel/pbus.h1
2 files changed, 19 insertions, 21 deletions
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