Annotation of 43BSDReno/sys/hpstand/fhpib.c, revision 1.1

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:  *     @(#)fhpib.c     7.1 (Berkeley) 5/8/90
        !            21:  */
        !            22: 
        !            23: /*
        !            24:  * 98625A/B HPIB driver
        !            25:  */
        !            26: 
        !            27: #include "param.h"
        !            28: #include "../hpdev/fhpibreg.h"
        !            29: #include "hpibvar.h"
        !            30: 
        !            31: fhpibinit(unit)
        !            32:        register int unit;
        !            33: {
        !            34:        register struct hpib_softc *hs = &hpib_softc[unit];
        !            35:        register struct fhpibdevice *hd = (struct fhpibdevice *)hs->sc_addr;
        !            36: 
        !            37:        if (hd->hpib_cid != HPIBC)
        !            38:                return(0);
        !            39:        hs->sc_type = HPIBC;
        !            40:        hs->sc_ba = HPIBC_BA;
        !            41:        fhpibreset(unit);
        !            42:        return(1);
        !            43: }
        !            44: 
        !            45: fhpibreset(unit)
        !            46: {
        !            47:        register struct hpib_softc *hs = &hpib_softc[unit];
        !            48:        register struct fhpibdevice *hd;
        !            49: 
        !            50:        hd = (struct fhpibdevice *)hs->sc_addr;
        !            51:        hd->hpib_cid = 0xFF;
        !            52:        DELAY(100);
        !            53:        hd->hpib_cmd = CT_8BIT;
        !            54:        hd->hpib_ar = AR_ARONC;
        !            55:        hd->hpib_cmd |= CT_IFC;
        !            56:        hd->hpib_cmd |= CT_INITFIFO;
        !            57:        DELAY(100);
        !            58:        hd->hpib_cmd &= ~CT_IFC;
        !            59:        hd->hpib_cmd |= CT_REN;
        !            60:        hd->hpib_stat = ST_ATN;
        !            61:        hd->hpib_data = C_DCL;
        !            62:        DELAY(100000);
        !            63: }
        !            64: 
        !            65: fhpibsend(unit, slave, sec, buf, cnt)
        !            66:        register char *buf;
        !            67:        register int cnt;
        !            68: {
        !            69:        register struct hpib_softc *hs = &hpib_softc[unit];
        !            70:        register struct fhpibdevice *hd;
        !            71:        int origcnt = cnt;
        !            72: 
        !            73:        hd = (struct fhpibdevice *)hs->sc_addr;
        !            74:        hd->hpib_stat = 0;
        !            75:        hd->hpib_imask = IM_IDLE | IM_ROOM;
        !            76:        fhpibwait(hd, IM_IDLE);
        !            77:        hd->hpib_stat = ST_ATN;
        !            78:        hd->hpib_data = C_UNL;
        !            79:        hd->hpib_data = C_TAG + hs->sc_ba;
        !            80:        hd->hpib_data = C_LAG + slave;
        !            81:        if (sec != -1)
        !            82:                hd->hpib_data = C_SCG + sec;
        !            83:        fhpibwait(hd, IM_IDLE);
        !            84:        hd->hpib_stat = ST_WRITE;
        !            85:        if (cnt) {
        !            86:                while (--cnt) {
        !            87:                        hd->hpib_data = *buf++;
        !            88:                        if (fhpibwait(hd, IM_ROOM) < 0)
        !            89:                                break;
        !            90:                }
        !            91:                hd->hpib_stat = ST_EOI;
        !            92:                hd->hpib_data = *buf;
        !            93:                if (fhpibwait(hd, IM_ROOM) < 0)
        !            94:                        cnt++;
        !            95:                hd->hpib_stat = ST_ATN;
        !            96:                /* XXX: HP-UX claims bug with CS80 transparent messages */
        !            97:                if (sec == 0x12)
        !            98:                        DELAY(150);
        !            99:                hd->hpib_data = C_UNL;
        !           100:                fhpibwait(hd, IM_IDLE);
        !           101:        }
        !           102:        hd->hpib_imask = 0;
        !           103:        return(origcnt - cnt);
        !           104: }
        !           105: 
        !           106: fhpibrecv(unit, slave, sec, buf, cnt)
        !           107:        register char *buf;
        !           108:        register int cnt;
        !           109: {
        !           110:        register struct hpib_softc *hs = &hpib_softc[unit];
        !           111:        register struct fhpibdevice *hd;
        !           112:        int origcnt = cnt;
        !           113: 
        !           114:        hd = (struct fhpibdevice *)hs->sc_addr;
        !           115:        hd->hpib_stat = 0;
        !           116:        hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE;
        !           117:        fhpibwait(hd, IM_IDLE);
        !           118:        hd->hpib_stat = ST_ATN;
        !           119:        hd->hpib_data = C_UNL;
        !           120:        hd->hpib_data = C_LAG + hs->sc_ba;
        !           121:        hd->hpib_data = C_TAG + slave;
        !           122:        if (sec != -1)
        !           123:                hd->hpib_data = C_SCG + sec;
        !           124:        fhpibwait(hd, IM_IDLE);
        !           125:        hd->hpib_stat = ST_READ0;
        !           126:        hd->hpib_data = 0;
        !           127:        if (cnt) {
        !           128:                while (--cnt >= 0) {
        !           129:                        if (fhpibwait(hd, IM_BYTE) < 0)
        !           130:                                break;
        !           131:                        *buf++ = hd->hpib_data;
        !           132:                }
        !           133:                cnt++;
        !           134:                fhpibwait(hd, IM_ROOM);
        !           135:                hd->hpib_stat = ST_ATN;
        !           136:                hd->hpib_data = (slave == 31) ? C_UNA : C_UNT;
        !           137:                fhpibwait(hd, IM_IDLE);
        !           138:        }
        !           139:        hd->hpib_imask = 0;
        !           140:        return(origcnt - cnt);
        !           141: }
        !           142: 
        !           143: fhpibppoll(unit)
        !           144:        register int unit;
        !           145: {
        !           146:        register struct hpib_softc *hs = &hpib_softc[unit];
        !           147:        register struct fhpibdevice *hd;
        !           148:        register int ppoll;
        !           149: 
        !           150:        hd = (struct fhpibdevice *)hs->sc_addr;
        !           151:        hd->hpib_stat = 0;
        !           152:        hd->hpib_psense = 0;
        !           153:        hd->hpib_pmask = 0xFF;
        !           154:        hd->hpib_imask = IM_PPRESP | IM_PABORT;
        !           155:        DELAY(25);
        !           156:        hd->hpib_intr = IM_PABORT;
        !           157:        ppoll = hd->hpib_data;
        !           158:        if (hd->hpib_intr & IM_PABORT)
        !           159:                ppoll = 0;
        !           160:        hd->hpib_imask = 0;
        !           161:        hd->hpib_pmask = 0;
        !           162:        hd->hpib_stat = ST_IENAB;
        !           163:        return(ppoll);
        !           164: }
        !           165: 
        !           166: fhpibwait(hd, x)
        !           167:        register struct fhpibdevice *hd;
        !           168: {
        !           169:        register int timo = 100000;
        !           170: 
        !           171:        while ((hd->hpib_intr & x) == 0 && --timo)
        !           172:                ;
        !           173:        if (timo == 0)
        !           174:                return(-1);
        !           175:        return(0);
        !           176: }

unix.superglobalmegacorp.com

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