Annotation of 40BSD/sys/dev/vp.c, revision 1.1

1.1     ! root        1: /*     vp.c    4.1     11/9/80 */
        !             2: 
        !             3: #include "../conf/vp.h"
        !             4: #if NVP > 0
        !             5: /*
        !             6:  * Versatec matrix printer/plotter
        !             7:  * dma interface driver
        !             8:  */
        !             9: #include "../h/param.h"
        !            10: #include "../h/dir.h"
        !            11: #include "../h/user.h"
        !            12: #include "../h/buf.h"
        !            13: #include "../h/systm.h"
        !            14: #include "../h/map.h"
        !            15: #include "../h/pte.h"
        !            16: #include "../h/uba.h"
        !            17: 
        !            18: int    vpbdp = 1;
        !            19: 
        !            20: unsigned minvpph();
        !            21: 
        !            22: #define        VPPRI   (PZERO-1)
        !            23: 
        !            24: struct vpregs {
        !            25:        short   plbcr;
        !            26:        short   fill;
        !            27:        short   prbcr;
        !            28:        unsigned short pbaddr;
        !            29:        short   plcsr;
        !            30:        short   plbuf;
        !            31:        short   prcsr;
        !            32:        unsigned short prbuf;
        !            33: };
        !            34: 
        !            35: #define        ERROR   0100000
        !            36: #define        DTCINTR 040000
        !            37: #define        DMAACT  020000
        !            38: #define        READY   0200
        !            39: #define        IENABLE 0100
        !            40: #define        TERMCOM 040
        !            41: #define        FFCOM   020
        !            42: #define        EOTCOM  010
        !            43: #define        CLRCOM  04
        !            44: #define        RESET   02
        !            45: #define        SPP     01
        !            46: 
        !            47: struct {
        !            48:        int     vp_state;
        !            49:        int     vp_count;
        !            50:        int     vp_bufp;
        !            51:        struct  buf *vp_bp;
        !            52: } vp11;
        !            53: int    vp_ubinfo;
        !            54: 
        !            55: struct buf rvpbuf;
        !            56: 
        !            57: #define        VISOPEN 01
        !            58: #define        CMNDS   076
        !            59: #define        MODE    0700
        !            60: #define        PRINT   0100
        !            61: #define        PLOT    0200
        !            62: #define        PPLOT   0400
        !            63: #define        VBUSY   01000
        !            64: 
        !            65: vpopen()
        !            66: {
        !            67: 
        !            68:        if (vp11.vp_state & VISOPEN) {
        !            69:                u.u_error = ENXIO;
        !            70:                return;
        !            71:        }
        !            72:        vp11.vp_state = VISOPEN | PRINT | CLRCOM | RESET;
        !            73:        vp11.vp_count = 0;
        !            74:        VPADDR->prcsr = IENABLE | DTCINTR;
        !            75:        vptimo();
        !            76:        while (vp11.vp_state & CMNDS) {
        !            77:                (void) spl4();
        !            78:                if (vperror(READY)) {
        !            79:                        vpclose();
        !            80:                        u.u_error = EIO;
        !            81:                        return;
        !            82:                }
        !            83:                vpstart();
        !            84:                (void) spl0();
        !            85:        }
        !            86: }
        !            87: 
        !            88: vpstrategy(bp)
        !            89:        register struct buf *bp;
        !            90: {
        !            91:        register int e;
        !            92: 
        !            93:        (void) spl4();
        !            94:        while (vp11.vp_state & VBUSY)
        !            95:                sleep((caddr_t)&vp11, VPPRI);
        !            96:        vp11.vp_state |= VBUSY;
        !            97:        vp11.vp_bp = bp;
        !            98:        vp_ubinfo = ubasetup(bp, vpbdp);
        !            99:        vp11.vp_bufp = vp_ubinfo & 0x3ffff;
        !           100:        if (e = vperror(READY))
        !           101:                goto brkout;
        !           102:        vp11.vp_count = bp->b_bcount;
        !           103:        vpstart();
        !           104:        while ((vp11.vp_state&PLOT ? VPADDR->plcsr : VPADDR->prcsr) & DMAACT)
        !           105:                sleep((caddr_t)&vp11, VPPRI);
        !           106:        vp11.vp_count = 0;
        !           107:        vp11.vp_bufp = 0;
        !           108:        if ((vp11.vp_state&MODE) == PPLOT)
        !           109:                vp11.vp_state = (vp11.vp_state &~ MODE) | PLOT;
        !           110:        (void) spl0();
        !           111: brkout:
        !           112:        ubafree(vp_ubinfo), vp_ubinfo = 0;
        !           113:        vp11.vp_state &= ~VBUSY;
        !           114:        vp11.vp_bp = 0;
        !           115:        iodone(bp);
        !           116:        if (e)
        !           117:                u.u_error = EIO;
        !           118:        wakeup((caddr_t)&vp11);
        !           119: }
        !           120: 
        !           121: int    vpblock = 16384;
        !           122: 
        !           123: unsigned
        !           124: minvpph(bp)
        !           125: struct buf *bp;
        !           126: {
        !           127: 
        !           128:        if (bp->b_bcount > vpblock)
        !           129:                bp->b_bcount = vpblock;
        !           130: }
        !           131: 
        !           132: /*ARGSUSED*/
        !           133: vpwrite(dev)
        !           134: {
        !           135: 
        !           136:        physio(vpstrategy, &rvpbuf, dev, B_WRITE, minvpph);
        !           137: }
        !           138: 
        !           139: vperror(bit)
        !           140: {
        !           141:        register int state, e;
        !           142: 
        !           143:        state = vp11.vp_state & PLOT;
        !           144:        while ((e = (state ? VPADDR->plcsr : VPADDR->prcsr) & (bit|ERROR)) == 0)
        !           145:                sleep((caddr_t)&vp11, VPPRI);
        !           146:        return (e & ERROR);
        !           147: }
        !           148: 
        !           149: vpstart()
        !           150: {
        !           151:        register short bit;
        !           152: 
        !           153:        if (vp11.vp_count) {
        !           154:                VPADDR->pbaddr = vp11.vp_bufp;
        !           155:                if (vp11.vp_state & (PRINT|PPLOT))
        !           156:                        VPADDR->prbcr = vp11.vp_count;
        !           157:                else
        !           158:                        VPADDR->plbcr = vp11.vp_count;
        !           159:                return;
        !           160:        }
        !           161:        for (bit = 1; bit != 0; bit <<= 1)
        !           162:                if (vp11.vp_state&bit&CMNDS) {
        !           163:                        VPADDR->plcsr |= bit;
        !           164:                        vp11.vp_state &= ~bit;
        !           165:                        return;
        !           166:                }
        !           167: }
        !           168: 
        !           169: /*ARGSUSED*/
        !           170: vpioctl(dev, cmd, addr, flag)
        !           171:        register caddr_t addr;
        !           172: {
        !           173:        register int m;
        !           174: 
        !           175:        switch (cmd) {
        !           176: 
        !           177:        case ('v'<<8)+0:
        !           178:                (void) suword(addr, vp11.vp_state);
        !           179:                return;
        !           180: 
        !           181:        case ('v'<<8)+1:
        !           182:                m = fuword(addr);
        !           183:                if (m == -1) {
        !           184:                        u.u_error = EFAULT;
        !           185:                        return;
        !           186:                }
        !           187:                vp11.vp_state = (vp11.vp_state & ~MODE) | (m&(MODE|CMNDS));
        !           188:                break;
        !           189: 
        !           190:        default:
        !           191:                u.u_error = ENOTTY;
        !           192:                return;
        !           193:        }
        !           194:        (void) spl4();
        !           195:        (void) vperror(READY);
        !           196:        if (vp11.vp_state&PPLOT)
        !           197:                VPADDR->plcsr |= SPP;
        !           198:        else
        !           199:                VPADDR->plcsr &= ~SPP;
        !           200:        vp11.vp_count = 0;
        !           201:        while (CMNDS & vp11.vp_state) {
        !           202:                (void) vperror(READY);
        !           203:                vpstart();
        !           204:        }
        !           205:        (void) spl0();
        !           206: }
        !           207: 
        !           208: vptimo()
        !           209: {
        !           210: 
        !           211:        if (vp11.vp_state&VISOPEN)
        !           212:                timeout(vptimo, (caddr_t)0, HZ/10);
        !           213:        vpintr(0);
        !           214: }
        !           215: 
        !           216: /*ARGSUSED*/
        !           217: vpintr(dev)
        !           218: {
        !           219: 
        !           220:        wakeup((caddr_t)&vp11);
        !           221: }
        !           222: 
        !           223: vpclose()
        !           224: {
        !           225: 
        !           226:        vp11.vp_state = 0;
        !           227:        vp11.vp_count = 0;
        !           228:        vp11.vp_bufp = 0;
        !           229:        VPADDR->plcsr = 0;
        !           230: }
        !           231: 
        !           232: vpreset()
        !           233: {
        !           234: 
        !           235:        if ((vp11.vp_state & VISOPEN) == 0)
        !           236:                return;
        !           237:        printf(" vp");
        !           238:        VPADDR->prcsr = IENABLE | DTCINTR;
        !           239:        if ((vp11.vp_state & VBUSY) == 0)
        !           240:                return;
        !           241:        if (vp_ubinfo) {
        !           242:                printf("<%d>", (vp_ubinfo>>28)&0xf);
        !           243:                ubafree(vp_ubinfo), vp_ubinfo = 0;
        !           244:        }
        !           245:        vp11.vp_bufp = vp_ubinfo & 0x3ffff;
        !           246:        vp11.vp_count = vp11.vp_bp->b_bcount;
        !           247:        vpstart();
        !           248: }
        !           249: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.