void pckbd_set_leds(void *v, int leds) { struct pckbd_softc *sc = v; u_char cmd[2]; cmd[0] = KBC_MODEIND; cmd[1] = pckbd_led_encode(leds); sc->sc_ledstate = cmd[1]; (void)pckbport_enqueue_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 2, 0, 0, 0); }
int pckbd_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l) { struct pckbd_softc *sc = v; switch (cmd) { case WSKBDIO_GTYPE: *(int *)data = WSKBD_TYPE_PC_XT; return 0; case WSKBDIO_SETLEDS: { int res; u_char cmdb[2]; cmdb[0] = KBC_MODEIND; cmdb[1] = pckbd_led_encode(*(int *)data); sc->sc_ledstate = cmdb[1]; res = pckbport_enqueue_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmdb, 2, 0, 1, 0); return res; } case WSKBDIO_GETLEDS: *(int *)data = pckbd_led_decode(sc->sc_ledstate); return 0; case WSKBDIO_COMPLEXBELL: #define d ((struct wskbd_bell_data *)data) /* * Keyboard can't beep directly; we have an * externally-provided global hook to do this. */ pckbd_bell(d->pitch, d->period, d->volume, 0); #undef d return 0; #ifdef WSDISPLAY_COMPAT_RAWKBD case WSKBDIO_SETMODE: sc->rawkbd = (*(int *)data == WSKBD_RAW); return 0; #endif } return EPASSTHROUGH; }