xref: /csrg-svn/sys/pmax/pmax/cons.c (revision 63218)
152118Smckusick /*
252118Smckusick  * Copyright (c) 1988 University of Utah.
3*63218Sbostic  * Copyright (c) 1992, 1993
4*63218Sbostic  *	The Regents of the University of California.  All rights reserved.
552118Smckusick  *
652118Smckusick  * This code is derived from software contributed to Berkeley by
752118Smckusick  * the Systems Programming Group of the University of Utah Computer
852118Smckusick  * Science Department and Ralph Campbell.
952118Smckusick  *
1052118Smckusick  * %sccs.include.redist.c%
1152118Smckusick  *
1252118Smckusick  * from: Utah $Hdr: cons.c 1.1 90/07/09$
1352118Smckusick  *
14*63218Sbostic  *	@(#)cons.c	8.1 (Berkeley) 06/10/93
1552118Smckusick  */
1652118Smckusick 
1756524Sbostic #include <sys/param.h>
1856524Sbostic #include <sys/proc.h>
1956524Sbostic #include <sys/systm.h>
2056524Sbostic #include <sys/buf.h>
2156524Sbostic #include <sys/ioctl.h>
2256524Sbostic #include <sys/tty.h>
2356524Sbostic #include <sys/file.h>
2456524Sbostic #include <sys/conf.h>
2552118Smckusick 
2656828Sralph #include <pmax/stand/dec_prom.h>
2752118Smckusick 
2852118Smckusick /*
2956828Sralph  * Console I/O is redirected to the appropriate device, either a screen and
3056828Sralph  * keyboard or a serial port.
3152118Smckusick  */
3256828Sralph #include <pmax/pmax/cons.h>
3352118Smckusick 
3456828Sralph struct consdev cn_tab = {
3556828Sralph 	1,
3656828Sralph 	1,
3756828Sralph 	NODEV,
3856828Sralph 	(struct pmax_fb *)0,
3956828Sralph 	(int (*)())0,
4056828Sralph 	(int (*)())0,
4156828Sralph 	(void (*)())0,
4256828Sralph 	(struct tty *)0,
4356828Sralph };
4456828Sralph 
4556828Sralph cnopen(dev, flag, mode, p)
4656828Sralph 	dev_t dev;
4756828Sralph 	int flag, mode;
4856828Sralph 	struct proc *p;
4956828Sralph {
5056828Sralph 	if (cn_tab.cn_dev == NODEV)
5156828Sralph 		return (0);
5256828Sralph 	dev = cn_tab.cn_dev;
5356828Sralph 	return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
5456828Sralph }
5556828Sralph 
5656828Sralph cnclose(dev, flag, mode, p)
5756828Sralph 	dev_t dev;
5856828Sralph 	int flag, mode;
5956828Sralph 	struct proc *p;
6056828Sralph {
6156828Sralph 	if (cn_tab.cn_dev == NODEV)
6256828Sralph 		return (0);
6356828Sralph 	dev = cn_tab.cn_dev;
6456828Sralph 	return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
6556828Sralph }
6656828Sralph 
6756828Sralph cnread(dev, uio, flag)
6856828Sralph 	dev_t dev;
6956828Sralph 	struct uio *uio;
7056828Sralph {
7156828Sralph 	if (cn_tab.cn_dev == NODEV)
7256828Sralph 		return (0);
7356828Sralph 	dev = cn_tab.cn_dev;
7456828Sralph 	return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
7556828Sralph }
7656828Sralph 
7756828Sralph cnwrite(dev, uio, flag)
7856828Sralph 	dev_t dev;
7956828Sralph 	struct uio *uio;
8056828Sralph {
8156828Sralph 	if (cn_tab.cn_dev == NODEV)
8256828Sralph 		return (0);
8356828Sralph 	dev = cn_tab.cn_dev;
8456828Sralph 	return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
8556828Sralph }
8656828Sralph 
8756828Sralph cnioctl(dev, cmd, data, flag, p)
8856828Sralph 	dev_t dev;
8956828Sralph 	caddr_t data;
9056828Sralph 	struct proc *p;
9156828Sralph {
9256828Sralph 	int error;
9356828Sralph 
9456828Sralph 	if (cn_tab.cn_dev == NODEV)
9556828Sralph 		return (0);
9656828Sralph 	dev = cn_tab.cn_dev;
9756828Sralph 	return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
9856828Sralph }
9956828Sralph 
10056828Sralph /*ARGSUSED*/
10156828Sralph cnselect(dev, rw, p)
10256828Sralph 	dev_t dev;
10356828Sralph 	int rw;
10456828Sralph 	struct proc *p;
10556828Sralph {
10656828Sralph 	if (cn_tab.cn_dev == NODEV)
10756828Sralph 		return (1);
10856828Sralph 	return (ttselect(cn_tab.cn_dev, rw, p));
10956828Sralph }
11056828Sralph 
11152118Smckusick /*
11252118Smckusick  * Get character from console.
11352118Smckusick  */
11452118Smckusick cngetc()
11552118Smckusick {
11652118Smckusick 
11752701Sralph 	/* check to be sure device has been initialized */
11856828Sralph 	if (cn_tab.cn_dev == NODEV || cn_tab.cn_disabled)
11956828Sralph 		return ((*callv->getchar)());
12056828Sralph 	return ((*cn_tab.cn_getc)(cn_tab.cn_dev));
12152118Smckusick }
12252118Smckusick 
12352118Smckusick /*
12452118Smckusick  * Print a character on console.
12552118Smckusick  */
12652118Smckusick cnputc(c)
12752118Smckusick 	register int c;
12852118Smckusick {
12952118Smckusick 	int s;
13052118Smckusick 
13156828Sralph 	if (cn_tab.cn_dev == NODEV || cn_tab.cn_disabled) {
13256828Sralph 		s = splhigh();
13356828Sralph 		(*callv->printf)("%c", c);
13456828Sralph 		splx(s);
13556828Sralph 	} else if (c) {
13656828Sralph 		if (c == '\n')
13756828Sralph 			(*cn_tab.cn_putc)(cn_tab.cn_dev, '\r');
13856828Sralph 		(*cn_tab.cn_putc)(cn_tab.cn_dev, c);
13956828Sralph 	}
14052118Smckusick }
141