/* 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; }
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; }
/* 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); }
/* 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)); }
/* 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)); }
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; }