|
|
1.1 ! root 1: /* ! 2: * vtmm.c ! 3: * ! 4: * Memory Mapped Video ! 5: * High level output routines. ! 6: * ! 7: * $Log: vtmm.c,v $ ! 8: * Revision 2.3 93/08/09 13:47:17 bin ! 9: * Kernel 82 changes ! 10: * ! 11: * Revision 2.2 93/07/26 15:33:01 nigel ! 12: * Nigel's R80 ! 13: * ! 14: * Revision 1.2 92/07/16 16:35:31 hal ! 15: * Kernel #58 ! 16: * ! 17: * Revision 1.4 92/04/09 10:25:38 hal ! 18: * Call mmgo() from mmstart() at low priority. ! 19: * ! 20: */ ! 21: ! 22: #include <kernel/timeout.h> ! 23: ! 24: #include <sys/coherent.h> ! 25: #include <sys/sched.h> ! 26: #include <sys/errno.h> ! 27: #include <sys/stat.h> ! 28: #include <sys/io.h> ! 29: #include <sys/tty.h> ! 30: ! 31: #include <sys/kb.h> ! 32: #include <sys/vt.h> ! 33: ! 34: /* For beeper */ ! 35: #define TIMCTL 0x43 /* Timer control port */ ! 36: #define TIMCNT 0x42 /* Counter timer port */ ! 37: #define PORTB 0x61 /* Port containing speaker enable */ ! 38: #define FREQ ((int)(1193181L/440)) /* Counter for 440 Hz. tone */ ! 39: ! 40: int vtmmtime(); ! 41: ! 42: char vtmmbeeps; /* number of ticks remaining on bell */ ! 43: char vtmmesc; /* last unserviced escape character */ ! 44: int vtmmcrtsav = 1; /* crt saver enabled */ ! 45: int vtmmvcnt = 900; /* seconds remaining before crt saver is activated */ ! 46: ! 47: extern TTY **vttty; ! 48: ! 49: /* ! 50: * Start the output stream. ! 51: * Called from `ttwrite' and `isrint' routines. ! 52: */ ! 53: TIM vtmmtim; ! 54: ! 55: vtmmstart(tp) ! 56: register TTY *tp; ! 57: { ! 58: int c, s; ! 59: IO iob; ! 60: static int mmbegun; ! 61: ! 62: if (mmbegun == 0) { ! 63: ++mmbegun; ! 64: timeout(&vtmmtim, HZ/10, vtmmtime, (char *)tp); ! 65: } ! 66: ! 67: while ((tp->t_flags&T_STOP) == 0) { ! 68: if ((c = ttout(tp)) < 0) ! 69: break; ! 70: iob.io_seg = IOSYS; ! 71: iob.io_ioc = 1; ! 72: iob.io.vbase = &c; ! 73: iob.io_flag = 0; ! 74: #if 0 ! 75: vtmmwrite( ((VTDATA *)tp->t_ddp)->vt_dev, &iob ); ! 76: #else ! 77: s = splo(); ! 78: vtmmgo(&iob, tp->t_ddp, ((VTDATA *)(tp->t_ddp))->vt_ind); ! 79: spl(s); ! 80: #endif ! 81: } ! 82: } ! 83: ! 84: vtmmtime(xp) ! 85: char *xp; ! 86: { ! 87: register int s; ! 88: register VTDATA *vp = (VTDATA *)((TTY *)xp)->t_ddp; ! 89: ! 90: s = sphi(); ! 91: if (vtmmbeeps < 0) { ! 92: vtmmbeeps = 2; ! 93: outb(TIMCTL, 0xB6); /* Timer 2, lsb, msb, binary */ ! 94: outb(TIMCNT, FREQ&0xFF); ! 95: outb(TIMCNT, FREQ>>8); ! 96: outb(PORTB, inb(PORTB) | 03); /* Turn speaker on */ ! 97: } ! 98: else if ((vtmmbeeps > 0) && (--vtmmbeeps == 0)) ! 99: outb( PORTB, inb(PORTB) & ~03 ); ! 100: ! 101: if (vp->vmm_esc) { ! 102: ismmfunc(vp->vmm_esc); ! 103: vp->vmm_esc = 0; ! 104: } ! 105: spl(s); ! 106: ! 107: ttstart( (TTY *) xp ); ! 108: ! 109: timeout(&vtmmtim, HZ/10, vtmmtime, xp); ! 110: } ! 111: ! 112: /** ! 113: * ! 114: * void ! 115: * mmwatch() -- turn video display off after 15 minutes inactivity. ! 116: */ ! 117: void ! 118: vtmmwatch() ! 119: { ! 120: if ( (vtmmcrtsav > 0) && (vtmmvcnt > 0) && (--vtmmvcnt == 0) ) { ! 121: vtmm_voff(vtdata[vtactive]); ! 122: } ! 123: } ! 124: ! 125: vtmmwrite( dev, iop ) ! 126: dev_t dev; ! 127: register IO *iop; ! 128: { ! 129: int ioc; ! 130: register TTY *tp = vttty[vtindex(dev)]; ! 131: ! 132: if (!tp) { ! 133: printf( "mmwrite: bad dev %x", dev ); ! 134: } ! 135: /* ! 136: * Kernel writes. ! 137: */ ! 138: if (iop->io_seg == IOSYS) { ! 139: while (vtmmgo(iop, tp->t_ddp, vtindex(dev))) ! 140: ; ! 141: goto mmwdone; ! 142: } ! 143: ! 144: #if 0 ! 145: ioc = iop->io_ioc; ! 146: /* ! 147: * Blocking user writes. ! 148: */ ! 149: if ( (iop->io_flag & IONDLY) == 0 ) { ! 150: do { ! 151: while (tp->t_flags & T_STOP) { ! 152: register s = sphi(); ! 153: ! 154: tp->t_flags |= T_HILIM; ! 155: sleep((char*) &tp->t_oq, ! 156: CVTTOUT, IVTTOUT, SVTTOUT); ! 157: spl( s ); ! 158: } ! 159: /* ! 160: * Signal received. ! 161: */ ! 162: if (nondsig ()) { ! 163: kbunscroll(); /* update kbd LEDS */ ! 164: /* ! 165: * No data transferred yet. ! 166: */ ! 167: if ( ioc == iop->io_ioc ) ! 168: u.u_error = EINTR; ! 169: /* ! 170: * Transfer remaining data ! 171: * without pausing after scrolling. ! 172: */ ! 173: else while ( vtmmgo(iop, tp->t_ddp, vtindex(dev))) ! 174: ; ! 175: goto mmwdone; ! 176: } ! 177: vtmmgo(iop, tp->t_ddp, vtindex(dev)); ! 178: } while ( iop->io_ioc ); ! 179: goto mmwdone; ! 180: } ! 181: ! 182: /* ! 183: * Non-blocking user writes with output stopped. ! 184: */ ! 185: if ( tp->t_flags & T_STOP ) { ! 186: u.u_error = EAGAIN; ! 187: goto mmwdone; ! 188: } ! 189: ! 190: /* ! 191: * Non-blocking user writes do not pause after scrolling. ! 192: */ ! 193: { ! 194: while ( vtmmgo(iop, tp->t_ddp, vtindex(dev)) ) ! 195: ; ! 196: } ! 197: #else ! 198: ttwrite(tp, iop); ! 199: #endif ! 200: mmwdone: ! 201: return; ! 202: } ! 203: ! 204: /****************************************************************************** ! 205: * ! 206: * The following routines are called by deferred isr's, i.e., no sleep() calls ! 207: * allowed ! 208: * ! 209: *******************************************************************************/ ! 210: ! 211: /* ! 212: * update the screen to match vtactive ! 213: */ ! 214: vtupdscreen(index) ! 215: int index; ! 216: { ! 217: register int pos, s; ! 218: VTDATA *vp; ! 219: ! 220: vp = vtdata[index]; ! 221: pos = vp->vmm_voff; ! 222: PRINTV( "update screen@%x {%d @%x|", ! 223: vp->vmm_port, index, pos ); ! 224: ! 225: s = sphi(); ! 226: /* update base of video memory */ ! 227: outb(vp->vmm_port, 0xC); ! 228: outb(vp->vmm_port+1, pos >> (8 + 1) ); ! 229: outb(vp->vmm_port, 0xD); ! 230: outb(vp->vmm_port+1, pos >> (0 + 1) ); ! 231: ! 232: /* update the cursor */ ! 233: pos += vp->vmm_pos; ! 234: ! 235: pos |= vp->vmm_invis; /* Mask cursor, if set */ ! 236: outb(vp->vmm_port, 0xE); ! 237: outb(vp->vmm_port+1, pos >> (8 + 1) ); ! 238: outb(vp->vmm_port, 0xF); ! 239: outb(vp->vmm_port+1, pos >> (0 + 1) ); ! 240: ! 241: spl(s); ! 242: PRINTV( "%x}\n", pos ); ! 243: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.