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