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