?? dc.c
字號:
#include "../h/param.h"#include "../h/conf.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/tty.h"#include "../h/systm.h"/* * Base address of DC-11's. Minor device i is at * DCADDR + 10*i. */#define DCADDR (struct device *)0174000/* * Number of DC's for which table space is allocated. */#define NDC11 4/* * Control bits in device registers */#define CDLEAD 01#define CARRIER 04#define SPEED1 010#define STOP1 0400#define RQSEND 01#define PARITY 040#define ERROR 0100000#define CTRANS 040000#define RINGIND 020000struct tty dc11[NDC11];struct device { int dcrcsr; int dcrbuf; int dctcsr; int dctbuf;};/* * Input-side speed and control bit table. * Each DC11 has 4 speeds which correspond to the 4 non-zero entries. * The table index is the same as the speed-selector * number for the DH11. * Attempts to set the speed to a zero entry are ignored. */int dcrstab[] = { 0, /* 0 baud */ 0, /* 50 baud */ 0, /* 75 baud */ 0, /* 110 baud */ 01101, /* 134.5 baud: 7b/ch, speed 0 */ 0111, /* 150 baud: 8b/ch, speed 1 */ 0, /* 200 baud */ 0121, /* 300 baud: 8b/ch, speed 2 */ 0, /* 600 baud */ 0131, /* 1200 baud */ 0, /* 1800 baud */ 0, /* 2400 baud */ 0, /* 4800 baud */ 0, /* 9600 baud */ 0, /* X0 */ 0, /* X1 */};/* * Transmitter speed table */int dctstab[] = { 0, /* 0 baud */ 0, /* 50 baud */ 0, /* 75 baud */ 0, /* 110 baud */ 0501, /* 134.5 baud: stop 1 */ 0511, /* 150 baud */ 0, /* 200 baud */ 0521, /* 300 baud */ 0, /* 600 baud */ 0531, /* 1200 baud */ 0, /* 1800 baud */ 0, /* 2400 baud */ 0, /* 4800 baud */ 0, /* 9600 baud */ 0, /* X0 */ 0, /* X1 */};/* * Open a DC11, waiting until carrier is established. * Default initial conditions are set up on the first open. * t_state's CARR_ON bit is a pure copy of the hardware * CARRIER bit, and is only used to regularize * carrier tests in general tty routines. */dcopen(dev, flag)dev_t dev;{ register struct tty *tp; register struct device *addr; extern int klstart(); int s; if (minor(dev) >= NDC11) { u.u_error = ENXIO; return; } tp = &dc11[minor(dev)]; addr = DCADDR + minor(dev); tp->t_addr = (caddr_t)addr; tp->t_state |= WOPEN; s = spl5(); addr->dcrcsr |= IENABLE|CDLEAD; if ((tp->t_state&ISOPEN) == 0) { tp->t_erase = CERASE; tp->t_kill = CKILL; addr->dcrcsr = IENABLE|CDLEAD|SPEED1; addr->dctcsr = IENABLE|SPEED1|STOP1|RQSEND; tp->t_state = ISOPEN | WOPEN; tp->t_flags = ODDP|EVENP|ECHO; tp->t_oproc = klstart; } if (addr->dcrcsr & CARRIER) tp->t_state |= CARR_ON; splx(s); while ((tp->t_state & CARR_ON) == 0) sleep((caddr_t)&tp->t_rawq, TTIPRI); ttyopen(dev, tp);}/* * Close a dc11 */dcclose(dev)dev_t dev;{ register struct tty *tp; tp = &dc11[minor(dev)]; if (tp->t_state&HUPCLS) ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD; ttyclose(tp);}/* * Read a DC11 */dcread(dev)dev_t dev;{ ttread(&dc11[minor(dev)]);}/* * Write a DC11 */dcwrite(dev)dev_t dev;{ ttwrite(&dc11[minor(dev)]);}/* * DC11 transmitter interrupt. */dcxint(dev)dev_t dev;{ register struct tty *tp; tp = &dc11[minor(dev)]; ttstart(tp); if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT) wakeup((caddr_t)&tp->t_outq);}/* * DC11 receiver interrupt. */dcrint(dev)dev_t dev;{ register struct tty *tp; register int c, csr; tp = &dc11[minor(dev)]; c = ((struct device *)(tp->t_addr))->dcrbuf; /* * If carrier is off, and an open is not in progress, * knock down the CD lead to hang up the local dataset * and signal a hangup. */ if (((csr = ((struct device *)(tp->t_addr))->dcrcsr) & CARRIER) == 0) { if ((tp->t_state&WOPEN) == 0) { ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD; if (tp->t_state & CARR_ON) signal(tp->t_pgrp, SIGHUP); flushtty(tp); } tp->t_state &= ~CARR_ON; return; } if (csr&ERROR || (tp->t_state&ISOPEN)==0) { if (tp->t_state&WOPEN && csr&CARRIER) tp->t_state |= CARR_ON; wakeup((caddr_t)tp); return; } csr &= PARITY; if (csr&&(tp->t_flags&ODDP) || !csr&&(tp->t_flags&EVENP)) ttyinput(c, tp);}/* * DC11 stty/gtty. * Perform general functions and set speeds. */dcioctl(dev, cmd, addr, flag)dev_t dev;caddr_t addr;{ register struct tty *tp; register r; tp = &dc11[minor(dev)]; if (ttioccom(cmd, &dc11[minor(dev)], addr, dev) == 0) { u.u_error = ENOTTY; return; } if (cmd == TIOCSETP) { r = dcrstab[tp->t_ispeed]; if (r) ((struct device *)(tp->t_addr))->dcrcsr = r; else ((struct device *)(tp->t_addr))->dcrcsr &= ~CDLEAD; r = dctstab[tp->t_ospeed]; ((struct device *)(tp->t_addr))->dctcsr = r; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -