Пример #1
0
/* check if data is waiting */
static int
ukbd_check(keyboard_t *kbd)
{
	ukbd_state_t *state;

	if (!KBD_IS_ACTIVE(kbd)) {
		return FALSE;
	}
	state = (ukbd_state_t *)kbd->kb_data;
	if (state->ks_polling) {
		crit_enter();
		usbd_dopoll(state->ks_iface);
		crit_exit();
	}
#ifdef UKBD_EMULATE_ATSCANCODE
	if (((ukbd_state_t *)kbd->kb_data)->ks_buffered_char[0]) {
		return TRUE;
	}
#endif
	if (((ukbd_state_t *)kbd->kb_data)->ks_inputs > 0) {
		return TRUE;
	}

	return FALSE;
}
Пример #2
0
static int
ukbd_getc(ukbd_state_t *state, int wait)
{
	int c;

	if (state->ks_polling) {
		DPRINTFN(1,("ukbd_getc: polling\n"));
		crit_enter();
		while (state->ks_inputs <= 0) {
			usbd_dopoll(state->ks_iface);
			if (wait == 0)
				break;
		}
		crit_exit();
	}
	crit_enter();
	if (state->ks_inputs <= 0) {
		c = -1;
	} else {
		c = state->ks_input[state->ks_inputhead];
		--state->ks_inputs;
		state->ks_inputhead = (state->ks_inputhead + 1)%INPUTBUFSIZE;
	}
	crit_exit();

	return c;
}
Пример #3
0
/* Console interface. */
void
ukbd_cngetc(void *v, u_int *type, int *data)
{
	struct ukbd_softc *sc = v;
	int c;
	int broken;

	if (pollenter == 0) {
		if (!warned) {
			printf("\n"
"This port is broken, it does not call cnpollc() before calling cngetc().\n"
"This should be fixed, but it will work anyway (for now).\n");
			warned = 1;
		}
		broken = 1;
		ukbd_cnpollc(v, 1);
	} else
		broken = 0;

	DPRINTFN(0,("ukbd_cngetc: enter\n"));
	sc->sc_polling = 1;
	while(sc->sc_npollchar <= 0)
		usbd_dopoll(sc->sc_hdev.sc_parent->sc_iface);
	sc->sc_polling = 0;
	c = sc->sc_pollchars[0];
	sc->sc_npollchar--;
	memcpy(sc->sc_pollchars, sc->sc_pollchars+1,
	       sc->sc_npollchar * sizeof(u_int16_t));
	*type = c & RELEASE ? WSCONS_EVENT_KEY_UP : WSCONS_EVENT_KEY_DOWN;
	*data = c & CODEMASK;
	DPRINTFN(0,("ukbd_cngetc: return 0x%02x\n", c));
	if (broken)
		ukbd_cnpollc(v, 0);
}
Пример #4
0
/* Console interface. */
void
ukbd_cngetc(void *v, u_int *type, int *data)
{
	struct ukbd_softc *sc = v;
	struct hidkbd *kbd = &sc->sc_kbd;

	DPRINTFN(0,("ukbd_cngetc: enter\n"));
	kbd->sc_polling = 1;
	while (kbd->sc_npollchar <= 0)
		usbd_dopoll(sc->sc_hdev.sc_udev);
	kbd->sc_polling = 0;
	hidkbd_cngetc(kbd, type, data);
	DPRINTFN(0,("ukbd_cngetc: return 0x%02x\n", *data));
}
Пример #5
0
/* Console interface. */
void
ukbd_cngetc(void *v, u_int *type, int *data)
{
	struct ukbd_softc *sc = v;
	int c;

	DPRINTFN(0,("ukbd_cngetc: enter\n"));
	sc->sc_polling = 1;
	while(sc->sc_npollchar <= 0)
		usbd_dopoll(sc->sc_hdev.sc_parent->sc_iface);
	sc->sc_polling = 0;
	c = sc->sc_pollchars[0];
	sc->sc_npollchar--;
	memcpy(sc->sc_pollchars, sc->sc_pollchars+1,
	       sc->sc_npollchar * sizeof(u_int16_t));
	*type = c & RELEASE ? WSCONS_EVENT_KEY_UP : WSCONS_EVENT_KEY_DOWN;
	*data = c & CODEMASK;
	DPRINTFN(0,("ukbd_cngetc: return 0x%02x\n", c));
}
Пример #6
0
static int
ukbd_getc(ukbd_state_t *state)
{
	int c;
	int s;

	if (state->ks_polling) {
		DPRINTFN(1,("ukbd_getc: polling\n"));
		s = splusb();
		while (state->ks_inputs <= 0)
			usbd_dopoll(state->ks_iface);
		splx(s);
	}
	s = splusb();
	if (state->ks_inputs <= 0) {
		c = -1;
	} else {
		c = state->ks_input[state->ks_inputhead];
		--state->ks_inputs;
		state->ks_inputhead = (state->ks_inputhead + 1)%INPUTBUFSIZE;
	}
	splx(s);
	return c;
}