xref: /csrg-svn/sys/luna68k/luna68k/cons.c (revision 53984)
1*53984Sfujita /*
2*53984Sfujita  * Copyright (c) 1988 University of Utah.
3*53984Sfujita  * Copyright (c) 1992 OMRON Corporation.
4*53984Sfujita  * Copyright (c) 1990, 1992 The Regents of the University of California.
5*53984Sfujita  * All rights reserved.
6*53984Sfujita  *
7*53984Sfujita  * This code is derived from software contributed to Berkeley by
8*53984Sfujita  * the Systems Programming Group of the University of Utah Computer
9*53984Sfujita  * Science Department.
10*53984Sfujita  *
11*53984Sfujita  * %sccs.include.redist.c%
12*53984Sfujita  *
13*53984Sfujita  * from: Utah $Hdr: cons.c 1.1 90/07/09$
14*53984Sfujita  *
15*53984Sfujita  * from: hp300/hp300/cons.c	7.1 (Berkeley) 6/4/92
16*53984Sfujita  *
17*53984Sfujita  *	@(#)cons.c	7.1 (Berkeley) 06/15/92
18*53984Sfujita  */
19*53984Sfujita 
20*53984Sfujita #include "sys/param.h"
21*53984Sfujita #include "sys/proc.h"
22*53984Sfujita #include "sys/systm.h"
23*53984Sfujita #include "sys/buf.h"
24*53984Sfujita #include "sys/ioctl.h"
25*53984Sfujita #include "sys/tty.h"
26*53984Sfujita #include "sys/file.h"
27*53984Sfujita #include "sys/conf.h"
28*53984Sfujita 
29*53984Sfujita #include "cons.h"
30*53984Sfujita 
31*53984Sfujita /* XXX - all this could be autoconfig()ed */
32*53984Sfujita #include "sio.h"
33*53984Sfujita #if NSIO > 0
34*53984Sfujita int siocnprobe(), siocninit(), siocngetc(), siocnputc();
35*53984Sfujita #endif
36*53984Sfujita 
37*53984Sfujita struct	consdev constab[] = {
38*53984Sfujita #if NSIO > 0
39*53984Sfujita 	{ siocnprobe,	siocninit,	siocngetc,	siocnputc },
40*53984Sfujita #endif
41*53984Sfujita 	{ 0 },
42*53984Sfujita };
43*53984Sfujita /* end XXX */
44*53984Sfujita 
45*53984Sfujita struct	tty *constty = 0;	/* virtual console output device */
46*53984Sfujita struct	consdev *cn_tab;	/* physical console device info */
47*53984Sfujita struct	tty *cn_tty;		/* XXX: console tty struct for tprintf */
48*53984Sfujita 
49*53984Sfujita cninit()
50*53984Sfujita {
51*53984Sfujita 	register struct consdev *cp;
52*53984Sfujita 
53*53984Sfujita 	/*
54*53984Sfujita 	 * Collect information about all possible consoles
55*53984Sfujita 	 * and find the one with highest priority
56*53984Sfujita 	 */
57*53984Sfujita 	for (cp = constab; cp->cn_probe; cp++) {
58*53984Sfujita 		(*cp->cn_probe)(cp);
59*53984Sfujita 		if (cp->cn_pri > CN_DEAD &&
60*53984Sfujita 		    (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
61*53984Sfujita 			cn_tab = cp;
62*53984Sfujita 	}
63*53984Sfujita 	/*
64*53984Sfujita 	 * No console, we can handle it
65*53984Sfujita 	 */
66*53984Sfujita 	if ((cp = cn_tab) == NULL)
67*53984Sfujita 		return;
68*53984Sfujita 	/*
69*53984Sfujita 	 * Turn on console
70*53984Sfujita 	 */
71*53984Sfujita 	cn_tty = cp->cn_tp;
72*53984Sfujita 	(*cp->cn_init)(cp);
73*53984Sfujita }
74*53984Sfujita 
75*53984Sfujita cnopen(dev, flag, mode, p)
76*53984Sfujita 	dev_t dev;
77*53984Sfujita 	int flag, mode;
78*53984Sfujita 	struct proc *p;
79*53984Sfujita {
80*53984Sfujita 	if (cn_tab == NULL)
81*53984Sfujita 		return (0);
82*53984Sfujita 	dev = cn_tab->cn_dev;
83*53984Sfujita 	return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
84*53984Sfujita }
85*53984Sfujita 
86*53984Sfujita cnclose(dev, flag, mode, p)
87*53984Sfujita 	dev_t dev;
88*53984Sfujita 	int flag, mode;
89*53984Sfujita 	struct proc *p;
90*53984Sfujita {
91*53984Sfujita 	if (cn_tab == NULL)
92*53984Sfujita 		return (0);
93*53984Sfujita 	dev = cn_tab->cn_dev;
94*53984Sfujita 	return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
95*53984Sfujita }
96*53984Sfujita 
97*53984Sfujita cnread(dev, uio, flag)
98*53984Sfujita 	dev_t dev;
99*53984Sfujita 	struct uio *uio;
100*53984Sfujita {
101*53984Sfujita 	if (cn_tab == NULL)
102*53984Sfujita 		return (0);
103*53984Sfujita 	dev = cn_tab->cn_dev;
104*53984Sfujita 	return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
105*53984Sfujita }
106*53984Sfujita 
107*53984Sfujita cnwrite(dev, uio, flag)
108*53984Sfujita 	dev_t dev;
109*53984Sfujita 	struct uio *uio;
110*53984Sfujita {
111*53984Sfujita 	if (cn_tab == NULL)
112*53984Sfujita 		return (0);
113*53984Sfujita 	dev = cn_tab->cn_dev;
114*53984Sfujita 	return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
115*53984Sfujita }
116*53984Sfujita 
117*53984Sfujita cnioctl(dev, cmd, data, flag, p)
118*53984Sfujita 	dev_t dev;
119*53984Sfujita 	caddr_t data;
120*53984Sfujita 	struct proc *p;
121*53984Sfujita {
122*53984Sfujita 	int error;
123*53984Sfujita 
124*53984Sfujita 	if (cn_tab == NULL)
125*53984Sfujita 		return (0);
126*53984Sfujita 	/*
127*53984Sfujita 	 * Superuser can always use this to wrest control of console
128*53984Sfujita 	 * output from the "virtual" console.
129*53984Sfujita 	 */
130*53984Sfujita 	if (cmd == TIOCCONS && constty) {
131*53984Sfujita 		error = suser(p->p_ucred, (u_short *) NULL);
132*53984Sfujita 		if (error)
133*53984Sfujita 			return (error);
134*53984Sfujita 		constty = NULL;
135*53984Sfujita 		return (0);
136*53984Sfujita 	}
137*53984Sfujita 	dev = cn_tab->cn_dev;
138*53984Sfujita 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
139*53984Sfujita }
140*53984Sfujita 
141*53984Sfujita /*ARGSUSED*/
142*53984Sfujita cnselect(dev, rw, p)
143*53984Sfujita 	dev_t dev;
144*53984Sfujita 	int rw;
145*53984Sfujita 	struct proc *p;
146*53984Sfujita {
147*53984Sfujita 	if (cn_tab == NULL)
148*53984Sfujita 		return (1);
149*53984Sfujita 	return (ttselect(cn_tab->cn_dev, rw, p));
150*53984Sfujita }
151*53984Sfujita 
152*53984Sfujita cngetc()
153*53984Sfujita {
154*53984Sfujita 	if (cn_tab == NULL)
155*53984Sfujita 		return (0);
156*53984Sfujita 	return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
157*53984Sfujita }
158*53984Sfujita 
159*53984Sfujita cnputc(c)
160*53984Sfujita 	register int c;
161*53984Sfujita {
162*53984Sfujita 	if (cn_tab == NULL)
163*53984Sfujita 		return;
164*53984Sfujita 	if (c) {
165*53984Sfujita 		(*cn_tab->cn_putc)(cn_tab->cn_dev, c);
166*53984Sfujita 		if (c == '\n')
167*53984Sfujita 			(*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
168*53984Sfujita 	}
169*53984Sfujita }
170