void pckbdattach(device_t parent, device_t self, void *aux) { struct pckbd_softc *sc = device_private(self); struct pckbport_attach_args *pa = aux; struct wskbddev_attach_args a; int isconsole; u_char cmd[1]; aprint_naive("\n"); aprint_normal("\n"); sc->sc_dev = self; isconsole = pckbd_is_console(pa->pa_tag, pa->pa_slot); if (isconsole) { sc->id = &pckbd_consdata; /* * Some keyboards are not enabled after a reset, * so make sure it is enabled now. */ cmd[0] = KBC_ENABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 1; } else { sc->id = malloc(sizeof(struct pckbd_internal), M_DEVBUF, M_WAITOK); (void) pckbd_init(sc->id, pa->pa_tag, pa->pa_slot, 0); /* no interrupts until enabled */ cmd[0] = KBC_DISABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 0; } sc->id->t_sc = sc; pckbport_set_inputhandler(sc->id->t_kbctag, sc->id->t_kbcslot, pckbd_input, sc, device_xname(sc->sc_dev)); a.console = isconsole; a.keymap = &pckbd_keymapdata; a.accessops = &pckbd_accessops; a.accesscookie = sc; if (!pmf_device_register(self, pckbd_suspend, pckbd_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); /* * Attach the wskbd, saving a handle to it. * XXX XXX XXX */ sc->sc_wskbddev = config_found_ia(self, "wskbddev", &a, wskbddevprint); }
void pckbdattach(struct device *parent, struct device *self, void *aux) { struct pckbd_softc *sc = (void *)self; struct pckbport_attach_args *pa = aux; struct wskbddev_attach_args a; int isconsole; u_char cmd[1]; printf("\n"); isconsole = pckbd_is_console(pa->pa_tag, pa->pa_slot); if (isconsole) { sc->id = &pckbd_consdata; /* * Some keyboards are not enabled after a reset, * so make sure it is enabled now. */ cmd[0] = KBC_ENABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 1; } else { sc->id = malloc(sizeof(struct pckbd_internal), M_DEVBUF, M_WAITOK); (void) pckbd_init(sc->id, pa->pa_tag, pa->pa_slot, 0); /* no interrupts until enabled */ cmd[0] = KBC_DISABLE; (void) pckbport_poll_cmd(sc->id->t_kbctag, sc->id->t_kbcslot, cmd, 1, 0, 0, 0); sc->sc_enabled = 0; } sc->id->t_sc = sc; pckbport_set_inputhandler(sc->id->t_kbctag, sc->id->t_kbcslot, pckbd_input, sc, sc->sc_dev.dv_xname); a.console = isconsole; a.keymap = &pckbd_keymapdata; a.accessops = &pckbd_accessops; a.accesscookie = sc; /* * Attach the wskbd, saving a handle to it. * XXX XXX XXX */ sc->sc_wskbddev = config_found(self, &a, wskbddevprint); }
/* * these are both bad jokes */ int pckbdprobe(struct device *parent, struct cfdata *cf, void *aux) { struct pckbport_attach_args *pa = aux; int res; u_char cmd[1], resp[1]; /* * XXX There are rumours that a keyboard can be connected * to the aux port as well. For me, this didn't work. * For further experiments, allow it if explicitly * wired in the config file. */ if ((pa->pa_slot != PCKBPORT_KBD_SLOT) && (cf->cf_loc[PCKBPORTCF_SLOT] == PCKBPORTCF_SLOT_DEFAULT)) return 0; /* Flush any garbage. */ pckbport_flush(pa->pa_tag, pa->pa_slot); /* Reset the keyboard. */ cmd[0] = KBC_RESET; res = pckbport_poll_cmd(pa->pa_tag, pa->pa_slot, cmd, 1, 1, resp, 1); if (res) { #ifdef DEBUG printf("pckbdprobe: reset error %d\n", res); #endif /* * There is probably no keyboard connected. * Let the probe succeed if the keyboard is used * as console input - it can be connected later. */ return pckbd_is_console(pa->pa_tag, pa->pa_slot) ? 1 : 0; } if (resp[0] != KBR_RSTDONE) { printf("pckbdprobe: reset response 0x%x\n", resp[0]); return 0; } /* * Some keyboards seem to leave a second ack byte after the reset. * This is kind of stupid, but we account for them anyway by just * flushing the buffer. */ pckbport_flush(pa->pa_tag, pa->pa_slot); if (pckbd_set_xtscancode(pa->pa_tag, pa->pa_slot)) return 0; return 2; }