Ejemplo n.º 1
0
void
dartrint(struct dartsoftc *sc, int port)
{
	struct tty *tp;
	unsigned char data, sr;
	struct dart_info *dart;
	bus_addr_t ptaddr;

	dart = &sc->sc_dart[port];
	ptaddr = port ? DART_B_BASE : DART_A_BASE;
	tp = dart->tty;

	/* read status reg */
	while ((sr = dart_read(sc, ptaddr + DART_SRA)) & RXRDY) {
		/* read data and reset receiver */
		data = dart_read(sc, ptaddr + DART_RBA);

		if ((tp->t_state & (TS_ISOPEN|TS_WOPEN)) == 0 &&
		    CONS_PORT != port) {
			return;
		}

		if (sr & RBRK) {
			/* clear break state */
			dart_write(sc, ptaddr + DART_CRA, BRKINTRESET);
			DELAY_CR;
			dart_write(sc, ptaddr + DART_CRA, ERRRESET);

#if defined(DDB)
			if (db_console != 0 && port == CONS_PORT)
				Debugger();
#endif
		} else {
			if (sr & (FRERR|PERR|ROVRN)) { /* errors */
				if (sr & ROVRN)
					printf("dart0: receiver overrun port %c\n", 'A' + port);
				if (sr & FRERR)
					printf("dart0: framing error port %c\n", 'A' + port);
				if (sr & PERR)
					printf("dart0: parity error port %c\n", 'A' + port);
				/* clear error state */
				dart_write(sc, ptaddr + DART_CRA, ERRRESET);
			} else {
				/* no errors */
				(*linesw[tp->t_line].l_rint)(data,tp);
#if 0
				{
					if (tp->t_ispeed == B134) /* CS6 */
						data &= 077;
					else if (tp->t_flags & CS8)
						;
					else
						data &= 0177; /* CS7 */
					ttyinput(data, tp);
				}
#endif
			}
		}
	}
}
Ejemplo n.º 2
0
static int
snpwrite(struct dev_write_args *ap)
{
	cdev_t dev = ap->a_head.a_dev;
	struct uio *uio = ap->a_uio;
	struct snoop *snp;
	struct tty *tp;
	int error, i, len;
	unsigned char c[SNP_INPUT_BUF];

	lwkt_gettoken(&tty_token);
	snp = dev->si_drv1;
	tp = snp->snp_tty;
	if (tp == NULL) {
		lwkt_reltoken(&tty_token);
		return (EIO);
	}
	if ((tp->t_sc == snp) && (tp->t_state & TS_SNOOP) &&
	    tp->t_line == snooplinedisc)
		goto tty_input;

	kprintf("Snoop: attempt to write to bad tty.\n");
	lwkt_reltoken(&tty_token);
	return (EIO);

tty_input:
	if (!(tp->t_state & TS_ISOPEN)) {
		lwkt_reltoken(&tty_token);
		return (EIO);
	}

	while (uio->uio_resid > 0) {
		len = (int)szmin(uio->uio_resid, SNP_INPUT_BUF);
		if ((error = uiomove(c, (size_t)len, uio)) != 0) {
			lwkt_reltoken(&tty_token);
			return (error);
		}
		for (i=0; i < len; i++) {
			if (ttyinput(c[i], tp)) {
				lwkt_reltoken(&tty_token);
				return (EIO);
			}
		}
	}
	lwkt_reltoken(&tty_token);
	return (0);
}
Ejemplo n.º 3
0
static void rcvISR(int irq, InterruptContext *icp) {
  int dev;
  struct tty *tp;
  struct device *addr;
  int c;

  /* set process priority, re-enable interrupts */
  spl4();
  enableInt();
  /* process received character */
  dev = (irq - 1) / 2;
  tp = &terminal[dev];
  addr = (struct device *) tp->t_addr;
  c = addr->rcvData;
  if (c == '^') {
    showProcTable(NULL);
    return;
  }
  ttyinput(c, tp);
}
Ejemplo n.º 4
0
static void com_interrupt( void *_dev )
{
    phantom_device_t * dev = _dev;

    int unit = dev->seq_number;
    int addr = dev->iobase;

    com_port_t *cp = dev->drv_private;

    (void) unit;
    SHOW_FLOW( 9, "com port %d interrupt", unit );

    //register struct tty	*tp = &com_tty[unit];
    //static char 		comoverrun = 0;
    //char			c, line, intr_id;
    char			intr_id;
    //int			modem_stat;
    int				line_stat;

    while (! ((intr_id=(inb(INTR_ID(addr))&MASKi)) & 1))
    {
        switch (intr_id) {
        case MODi:
            /* modem change */
            //int ms =
            inb(MODEM_STAT(addr));
            //commodem_intr(unit, ms));
            break;

        case TRAi:
            hal_sem_release( &(cp->wsem) );
            //comtimer_state[unit] = 0;
            //tp->t_state &= ~(TS_BUSY|TS_FLUSH);
            //tt_write_wakeup(tp);
            //(void) comstart(tp);
            break;

        case RECi:
        case CTIi:         /* Character timeout indication */
            hal_sem_release( &(cp->rsem) );
            break;

        case LINi:
            line_stat = inb(LINE_STAT(addr));
            (void) line_stat;
#if 0
            if ((line_stat & iPE) &&
                ((tp->t_flags&(EVENP|ODDP)) == EVENP ||
                 (tp->t_flags&(EVENP|ODDP)) == ODDP)) {
                /* parity error */;
            } else 	if (line&iOR && !comoverrun) {
                printf("com%d: overrun\n", unit);
                comoverrun = 1;
            } else if (line_stat & (iFE | iBRKINTR)) {
                /* framing error or break */
                ttyinput(tp->t_breakc, tp);
            }
#endif
            break;
        }
    }
}