xref: /csrg-svn/sys/hp/dev/cons.c (revision 42364)
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  *
1241475Smckusick  * from: Utah $Hdr: cons.c 1.4 88/12/03$
1341475Smckusick  *
14*42364Smckusick  *	@(#)cons.c	7.2 (Berkeley) 05/25/90
1541475Smckusick  */
1641475Smckusick 
1741475Smckusick #include "param.h"
1841475Smckusick #include "user.h"
1941475Smckusick #include "systm.h"
2041475Smckusick #include "buf.h"
2141475Smckusick #include "ioctl.h"
2241475Smckusick #include "tty.h"
2341475Smckusick #include "file.h"
2441475Smckusick #include "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
37*42364Smckusick #include "dcm.h"
38*42364Smckusick #if NDCM > 0
39*42364Smckusick int dcmcnprobe(), dcmcninit(), dcmcngetc(), dcmcnputc();
40*42364Smckusick #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
49*42364Smckusick #if NDCM > 0
50*42364Smckusick 	{ dcmcnprobe,	dcmcninit,	dcmcngetc,	dcmcnputc },
51*42364Smckusick #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 
8641475Smckusick cnopen(dev, flag)
8741475Smckusick 	dev_t dev;
8841475Smckusick {
8941475Smckusick 	if (cn_tab == NULL)
9041475Smckusick 		return(0);
9141475Smckusick 	dev = cn_tab->cn_dev;
9241475Smckusick 	return ((*cdevsw[major(dev)].d_open)(dev, flag));
9341475Smckusick }
9441475Smckusick 
9541475Smckusick cnclose(dev, flag)
9641475Smckusick 	dev_t dev;
9741475Smckusick {
9841475Smckusick 	if (cn_tab == NULL)
9941475Smckusick 		return(0);
10041475Smckusick 	dev = cn_tab->cn_dev;
10141475Smckusick 	return ((*cdevsw[major(dev)].d_close)(dev, flag));
10241475Smckusick }
10341475Smckusick 
10441475Smckusick cnread(dev, uio)
10541475Smckusick 	dev_t dev;
10641475Smckusick 	struct uio *uio;
10741475Smckusick {
10841475Smckusick 	if (cn_tab == NULL)
10941475Smckusick 		return(0);
11041475Smckusick 	dev = cn_tab->cn_dev;
11141475Smckusick 	return ((*cdevsw[major(dev)].d_read)(dev, uio));
11241475Smckusick }
11341475Smckusick 
11441475Smckusick cnwrite(dev, uio)
11541475Smckusick 	dev_t dev;
11641475Smckusick 	struct uio *uio;
11741475Smckusick {
11841475Smckusick 	if (cn_tab == NULL)
11941475Smckusick 		return(0);
12041475Smckusick 	dev = cn_tab->cn_dev;
12141475Smckusick 	return ((*cdevsw[major(dev)].d_write)(dev, uio));
12241475Smckusick }
12341475Smckusick 
12441475Smckusick cnioctl(dev, cmd, data, flag)
12541475Smckusick 	dev_t dev;
12641475Smckusick 	caddr_t data;
12741475Smckusick {
12841475Smckusick 	int error;
12941475Smckusick 
13041475Smckusick 	if (cn_tab == NULL)
13141475Smckusick 		return(0);
13241475Smckusick 	/*
13341475Smckusick 	 * Superuser can always use this to wrest control of console
13441475Smckusick 	 * output from the "virtual" console.
13541475Smckusick 	 */
13641475Smckusick 	if (cmd == TIOCCONS && constty) {
13741475Smckusick 		error = suser(u.u_cred, &u.u_acflag);
13841475Smckusick 		if (error)
13941475Smckusick 			return (error);
14041475Smckusick 		constty = NULL;
14141475Smckusick 		return (0);
14241475Smckusick 	}
14341475Smckusick 	dev = cn_tab->cn_dev;
14441475Smckusick 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag));
14541475Smckusick }
14641475Smckusick 
14741475Smckusick /*ARGSUSED*/
14841475Smckusick cnselect(dev, rw)
14941475Smckusick 	dev_t dev;
15041475Smckusick 	int rw;
15141475Smckusick {
15241475Smckusick 	if (cn_tab == NULL)
15341475Smckusick 		return(1);
15441475Smckusick 	return(ttselect(cn_tab->cn_dev, rw));
15541475Smckusick }
15641475Smckusick 
15741475Smckusick cngetc()
15841475Smckusick {
15941475Smckusick 	if (cn_tab == NULL)
16041475Smckusick 		return(0);
16141475Smckusick 	return((*cn_tab->cn_getc)(cn_tab->cn_dev));
16241475Smckusick }
16341475Smckusick 
16441475Smckusick cnputc(c)
16541475Smckusick 	register int c;
16641475Smckusick {
16741475Smckusick 	if (cn_tab == NULL)
16841475Smckusick 		return;
16941475Smckusick 	if (c) {
17041475Smckusick 		(*cn_tab->cn_putc)(cn_tab->cn_dev, c);
17141475Smckusick 		if (c == '\n')
17241475Smckusick 			(*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
17341475Smckusick 	}
17441475Smckusick }
175