Annotation of 43BSD/sys/vaxuba/ad.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)ad.c        7.1 (Berkeley) 6/5/86
                      7:  */
                      8: 
                      9: #include "ad.h"
                     10: #if NAD > 0
                     11: /*
                     12:  * Data translation AD converter interface -- Bill Reeves
                     13:  */
                     14: #include "../machine/pte.h"
                     15: 
                     16: #include "param.h"
                     17: #include "dir.h"
                     18: #include "user.h"
                     19: #include "buf.h"
                     20: #include "systm.h"
                     21: #include "map.h"
                     22: 
                     23: #include "ubareg.h"
                     24: #include "ubavar.h"
                     25: #include "adreg.h"
                     26: 
                     27: #define ADBUSY 01
                     28: #define ADWAITPRI (PZERO+1)
                     29: 
                     30: int adprobe(), adattach();
                     31: struct uba_device *addinfo[NAD];
                     32: u_short adstd[] = { 0770400, 0000000, 0 };
                     33: struct uba_driver addriver =
                     34:        { adprobe, 0, adattach, 0, adstd, "ad", addinfo, 0, 0 };
                     35: 
                     36: struct ad {
                     37:        char    ad_open;
                     38:        short int ad_uid;
                     39:        short int ad_state;
                     40:        short int ad_softcsr;
                     41:        short int ad_softdata;
                     42:        short int ad_chan;
                     43:        int     ad_icnt;
                     44:        int     ad_loop;
                     45: } ad[NAD];
                     46: 
                     47: #define ADUNIT(dev) (minor(dev))
                     48: 
                     49: adprobe(reg)
                     50:        caddr_t reg;
                     51: {
                     52:        register int br, cvec;          /* value-result */
                     53:        register struct addevice *adaddr = (struct addevice *) reg;
                     54: 
                     55:        adaddr->ad_csr = AD_IENABLE | AD_START;
                     56:        DELAY(40000);
                     57:        adaddr->ad_csr = 0;
                     58:        return (sizeof (struct addevice));
                     59: }
                     60: 
                     61: /*ARGSUSED*/
                     62: adattach(ui)
                     63:        struct uba_device *ui;
                     64: {
                     65: 
                     66: }
                     67: 
                     68: adopen(dev)
                     69:        dev_t dev;
                     70: {
                     71:        register struct ad *adp;
                     72:        register struct uba_device *ui;
                     73: 
                     74:        if (ADUNIT(dev) >= NAD || (adp = &ad[ADUNIT(dev)])->ad_open ||
                     75:            (ui = addinfo[ADUNIT(dev)]) == 0 || ui->ui_alive == 0)
                     76:                return (ENXIO);
                     77:        adp->ad_open = 1;
                     78:        adp->ad_icnt = 0;
                     79:        adp->ad_state = 0;
                     80:        adp->ad_uid = u.u_uid;
                     81:        return (0);
                     82: }
                     83: 
                     84: adclose(dev)
                     85:        dev_t dev;
                     86: {
                     87: 
                     88:        ad[ADUNIT(dev)].ad_open = 0;
                     89:        ad[ADUNIT(dev)].ad_state = 0;
                     90: }
                     91: 
                     92: /*ARGSUSED*/
                     93: adioctl(dev, cmd, addr, flag)
                     94:        dev_t dev;
                     95:        register caddr_t addr;
                     96: {
                     97:        register struct addevice *adaddr =
                     98:            (struct addevice *) addinfo[ADUNIT(dev)]->ui_addr;
                     99:        register struct uba_device *ui = addinfo[ADUNIT(dev)];
                    100:        register struct ad *adp;
                    101:        register int i;
                    102:        short int chan;
                    103: 
                    104:        switch (cmd) {
                    105: 
                    106:        case ADIOSCHAN:
                    107:                adp = &ad[ADUNIT(dev)];
                    108:                adp->ad_chan = (*(int *)data)<<8;
                    109:                break;
                    110: 
                    111:        case ADIOGETW:
                    112:                adp = &ad[ADUNIT(dev)];
                    113:                spl6();
                    114:                adaddr->ad_csr = adp->ad_chan;
                    115:                i = 1000;
                    116:                while (i-- > 0 && (adaddr->ad_csr&037400) != adp->ad_chan) {
                    117:                        adp->ad_loop++;
                    118:                        adaddr->ad_csr = adp->ad_chan;
                    119:                }
                    120:                adp->ad_state |= ADBUSY;
                    121:                adaddr->ad_csr |= AD_IENABLE|AD_START;
                    122:                while (adp->ad_state&ADBUSY)
                    123:                        sleep((caddr_t)adp, ADWAITPRI);
                    124:                spl0();
                    125:                *(int *)data = adp->ad_softdata;
                    126:                break;
                    127: 
                    128:        default:
                    129:                return (ENOTTY);        /* Not a legal ioctl cmd. */
                    130:        }
                    131:        return (0);
                    132: }
                    133: 
                    134: /*ARGSUSED*/
                    135: adintr(dev)
                    136:        dev_t dev;
                    137: {
                    138:        register struct addevice *adaddr =
                    139:                        (struct addevice *) addinfo[ADUNIT(dev)]->ui_addr;
                    140:        register struct ad *adp = &ad[ADUNIT(dev)];
                    141: 
                    142:        adp->ad_icnt++;
                    143:        adp->ad_softcsr = adaddr->ad_csr;
                    144:        adp->ad_softdata = adaddr->ad_data;
                    145:        if(adp->ad_state&ADBUSY) {
                    146:                adp->ad_state &= ~ADBUSY;
                    147:                wakeup((caddr_t)adp);
                    148:        }
                    149: }
                    150: 
                    151: adreset(uban)
                    152:        int uban;
                    153: {
                    154:        register int i;
                    155:        register struct uba_device *ui;
                    156:        register struct ad *adp = ad;
                    157:        register struct addevice *adaddr;
                    158: 
                    159:        for(i = 0; i < NAD; i++, adp++) {
                    160:                if((ui = addinfo[i]) == 0 || ui->ui_alive == 0 ||
                    161:                                ui->ui_ubanum != uban || adp->ad_open == 0)
                    162:                        continue;
                    163:                printf(" ad%d", i);
                    164:                if(adp->ad_state&ADBUSY == 0)
                    165:                        continue;
                    166:                adaddr = (struct addevice *) ui->ui_addr;
                    167:                adaddr->ad_csr = 0;
                    168:                adaddr->ad_csr = adp->ad_chan|AD_IENABLE|AD_START;
                    169:        }
                    170: }
                    171: #endif

unix.superglobalmegacorp.com

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