|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.