|
|
1.1 ! root 1: /* cons.c 6.1 83/07/29 */ ! 2: ! 3: /* ! 4: * VAX console driver (and floppy interface) ! 5: */ ! 6: #include "../h/param.h" ! 7: #include "../h/conf.h" ! 8: #include "../h/dir.h" ! 9: #include "../h/user.h" ! 10: #include "../h/proc.h" ! 11: #include "../h/ioctl.h" ! 12: #include "../h/tty.h" ! 13: #include "../h/systm.h" ! 14: #include "../h/uio.h" ! 15: ! 16: #include "../vax/cpu.h" ! 17: #include "../vax/cons.h" ! 18: #include "../vax/mtpr.h" ! 19: ! 20: struct tty cons; ! 21: int cnstart(); ! 22: int ttrstrt(); ! 23: char partab[]; ! 24: ! 25: /*ARGSUSED*/ ! 26: cnopen(dev, flag) ! 27: dev_t dev; ! 28: { ! 29: register struct tty *tp = &cons; ! 30: ! 31: tp->t_oproc = cnstart; ! 32: if ((tp->t_state&TS_ISOPEN) == 0) { ! 33: ttychars(tp); ! 34: tp->t_state = TS_ISOPEN|TS_CARR_ON; ! 35: tp->t_flags = EVENP|ECHO|XTABS|CRMOD; ! 36: } ! 37: if (tp->t_state&TS_XCLUDE && u.u_uid != 0) ! 38: return (EBUSY); ! 39: mtpr(RXCS, mfpr(RXCS)|RXCS_IE); ! 40: mtpr(TXCS, mfpr(TXCS)|TXCS_IE); ! 41: return ((*linesw[tp->t_line].l_open)(dev, tp)); ! 42: } ! 43: ! 44: /*ARGSUSED*/ ! 45: cnclose(dev) ! 46: dev_t dev; ! 47: { ! 48: register struct tty *tp = &cons; ! 49: ! 50: (*linesw[tp->t_line].l_close)(tp); ! 51: ttyclose(tp); ! 52: } ! 53: ! 54: /*ARGSUSED*/ ! 55: cnread(dev, uio) ! 56: dev_t dev; ! 57: struct uio *uio; ! 58: { ! 59: register struct tty *tp = &cons; ! 60: ! 61: return ((*linesw[tp->t_line].l_read)(tp, uio)); ! 62: } ! 63: ! 64: /*ARGSUSED*/ ! 65: cnwrite(dev, uio) ! 66: dev_t dev; ! 67: struct uio *uio; ! 68: { ! 69: register struct tty *tp = &cons; ! 70: ! 71: return ((*linesw[tp->t_line].l_write)(tp, uio)); ! 72: } ! 73: ! 74: /* ! 75: * Got a level-20 receive interrupt - ! 76: * the LSI wants to give us a character. ! 77: * Catch the character, and see who it goes to. ! 78: */ ! 79: /*ARGSUSED*/ ! 80: cnrint(dev) ! 81: dev_t dev; ! 82: { ! 83: register int c; ! 84: register struct tty *tp; ! 85: ! 86: c = mfpr(RXDB); ! 87: if (c&RXDB_ID) { ! 88: #if VAX780 ! 89: if (cpu == VAX_780) ! 90: cnrfl(c); ! 91: #endif ! 92: return; ! 93: } ! 94: tp = &cons; ! 95: (*linesw[tp->t_line].l_rint)(c, tp); ! 96: } ! 97: ! 98: /*ARGSUSED*/ ! 99: cnioctl(dev, cmd, addr, flag) ! 100: dev_t dev; ! 101: caddr_t addr; ! 102: { ! 103: register struct tty *tp = &cons; ! 104: int error; ! 105: ! 106: error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, addr); ! 107: if (error >= 0) ! 108: return (error); ! 109: error = ttioctl(tp, cmd, addr, flag); ! 110: if (error < 0) ! 111: error = ENOTTY; ! 112: return (error); ! 113: } ! 114: ! 115: int consdone = 1; ! 116: /* ! 117: * Got a level-20 transmission interrupt - ! 118: * the LSI wants another character. First, ! 119: * see if we can send something to the typewriter. ! 120: * If not, try the floppy. ! 121: */ ! 122: /*ARGSUSED*/ ! 123: cnxint(dev) ! 124: dev_t dev; ! 125: { ! 126: register struct tty *tp = &cons; ! 127: ! 128: consdone++; ! 129: tp->t_state &= ~TS_BUSY; ! 130: if (tp->t_line) ! 131: (*linesw[tp->t_line].l_start)(tp); ! 132: else ! 133: cnstart(tp); ! 134: #if VAX780 ! 135: if (cpu==VAX_780 && (tp->t_state & TS_BUSY) == 0) ! 136: conxfl(); ! 137: #endif ! 138: } ! 139: ! 140: cnstart(tp) ! 141: register struct tty *tp; ! 142: { ! 143: register int c, s; ! 144: ! 145: s = spl5(); ! 146: if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) ! 147: goto out; ! 148: if (tp->t_outq.c_cc <= TTLOWAT(tp)) { ! 149: if (tp->t_state&TS_ASLEEP) { ! 150: tp->t_state &= ~TS_ASLEEP; ! 151: wakeup((caddr_t)&tp->t_outq); ! 152: } ! 153: if (tp->t_wsel) { ! 154: selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); ! 155: tp->t_wsel = 0; ! 156: tp->t_state &= ~TS_WCOLL; ! 157: } ! 158: } ! 159: if (tp->t_outq.c_cc == 0) ! 160: goto out; ! 161: if (consdone == 0) ! 162: return; ! 163: c = getc(&tp->t_outq); ! 164: if (tp->t_flags&(RAW|LITOUT)) ! 165: mtpr(TXDB, c&0xff); ! 166: else if (c <= 0177) ! 167: mtpr(TXDB, (c | (partab[c]&0200))&0xff); ! 168: else { ! 169: timeout(ttrstrt, (caddr_t)tp, (c&0177)); ! 170: tp->t_state |= TS_TIMEOUT; ! 171: goto out; ! 172: } ! 173: consdone = 0; ! 174: tp->t_state |= TS_BUSY; ! 175: out: ! 176: splx(s); ! 177: } ! 178: ! 179: /* ! 180: * Print a character on console. ! 181: * Attempts to save and restore device ! 182: * status. ! 183: */ ! 184: cnputc(c) ! 185: register int c; ! 186: { ! 187: register int s, timo; ! 188: ! 189: timo = 30000; ! 190: /* ! 191: * Try waiting for the console tty to come ready, ! 192: * otherwise give up after a reasonable time. ! 193: */ ! 194: while ((mfpr(TXCS)&TXCS_RDY) == 0) ! 195: if(--timo == 0) ! 196: break; ! 197: if (c == 0) ! 198: return; ! 199: s = mfpr(TXCS); ! 200: mtpr(TXCS, 0); ! 201: mtpr(TXDB, c&0xff); ! 202: if (c == '\n') ! 203: cnputc('\r'); ! 204: cnputc(0); ! 205: mtpr(TXCS, s); ! 206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.