xref: /csrg-svn/sys/news3400/bm/bmcons.c (revision 63250)
153889Smckusick /*
2*63250Sbostic  * Copyright (c) 1992, 1993
3*63250Sbostic  *	The Regents of the University of California.  All rights reserved.
453889Smckusick  *
553889Smckusick  * This code is derived from software contributed to Berkeley by
653889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753889Smckusick  *
853889Smckusick  * %sccs.include.redist.c%
953889Smckusick  *
1053889Smckusick  * from: $Hdr: cons.c,v 4.300 91/06/09 06:34:41 root Rel41 $ SONY
1153889Smckusick  *
12*63250Sbostic  *	@(#)bmcons.c	8.1 (Berkeley) 06/10/93
1353889Smckusick  */
1453889Smckusick 
1553889Smckusick /*
1653889Smckusick  * console driver
1753889Smckusick  */
1857177Sutashiro #include <sys/param.h>
1957177Sutashiro #include <machine/pte.h>
2057177Sutashiro #include <sys/conf.h>
2157177Sutashiro #include <sys/proc.h>
2257177Sutashiro #include <sys/user.h>
2357177Sutashiro #include <sys/ioctl.h>
2457177Sutashiro #include <sys/tty.h>
2557177Sutashiro #include <sys/map.h>
2657177Sutashiro #include <sys/buf.h>
2757177Sutashiro #include <sys/clist.h>
2857177Sutashiro #include <sys/file.h>
2957603Sutashiro #include "bm.h"
3053889Smckusick 
3157177Sutashiro #include <news3400/hbdev/rsreg.h>
3257177Sutashiro #include <news3400/sio/sccparam.h>
3353889Smckusick 
3453889Smckusick #define	CN_RXE		RXE
3553889Smckusick #define	CN_TXE		TXE
3653889Smckusick #define	CN_ON		(RXE|TXE|RTS|DTR)
3753889Smckusick #define	CN_OFF		0
3853889Smckusick #define	CN_RTS		RTS
3953889Smckusick #define	CN_DTR		DTR
4053889Smckusick #define	CN_CTS		CTS
4153889Smckusick #define	CN_DCD		DCD
4253889Smckusick #define	CN_DSR		DSR
4353889Smckusick #define	CN_RI		RI
4453889Smckusick #define	CN_BRK		XBREAK
4553889Smckusick 
4653889Smckusick /*
4753889Smckusick  * Local variables for the driver
4853889Smckusick  */
4953889Smckusick 
5053889Smckusick #define	splcons	spltty
5153889Smckusick 
5253889Smckusick char cn_active[1];
5353889Smckusick char cn_stopped[1];
5453889Smckusick struct tty cn_tty[1];
5553889Smckusick 
5653889Smckusick void	cnstart();
5753889Smckusick int	ttrstrt();
5853889Smckusick int	cnrint(), cnxint(), cnsint();
5953889Smckusick 
bmattach(i)6059999Sutashiro bmattach(i)
6159999Sutashiro {
6259999Sutashiro 	        /* temporary hack for pseudo-device initialization */;
6359999Sutashiro }
6459999Sutashiro 
6553889Smckusick /*
6653889Smckusick  * Open console. Turn on console if this is the first use of it.
6753889Smckusick  */
6853889Smckusick /*ARGSUSED*/
cnopen(dev,flag,mode,p)6953889Smckusick cnopen(dev, flag, mode, p)
7053889Smckusick 	dev_t dev;
7153889Smckusick 	int flag, mode;
7253889Smckusick 	struct proc *p;
7353889Smckusick {
7453889Smckusick 	register struct tty *tp = &cn_tty[0];
7553889Smckusick 
7653889Smckusick 	if (cn_active[0] == 0) {
7753889Smckusick 		if (cn_init() < 0)
7853889Smckusick 			return (ENXIO);
7953889Smckusick 		cn_enable();
8053889Smckusick 		cn_active[0] = 1;
8153889Smckusick 	}
8253889Smckusick 	if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0)
8353889Smckusick 		return (EBUSY);
8453889Smckusick 	tp->t_addr = (caddr_t)0;
8553889Smckusick 	tp->t_oproc = cnstart;
8653889Smckusick 	tp->t_state |= TS_WOPEN;
8753889Smckusick 	/*
8853889Smckusick 	 * If this is first open, initialze tty state to default.
8953889Smckusick 	 */
9053889Smckusick 	if ((tp->t_state & TS_ISOPEN) == 0) {
9153889Smckusick 		tp->t_state |= TS_WOPEN;
9253889Smckusick 		ttychars(tp);
9353889Smckusick 		if (tp->t_ispeed == 0) {
9453889Smckusick 			tp->t_iflag = TTYDEF_IFLAG;
9553889Smckusick 			tp->t_oflag = TTYDEF_OFLAG;
9653889Smckusick 			tp->t_cflag = TTYDEF_CFLAG;
9753889Smckusick 			tp->t_lflag = TTYDEF_LFLAG;
9853889Smckusick 			tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
9953889Smckusick 		}
10053889Smckusick 		cnparam(tp, &tp->t_termios);
10153889Smckusick 		ttsetwater(tp);
10253889Smckusick 	}
10353889Smckusick 	/*
10453889Smckusick 	 * Wait receiver and status interrupt
10553889Smckusick 	 */
10653889Smckusick 	(void) cnmctl(CN_ON, DMSET);
10753889Smckusick 	tp->t_state |= TS_CARR_ON;
10853889Smckusick 	return ((*linesw[tp->t_line].l_open)(dev, tp));
10953889Smckusick }
11053889Smckusick 
11153889Smckusick /*
11253889Smckusick  * Close console.
11353889Smckusick  */
11453889Smckusick /*ARGSUSED*/
cnclose(dev,flag)11553889Smckusick cnclose(dev, flag)
11653889Smckusick 	dev_t dev;
11753889Smckusick 	int flag;
11853889Smckusick {
11953889Smckusick 	register struct tty *tp = &cn_tty[0];
12053889Smckusick 
12153889Smckusick 	(*linesw[tp->t_line].l_close)(tp);
12253889Smckusick 	(void) cnmctl(CN_BRK, DMBIC);
12353889Smckusick 	ttyclose(tp);
12453889Smckusick 	return (0);
12553889Smckusick }
12653889Smckusick 
12753889Smckusick /*ARGSUSED*/
cnread(dev,uio,flag)12853889Smckusick cnread(dev, uio, flag)
12953889Smckusick 	dev_t dev;
13053889Smckusick 	struct uio *uio;
13153889Smckusick 	int flag;
13253889Smckusick {
13353889Smckusick 	register struct tty *tp = &cn_tty[0];
13453889Smckusick 
13553889Smckusick 	return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
13653889Smckusick }
13753889Smckusick 
13853889Smckusick /*ARGSUSED*/
cnwrite(dev,uio,flag)13953889Smckusick cnwrite(dev, uio, flag)
14053889Smckusick 	dev_t dev;
14153889Smckusick 	struct uio *uio;
14253889Smckusick 	int flag;
14353889Smckusick {
14453889Smckusick 	register struct tty *tp = &cn_tty[0];
14553889Smckusick 
14653889Smckusick 	return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
14753889Smckusick }
14853889Smckusick 
14953889Smckusick /*
15053889Smckusick  * console receiver interrupt.
15153889Smckusick  */
_cnrint(buf,n)15253889Smckusick _cnrint(buf, n)
15353889Smckusick 	register char *buf;
15453889Smckusick 	register int n;
15553889Smckusick {
15653889Smckusick 	register struct tty *tp = &cn_tty[0];
15753889Smckusick 	register int (*rint)();
15853889Smckusick 
15953889Smckusick 	if ((tp->t_state & TS_ISOPEN) == 0) {
16053889Smckusick 		wakeup((caddr_t)&tp->t_rawq);
16153889Smckusick 		cn_enable();
16253889Smckusick 		return;
16353889Smckusick 	}
16453889Smckusick 	/*
16553889Smckusick 	 * Loop fetching characters from the silo for console
16653889Smckusick 	 * until there are no more in the silo.
16753889Smckusick 	 */
16853889Smckusick 	rint = linesw[tp->t_line].l_rint;
16953889Smckusick 	while (--n >= 0)
17053889Smckusick 		(*rint)(*buf++, tp);
17153889Smckusick 	cn_enable();
17253889Smckusick }
17353889Smckusick 
17453889Smckusick /*
17553889Smckusick  * Ioctl for console.
17653889Smckusick  */
17753889Smckusick /*ARGSUSED*/
cnioctl(dev,cmd,data,flag)17853889Smckusick cnioctl(dev, cmd, data, flag)
17953889Smckusick 	dev_t dev;
18053889Smckusick 	caddr_t data;
18153889Smckusick {
18253889Smckusick 	register struct tty *tp = &cn_tty[0];
18353889Smckusick 	int error;
18453889Smckusick 
18553889Smckusick 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
18653889Smckusick 	if (error >= 0)
18753889Smckusick 		return (error);
18853889Smckusick 	error = ttioctl(tp, cmd, data, flag);
18953889Smckusick 	if (error >= 0)
19053889Smckusick 		return (error);
19153889Smckusick 
19253889Smckusick 	switch (cmd) {
19353889Smckusick 
19453889Smckusick 	case TIOCSBRK:
19553889Smckusick 		(void) cnmctl(CN_BRK, DMBIS);
19653889Smckusick 		break;
19753889Smckusick 
19853889Smckusick 	case TIOCCBRK:
19953889Smckusick 		(void) cnmctl(CN_BRK, DMBIC);
20053889Smckusick 		break;
20153889Smckusick 
20253889Smckusick 	case TIOCSDTR:
20353889Smckusick 		(void) cnmctl(CN_DTR|CN_RTS, DMBIS);
20453889Smckusick 		break;
20553889Smckusick 
20653889Smckusick 	case TIOCCDTR:
20753889Smckusick 		(void) cnmctl(CN_DTR|CN_RTS, DMBIC);
20853889Smckusick 		break;
20953889Smckusick 
21053889Smckusick 	case TIOCMSET:
21153889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMSET);
21253889Smckusick 		break;
21353889Smckusick 
21453889Smckusick 	case TIOCMBIS:
21553889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMBIS);
21653889Smckusick 		break;
21753889Smckusick 
21853889Smckusick 	case TIOCMBIC:
21953889Smckusick 		(void) cnmctl(dmtocn(*(int *)data), DMBIC);
22053889Smckusick 		break;
22153889Smckusick 
22253889Smckusick 	case TIOCMGET:
22353889Smckusick 		*(int *)data = cntodm(cnmctl(0, DMGET));
22453889Smckusick 		break;
22553889Smckusick 
22653889Smckusick 	default:
22753889Smckusick 		return (ENOTTY);
22853889Smckusick 	}
22953889Smckusick 	return (0);
23053889Smckusick }
23153889Smckusick 
dmtocn(bits)23253889Smckusick dmtocn(bits)
23353889Smckusick 	register int bits;
23453889Smckusick {
23553889Smckusick 	register int b;
23653889Smckusick 
23753889Smckusick 	b = 0;
23853889Smckusick 	if (bits & DML_LE)  b |= CN_TXE|CN_RXE;
23953889Smckusick 	if (bits & DML_DTR) b |= CN_DTR;
24053889Smckusick 	if (bits & DML_RTS) b |= CN_RTS;
24153889Smckusick 	if (bits & DML_CTS) b |= CN_CTS;
24253889Smckusick 	if (bits & DML_CAR) b |= CN_DCD;
24353889Smckusick 	if (bits & DML_RNG) b |= CN_RI;
24453889Smckusick 	if (bits & DML_DSR) b |= CN_DSR;
24553889Smckusick 	return(b);
24653889Smckusick }
24753889Smckusick 
cntodm(bits)24853889Smckusick cntodm(bits)
24953889Smckusick 	register int bits;
25053889Smckusick {
25153889Smckusick 	register int b;
25253889Smckusick 
25353889Smckusick 	b = 0;
25453889Smckusick 	if (bits & (CN_TXE|CN_RXE)) b |= DML_LE;
25553889Smckusick 	if (bits & CN_DTR) b |= DML_DTR;
25653889Smckusick 	if (bits & CN_RTS) b |= DML_RTS;
25753889Smckusick 	if (bits & CN_CTS) b |= DML_CTS;
25853889Smckusick 	if (bits & CN_DCD) b |= DML_CAR;
25953889Smckusick 	if (bits & CN_RI)  b |= DML_RNG;
26053889Smckusick 	if (bits & CN_DSR) b |= DML_DSR;
26153889Smckusick 	return(b);
26253889Smckusick }
26353889Smckusick 
26453889Smckusick /*
26553889Smckusick  * Set parameters from open or stty into the console hardware
26653889Smckusick  * registers.
26753889Smckusick  */
cnparam(tp,t)26853889Smckusick cnparam(tp, t)
26953889Smckusick 	register struct tty *tp;
27053889Smckusick 	register struct termios *t;
27153889Smckusick {
27253889Smckusick 	register int param;
27353889Smckusick 	register int cflag = t->c_cflag;
27453889Smckusick 	int s;
27553889Smckusick 
27653889Smckusick 	/*
27753889Smckusick 	 * Block interrupts so parameters will be set
27853889Smckusick 	 * before the line interrupts.
27953889Smckusick 	 */
28053889Smckusick 	s = splcons();
28153889Smckusick 	if ((tp->t_ispeed)==0) {
28253889Smckusick 		tp->t_cflag |= HUPCL;
28353889Smckusick 		(void) cnmctl(CN_OFF, DMSET);
28453889Smckusick 		(void) splx(s);
28553889Smckusick 		return;
28653889Smckusick 	}
28753889Smckusick 
28853889Smckusick 	param = cn_get_param() &
28953889Smckusick 		~(CHAR_SIZE|PARITY|EVEN|STOPBIT|BAUD_RATE|NOCHECK);
29053889Smckusick 	if ((cflag & CREAD) == 0)
29153889Smckusick 		param &= ~RXE;
29253889Smckusick 	switch (cflag & CSIZE) {
29353889Smckusick 	    case CS5: break;
29453889Smckusick 	    case CS6: param |= C6BIT; break;
29553889Smckusick 	    case CS7: param |= C7BIT; break;
29653889Smckusick 	    case CS8: param |= C8BIT; break;
29753889Smckusick 	}
29853889Smckusick 	if (cflag & PARENB)
29953889Smckusick 		param |= PARITY;
30053889Smckusick 	if ((cflag & PARODD) == 0)
30153889Smckusick 		param |= EVEN;
30253889Smckusick 	if ((tp->t_iflag & INPCK) == 0)
30353889Smckusick 		param |= NOCHECK;
30453889Smckusick 	if (cflag & CSTOPB)
30553889Smckusick 		param |= STOP2;
30653889Smckusick 	else
30753889Smckusick 		param |= STOP1;
30853889Smckusick 	cn_set_param(param);
30953889Smckusick 	(void) splx(s);
31053889Smckusick }
31153889Smckusick 
31253889Smckusick /*
31353889Smckusick  * console transmitter interrupt.
31453889Smckusick  * Restart the idle line.
31553889Smckusick  */
_cnxint(count)31653889Smckusick _cnxint(count)
31753889Smckusick 	int count;
31853889Smckusick {
31953889Smckusick 	register struct tty *tp = &cn_tty[0];
32053889Smckusick 	int s;
32153889Smckusick 
32253889Smckusick 	cn_stopped[0] = 0;
32353889Smckusick 	tp->t_state &= ~TS_BUSY;
32453889Smckusick 	s = splcons();
32553889Smckusick 	if (tp->t_state & TS_FLUSH)
32653889Smckusick 		tp->t_state &= ~TS_FLUSH;
32753889Smckusick 	else
32853889Smckusick 		ndflush(&tp->t_outq, count);
32953889Smckusick 	(void) splx(s);
33053889Smckusick 	if (tp->t_line)
33153889Smckusick 		(*linesw[tp->t_line].l_start)(tp);
33253889Smckusick 	else
33353889Smckusick 		cnstart(tp);
33453889Smckusick }
33553889Smckusick 
33653889Smckusick /*
33753889Smckusick  * Start (restart) transmission on the console.
33853889Smckusick  */
33953889Smckusick void
cnstart(tp)34053889Smckusick cnstart(tp)
34153889Smckusick 	register struct tty *tp;
34253889Smckusick {
34353889Smckusick 	register int nch;
34453889Smckusick 	int s;
34553889Smckusick 
34653889Smckusick 	/*
34753889Smckusick 	 * Must hold interrupts in following code to prevent
34853889Smckusick 	 * state of the tp from changing.
34953889Smckusick 	 */
35053889Smckusick 	s = splcons();
35153889Smckusick 	/*
35253889Smckusick 	 * If it's currently active, or delaying, no need to do anything.
35353889Smckusick 	 */
35453889Smckusick 	if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))
35553889Smckusick 		goto out;
35653889Smckusick 	/*
35753889Smckusick 	 * If ther are still characters in the IOP,
35853889Smckusick 	 * just reenable transmit.
35953889Smckusick 	 */
36053889Smckusick 	if (cn_stopped[0]) {
36153889Smckusick 		cn_stopped[0] = 0;
36253889Smckusick 		cn_start();
36353889Smckusick 		goto out;
36453889Smckusick 	}
36553889Smckusick 	/*
36653889Smckusick 	 * If there are sleepers, and output has drained below low
36753889Smckusick 	 * water mark, wake up the sleepers.
36853889Smckusick 	 */
36953889Smckusick 	if (tp->t_outq.c_cc <= tp->t_lowat) {
37053889Smckusick 		if (tp->t_state & TS_ASLEEP) {
37153889Smckusick 			tp->t_state &= ~TS_ASLEEP;
37253889Smckusick 			wakeup((caddr_t)&tp->t_outq);
37353889Smckusick 		}
37453889Smckusick 		selwakeup(&tp->t_wsel);
37553889Smckusick 	}
37653889Smckusick 	/*
37753889Smckusick 	 * Now restart transmission unless the output queue is
37853889Smckusick 	 * empty.
37953889Smckusick 	 */
38053889Smckusick 	if (tp->t_outq.c_cc == 0)
38153889Smckusick 		goto out;
38253889Smckusick 	if (tp->t_flags & (RAW|LITOUT))
38353889Smckusick 		nch = ndqb(&tp->t_outq, 0);
38453889Smckusick 	else {
38553889Smckusick 		nch = ndqb(&tp->t_outq, 0200);
38653889Smckusick 		/*
38753889Smckusick 		 * If first thing on queue is a delay process it.
38853889Smckusick 		 */
38953889Smckusick 		if (nch == 0) {
39053889Smckusick 			nch = getc(&tp->t_outq);
39153889Smckusick 			timeout(ttrstrt, (caddr_t)tp, (nch&0x7f)+6);
39253889Smckusick 			tp->t_state |= TS_TIMEOUT;
39353889Smckusick 			goto out;
39453889Smckusick 		}
39553889Smckusick 	}
39653889Smckusick 	/*
39753889Smckusick 	 * If characters to transmit, restart transmission.
39853889Smckusick 	 */
39953889Smckusick 	if (nch) {
40053889Smckusick 		tp->t_state |= TS_BUSY;
40153889Smckusick 		cn_output(tp, nch);
40253889Smckusick 	}
40353889Smckusick out:
40453889Smckusick 	(void) splx(s);
40553889Smckusick }
40653889Smckusick 
40753889Smckusick /*
40853889Smckusick  * Stop output on a line, e.g. for ^S/^Q or output flush.
40953889Smckusick  */
41053889Smckusick /*ARGSUSED*/
cnstop(tp,flag)41153889Smckusick cnstop(tp, flag)
41253889Smckusick 	register struct tty *tp;
41353889Smckusick {
41453889Smckusick 	register int s;
41553889Smckusick 
41653889Smckusick 	/*
41753889Smckusick 	 * Block input/output interrupts while messing with state.
41853889Smckusick 	 */
41953889Smckusick 	s = splcons();
42053889Smckusick 	if (tp->t_state & TS_BUSY) {
42153889Smckusick 		cn_stop(0);
42253889Smckusick 		cn_stopped[0] = 1;
42353889Smckusick 		if ((tp->t_state & TS_TTSTOP) == 0) {
42453889Smckusick 			tp->t_state |= TS_FLUSH;
42553889Smckusick 			cn_stop(1);
42653889Smckusick 		}
42753889Smckusick 	}
42853889Smckusick 	(void) splx(s);
42953889Smckusick }
43053889Smckusick 
43153889Smckusick /*
43253889Smckusick  * console modem control
43353889Smckusick  */
cnmctl(bits,how)43453889Smckusick cnmctl(bits, how)
43553889Smckusick 	int bits, how;
43653889Smckusick {
43753889Smckusick 	register int mbits;
43853889Smckusick 	int s;
43953889Smckusick 
44053889Smckusick 	bits &= (RXE|TXE|RTS|DTR|XBREAK);
44153889Smckusick 
44253889Smckusick 	s = splcons();
44353889Smckusick 
44453889Smckusick 	mbits = cn_get_param();
44553889Smckusick 	switch (how) {
44653889Smckusick 	case DMSET:
44753889Smckusick 		mbits = mbits & ~(RXE|TXE|RTS|DTR|XBREAK) | bits;
44853889Smckusick 		break;
44953889Smckusick 
45053889Smckusick 	case DMBIS:
45153889Smckusick 		mbits |= bits;
45253889Smckusick 		break;
45353889Smckusick 
45453889Smckusick 	case DMBIC:
45553889Smckusick 		mbits &= ~bits;
45653889Smckusick 		break;
45753889Smckusick 
45853889Smckusick 	case DMGET:
45953889Smckusick 		(void) splx(s);
46053889Smckusick 		return(mbits);
46153889Smckusick 	}
46253889Smckusick 	cn_set_param(mbits);
46353889Smckusick 
46453889Smckusick 	(void) splx(s);
46553889Smckusick 	return(mbits);
46653889Smckusick }
46753889Smckusick 
46853889Smckusick /*
46953889Smckusick  * console status interrupt
47053889Smckusick  */
_cnsint(stat)47153889Smckusick _cnsint(stat)
47253889Smckusick 	int stat;
47353889Smckusick {
47453889Smckusick 	register struct tty *tp = &cn_tty[0];
47553889Smckusick 
47653889Smckusick 	if (stat & OVERRUN_ERROR)
47753889Smckusick 		printf("console: fifo overflow\n");
47853889Smckusick 	if (stat & RBREAK)
47953889Smckusick 		(*linesw[tp->t_line].l_rint)
48053889Smckusick 		    (tp->t_flags & RAW ? '\0' : tp->t_cc[VINTR], tp);
48153889Smckusick }
48253889Smckusick 
48353889Smckusick /*
48453889Smckusick  * console control interrupt
48553889Smckusick  */
cncint()48653889Smckusick cncint()
48753889Smckusick {
48853889Smckusick 	printf("cncint:\n");
48953889Smckusick }
49053889Smckusick 
49153889Smckusick /*
49253889Smckusick  * Machine dependent functions
49353889Smckusick  *
49453889Smckusick  *	cn_init()
49553889Smckusick  *	cnrint()
49653889Smckusick  *	cnxint()
49753889Smckusick  *	cnsint()
49853889Smckusick  *	cn_enable()
49953889Smckusick  *	cn_output()
50053889Smckusick  *	cn_start()
50153889Smckusick  *	cn_stop()
50253889Smckusick  *	cn_get_param()
50353889Smckusick  *	cn_set_param()
50453889Smckusick  */
50553889Smckusick #ifdef IPC_MRX
50657177Sutashiro #include <news3400/newsipc/newsipc.h>
50757177Sutashiro #include <news3400/mrx/h/cio.h>
50857177Sutashiro #include <news3400/mrx/h/console.h>
50953889Smckusick 
51053889Smckusick #ifdef mips
51153889Smckusick #define ipc_phys(x)	K0_TT0(x)
51253889Smckusick #define ipc_log(x)	TT0_K0(x)
51353889Smckusick #else
51453889Smckusick #define ipc_phys(x)	(caddr_t)((int)(x) & ~0x80000000)
51553889Smckusick #define ipc_log(x)	(caddr_t)((int)(x) | 0x80000000)
51653889Smckusick #endif
51753889Smckusick 
51853889Smckusick #if NBM > 0
51953889Smckusick extern char *ext_fnt_addr[];
52053889Smckusick extern char *ext_fnt24_addr[];
52153889Smckusick #endif /* NBM > 0 */
52253889Smckusick 
52353889Smckusick int	port_cnrecv;
52453889Smckusick int	port_cnxmit;
52553889Smckusick int	port_cnstat;
52653889Smckusick int	port_cnctrl;
52753889Smckusick int	port_cnfont;
52853889Smckusick int	port_cnrecv_iop;
52953889Smckusick int	port_cnxmit_iop;
53053889Smckusick int	port_cnstat_iop;
53153889Smckusick int	port_cnctrl_iop;
53253889Smckusick 
53353889Smckusick int	cnfont();
53453889Smckusick 
cn_init()53553889Smckusick cn_init()
53653889Smckusick {
53753889Smckusick 	struct cons_ctrl_req req;
53853889Smckusick 	int *reply;
53953889Smckusick 
54053889Smckusick 	port_cnrecv = port_create("@cnrecv", cnrint, -1);
54153889Smckusick 	port_cnxmit = port_create("@cnxmit", cnxint, -1);
54253889Smckusick 	port_cnctrl = port_create("@cnctrl", NULL, 0);
54353889Smckusick 	port_cnstat = port_create("@cnstat", cnsint, -1);
54453889Smckusick 	port_cnfont = port_create("@cnfont", cnfont, -1);
54553889Smckusick 
54653889Smckusick 	/* use NULL action port */
54753889Smckusick 	port_cnrecv_iop = object_query("cons_input");
54853889Smckusick 	port_cnxmit_iop = object_query("cons_output");
54953889Smckusick 	port_cnctrl_iop = object_query("cons_ctrl");
55053889Smckusick 	port_cnstat_iop = object_query("cons_stat");
55153889Smckusick 	req.cons_func = CIO_ASKDEVICE;
55253889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
55353889Smckusick 	msg_recv(port_cnctrl, NULL, &reply, NULL, 0);
55453889Smckusick 	tty00_is_console = *reply;
55553889Smckusick 	msg_free(port_cnctrl);
55653889Smckusick #if NBM > 0
55753889Smckusick 	req.cons_func = CIO_SET16FNT;
55853889Smckusick 	req.cons_addr = (char *)ipc_phys(ext_fnt_addr);
55953889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
56053889Smckusick 	msg_recv(port_cnctrl, NULL, NULL, NULL, 0);
56153889Smckusick 	req.cons_func = CIO_SET24FNT;
56253889Smckusick 	req.cons_addr = (char *)ipc_phys(ext_fnt24_addr);
56353889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, sizeof(req), 0);
56453889Smckusick 	msg_recv(port_cnctrl, NULL, NULL, NULL, 0);
56553889Smckusick #endif
56653889Smckusick 	return (0);
56753889Smckusick }
56853889Smckusick 
cn_enable()56953889Smckusick cn_enable()
57053889Smckusick {
57153889Smckusick 	int len;
57253889Smckusick 
57353889Smckusick 	len = MAX_CIO;
57453889Smckusick 	msg_send(port_cnrecv_iop, port_cnrecv, &len, sizeof(len), 0);
57553889Smckusick }
57653889Smckusick 
cnrint(port)57753889Smckusick cnrint(port)
57853889Smckusick 	int port;
57953889Smckusick {
58053889Smckusick 	int len;
58153889Smckusick 	char *buf;
58253889Smckusick 
58353889Smckusick 	msg_recv(port, NULL, &buf, &len, 0);
58453889Smckusick #ifdef mips
58553889Smckusick 	_cnrint((char *)MACH_CACHED_TO_UNCACHED(buf), len);
58653889Smckusick #else
58753889Smckusick 	dcia();
58853889Smckusick 	_cnrint(buf, len);
58953889Smckusick #endif
59053889Smckusick 	msg_free(port);
59153889Smckusick }
59253889Smckusick 
cnxint(port)59353889Smckusick cnxint(port)
59453889Smckusick 	int port;
59553889Smckusick {
59653889Smckusick 	int *len;
59753889Smckusick 
59853889Smckusick 	msg_recv(port, NULL, &len, NULL, 0);
59953889Smckusick 	_cnxint(*len);
60053889Smckusick }
60153889Smckusick 
cn_start()60253889Smckusick cn_start()
60353889Smckusick {
60453889Smckusick 	int func;
60553889Smckusick 
60653889Smckusick 	func = CIO_START;
60753889Smckusick 	msg_send(port_cnctrl_iop, 0, &func, sizeof(func), 0);
60853889Smckusick }
60953889Smckusick 
61053889Smckusick cn_output(tp, n)
61153889Smckusick 	struct tty *tp;
61253889Smckusick 	int n;
61353889Smckusick {
61453889Smckusick 
61553889Smckusick 	msg_send(port_cnxmit_iop, port_cnxmit, tp->t_outq.c_cf,
61655762Sbostic 	    min(n, MAX_CIO), 0);
61753889Smckusick }
61853889Smckusick 
cn_stop(flush)61953889Smckusick cn_stop(flush)
62053889Smckusick 	int flush;
62153889Smckusick {
62253889Smckusick 	int	func;
62353889Smckusick 
62453889Smckusick 	func = flush ? CIO_FLUSH : CIO_STOP;
62553889Smckusick 	msg_send(port_cnctrl_iop, 0, &func, sizeof(func), 0);
62653889Smckusick }
62753889Smckusick 
cnsint(port)62853889Smckusick cnsint(port)
62953889Smckusick 	int port;
63053889Smckusick {
63153889Smckusick 	int *stat;
63253889Smckusick 
63353889Smckusick 	msg_recv(port, NULL, &stat, NULL, 0);
63453889Smckusick 	_cnsint(*stat);
63553889Smckusick 	msg_send(port_cnstat_iop, port_cnstat, NULL, 0, 0);
63653889Smckusick }
63753889Smckusick 
cn_get_param()63853889Smckusick cn_get_param()
63953889Smckusick {
64053889Smckusick 	struct cons_ctrl_req req;
64153889Smckusick 	int *reply, param;
64253889Smckusick 
64353889Smckusick 	req.cons_func = CIO_GETPARAMS;
64453889Smckusick 	/* message length 8 means 2 * sizeof(int) : func and status */
64553889Smckusick 	msg_send(port_cnctrl_iop, port_cnctrl, &req, 8, 0);
64653889Smckusick 	msg_recv(port_cnctrl, NULL, &reply, NULL, 0);
64753889Smckusick 	param = *reply;
64853889Smckusick 	msg_free(port_cnctrl);
64953889Smckusick 
65053889Smckusick 	return (param);
65153889Smckusick }
65253889Smckusick 
cn_set_param(param)65353889Smckusick cn_set_param(param)
65453889Smckusick 	int param;
65553889Smckusick {
65653889Smckusick 	struct cons_ctrl_req req;
65753889Smckusick 
65853889Smckusick 	req.cons_func = CIO_SETPARAMS;
65953889Smckusick 	req.cons_status = param;
66053889Smckusick 
66153889Smckusick 	/* message length 8 means 2 * sizeof(int) : func and status */
66253889Smckusick 	msg_send(port_cnctrl_iop, 0, &req, 8, 0);
66353889Smckusick }
66453889Smckusick 
cnfont(port)66553889Smckusick cnfont(port)
66653889Smckusick 	int port;
66753889Smckusick {
66853889Smckusick 	int *func;
66953889Smckusick 
67053889Smckusick 	msg_recv(port, NULL, &func, NULL, 0);
67153889Smckusick #if NBM > 0
67253889Smckusick 	switch (*func) {
67353889Smckusick 
67453889Smckusick 	case FONT_JISROMAN:
67553889Smckusick 		font_jisroman();
67653889Smckusick 		font_jisroman24();
67753889Smckusick 		break;
67853889Smckusick 
67953889Smckusick 	case FONT_ASCII:
68053889Smckusick 		font_ascii();
68153889Smckusick 		font_ascii24();
68253889Smckusick 		break;
68353889Smckusick 	}
68453889Smckusick #endif /* NBM > 0 */
68553889Smckusick 	msg_free(port);
68653889Smckusick }
68753889Smckusick #endif /* IPC_MRX */
68853889Smckusick 
68953889Smckusick #ifdef CPU_SINGLE
69057177Sutashiro #include <news3400/hbdev/rsreg.h>
69157177Sutashiro #include <news3400/iop/framebuf.h>
69257177Sutashiro #include <news3400/fb/fbdefs.h>
69353889Smckusick 
69453889Smckusick int lastcount;
69553889Smckusick int start_dimmer = 1;
69653889Smckusick 
cn_init()69753889Smckusick cn_init()
69853889Smckusick {
69953889Smckusick 
70053889Smckusick 	if (start_dimmer) {
70153889Smckusick 		auto_dimmer();
70253889Smckusick 		start_dimmer = 0;
70353889Smckusick 	}
70453889Smckusick 	return (0);
70553889Smckusick }
70653889Smckusick 
cn_enable()70753889Smckusick cn_enable()
70853889Smckusick {
70953889Smckusick 
71053889Smckusick 	/* nothing to do */
71153889Smckusick }
71253889Smckusick 
cnrint(code)71353889Smckusick cnrint(code)
71453889Smckusick 	char code;
71553889Smckusick {
71653889Smckusick 
71753889Smckusick 	_cnrint(&code, 1);
71853889Smckusick }
71953889Smckusick 
cnxint()72053889Smckusick cnxint()
72153889Smckusick {
72253889Smckusick 
72353889Smckusick 	_cnxint(lastcount);
72453889Smckusick }
72553889Smckusick 
cn_start()72653889Smckusick cn_start()
72753889Smckusick {
72853889Smckusick 
72953889Smckusick 	/* nothing to do */
73053889Smckusick }
73153889Smckusick 
73253889Smckusick cn_output(tp, n)
73353889Smckusick 	struct tty *tp;
73453889Smckusick 	int n;
73553889Smckusick {
73653889Smckusick 
73753889Smckusick 	lastcount = vt100_write(0, tp->t_outq.c_cf, n);
73853889Smckusick 	cnxint();
73953889Smckusick }
74053889Smckusick 
cn_stop(flush)74153889Smckusick cn_stop(flush)
74253889Smckusick 	int flush;
74353889Smckusick {
74453889Smckusick 
74553889Smckusick 	/* nothing to do */
74653889Smckusick }
74753889Smckusick 
cnsint(param)74853889Smckusick cnsint(param)
74953889Smckusick 	int param;
75053889Smckusick {
75153889Smckusick 
75253889Smckusick 	_cnsint(param);
75353889Smckusick }
75453889Smckusick 
cn_get_param()75553889Smckusick cn_get_param()
75653889Smckusick {
75753889Smckusick 
75853889Smckusick 	return (bitmap_get_param());
75953889Smckusick }
76053889Smckusick 
cn_set_param(param)76153889Smckusick cn_set_param(param)
76253889Smckusick 	int param;
76353889Smckusick {
76453889Smckusick 
76553889Smckusick 	bitmap_set_param(param);
76653889Smckusick }
76753889Smckusick #endif /* CPU_SINGLE */
768