Annotation of 42BSD/sys/vaxuba/ad.c, revision 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.