xref: /csrg-svn/sys/hp/dev/cons.c (revision 49126)
141475Smckusick /*
241475Smckusick  * Copyright (c) 1988 University of Utah.
341475Smckusick  * Copyright (c) 1990 The Regents of the University of California.
441475Smckusick  * All rights reserved.
541475Smckusick  *
641475Smckusick  * This code is derived from software contributed to Berkeley by
741475Smckusick  * the Systems Programming Group of the University of Utah Computer
841475Smckusick  * Science Department.
941475Smckusick  *
1041475Smckusick  * %sccs.include.redist.c%
1141475Smckusick  *
1245467Smckusick  * from: Utah $Hdr: cons.c 1.1 90/07/09$
1341475Smckusick  *
14*49126Skarels  *	@(#)cons.c	7.6 (Berkeley) 05/04/91
1541475Smckusick  */
1641475Smckusick 
1745788Sbostic #include "sys/param.h"
18*49126Skarels #include "sys/proc.h"
1945788Sbostic #include "sys/systm.h"
2045788Sbostic #include "sys/buf.h"
2145788Sbostic #include "sys/ioctl.h"
2245788Sbostic #include "sys/tty.h"
2345788Sbostic #include "sys/file.h"
2445788Sbostic #include "sys/conf.h"
2541475Smckusick 
2641475Smckusick #include "cons.h"
2741475Smckusick 
2841475Smckusick /* XXX - all this could be autoconfig()ed */
2941475Smckusick #include "ite.h"
3041475Smckusick #if NITE > 0
3141475Smckusick int itecnprobe(), itecninit(), itecngetc(), itecnputc();
3241475Smckusick #endif
3341475Smckusick #include "dca.h"
3441475Smckusick #if NDCA > 0
3541475Smckusick int dcacnprobe(), dcacninit(), dcacngetc(), dcacnputc();
3641475Smckusick #endif
3742364Smckusick #include "dcm.h"
3842364Smckusick #if NDCM > 0
3942364Smckusick int dcmcnprobe(), dcmcninit(), dcmcngetc(), dcmcnputc();
4042364Smckusick #endif
4141475Smckusick 
4241475Smckusick struct	consdev constab[] = {
4341475Smckusick #if NITE > 0
4441475Smckusick 	{ itecnprobe,	itecninit,	itecngetc,	itecnputc },
4541475Smckusick #endif
4641475Smckusick #if NDCA > 0
4741475Smckusick 	{ dcacnprobe,	dcacninit,	dcacngetc,	dcacnputc },
4841475Smckusick #endif
4942364Smckusick #if NDCM > 0
5042364Smckusick 	{ dcmcnprobe,	dcmcninit,	dcmcngetc,	dcmcnputc },
5142364Smckusick #endif
5241475Smckusick 	{ 0 },
5341475Smckusick };
5441475Smckusick /* end XXX */
5541475Smckusick 
5641475Smckusick struct	tty *constty = 0;	/* virtual console output device */
5741475Smckusick struct	consdev *cn_tab;	/* physical console device info */
5841475Smckusick struct	tty *cn_tty;		/* XXX: console tty struct for tprintf */
5941475Smckusick 
6041475Smckusick cninit()
6141475Smckusick {
6241475Smckusick 	register struct consdev *cp;
6341475Smckusick 
6441475Smckusick 	/*
6541475Smckusick 	 * Collect information about all possible consoles
6641475Smckusick 	 * and find the one with highest priority
6741475Smckusick 	 */
6841475Smckusick 	for (cp = constab; cp->cn_probe; cp++) {
6941475Smckusick 		(*cp->cn_probe)(cp);
7041475Smckusick 		if (cp->cn_pri > CN_DEAD &&
7141475Smckusick 		    (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
7241475Smckusick 			cn_tab = cp;
7341475Smckusick 	}
7441475Smckusick 	/*
7541475Smckusick 	 * No console, we can handle it
7641475Smckusick 	 */
7741475Smckusick 	if ((cp = cn_tab) == NULL)
7841475Smckusick 		return;
7941475Smckusick 	/*
8041475Smckusick 	 * Turn on console
8141475Smckusick 	 */
8241475Smckusick 	cn_tty = cp->cn_tp;
8341475Smckusick 	(*cp->cn_init)(cp);
8441475Smckusick }
8541475Smckusick 
86*49126Skarels cnopen(dev, flag, mode, p)
8741475Smckusick 	dev_t dev;
88*49126Skarels 	int flag, mode;
89*49126Skarels 	struct proc *p;
9041475Smckusick {
9141475Smckusick 	if (cn_tab == NULL)
92*49126Skarels 		return (0);
9341475Smckusick 	dev = cn_tab->cn_dev;
94*49126Skarels 	return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
9541475Smckusick }
9641475Smckusick 
97*49126Skarels cnclose(dev, flag, mode, p)
9841475Smckusick 	dev_t dev;
99*49126Skarels 	int flag, mode;
100*49126Skarels 	struct proc *p;
10141475Smckusick {
10241475Smckusick 	if (cn_tab == NULL)
103*49126Skarels 		return (0);
10441475Smckusick 	dev = cn_tab->cn_dev;
105*49126Skarels 	return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
10641475Smckusick }
10741475Smckusick 
10842942Smckusick cnread(dev, uio, flag)
10941475Smckusick 	dev_t dev;
11041475Smckusick 	struct uio *uio;
11141475Smckusick {
11241475Smckusick 	if (cn_tab == NULL)
113*49126Skarels 		return (0);
11441475Smckusick 	dev = cn_tab->cn_dev;
11542942Smckusick 	return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
11641475Smckusick }
11741475Smckusick 
11842942Smckusick cnwrite(dev, uio, flag)
11941475Smckusick 	dev_t dev;
12041475Smckusick 	struct uio *uio;
12141475Smckusick {
12241475Smckusick 	if (cn_tab == NULL)
123*49126Skarels 		return (0);
12441475Smckusick 	dev = cn_tab->cn_dev;
12542942Smckusick 	return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
12641475Smckusick }
12741475Smckusick 
128*49126Skarels cnioctl(dev, cmd, data, flag, p)
12941475Smckusick 	dev_t dev;
13041475Smckusick 	caddr_t data;
131*49126Skarels 	struct proc *p;
13241475Smckusick {
13341475Smckusick 	int error;
13441475Smckusick 
13541475Smckusick 	if (cn_tab == NULL)
136*49126Skarels 		return (0);
13741475Smckusick 	/*
13841475Smckusick 	 * Superuser can always use this to wrest control of console
13941475Smckusick 	 * output from the "virtual" console.
14041475Smckusick 	 */
14141475Smckusick 	if (cmd == TIOCCONS && constty) {
142*49126Skarels 		error = suser(p->p_ucred, (u_short *) NULL);
14341475Smckusick 		if (error)
14441475Smckusick 			return (error);
14541475Smckusick 		constty = NULL;
14641475Smckusick 		return (0);
14741475Smckusick 	}
14841475Smckusick 	dev = cn_tab->cn_dev;
149*49126Skarels 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
15041475Smckusick }
15141475Smckusick 
15241475Smckusick /*ARGSUSED*/
153*49126Skarels cnselect(dev, rw, p)
15441475Smckusick 	dev_t dev;
15541475Smckusick 	int rw;
156*49126Skarels 	struct proc *p;
15741475Smckusick {
15841475Smckusick 	if (cn_tab == NULL)
159*49126Skarels 		return (1);
160*49126Skarels 	return (ttselect(cn_tab->cn_dev, rw, p));
16141475Smckusick }
16241475Smckusick 
16341475Smckusick cngetc()
16441475Smckusick {
16541475Smckusick 	if (cn_tab == NULL)
166*49126Skarels 		return (0);
167*49126Skarels 	return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
16841475Smckusick }
16941475Smckusick 
17041475Smckusick cnputc(c)
17141475Smckusick 	register int c;
17241475Smckusick {
17341475Smckusick 	if (cn_tab == NULL)
17441475Smckusick 		return;
17541475Smckusick 	if (c) {
17641475Smckusick 		(*cn_tab->cn_putc)(cn_tab->cn_dev, c);
17741475Smckusick 		if (c == '\n')
17841475Smckusick 			(*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
17941475Smckusick 	}
18041475Smckusick }
181