Пример #1
0
int
sacomcngetc(dev_t dev)
{
    int c, s;

    s = spltty();	/* XXX do we need this? */

    while (!(bus_space_read_4(sacomconstag, sacomconsioh, SACOM_SR1)
             & SR1_RNE)) {
#if defined(DDB) || defined(KGDB)
#ifndef DDB_BREAK_CHAR
        u_int sr0;
        extern int db_active;

        sr0 = bus_space_read_4(sacomconstag, sacomconsioh, SACOM_SR0);
        if (ISSET(sr0, SR0_RBB))
            bus_space_write_4(sacomconstag, sacomconsioh,
                              SACOM_SR0, SR0_RBB);
        if (ISSET(sr0, SR0_REB)) {
            bus_space_write_4(sacomconstag, sacomconsioh,
                              SACOM_SR0, SR0_REB);
            if (db_active == 0)
                console_debugger();
        }
#endif
#endif /* DDB || KGDB */
    }

    c = bus_space_read_4(sacomconstag, sacomconsioh, SACOM_DR);
    c &= 0xff;
    splx(s);

    return c;
}
Пример #2
0
/*
 * Handle user request to enter kernel debugger.
 */
void
zs_abort(struct zs_chanstate *cs)
{
	int rr0;

	/* Wait for end of break to avoid PROM abort. */
	/* XXX - Limit the wait? */
	do {
		rr0 = *cs->cs_reg_csr;
		ZS_DELAY();
	} while (rr0 & ZSRR0_BREAK);
#ifdef DDB
	console_debugger();
#endif
}
Пример #3
0
int
uart_intr(void *v)
{
	struct uart_softc *sc = v;
	struct tty *tp = sc->sc_tty;
	int c, l_r;

	if (REG_READ(UART_RSR_REG) & UART_RSR_BE) {
		REG_WRITE(UART_ECR_REG, UART_ECR_RSR);
		console_debugger();
	}

	while ((REG_READ(UART_FR_REG) & UART_FR_RX_FIFO_EMPTY) == 0) {
		c = REG_READ(UART_DR_REG) & 0xff;
		if (tp->t_state & TS_ISOPEN)
			l_r = (*tp->t_linesw->l_rint)(c, tp);
	}
	return 0;
}
Пример #4
0
int
sacomintr(void *arg)
{
    struct sacom_softc *sc = arg;
    bus_space_tag_t iot = sc->sc_iot;
    bus_space_handle_t ioh = sc->sc_ioh;
    u_char *put, *end;
    u_int cc;
    u_int sr0, sr1;

    if (COM_ISALIVE(sc) == 0)
        return 0;

    COM_LOCK(sc);
    sr0 = bus_space_read_4(iot, ioh, SACOM_SR0);
    if (!sr0) {
        COM_UNLOCK(sc);
        return 0;
    }
    if (ISSET(sr0, SR0_EIF))
        /* XXX silently discard error bits */
        bus_space_read_4(iot, ioh, SACOM_DR);
    if (ISSET(sr0, SR0_RBB))
        bus_space_write_4(iot, ioh, SACOM_SR0, SR0_RBB);
    if (ISSET(sr0, SR0_REB)) {
        bus_space_write_4(iot, ioh, SACOM_SR0, SR0_REB);
#if defined(DDB) || defined(KGDB)
#ifndef DDB_BREAK_CHAR
        if (ISSET(sc->sc_hwflags, COM_HW_CONSOLE)) {
            console_debugger();
        }
#endif
#endif /* DDB || KGDB */
    }


    end = sc->sc_ebuf;
    put = sc->sc_rbput;
    cc = sc->sc_rbavail;

    sr1 = bus_space_read_4(iot, ioh, SACOM_SR1);
    if (ISSET(sr0, SR0_RFS | SR0_RID)) {
        if (!ISSET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED)) {
            while (cc > 0) {
                if (!ISSET(sr1, SR1_RNE)) {
                    bus_space_write_4(iot, ioh, SACOM_SR0,
                                      SR0_RID);
                    break;
                }
                put[0] = bus_space_read_4(iot, ioh, SACOM_DR);
                put[1] = sr1;
#if defined(DDB) && defined(DDB_BREAK_CHAR)
                if (put[0] == DDB_BREAK_CHAR &&
                        ISSET(sc->sc_hwflags, COM_HW_CONSOLE)) {
                    console_debugger();

                    sr1 = bus_space_read_4(iot, ioh, SACOM_SR1);
                    continue;
                }
#endif
                put += 2;
                if (put >= end)
                    put = sc->sc_rbuf;
                cc--;

                sr1 = bus_space_read_4(iot, ioh, SACOM_SR1);
            }

            /*
             * Current string of incoming characters ended because
             * no more data was available or we ran out of space.
             * Schedule a receive event if any data was received.
             * If we're out of space, turn off receive interrupts.
             */
            sc->sc_rbput = put;
            sc->sc_rbavail = cc;
            if (!ISSET(sc->sc_rx_flags, RX_TTY_OVERFLOWED))
                sc->sc_rx_ready = 1;

            /* XXX do RX hardware flow control */

            /*
             * If we're out of space, disable receive interrupts
             * until the queue has drained a bit.
             */
            if (!cc) {
                SET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED);
                CLR(sc->sc_cr3, CR3_RIE);
                bus_space_write_4(iot, ioh, SACOM_CR3,
                                  sc->sc_cr3);
            }
        } else {
#ifdef DIAGNOSTIC
            panic("sacomintr: we shouldn't reach here");
#endif
            CLR(sc->sc_cr3, CR3_RIE);
            bus_space_write_4(iot, ioh, SACOM_CR3, sc->sc_cr3);
        }
    }

    /*
     * Done handling any receive interrupts. See if data can be
     * transmitted as well. Schedule tx done event if no data left
     * and tty was marked busy.
     */
    sr0 = bus_space_read_4(iot, ioh, SACOM_SR0);
    if (ISSET(sr0, SR0_TFS)) {
        /*
         * If we've delayed a parameter change, do it now, and restart
         * output.
         * XXX sacom_loadchannelregs() waits TX completion,
         * XXX resulting in ~0.1s hang (300bps, 4 bytes) in worst case
         */
        if (sc->sc_heldchange) {
            sacom_loadchannelregs(sc);
            sc->sc_heldchange = 0;
            sc->sc_tbc = sc->sc_heldtbc;
            sc->sc_heldtbc = 0;
        }

        /* Output the next chunk of the contiguous buffer, if any. */
        if (sc->sc_tbc > 0) {
            sacom_filltx(sc);
        } else {
            /* Disable transmit completion interrupts if necessary. */
            if (ISSET(sc->sc_cr3, CR3_TIE)) {
                CLR(sc->sc_cr3, CR3_TIE);
                bus_space_write_4(iot, ioh, SACOM_CR3,
                                  sc->sc_cr3);
            }
            if (sc->sc_tx_busy) {
                sc->sc_tx_busy = 0;
                sc->sc_tx_done = 1;
            }
        }
    }
    COM_UNLOCK(sc);

    /* Wake up the poller. */
    softint_schedule(sc->sc_si);

