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