From: Bill Joy Date: Sun, 19 Oct 1980 14:27:46 +0000 (-0800) Subject: BSD 4 development X-Git-Tag: BSD-4~123 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/49e676ef4020ed8076fd9229aa9997799a77a5b1?ds=inline;hp=94487c26670d621584807bc90262598af267141a BSD 4 development Work on file usr/src/sys/newdev/kl.c Synthesized-from: CSRG//cd1/4.0 --- diff --git a/usr/src/sys/newdev/kl.c b/usr/src/sys/newdev/kl.c new file mode 100644 index 0000000000..dd5cf8228b --- /dev/null +++ b/usr/src/sys/newdev/kl.c @@ -0,0 +1,164 @@ +/* %M% %I% %G% */ + +/* + * KL/DL-11 driver + */ +#include "../h/param.h" +#include "../h/conf.h" +#include "../h/dir.h" +#include "../h/user.h" +#include "../h/tty.h" +#include "../h/systm.h" +#include "../h/map.h" +#include "../h/pte.h" +#include "../h/uba.h" + +/* base address */ +#define KLBASE ((struct device *)(UBA0_DEV+0176500)) /* kl and dl11-a */ +#define DLBASE ((struct device *)(UBA0_DEV+0175610)) /* dl-e */ +#define NKL11 8 +#define NDL11 0 +#define DSRDY 02 +#define RDRENB 01 +#define DLDELAY 4 /* Extra delay for DL's (double buff) */ + +#define NL1 000400 +#define NL2 001000 +#define CR2 020000 +#define FF1 040000 +#define TAB1 002000 + +struct tty kl_tty[NKL11+NDL11]; +int klstart(); +int ttrstrt(); +char partab[]; + +struct device { + short rcsr; + short rbuf; + short tcsr; + short tbuf; +}; + +/*ARGSUSED*/ +klopen(dev, flag) +dev_t dev; +{ + register struct device *addr; + register struct tty *tp; + register d; + + d = minor(dev); + if(d >= NKL11+NDL11) { + u.u_error = ENXIO; + return; + } + tp = &kl_tty[d]; + /* + * set up minor 0 thru NKL11-1 to address from KLBASE + * set up minor NKL11 on to address from DLBASE + */ + if(dt_addr = (caddr_t)addr; + tp->t_oproc = klstart; + if ((tp->t_state&ISOPEN) == 0) { + tp->t_state = ISOPEN|CARR_ON; + tp->t_flags = EVENP|LCASE|ECHO|XTABS|CRMOD|CR2; + ttychars(tp); + } + addr->rcsr |= IENABLE|DSRDY|RDRENB; + addr->tcsr |= IENABLE; + (*linesw[tp->t_line].l_open)(dev, tp); +} + +klclose(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &kl_tty[minor(dev)]; + (*linesw[tp->t_line].l_close)(tp); + ttyclose(tp); +} + +klread(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &kl_tty[minor(dev)]; + (*linesw[tp->t_line].l_read)(tp); +} + +klwrite(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &kl_tty[minor(dev)]; + (*linesw[tp->t_line].l_write)(tp); +} + +klxint(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &kl_tty[minor(dev)]; + if (tp->t_line) + (*linesw[tp->t_line].l_start)(tp); + else + ttstart(tp); + if ((tp->t_state&ASLEEP) && tp->t_outq.c_cc<=TTLOWAT(tp)) + if (tp->t_chan) + mcstart(tp->t_chan, (caddr_t)&tp->t_outq); + else + wakeup((caddr_t)&tp->t_outq); +} + +klrint(dev) +dev_t dev; +{ + register int c; + register struct device *addr; + register struct tty *tp; + + tp = &kl_tty[minor(dev)]; + addr = (struct device *)tp->t_addr; + c = addr->rbuf; + addr->rcsr |= RDRENB; + (*linesw[tp->t_line].l_rint)(c, tp); +} + +/*ARGSUSED*/ +klioctl(dev, cmd, addr, flag) +caddr_t addr; +dev_t dev; +{ + if (ttioccomm(cmd, &kl_tty[minor(dev)], addr, dev, flag)==0) + u.u_error = ENOTTY; +} + +klstart(tp) +register struct tty *tp; +{ + register c; + register struct device *addr; + + addr = (struct device *)tp->t_addr; + if ((addr->tcsr&DONE) == 0) + return; + if ((c=getc(&tp->t_outq)) >= 0) { + if (tp->t_flags&RAW) + addr->tbuf = c; + else if (c<=0177) + addr->tbuf = c | (partab[c]&0200); + else { + timeout(ttrstrt, (caddr_t)tp, (c&0177) + DLDELAY); + tp->t_state |= TIMEOUT; + } + } +}