#if NRND > 0 && defined(RND_COM)
    rnd_add_uint32(&sc->rnd_source, iir | lsr);
#endif
    return 1;
}
Пример #5
0
static int
internal_command(struct wskbd_softc *sc, u_int *type, keysym_t ksym,
	keysym_t ksym2)
{
#if NWSDISPLAY > 0 && defined(WSDISPLAY_SCROLLSUPPORT)
	u_int state = 0;
#endif
	switch (ksym) {
	case KS_Cmd_VolumeToggle:
		if (*type == WSCONS_EVENT_KEY_DOWN)
			pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_TOGGLE);
		break;
	case KS_Cmd_VolumeUp:
		if (*type == WSCONS_EVENT_KEY_DOWN)
			pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_UP);
		break;
	case KS_Cmd_VolumeDown:
		if (*type == WSCONS_EVENT_KEY_DOWN)
			pmf_event_inject(NULL, PMFE_AUDIO_VOLUME_DOWN);
		break;
#if NWSDISPLAY > 0 && defined(WSDISPLAY_SCROLLSUPPORT)
	case KS_Cmd_ScrollFastUp:
	case KS_Cmd_ScrollFastDown:
		if (*type == WSCONS_EVENT_KEY_DOWN) {
			GETMODSTATE(sc->id->t_modifiers, state);
			if ((sc->sc_scroll_data.mode == WSKBD_SCROLL_MODE_HOLD
			   	&& MOD_ONESET(sc->id, MOD_HOLDSCREEN))
			|| (sc->sc_scroll_data.mode == WSKBD_SCROLL_MODE_NORMAL
				&& sc->sc_scroll_data.modifier == state)) {
					update_modifier(sc->id, *type, 0, MOD_COMMAND);
					wsdisplay_scroll(sc->sc_base.me_dispdv,
						(ksym == KS_Cmd_ScrollFastUp) ?
						WSDISPLAY_SCROLL_BACKWARD :
						WSDISPLAY_SCROLL_FORWARD);
					return (1);
			} else {
				return (0);
			}
		}

	case KS_Cmd_ScrollSlowUp:
	case KS_Cmd_ScrollSlowDown:
		if (*type == WSCONS_EVENT_KEY_DOWN) {
			GETMODSTATE(sc->id->t_modifiers, state);
			if ((sc->sc_scroll_data.mode == WSKBD_SCROLL_MODE_HOLD
			   	&& MOD_ONESET(sc->id, MOD_HOLDSCREEN))
			|| (sc->sc_scroll_data.mode == WSKBD_SCROLL_MODE_NORMAL
				&& sc->sc_scroll_data.modifier == state)) {
					update_modifier(sc->id, *type, 0, MOD_COMMAND);
					wsdisplay_scroll(sc->sc_base.me_dispdv,
					   	(ksym == KS_Cmd_ScrollSlowUp) ?
						WSDISPLAY_SCROLL_BACKWARD | WSDISPLAY_SCROLL_LOW:
						WSDISPLAY_SCROLL_FORWARD | WSDISPLAY_SCROLL_LOW);
					return (1);
			} else {
				return (0);
			}
		}
