Annotation of 43BSDReno/sys/hpstand/fhpib.c, revision 1.1.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.