|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)ppi.c 7.1 (Berkeley) 5/8/90
21: */
22:
23: /*
24: * Printer/Plotter HPIB interface
25: */
26:
27: #include "ppi.h"
28: #if NPPI > 0
29:
30: #include "param.h"
31: #include "errno.h"
32: #include "uio.h"
33: #include "malloc.h"
34:
35: #include "device.h"
36:
37: int ppiattach(), ppistart();
38: struct driver ppidriver = {
39: ppiattach, "ppi", ppistart,
40: };
41:
42: struct ppi_softc {
43: int sc_flags;
44: struct devqueue sc_dq;
45: struct hp_device *sc_hd;
46: } ppi_softc[NPPI];
47:
48: /* sc_flags values */
49: #define PPIF_ALIVE 0x1
50: #define PPIF_OPEN 0x2
51:
52: #define UNIT(x) minor(x)
53:
54: ppiattach(hd)
55: register struct hp_device *hd;
56: {
57: register struct ppi_softc *sc = &ppi_softc[hd->hp_unit];
58:
59: /*
60: * XXX: the printer/plotter doesn't seem to really return
61: * an ID but this will at least prevent us from mistaking
62: * a cs80 disk or tape for a ppi device.
63: */
64: if (hpibid(hd->hp_ctlr, hd->hp_slave) & 0x200)
65: return(0);
66: sc->sc_flags = PPIF_ALIVE;
67: sc->sc_dq.dq_ctlr = hd->hp_ctlr;
68: sc->sc_dq.dq_unit = hd->hp_unit;
69: sc->sc_dq.dq_slave = hd->hp_slave;
70: sc->sc_dq.dq_driver = &ppidriver;
71: sc->sc_hd = hd;
72: return(1);
73: }
74:
75: ppiopen(dev, flags)
76: dev_t dev;
77: {
78: register int unit = UNIT(dev);
79: register struct ppi_softc *sc = &ppi_softc[unit];
80:
81: if (unit >= NPPI || (sc->sc_flags & PPIF_ALIVE) == 0)
82: return(ENXIO);
83: if (sc->sc_flags & PPIF_OPEN)
84: return(EBUSY);
85: sc->sc_flags |= PPIF_OPEN;
86: return(0);
87: }
88:
89: ppiclose(dev, flags)
90: dev_t dev;
91: {
92: register int unit = UNIT(dev);
93: register struct ppi_softc *sc = &ppi_softc[unit];
94:
95: sc->sc_flags &= ~PPIF_OPEN;
96: return(0);
97: }
98:
99: ppistart(unit)
100: register int unit;
101: {
102: wakeup(&ppi_softc[unit]);
103: }
104:
105: ppiread(dev, uio)
106: dev_t dev;
107: struct uio *uio;
108: {
109:
110: return (ppirw(dev, uio, UIO_READ));
111: }
112:
113: ppiwrite(dev, uio)
114: dev_t dev;
115: struct uio *uio;
116: {
117:
118: return (ppirw(dev, uio, UIO_WRITE));
119: }
120:
121: ppirw(dev, uio, rw)
122: dev_t dev;
123: register struct uio *uio;
124: enum uio_rw rw;
125: {
126: register struct ppi_softc *sc = &ppi_softc[UNIT(dev)];
127: register int s, len, cnt;
128: register char *cp;
129: int error = 0;
130:
131: len = MIN(CLBYTES, uio->uio_resid);
132: cp = (char *)malloc(len, M_TEMP, M_WAITOK);
133: while (uio->uio_resid > 0) {
134: len = MIN(CLBYTES, uio->uio_resid);
135: if (rw == UIO_WRITE) {
136: error = uiomove(cp, len, uio);
137: if (error)
138: break;
139: }
140: s = splbio();
141: if (hpibreq(&sc->sc_dq) == 0)
142: sleep(sc, PRIBIO + 1);
143: splx(s);
144: if (rw == UIO_WRITE)
145: cnt = hpibsend(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
146: -1, cp, len);
147: else
148: cnt = hpibrecv(sc->sc_hd->hp_ctlr, sc->sc_hd->hp_slave,
149: -1, cp, len);
150: s = splbio();
151: hpibfree(&sc->sc_dq);
152: splx(s);
153: if (rw == UIO_READ) {
154: error = uiomove(cp, cnt, uio);
155: if (error)
156: break;
157: }
158: if (cnt != len) {
159: if (rw == UIO_WRITE)
160: uio->uio_resid += len - cnt;
161: break;
162: }
163: }
164: free(cp, M_TEMP);
165: return (error);
166: }
167: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.