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