153984Sfujita /* 253984Sfujita * Copyright (c) 1988 University of Utah. 353984Sfujita * Copyright (c) 1992 OMRON Corporation. 453984Sfujita * Copyright (c) 1990, 1992 The Regents of the University of California. 553984Sfujita * All rights reserved. 653984Sfujita * 753984Sfujita * This code is derived from software contributed to Berkeley by 853984Sfujita * the Systems Programming Group of the University of Utah Computer 953984Sfujita * Science Department. 1053984Sfujita * 1153984Sfujita * %sccs.include.redist.c% 1253984Sfujita * 1353984Sfujita * from: Utah $Hdr: cons.c 1.1 90/07/09$ 1453984Sfujita * 1553984Sfujita * from: hp300/hp300/cons.c 7.1 (Berkeley) 6/4/92 1653984Sfujita * 17*56521Sbostic * @(#)cons.c 7.2 (Berkeley) 10/11/92 1853984Sfujita */ 1953984Sfujita 20*56521Sbostic #include <sys/param.h> 21*56521Sbostic #include <sys/proc.h> 22*56521Sbostic #include <sys/systm.h> 23*56521Sbostic #include <sys/buf.h> 24*56521Sbostic #include <sys/ioctl.h> 25*56521Sbostic #include <sys/tty.h> 26*56521Sbostic #include <sys/file.h> 27*56521Sbostic #include <sys/conf.h> 2853984Sfujita 29*56521Sbostic #include <luna68k/luna68k/cons.h> 3053984Sfujita 3153984Sfujita /* XXX - all this could be autoconfig()ed */ 3253984Sfujita #include "sio.h" 3353984Sfujita #if NSIO > 0 3453984Sfujita int siocnprobe(), siocninit(), siocngetc(), siocnputc(); 3553984Sfujita #endif 3653984Sfujita 3753984Sfujita struct consdev constab[] = { 3853984Sfujita #if NSIO > 0 3953984Sfujita { siocnprobe, siocninit, siocngetc, siocnputc }, 4053984Sfujita #endif 4153984Sfujita { 0 }, 4253984Sfujita }; 4353984Sfujita /* end XXX */ 4453984Sfujita 4553984Sfujita struct tty *constty = 0; /* virtual console output device */ 4653984Sfujita struct consdev *cn_tab; /* physical console device info */ 4753984Sfujita struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 4853984Sfujita 4953984Sfujita cninit() 5053984Sfujita { 5153984Sfujita register struct consdev *cp; 5253984Sfujita 5353984Sfujita /* 5453984Sfujita * Collect information about all possible consoles 5553984Sfujita * and find the one with highest priority 5653984Sfujita */ 5753984Sfujita for (cp = constab; cp->cn_probe; cp++) { 5853984Sfujita (*cp->cn_probe)(cp); 5953984Sfujita if (cp->cn_pri > CN_DEAD && 6053984Sfujita (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 6153984Sfujita cn_tab = cp; 6253984Sfujita } 6353984Sfujita /* 6453984Sfujita * No console, we can handle it 6553984Sfujita */ 6653984Sfujita if ((cp = cn_tab) == NULL) 6753984Sfujita return; 6853984Sfujita /* 6953984Sfujita * Turn on console 7053984Sfujita */ 7153984Sfujita cn_tty = cp->cn_tp; 7253984Sfujita (*cp->cn_init)(cp); 7353984Sfujita } 7453984Sfujita 7553984Sfujita cnopen(dev, flag, mode, p) 7653984Sfujita dev_t dev; 7753984Sfujita int flag, mode; 7853984Sfujita struct proc *p; 7953984Sfujita { 8053984Sfujita if (cn_tab == NULL) 8153984Sfujita return (0); 8253984Sfujita dev = cn_tab->cn_dev; 8353984Sfujita return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 8453984Sfujita } 8553984Sfujita 8653984Sfujita cnclose(dev, flag, mode, p) 8753984Sfujita dev_t dev; 8853984Sfujita int flag, mode; 8953984Sfujita struct proc *p; 9053984Sfujita { 9153984Sfujita if (cn_tab == NULL) 9253984Sfujita return (0); 9353984Sfujita dev = cn_tab->cn_dev; 9453984Sfujita return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 9553984Sfujita } 9653984Sfujita 9753984Sfujita cnread(dev, uio, flag) 9853984Sfujita dev_t dev; 9953984Sfujita struct uio *uio; 10053984Sfujita { 10153984Sfujita if (cn_tab == NULL) 10253984Sfujita return (0); 10353984Sfujita dev = cn_tab->cn_dev; 10453984Sfujita return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 10553984Sfujita } 10653984Sfujita 10753984Sfujita cnwrite(dev, uio, flag) 10853984Sfujita dev_t dev; 10953984Sfujita struct uio *uio; 11053984Sfujita { 11153984Sfujita if (cn_tab == NULL) 11253984Sfujita return (0); 11353984Sfujita dev = cn_tab->cn_dev; 11453984Sfujita return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 11553984Sfujita } 11653984Sfujita 11753984Sfujita cnioctl(dev, cmd, data, flag, p) 11853984Sfujita dev_t dev; 11953984Sfujita caddr_t data; 12053984Sfujita struct proc *p; 12153984Sfujita { 12253984Sfujita int error; 12353984Sfujita 12453984Sfujita if (cn_tab == NULL) 12553984Sfujita return (0); 12653984Sfujita /* 12753984Sfujita * Superuser can always use this to wrest control of console 12853984Sfujita * output from the "virtual" console. 12953984Sfujita */ 13053984Sfujita if (cmd == TIOCCONS && constty) { 13153984Sfujita error = suser(p->p_ucred, (u_short *) NULL); 13253984Sfujita if (error) 13353984Sfujita return (error); 13453984Sfujita constty = NULL; 13553984Sfujita return (0); 13653984Sfujita } 13753984Sfujita dev = cn_tab->cn_dev; 13853984Sfujita return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 13953984Sfujita } 14053984Sfujita 14153984Sfujita /*ARGSUSED*/ 14253984Sfujita cnselect(dev, rw, p) 14353984Sfujita dev_t dev; 14453984Sfujita int rw; 14553984Sfujita struct proc *p; 14653984Sfujita { 14753984Sfujita if (cn_tab == NULL) 14853984Sfujita return (1); 14953984Sfujita return (ttselect(cn_tab->cn_dev, rw, p)); 15053984Sfujita } 15153984Sfujita 15253984Sfujita cngetc() 15353984Sfujita { 15453984Sfujita if (cn_tab == NULL) 15553984Sfujita return (0); 15653984Sfujita return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 15753984Sfujita } 15853984Sfujita 15953984Sfujita cnputc(c) 16053984Sfujita register int c; 16153984Sfujita { 16253984Sfujita if (cn_tab == NULL) 16353984Sfujita return; 16453984Sfujita if (c) { 16553984Sfujita (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 16653984Sfujita if (c == '\n') 16753984Sfujita (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 16853984Sfujita } 16953984Sfujita } 170