1*53984Sfujita /* 2*53984Sfujita * Copyright (c) 1988 University of Utah. 3*53984Sfujita * Copyright (c) 1992 OMRON Corporation. 4*53984Sfujita * Copyright (c) 1990, 1992 The Regents of the University of California. 5*53984Sfujita * All rights reserved. 6*53984Sfujita * 7*53984Sfujita * This code is derived from software contributed to Berkeley by 8*53984Sfujita * the Systems Programming Group of the University of Utah Computer 9*53984Sfujita * Science Department. 10*53984Sfujita * 11*53984Sfujita * %sccs.include.redist.c% 12*53984Sfujita * 13*53984Sfujita * from: Utah $Hdr: cons.c 1.1 90/07/09$ 14*53984Sfujita * 15*53984Sfujita * from: hp300/hp300/cons.c 7.1 (Berkeley) 6/4/92 16*53984Sfujita * 17*53984Sfujita * @(#)cons.c 7.1 (Berkeley) 06/15/92 18*53984Sfujita */ 19*53984Sfujita 20*53984Sfujita #include "sys/param.h" 21*53984Sfujita #include "sys/proc.h" 22*53984Sfujita #include "sys/systm.h" 23*53984Sfujita #include "sys/buf.h" 24*53984Sfujita #include "sys/ioctl.h" 25*53984Sfujita #include "sys/tty.h" 26*53984Sfujita #include "sys/file.h" 27*53984Sfujita #include "sys/conf.h" 28*53984Sfujita 29*53984Sfujita #include "cons.h" 30*53984Sfujita 31*53984Sfujita /* XXX - all this could be autoconfig()ed */ 32*53984Sfujita #include "sio.h" 33*53984Sfujita #if NSIO > 0 34*53984Sfujita int siocnprobe(), siocninit(), siocngetc(), siocnputc(); 35*53984Sfujita #endif 36*53984Sfujita 37*53984Sfujita struct consdev constab[] = { 38*53984Sfujita #if NSIO > 0 39*53984Sfujita { siocnprobe, siocninit, siocngetc, siocnputc }, 40*53984Sfujita #endif 41*53984Sfujita { 0 }, 42*53984Sfujita }; 43*53984Sfujita /* end XXX */ 44*53984Sfujita 45*53984Sfujita struct tty *constty = 0; /* virtual console output device */ 46*53984Sfujita struct consdev *cn_tab; /* physical console device info */ 47*53984Sfujita struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 48*53984Sfujita 49*53984Sfujita cninit() 50*53984Sfujita { 51*53984Sfujita register struct consdev *cp; 52*53984Sfujita 53*53984Sfujita /* 54*53984Sfujita * Collect information about all possible consoles 55*53984Sfujita * and find the one with highest priority 56*53984Sfujita */ 57*53984Sfujita for (cp = constab; cp->cn_probe; cp++) { 58*53984Sfujita (*cp->cn_probe)(cp); 59*53984Sfujita if (cp->cn_pri > CN_DEAD && 60*53984Sfujita (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 61*53984Sfujita cn_tab = cp; 62*53984Sfujita } 63*53984Sfujita /* 64*53984Sfujita * No console, we can handle it 65*53984Sfujita */ 66*53984Sfujita if ((cp = cn_tab) == NULL) 67*53984Sfujita return; 68*53984Sfujita /* 69*53984Sfujita * Turn on console 70*53984Sfujita */ 71*53984Sfujita cn_tty = cp->cn_tp; 72*53984Sfujita (*cp->cn_init)(cp); 73*53984Sfujita } 74*53984Sfujita 75*53984Sfujita cnopen(dev, flag, mode, p) 76*53984Sfujita dev_t dev; 77*53984Sfujita int flag, mode; 78*53984Sfujita struct proc *p; 79*53984Sfujita { 80*53984Sfujita if (cn_tab == NULL) 81*53984Sfujita return (0); 82*53984Sfujita dev = cn_tab->cn_dev; 83*53984Sfujita return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 84*53984Sfujita } 85*53984Sfujita 86*53984Sfujita cnclose(dev, flag, mode, p) 87*53984Sfujita dev_t dev; 88*53984Sfujita int flag, mode; 89*53984Sfujita struct proc *p; 90*53984Sfujita { 91*53984Sfujita if (cn_tab == NULL) 92*53984Sfujita return (0); 93*53984Sfujita dev = cn_tab->cn_dev; 94*53984Sfujita return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 95*53984Sfujita } 96*53984Sfujita 97*53984Sfujita cnread(dev, uio, flag) 98*53984Sfujita dev_t dev; 99*53984Sfujita struct uio *uio; 100*53984Sfujita { 101*53984Sfujita if (cn_tab == NULL) 102*53984Sfujita return (0); 103*53984Sfujita dev = cn_tab->cn_dev; 104*53984Sfujita return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 105*53984Sfujita } 106*53984Sfujita 107*53984Sfujita cnwrite(dev, uio, flag) 108*53984Sfujita dev_t dev; 109*53984Sfujita struct uio *uio; 110*53984Sfujita { 111*53984Sfujita if (cn_tab == NULL) 112*53984Sfujita return (0); 113*53984Sfujita dev = cn_tab->cn_dev; 114*53984Sfujita return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 115*53984Sfujita } 116*53984Sfujita 117*53984Sfujita cnioctl(dev, cmd, data, flag, p) 118*53984Sfujita dev_t dev; 119*53984Sfujita caddr_t data; 120*53984Sfujita struct proc *p; 121*53984Sfujita { 122*53984Sfujita int error; 123*53984Sfujita 124*53984Sfujita if (cn_tab == NULL) 125*53984Sfujita return (0); 126*53984Sfujita /* 127*53984Sfujita * Superuser can always use this to wrest control of console 128*53984Sfujita * output from the "virtual" console. 129*53984Sfujita */ 130*53984Sfujita if (cmd == TIOCCONS && constty) { 131*53984Sfujita error = suser(p->p_ucred, (u_short *) NULL); 132*53984Sfujita if (error) 133*53984Sfujita return (error); 134*53984Sfujita constty = NULL; 135*53984Sfujita return (0); 136*53984Sfujita } 137*53984Sfujita dev = cn_tab->cn_dev; 138*53984Sfujita return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 139*53984Sfujita } 140*53984Sfujita 141*53984Sfujita /*ARGSUSED*/ 142*53984Sfujita cnselect(dev, rw, p) 143*53984Sfujita dev_t dev; 144*53984Sfujita int rw; 145*53984Sfujita struct proc *p; 146*53984Sfujita { 147*53984Sfujita if (cn_tab == NULL) 148*53984Sfujita return (1); 149*53984Sfujita return (ttselect(cn_tab->cn_dev, rw, p)); 150*53984Sfujita } 151*53984Sfujita 152*53984Sfujita cngetc() 153*53984Sfujita { 154*53984Sfujita if (cn_tab == NULL) 155*53984Sfujita return (0); 156*53984Sfujita return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 157*53984Sfujita } 158*53984Sfujita 159*53984Sfujita cnputc(c) 160*53984Sfujita register int c; 161*53984Sfujita { 162*53984Sfujita if (cn_tab == NULL) 163*53984Sfujita return; 164*53984Sfujita if (c) { 165*53984Sfujita (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 166*53984Sfujita if (c == '\n') 167*53984Sfujita (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 168*53984Sfujita } 169*53984Sfujita } 170