Add original unix v6
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#
|
||||
/*
|
||||
*/
|
||||
|
||||
/*
|
||||
* DM-BB driver
|
||||
*/
|
||||
#include "../param.h"
|
||||
#include "../tty.h"
|
||||
#include "../conf.h"
|
||||
|
||||
#define DMADDR 0170500
|
||||
|
||||
struct tty dh11[];
|
||||
int ndh11; /* Set by dh.c to number of lines */
|
||||
|
||||
#define DONE 0200
|
||||
#define SCENABL 040
|
||||
#define CLSCAN 01000
|
||||
#define TURNON 07 /* RQ send, CD lead, line enable */
|
||||
#define TURNOFF 1 /* line enable only */
|
||||
#define CARRIER 0100
|
||||
|
||||
struct dmregs {
|
||||
int dmcsr;
|
||||
int dmlstat;
|
||||
};
|
||||
|
||||
/*
|
||||
* Turn on the line associated with the (DH) device dev.
|
||||
*/
|
||||
dmopen(dev)
|
||||
{
|
||||
register struct tty *tp;
|
||||
|
||||
tp = &dh11[dev.d_minor];
|
||||
DMADDR->dmcsr = dev.d_minor;
|
||||
DMADDR->dmlstat = TURNON;
|
||||
if (DMADDR->dmlstat&CARRIER)
|
||||
tp->t_state =| CARR_ON;
|
||||
DMADDR->dmcsr = IENABLE|SCENABL;
|
||||
spl5();
|
||||
while ((tp->t_state&CARR_ON)==0)
|
||||
sleep(&tp->t_rawq, TTIPRI);
|
||||
spl0();
|
||||
}
|
||||
|
||||
/*
|
||||
* If a DH line has the HUPCL mode,
|
||||
* turn off carrier when it is closed.
|
||||
*/
|
||||
dmclose(dev)
|
||||
{
|
||||
register struct tty *tp;
|
||||
|
||||
tp = &dh11[dev.d_minor];
|
||||
if (tp->t_flags&HUPCL) {
|
||||
DMADDR->dmcsr = dev.d_minor;
|
||||
DMADDR->dmlstat = TURNOFF;
|
||||
DMADDR->dmcsr = IENABLE|SCENABL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* DM11 interrupt.
|
||||
* Mainly, deal with carrier transitions.
|
||||
*/
|
||||
dmint()
|
||||
{
|
||||
register struct tty *tp;
|
||||
|
||||
if (DMADDR->dmcsr&DONE) {
|
||||
tp = &dh11[DMADDR->dmcsr&017];
|
||||
if (tp < &dh11[ndh11]) {
|
||||
wakeup(tp);
|
||||
if ((DMADDR->dmlstat&CARRIER)==0) {
|
||||
if ((tp->t_state&WOPEN)==0) {
|
||||
signal(tp, SIGHUP);
|
||||
DMADDR->dmlstat = 0;
|
||||
flushtty(tp);
|
||||
}
|
||||
tp->t_state =& ~CARR_ON;
|
||||
} else
|
||||
tp->t_state =| CARR_ON;
|
||||
}
|
||||
DMADDR->dmcsr = IENABLE|SCENABL;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user