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

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

unix.superglobalmegacorp.com

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