1: #include "../h/param.h"
   2: #include "../h/conf.h"
   3: #include "../h/dir.h"
   4: #include "../h/user.h"
   5: #include "../h/tty.h"
   6: #include "../h/systm.h"
   7: 
   8: /*
   9:  * Base address of DC-11's. Minor device  i  is at
  10:  * DCADDR + 10*i.
  11:  */
  12: #define DCADDR  (struct device *)0174000
  13: 
  14: /*
  15:  * Number of DC's for which table space is allocated.
  16:  */
  17: #define NDC11   4
  18: 
  19: /*
  20:  * Control bits in device registers
  21:  */
  22: #define CDLEAD  01
  23: #define CARRIER 04
  24: #define SPEED1  010
  25: #define STOP1   0400
  26: #define RQSEND  01
  27: #define PARITY  040
  28: #define ERROR   0100000
  29: #define CTRANS  040000
  30: #define RINGIND 020000
  31: 
  32: 
  33: struct  tty dc11[NDC11];
  34: 
  35: struct device {
  36:     int dcrcsr;
  37:     int dcrbuf;
  38:     int dctcsr;
  39:     int dctbuf;
  40: };
  41: 
  42: /*
  43:  * Input-side speed and control bit table.
  44:  * Each DC11 has 4 speeds which correspond to the 4 non-zero entries.
  45:  * The table index is the same as the speed-selector
  46:  * number for the DH11.
  47:  * Attempts to set the speed to a zero entry are ignored.
  48:  */
  49: int dcrstab[] = {
  50:     0,      /* 0 baud */
  51:     0,      /* 50 baud */
  52:     0,      /* 75 baud */
  53:     0,      /* 110 baud */
  54:     01101,      /* 134.5 baud: 7b/ch, speed 0 */
  55:     0111,       /* 150 baud: 8b/ch, speed 1 */
  56:     0,      /* 200 baud */
  57:     0121,       /* 300 baud: 8b/ch, speed 2 */
  58:     0,      /* 600 baud */
  59:     0131,       /* 1200 baud */
  60:     0,      /* 1800 baud */
  61:     0,      /* 2400 baud */
  62:     0,      /* 4800 baud */
  63:     0,      /* 9600 baud */
  64:     0,      /* X0 */
  65:     0,      /* X1 */
  66: };
  67: 
  68: /*
  69:  * Transmitter speed table
  70:  */
  71: int dctstab[] = {
  72:     0,      /* 0 baud */
  73:     0,      /* 50 baud */
  74:     0,      /* 75 baud */
  75:     0,      /* 110 baud */
  76:     0501,       /* 134.5 baud: stop 1 */
  77:     0511,       /* 150 baud */
  78:     0,      /* 200 baud */
  79:     0521,       /* 300 baud */
  80:     0,      /* 600 baud */
  81:     0531,       /* 1200 baud */
  82:     0,      /* 1800 baud */
  83:     0,      /* 2400 baud */
  84:     0,      /* 4800 baud */
  85:     0,      /* 9600 baud */
  86:     0,      /* X0 */
  87:     0,      /* X1 */
  88: };
  89: 
  90: /*
  91:  * Open a DC11, waiting until carrier is established.
  92:  * Default initial conditions are set up on the first open.
  93:  * t_state's CARR_ON bit is a pure copy of the hardware
  94:  * CARRIER bit, and is only used to regularize
  95:  * carrier tests in general tty routines.
  96:  */
  97: dcopen(dev, flag)
  98: dev_t dev;
  99: {
 100:     register struct tty *tp;
 101:     register struct device *addr;
 102:     extern int klstart();
 103:     int s;
 104: 
 105:     if (minor(dev) >= NDC11) {
 106:         u.u_error = ENXIO;
 107:         return;
 108:     }
 109:     tp = &dc11[minor(dev)];
 110:     addr = DCADDR + minor(dev);
 111:     tp->t_addr = (caddr_t)addr;
 112:     tp->t_state |= WOPEN;
 113:     s = spl5();
 114:     addr->dcrcsr |= IENABLE|CDLEAD;
 115:     if ((tp->t_state&ISOPEN) == 0) {
 116:         tp->t_erase = CERASE;
 117:         tp->t_kill = CKILL;
 118:         addr->dcrcsr = IENABLE|CDLEAD|SPEED1;
 119:         addr->dctcsr = IENABLE|SPEED1|STOP1|RQSEND;
 120:         tp->t_state = ISOPEN | WOPEN;
 121:         tp->t_flags = ODDP|EVENP|ECHO;
 122:         tp->t_oproc = klstart;
 123:     }
 124:     if (addr->dcrcsr & CARRIER)
 125:         tp->t_state |= CARR_ON;
 126:     splx(s);
 127:     while ((tp->t_state & CARR_ON) == 0)
 128:         sleep((caddr_t)&tp->t_rawq, TTIPRI);
 129:     ttyopen(dev, tp);
 130: }
 131: 
 132: /*
 133:  * Close a dc11
 134:  */
 135: dcclose(dev)
 136: dev_t dev;
 137: {
 138:     register struct tty *tp;
 139: 
 140:     tp = &dc11[minor(dev)];
 141:     if (tp->t_state&HUPCLS)
 142:         ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD;
 143:     ttyclose(tp);
 144: }
 145: 
 146: /*
 147:  * Read a DC11
 148:  */
 149: dcread(dev)
 150: dev_t dev;
 151: {
 152:     ttread(&dc11[minor(dev)]);
 153: }
 154: 
 155: /*
 156:  * Write a DC11
 157:  */
 158: dcwrite(dev)
 159: dev_t dev;
 160: {
 161:     ttwrite(&dc11[minor(dev)]);
 162: }
 163: 
 164: /*
 165:  * DC11 transmitter interrupt.
 166:  */
 167: dcxint(dev)
 168: dev_t dev;
 169: {
 170:     register struct tty *tp;
 171: 
 172:     tp = &dc11[minor(dev)];
 173:     ttstart(tp);
 174:     if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT)
 175:         wakeup((caddr_t)&tp->t_outq);
 176: }
 177: 
 178: /*
 179:  * DC11 receiver interrupt.
 180:  */
 181: dcrint(dev)
 182: dev_t dev;
 183: {
 184:     register struct tty *tp;
 185:     register int c, csr;
 186: 
 187:     tp = &dc11[minor(dev)];
 188:     c = ((struct device *)(tp->t_addr))->dcrbuf;
 189:     /*
 190: 	 * If carrier is off, and an open is not in progress,
 191: 	 * knock down the CD lead to hang up the local dataset
 192: 	 * and signal a hangup.
 193: 	 */
 194:     if (((csr = ((struct device *)(tp->t_addr))->dcrcsr) & CARRIER) == 0) {
 195:         if ((tp->t_state&WOPEN) == 0) {
 196:             ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD;
 197:             if (tp->t_state & CARR_ON)
 198:                 signal(tp->t_pgrp, SIGHUP);
 199:             flushtty(tp);
 200:         }
 201:         tp->t_state &= ~CARR_ON;
 202:         return;
 203:     }
 204:     if (csr&ERROR || (tp->t_state&ISOPEN)==0) {
 205:         if (tp->t_state&WOPEN && csr&CARRIER)
 206:             tp->t_state |= CARR_ON;
 207:         wakeup((caddr_t)tp);
 208:         return;
 209:     }
 210:     csr &= PARITY;
 211:     if (csr&&(tp->t_flags&ODDP) || !csr&&(tp->t_flags&EVENP))
 212:         ttyinput(c, tp);
 213: }
 214: 
 215: /*
 216:  * DC11 stty/gtty.
 217:  * Perform general functions and set speeds.
 218:  */
 219: dcioctl(dev, cmd, addr, flag)
 220: dev_t dev;
 221: caddr_t addr;
 222: {
 223:     register struct tty *tp;
 224:     register r;
 225: 
 226:     tp = &dc11[minor(dev)];
 227:     if (ttioccom(cmd, &dc11[minor(dev)], addr, dev) == 0) {
 228:         u.u_error = ENOTTY;
 229:         return;
 230:     }
 231:     if (cmd == TIOCSETP) {
 232:         r = dcrstab[tp->t_ispeed];
 233:         if (r)
 234:             ((struct device *)(tp->t_addr))->dcrcsr = r;
 235:         else
 236:             ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD;
 237:         r = dctstab[tp->t_ospeed];
 238:         ((struct device *)(tp->t_addr))->dctcsr = r;
 239:     }
 240: }

Defined functions

dcclose defined in line 135; never used
dcioctl defined in line 219; never used
dcopen defined in line 97; never used
dcread defined in line 149; never used
dcrint defined in line 181; never used
dcwrite defined in line 158; never used
dcxint defined in line 167; never used

Defined variables

dc11 defined in line 33; used 8 times
dcrstab defined in line 49; used 1 times
dctstab defined in line 71; used 1 times

Defined struct's

device defined in line 35; used 16 times

Defined macros

CARRIER defined in line 23; used 3 times
CDLEAD defined in line 22; used 5 times
CTRANS defined in line 29; never used
DCADDR defined in line 12; used 1 times
ERROR defined in line 28; used 1 times
NDC11 defined in line 17; used 2 times
PARITY defined in line 27; used 1 times
RINGIND defined in line 30; never used
RQSEND defined in line 26; used 1 times
SPEED1 defined in line 24; used 2 times
STOP1 defined in line 25; used 1 times
Last modified: 1979-05-13
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 764
Valid CSS Valid XHTML 1.0 Strict