#endif

	case KS_Cmd:
		update_modifier(sc->id, *type, 0, MOD_COMMAND);
		ksym = ksym2;
		break;

	case KS_Cmd1:
		update_modifier(sc->id, *type, 0, MOD_COMMAND1);
		break;

	case KS_Cmd2:
		update_modifier(sc->id, *type, 0, MOD_COMMAND2);
		break;
	}

	if (*type != WSCONS_EVENT_KEY_DOWN ||
	    (! MOD_ONESET(sc->id, MOD_COMMAND) &&
	     ! MOD_ALLSET(sc->id, MOD_COMMAND1 | MOD_COMMAND2)))
		return (0);

#if defined(DDB) || defined(KGDB)
	if (ksym == KS_Cmd_Debugger) {
		if (sc->sc_isconsole) {
#ifdef DDB
			console_debugger();
#endif
#ifdef KGDB
			kgdb_connect(1);
#endif
		}
		/* discard this key (ddb discarded command modifiers) */
		*type = WSCONS_EVENT_KEY_UP;
		return (1);
	}
#endif

#if NWSDISPLAY > 0
	if (sc->sc_base.me_dispdv == NULL)
		return (0);

	switch (ksym) {
	case KS_Cmd_Screen0:
	case KS_Cmd_Screen1:
	case KS_Cmd_Screen2:
	case KS_Cmd_Screen3:
	case KS_Cmd_Screen4:
	case KS_Cmd_Screen5:
	case KS_Cmd_Screen6:
	case KS_Cmd_Screen7:
	case KS_Cmd_Screen8:
	case KS_Cmd_Screen9:
		wsdisplay_switch(sc->sc_base.me_dispdv, ksym - KS_Cmd_Screen0, 0);
		return (1);
	case KS_Cmd_ResetEmul:
		wsdisplay_reset(sc->sc_base.me_dispdv, WSDISPLAY_RESETEMUL);
		return (1);
	case KS_Cmd_ResetClose:
		wsdisplay_reset(sc->sc_base.me_dispdv, WSDISPLAY_RESETCLOSE);
		return (1);
	case KS_Cmd_BacklightOn:
	case KS_Cmd_BacklightOff:
	case KS_Cmd_BacklightToggle:
		change_displayparam(sc, WSDISPLAYIO_PARAM_BACKLIGHT,
				    ksym == KS_Cmd_BacklightOff ? -1 : 1,
				    ksym == KS_Cmd_BacklightToggle ? 1 : 0);
		return (1);
	case KS_Cmd_BrightnessUp:
	case KS_Cmd_BrightnessDown:
	case KS_Cmd_BrightnessRotate:
		change_displayparam(sc, WSDISPLAYIO_PARAM_BRIGHTNESS,
				    ksym == KS_Cmd_BrightnessDown ? -1 : 1,
				    ksym == KS_Cmd_BrightnessRotate ? 1 : 0);
		return (1);
	case KS_Cmd_ContrastUp:
	case KS_Cmd_ContrastDown:
	case KS_Cmd_ContrastRotate:
		change_displayparam(sc, WSDISPLAYIO_PARAM_CONTRAST,
				    ksym == KS_Cmd_ContrastDown ? -1 : 1,
				    ksym == KS_Cmd_ContrastRotate ? 1 : 0);
		return (1);
	}
#endif

	return (0);
}