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

unix.superglobalmegacorp.com

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