|
|
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.7 (Berkeley) 4/3/90 ! 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 "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: return (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: i = 0; ! 124: while (adp->ad_state&ADBUSY) ! 125: if (i = tsleep((caddr_t)adp, ADWAITPRI | PCATCH, ! 126: devio, 0) ! 127: break; ! 128: spl0(); ! 129: if (i) ! 130: return (i); ! 131: *(int *)addr = adp->ad_softdata; ! 132: break; ! 133: ! 134: default: ! 135: return (ENOTTY); /* Not a legal ioctl cmd. */ ! 136: } ! 137: return (0); ! 138: } ! 139: ! 140: /*ARGSUSED*/ ! 141: adintr(dev) ! 142: dev_t dev; ! 143: { ! 144: register struct addevice *adaddr = ! 145: (struct addevice *) addinfo[ADUNIT(dev)]->ui_addr; ! 146: register struct ad *adp = &ad[ADUNIT(dev)]; ! 147: ! 148: adp->ad_icnt++; ! 149: adp->ad_softcsr = adaddr->ad_csr; ! 150: adp->ad_softdata = adaddr->ad_data; ! 151: if(adp->ad_state&ADBUSY) { ! 152: adp->ad_state &= ~ADBUSY; ! 153: wakeup((caddr_t)adp); ! 154: } ! 155: } ! 156: ! 157: adreset(uban) ! 158: int uban; ! 159: { ! 160: register int i; ! 161: register struct uba_device *ui; ! 162: register struct ad *adp = ad; ! 163: register struct addevice *adaddr; ! 164: ! 165: for(i = 0; i < NAD; i++, adp++) { ! 166: if((ui = addinfo[i]) == 0 || ui->ui_alive == 0 || ! 167: ui->ui_ubanum != uban || adp->ad_open == 0) ! 168: continue; ! 169: printf(" ad%d", i); ! 170: if(adp->ad_state&ADBUSY == 0) ! 171: continue; ! 172: adaddr = (struct addevice *) ui->ui_addr; ! 173: adaddr->ad_csr = 0; ! 174: adaddr->ad_csr = adp->ad_chan|AD_IENABLE|AD_START; ! 175: } ! 176: } ! 177: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.