xref: /csrg-svn/sys/luna68k/luna68k/cons.c (revision 63196)
153984Sfujita /*
253984Sfujita  * Copyright (c) 1988 University of Utah.
353984Sfujita  * Copyright (c) 1992 OMRON Corporation.
4*63196Sbostic  * Copyright (c) 1990, 1992, 1993
5*63196Sbostic  *	The Regents of the University of California.  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*63196Sbostic  *	@(#)cons.c	8.1 (Berkeley) 06/10/93
1853984Sfujita  */
1953984Sfujita 
2056521Sbostic #include <sys/param.h>
2156521Sbostic #include <sys/proc.h>
2256521Sbostic #include <sys/systm.h>
2356521Sbostic #include <sys/buf.h>
2456521Sbostic #include <sys/ioctl.h>
2556521Sbostic #include <sys/tty.h>
2656521Sbostic #include <sys/file.h>
2756521Sbostic #include <sys/conf.h>
2853984Sfujita 
2956521Sbostic #include <luna68k/luna68k/cons.h>
3053984Sfujita 
3156880Sakito #include "bmc.h"
3253984Sfujita #include "sio.h"
3356880Sakito 
3456880Sakito #if NBMC > 0
3556880Sakito int bmccnprobe(), bmccninit(), bmccngetc(), bmccnputc();
3656880Sakito #endif
3756880Sakito 
3853984Sfujita #if NSIO > 0
3953984Sfujita int siocnprobe(), siocninit(), siocngetc(), siocnputc();
4053984Sfujita #endif
4153984Sfujita 
4253984Sfujita struct	consdev constab[] = {
4356880Sakito #if NBMC > 0
4456880Sakito 	{ bmccnprobe,	bmccninit,	bmccngetc,	bmccnputc },
4556880Sakito #endif
4653984Sfujita #if NSIO > 0
4753984Sfujita 	{ siocnprobe,	siocninit,	siocngetc,	siocnputc },
4853984Sfujita #endif
4953984Sfujita 	{ 0 },
5053984Sfujita };
5153984Sfujita 
5256880Sakito 
5353984Sfujita struct	tty *constty = 0;	/* virtual console output device */
5453984Sfujita struct	consdev *cn_tab;	/* physical console device info */
5553984Sfujita struct	tty *cn_tty;		/* XXX: console tty struct for tprintf */
5653984Sfujita 
cninit()5753984Sfujita cninit()
5853984Sfujita {
5953984Sfujita 	register struct consdev *cp;
6053984Sfujita 
6153984Sfujita 	/*
6253984Sfujita 	 * Collect information about all possible consoles
6353984Sfujita 	 * and find the one with highest priority
6453984Sfujita 	 */
6553984Sfujita 	for (cp = constab; cp->cn_probe; cp++) {
6653984Sfujita 		(*cp->cn_probe)(cp);
6753984Sfujita 		if (cp->cn_pri > CN_DEAD &&
6853984Sfujita 		    (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
6953984Sfujita 			cn_tab = cp;
7053984Sfujita 	}
7153984Sfujita 	/*
7253984Sfujita 	 * No console, we can handle it
7353984Sfujita 	 */
7453984Sfujita 	if ((cp = cn_tab) == NULL)
7553984Sfujita 		return;
7653984Sfujita 	/*
7753984Sfujita 	 * Turn on console
7853984Sfujita 	 */
7953984Sfujita 	cn_tty = cp->cn_tp;
8053984Sfujita 	(*cp->cn_init)(cp);
8153984Sfujita }
8253984Sfujita 
cnopen(dev,flag,mode,p)8353984Sfujita cnopen(dev, flag, mode, p)
8453984Sfujita 	dev_t dev;
8553984Sfujita 	int flag, mode;
8653984Sfujita 	struct proc *p;
8753984Sfujita {
8853984Sfujita 	if (cn_tab == NULL)
8953984Sfujita 		return (0);
9053984Sfujita 	dev = cn_tab->cn_dev;
9153984Sfujita 	return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
9253984Sfujita }
9353984Sfujita 
cnclose(dev,flag,mode,p)9453984Sfujita cnclose(dev, flag, mode, p)
9553984Sfujita 	dev_t dev;
9653984Sfujita 	int flag, mode;
9753984Sfujita 	struct proc *p;
9853984Sfujita {
9953984Sfujita 	if (cn_tab == NULL)
10053984Sfujita 		return (0);
10153984Sfujita 	dev = cn_tab->cn_dev;
10253984Sfujita 	return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
10353984Sfujita }
10453984Sfujita 
cnread(dev,uio,flag)10553984Sfujita cnread(dev, uio, flag)
10653984Sfujita 	dev_t dev;
10753984Sfujita 	struct uio *uio;
10853984Sfujita {
10953984Sfujita 	if (cn_tab == NULL)
11053984Sfujita 		return (0);
11153984Sfujita 	dev = cn_tab->cn_dev;
11253984Sfujita 	return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
11353984Sfujita }
11453984Sfujita 
cnwrite(dev,uio,flag)11553984Sfujita cnwrite(dev, uio, flag)
11653984Sfujita 	dev_t dev;
11753984Sfujita 	struct uio *uio;
11853984Sfujita {
11953984Sfujita 	if (cn_tab == NULL)
12053984Sfujita 		return (0);
12153984Sfujita 	dev = cn_tab->cn_dev;
12253984Sfujita 	return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
12353984Sfujita }
12453984Sfujita 
cnioctl(dev,cmd,data,flag,p)12553984Sfujita cnioctl(dev, cmd, data, flag, p)
12653984Sfujita 	dev_t dev;
12753984Sfujita 	caddr_t data;
12853984Sfujita 	struct proc *p;
12953984Sfujita {
13053984Sfujita 	int error;
13153984Sfujita 
13253984Sfujita 	if (cn_tab == NULL)
13353984Sfujita 		return (0);
13453984Sfujita 	/*
13553984Sfujita 	 * Superuser can always use this to wrest control of console
13653984Sfujita 	 * output from the "virtual" console.
13753984Sfujita 	 */
13853984Sfujita 	if (cmd == TIOCCONS && constty) {
13953984Sfujita 		error = suser(p->p_ucred, (u_short *) NULL);
14053984Sfujita 		if (error)
14153984Sfujita 			return (error);
14253984Sfujita 		constty = NULL;
14353984Sfujita 		return (0);
14453984Sfujita 	}
14553984Sfujita 	dev = cn_tab->cn_dev;
14653984Sfujita 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
14753984Sfujita }
14853984Sfujita 
14953984Sfujita /*ARGSUSED*/
cnselect(dev,rw,p)15053984Sfujita cnselect(dev, rw, p)
15153984Sfujita 	dev_t dev;
15253984Sfujita 	int rw;
15353984Sfujita 	struct proc *p;
15453984Sfujita {
15553984Sfujita 	if (cn_tab == NULL)
15653984Sfujita 		return (1);
15753984Sfujita 	return (ttselect(cn_tab->cn_dev, rw, p));
15853984Sfujita }
15953984Sfujita 
cngetc()16053984Sfujita cngetc()
16153984Sfujita {
16253984Sfujita 	if (cn_tab == NULL)
16353984Sfujita 		return (0);
16453984Sfujita 	return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
16553984Sfujita }
16653984Sfujita 
cnputc(c)16753984Sfujita cnputc(c)
16853984Sfujita 	register int c;
16953984Sfujita {
17053984Sfujita 	if (cn_tab == NULL)
17153984Sfujita 		return;
17253984Sfujita 	if (c) {
17353984Sfujita 		(*cn_tab->cn_putc)(cn_tab->cn_dev, c);
17453984Sfujita 		if (c == '\n')
17553984Sfujita 			(*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
17653984Sfujita 	}
17753984Sfujita }
178