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