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

Defined functions

dcclose defined in line 138; never used
dcopen defined in line 103; never used
dcread defined in line 151; never used
dcrint defined in line 179; never used
dcsgtty defined in line 216; never used
dcwrite defined in line 159; never used
dcxint defined in line 167; never used

Defined variables

dc11 defined in line 39; used 7 times
dcrstab defined in line 55; used 1 times
dctstab defined in line 77; used 1 times

Defined struct's

dcregs defined in line 41; never used

Defined macros

CARRIER defined in line 29; used 3 times
CDLEAD defined in line 28; used 5 times
CTRANS defined in line 35; never used
DCADDR defined in line 18; used 1 times
ERROR defined in line 34; used 1 times
NDC11 defined in line 23; used 2 times
PARITY defined in line 33; used 1 times
RINGIND defined in line 36; never used
RQSEND defined in line 32; used 1 times
SPEED1 defined in line 30; used 2 times
STOP1 defined in line 31; used 1 times
Last modified: 1975-07-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 988
Valid CSS Valid XHTML 1.0 Strict