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