xref: /csrg-svn/sys/luna68k/luna68k/cons.c (revision 56521)
153984Sfujita /*
253984Sfujita  * Copyright (c) 1988 University of Utah.
353984Sfujita  * Copyright (c) 1992 OMRON Corporation.
453984Sfujita  * Copyright (c) 1990, 1992 The Regents of the University of California.
553984Sfujita  * All rights reserved.
653984Sfujita  *
753984Sfujita  * This code is derived from software contributed to Berkeley by
853984Sfujita  * the Systems Programming Group of the University of Utah Computer
953984Sfujita  * Science Department.
1053984Sfujita  *
1153984Sfujita  * %sccs.include.redist.c%
1253984Sfujita  *
1353984Sfujita  * from: Utah $Hdr: cons.c 1.1 90/07/09$
1453984Sfujita  *
1553984Sfujita  * from: hp300/hp300/cons.c	7.1 (Berkeley) 6/4/92
1653984Sfujita  *
17*56521Sbostic  *	@(#)cons.c	7.2 (Berkeley) 10/11/92
1853984Sfujita  */
1953984Sfujita 
20*56521Sbostic #include <sys/param.h>
21*56521Sbostic #include <sys/proc.h>
22*56521Sbostic #include <sys/systm.h>
23*56521Sbostic #include <sys/buf.h>
24*56521Sbostic #include <sys/ioctl.h>
25*56521Sbostic #include <sys/tty.h>
26*56521Sbostic #include <sys/file.h>
27*56521Sbostic #include <sys/conf.h>
2853984Sfujita 
29*56521Sbostic #include <luna68k/luna68k/cons.h>
3053984Sfujita 
3153984Sfujita /* XXX - all this could be autoconfig()ed */
3253984Sfujita #include "sio.h"
3353984Sfujita #if NSIO > 0
3453984Sfujita int siocnprobe(), siocninit(), siocngetc(), siocnputc();
3553984Sfujita #endif
3653984Sfujita 
3753984Sfujita struct	consdev constab[] = {
3853984Sfujita #if NSIO > 0
3953984Sfujita 	{ siocnprobe,	siocninit,	siocngetc,	siocnputc },
4053984Sfujita #endif
4153984Sfujita 	{ 0 },
4253984Sfujita };
4353984Sfujita /* end XXX */
4453984Sfujita 
4553984Sfujita struct	tty *constty = 0;	/* virtual console output device */
4653984Sfujita struct	consdev *cn_tab;	/* physical console device info */
4753984Sfujita struct	tty *cn_tty;		/* XXX: console tty struct for tprintf */
4853984Sfujita 
4953984Sfujita cninit()
5053984Sfujita {
5153984Sfujita 	register struct consdev *cp;
5253984Sfujita 
5353984Sfujita 	/*
5453984Sfujita 	 * Collect information about all possible consoles
5553984Sfujita 	 * and find the one with highest priority
5653984Sfujita 	 */
5753984Sfujita 	for (cp = constab; cp->cn_probe; cp++) {
5853984Sfujita 		(*cp->cn_probe)(cp);
5953984Sfujita 		if (cp->cn_pri > CN_DEAD &&
6053984Sfujita 		    (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
6153984Sfujita 			cn_tab = cp;
6253984Sfujita 	}
6353984Sfujita 	/*
6453984Sfujita 	 * No console, we can handle it
6553984Sfujita 	 */
6653984Sfujita 	if ((cp = cn_tab) == NULL)
6753984Sfujita 		return;
6853984Sfujita 	/*
6953984Sfujita 	 * Turn on console
7053984Sfujita 	 */
7153984Sfujita 	cn_tty = cp->cn_tp;
7253984Sfujita 	(*cp->cn_init)(cp);
7353984Sfujita }
7453984Sfujita 
7553984Sfujita cnopen(dev, flag, mode, p)
7653984Sfujita 	dev_t dev;
7753984Sfujita 	int flag, mode;
7853984Sfujita 	struct proc *p;
7953984Sfujita {
8053984Sfujita 	if (cn_tab == NULL)
8153984Sfujita 		return (0);
8253984Sfujita 	dev = cn_tab->cn_dev;
8353984Sfujita 	return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
8453984Sfujita }
8553984Sfujita 
8653984Sfujita cnclose(dev, flag, mode, p)
8753984Sfujita 	dev_t dev;
8853984Sfujita 	int flag, mode;
8953984Sfujita 	struct proc *p;
9053984Sfujita {
9153984Sfujita 	if (cn_tab == NULL)
9253984Sfujita 		return (0);
9353984Sfujita 	dev = cn_tab->cn_dev;
9453984Sfujita 	return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
9553984Sfujita }
9653984Sfujita 
9753984Sfujita cnread(dev, uio, flag)
9853984Sfujita 	dev_t dev;
9953984Sfujita 	struct uio *uio;
10053984Sfujita {
10153984Sfujita 	if (cn_tab == NULL)
10253984Sfujita 		return (0);
10353984Sfujita 	dev = cn_tab->cn_dev;
10453984Sfujita 	return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
10553984Sfujita }
10653984Sfujita 
10753984Sfujita cnwrite(dev, uio, flag)
10853984Sfujita 	dev_t dev;
10953984Sfujita 	struct uio *uio;
11053984Sfujita {
11153984Sfujita 	if (cn_tab == NULL)
11253984Sfujita 		return (0);
11353984Sfujita 	dev = cn_tab->cn_dev;
11453984Sfujita 	return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
11553984Sfujita }
11653984Sfujita 
11753984Sfujita cnioctl(dev, cmd, data, flag, p)
11853984Sfujita 	dev_t dev;
11953984Sfujita 	caddr_t data;
12053984Sfujita 	struct proc *p;
12153984Sfujita {
12253984Sfujita 	int error;
12353984Sfujita 
12453984Sfujita 	if (cn_tab == NULL)
12553984Sfujita 		return (0);
12653984Sfujita 	/*
12753984Sfujita 	 * Superuser can always use this to wrest control of console
12853984Sfujita 	 * output from the "virtual" console.
12953984Sfujita 	 */
13053984Sfujita 	if (cmd == TIOCCONS && constty) {
13153984Sfujita 		error = suser(p->p_ucred, (u_short *) NULL);
13253984Sfujita 		if (error)
13353984Sfujita 			return (error);
13453984Sfujita 		constty = NULL;
13553984Sfujita 		return (0);
13653984Sfujita 	}
13753984Sfujita 	dev = cn_tab->cn_dev;
13853984Sfujita 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
13953984Sfujita }
14053984Sfujita 
14153984Sfujita /*ARGSUSED*/
14253984Sfujita cnselect(dev, rw, p)
14353984Sfujita 	dev_t dev;
14453984Sfujita 	int rw;
14553984Sfujita 	struct proc *p;
14653984Sfujita {
14753984Sfujita 	if (cn_tab == NULL)
14853984Sfujita 		return (1);
14953984Sfujita 	return (ttselect(cn_tab->cn_dev, rw, p));
15053984Sfujita }
15153984Sfujita 
15253984Sfujita cngetc()
15353984Sfujita {
15453984Sfujita 	if (cn_tab == NULL)
15553984Sfujita 		return (0);
15653984Sfujita 	return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
15753984Sfujita }
15853984Sfujita 
15953984Sfujita cnputc(c)
16053984Sfujita 	register int c;
16153984Sfujita {
16253984Sfujita 	if (cn_tab == NULL)
16353984Sfujita 		return;
16453984Sfujita 	if (c) {
16553984Sfujita 		(*cn_tab->cn_putc)(cn_tab->cn_dev, c);
16653984Sfujita 		if (c == '\n')
16753984Sfujita 			(*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
16853984Sfujita 	}
16953984Sfujita }
170