int mfp_receive_usart(void) { while (!(mfp_get_rsr() & MFP_RSR_BF)) __asm("nop"); return mfp_get_udr(); }
void kbdenable(int mode) /* 1: interrupt, 0: poll */ { intio_set_sysport_keyctrl(8); mfp_bit_clear_iera(MFP_INTR_RCV_FULL | MFP_INTR_TIMER_B); mfp_set_tbcr(MFP_TIMERB_RESET | MFP_TIMERB_STOP); mfp_set_tbdr(13); /* Timer B interrupt interval */ mfp_set_tbcr(1); /* 1/4 delay mode */ mfp_set_ucr(MFP_UCR_CLKX16 | MFP_UCR_RW_8 | MFP_UCR_ONESB); mfp_set_rsr(MFP_RSR_RE); /* USART receive enable */ mfp_set_tsr(MFP_TSR_TE); /* USART transmit enable */ if (mode) { mfp_bit_set_iera(MFP_INTR_RCV_FULL); /* * Perform null read in case that an input byte is in the * receiver buffer, which prevents further interrupts. * We could save the input, but probably not so valuable. */ (void) mfp_get_udr(); } kbdled = 0; /* all keyboard LED turn off. */ kbd_setLED(); if (!(intio_get_sysport_keyctrl() & 8)) aprint_normal(" (no connected keyboard)"); }
int kbdintr(void *arg) { u_char c, st; struct kbd_softc *sc = arg; struct firm_event *fe; int put; /* clear receiver error if any */ st = mfp_get_rsr(); c = mfp_get_udr(); if ((st & MFP_RSR_BF) == 0) return 0; /* intr caused by an err -- no char received */ /* if not in event mode, deliver straight to ite to process key stroke */ if (!sc->sc_event_mode) { kbdbuf[kbdputoff++ & KBDBUFMASK] = c; softint_schedule(sc->sc_softintr_cookie); return 0; } /* Keyboard is generating events. Turn this keystroke into an event and put it in the queue. If the queue is full, the keystroke is lost (sorry!). */ put = sc->sc_events.ev_put; fe = &sc->sc_events.ev_q[put]; put = (put + 1) % EV_QSIZE; if (put == sc->sc_events.ev_get) { log(LOG_WARNING, "keyboard event queue overflow\n"); /* ??? */ return 0; } fe->id = KEY_CODE(c); fe->value = KEY_UP(c) ? VKEY_UP : VKEY_DOWN; firm_gettime(fe); sc->sc_events.ev_put = put; softint_schedule(sc->sc_softintr_cookie); return 0; }