void wsmouse_attach(struct device *parent, struct device *self, void *aux) { struct wsmouse_softc *sc = (struct wsmouse_softc *)self; struct wsmousedev_attach_args *ap = aux; #if NWSMUX > 0 int mux, error; #endif sc->sc_accessops = ap->accessops; sc->sc_accesscookie = ap->accesscookie; #if NWSMUX > 0 sc->sc_base.me_ops = &wsmouse_srcops; mux = sc->sc_base.me_dv.dv_cfdata->wsmousedevcf_mux; if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) printf(" attach error=%d", error); else printf(" mux %d", mux); } #else #if 0 /* not worth keeping, especially since the default value is not -1... */ if (sc->sc_base.me_dv.dv_cfdata->wsmousedevcf_mux >= 0) printf(" (mux ignored)"); #endif #endif /* NWSMUX > 0 */ printf("\n"); }
int wskbdclose(dev_t dev, int flags, int mode, struct proc *p) { struct wskbd_softc *sc = (struct wskbd_softc *)wskbd_cd.cd_devs[minor(dev)]; struct wseventvar *evar = sc->sc_base.me_evp; if (evar == NULL) /* not open for read */ return (0); sc->sc_base.me_evp = NULL; sc->sc_translating = 1; (void)wskbd_enable(sc, 0); wsevent_fini(evar); #if NWSMUX > 0 if (sc->sc_base.me_parent == NULL) { int mux, error; DPRINTF(("wskbdclose: attach\n")); mux = sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux; if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) printf("%s: can't attach mux (error=%d)\n", sc->sc_base.me_dv.dv_xname, error); } } #endif return (0); }
int wsmouseclose(dev_t dev, int flags, int mode, struct proc *p) { struct wsmouse_softc *sc = (struct wsmouse_softc *)wsmouse_cd.cd_devs[minor(dev)]; struct wseventvar *evar = sc->sc_base.me_evp; if ((flags & (FREAD | FWRITE)) == FWRITE) return (0); /* see wsmouseopen() */ if (evar == NULL) /* not open for read */ return (0); sc->sc_base.me_evp = NULL; (*sc->sc_accessops->disable)(sc->sc_accesscookie); wsevent_fini(evar); #if NWSMUX > 0 if (sc->sc_base.me_parent == NULL) { int mux, error; DPRINTF(("wsmouseclose: attach\n")); mux = sc->sc_base.me_dv.dv_cfdata->wsmousedevcf_mux; if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) printf("%s: can't attach mux (error=%d)\n", sc->sc_base.me_dv.dv_xname, error); } } #endif return (0); }
void wsmouse_attach(device_t parent, device_t self, void *aux) { struct wsmouse_softc *sc = device_private(self); struct wsmousedev_attach_args *ap = aux; #if NWSMUX > 0 int mux, error; #endif sc->sc_base.me_dv = self; sc->sc_accessops = ap->accessops; sc->sc_accesscookie = ap->accesscookie; /* Initialize button repeating. */ memset(&sc->sc_repeat, 0, sizeof(sc->sc_repeat)); sc->sc_repeat_button = -1; sc->sc_repeat_delay = 0; callout_init(&sc->sc_repeat_callout, 0); callout_setfunc(&sc->sc_repeat_callout, wsmouse_repeat, sc); #if NWSMUX > 0 sc->sc_base.me_ops = &wsmouse_srcops; mux = device_cfdata(self)->wsmousedevcf_mux; if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) aprint_error(" attach error=%d", error); else aprint_normal(" mux %d", mux); } #else if (device_cfdata(self)->wsmousedevcf_mux >= 0) aprint_normal(" (mux ignored)"); #endif aprint_naive("\n"); aprint_normal("\n"); if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); }
void wskbd_attach(struct device *parent, struct device *self, void *aux) { struct wskbd_softc *sc = (struct wskbd_softc *)self; struct wskbddev_attach_args *ap = aux; kbd_t layout; #if NWSMUX > 0 struct wsmux_softc *wsmux_sc; int mux, error; #endif sc->sc_isconsole = ap->console; #if NWSMUX > 0 || NWSDISPLAY > 0 sc->sc_base.me_ops = &wskbd_srcops; #endif #if NWSMUX > 0 mux = sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux; if (ap->console) { /* Ignore mux for console; it always goes to the console mux. */ /* printf(" (mux %d ignored for console)", mux); */ mux = -1; } if (mux >= 0) { printf(" mux %d", mux); wsmux_sc = wsmux_getmux(mux); } else wsmux_sc = NULL; #else #if 0 /* not worth keeping, especially since the default value is not -1... */ if (sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux >= 0) printf(" (mux ignored)"); #endif #endif /* NWSMUX > 0 */ if (ap->console) { sc->id = &wskbd_console_data; } else { sc->id = malloc(sizeof(struct wskbd_internal), M_DEVBUF, M_WAITOK | M_ZERO); bcopy(ap->keymap, &sc->id->t_keymap, sizeof(sc->id->t_keymap)); } #if NWSDISPLAY > 0 timeout_set(&sc->sc_repeat_ch, wskbd_repeat, sc); #endif sc->id->t_sc = sc; sc->sc_accessops = ap->accessops; sc->sc_accesscookie = ap->accesscookie; sc->sc_repeating = 0; sc->sc_translating = 1; sc->sc_ledstate = -1; /* force update */ /* * If this layout is the default choice of the driver (i.e. the * driver doesn't know better), pick the existing layout of the * current mux, if any. */ layout = sc->id->t_keymap.layout; #if NWSMUX > 0 if (layout & KB_DEFAULT) { if (wsmux_sc != NULL && wsmux_get_layout(wsmux_sc) != KB_NONE) layout = wsmux_get_layout(wsmux_sc); } #endif for (;;) { if (wskbd_load_keymap(&sc->id->t_keymap, layout, &sc->sc_map, &sc->sc_maplen) == 0) break; #if NWSMUX > 0 if (layout == sc->id->t_keymap.layout) panic("cannot load keymap"); if (wsmux_sc != NULL && wsmux_get_layout(wsmux_sc) != KB_NONE) { printf("\n%s: cannot load keymap, " "falling back to default\n%s", sc->sc_base.me_dv.dv_xname, sc->sc_base.me_dv.dv_xname); layout = wsmux_get_layout(wsmux_sc); } else #endif panic("cannot load keymap"); } wskbd_update_layout(sc->id, layout); /* set default bell and key repeat data */ sc->sc_bell_data = wskbd_default_bell_data; sc->sc_keyrepeat_data = wskbd_default_keyrepeat_data; if (ap->console) { KASSERT(wskbd_console_initted); KASSERT(wskbd_console_device == NULL); wskbd_console_device = sc; printf(": console keyboard"); #if NWSDISPLAY > 0 wsdisplay_set_console_kbd(&sc->sc_base); /* sets sc_displaydv */ if (sc->sc_displaydv != NULL) printf(", using %s", sc->sc_displaydv->dv_xname); #endif } printf("\n"); #if NWSMUX > 0 if (wsmux_sc != NULL) { error = wsmux_attach_sc(wsmux_sc, &sc->sc_base); if (error) printf("%s: attach error=%d\n", sc->sc_base.me_dv.dv_xname, error); /* * Try and set this encoding as the mux default if it * hasn't any yet, and if this is not a driver default * layout (i.e. parent driver pretends to know better). * Note that wsmux_set_layout() rejects layouts with * KB_DEFAULT set. */ if (wsmux_get_layout(wsmux_sc) == KB_NONE) wsmux_set_layout(wsmux_sc, layout); } #endif #if NWSDISPLAY > 0 && NWSMUX == 0 if (ap->console == 0) { /* * In the non-wsmux world, always connect wskbd0 and wsdisplay0 * together. */ extern struct cfdriver wsdisplay_cd; if (wsdisplay_cd.cd_ndevs != 0 && self->dv_unit == 0) { if (wskbd_set_display(self, wsdisplay_cd.cd_devs[0]) == 0) wsdisplay_set_kbd(wsdisplay_cd.cd_devs[0], (struct wsevsrc *)sc); } } #endif }
void wskbd_attach(device_t parent, device_t self, void *aux) { struct wskbd_softc *sc = device_private(self); struct wskbddev_attach_args *ap = aux; #if NWSMUX > 0 int mux, error; #endif sc->sc_base.me_dv = self; sc->sc_isconsole = ap->console; sc->sc_hotkey = NULL; sc->sc_hotkeycookie = NULL; sc->sc_evtrans_len = 0; sc->sc_evtrans = NULL; #if NWSMUX > 0 || NWSDISPLAY > 0 sc->sc_base.me_ops = &wskbd_srcops; #endif #if NWSMUX > 0 mux = device_cfdata(sc->sc_base.me_dv)->wskbddevcf_mux; if (ap->console) { /* Ignore mux for console; it always goes to the console mux. */ /* printf(" (mux %d ignored for console)", mux); */ mux = -1; } if (mux >= 0) aprint_normal(" mux %d", mux); #else if (device_cfdata(sc->sc_base.me_dv)->wskbddevcf_mux >= 0) aprint_normal(" (mux ignored)"); #endif if (ap->console) { sc->id = &wskbd_console_data; } else { sc->id = malloc(sizeof(struct wskbd_internal), M_DEVBUF, M_WAITOK|M_ZERO); sc->id->t_keymap = ap->keymap; wskbd_update_layout(sc->id, ap->keymap->layout); } callout_init(&sc->sc_repeat_ch, 0); callout_setfunc(&sc->sc_repeat_ch, wskbd_repeat, sc); sc->id->t_sc = sc; sc->sc_accessops = ap->accessops; sc->sc_accesscookie = ap->accesscookie; sc->sc_repeating = 0; sc->sc_translating = 1; sc->sc_ledstate = -1; /* force update */ if (wskbd_load_keymap(sc->id->t_keymap, &sc->sc_map, &sc->sc_maplen) != 0) panic("cannot load keymap"); sc->sc_layout = sc->id->t_keymap->layout; /* set default bell and key repeat data */ sc->sc_bell_data = wskbd_default_bell_data; sc->sc_keyrepeat_data = wskbd_default_keyrepeat_data; #ifdef WSDISPLAY_SCROLLSUPPORT sc->sc_scroll_data = wskbd_default_scroll_data; #endif if (ap->console) { KASSERT(wskbd_console_initted); KASSERT(wskbd_console_device == NULL); wskbd_console_device = sc; aprint_naive(": console keyboard"); aprint_normal(": console keyboard"); #if NWSDISPLAY > 0 wsdisplay_set_console_kbd(&sc->sc_base); /* sets me_dispv */ if (sc->sc_base.me_dispdv != NULL) aprint_normal(", using %s", device_xname(sc->sc_base.me_dispdv)); #endif } aprint_naive("\n"); aprint_normal("\n"); #if NWSMUX > 0 if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) aprint_error_dev(sc->sc_base.me_dv, "attach error=%d\n", error); } #endif if (!pmf_device_register(self, wskbd_suspend, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); else if (!pmf_class_input_register(self)) aprint_error_dev(self, "couldn't register as input device\n"); }
void wskbd_attach(struct device *parent, struct device *self, void *aux) { struct wskbd_softc *sc = (struct wskbd_softc *)self; struct wskbddev_attach_args *ap = aux; #if NWSMUX > 0 int mux, error; #endif sc->sc_isconsole = ap->console; #if NWSMUX > 0 || NWSDISPLAY > 0 sc->sc_base.me_ops = &wskbd_srcops; #endif #if NWSMUX > 0 mux = sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux; if (ap->console) { /* Ignore mux for console; it always goes to the console mux. */ /* printf(" (mux %d ignored for console)", mux); */ mux = -1; } if (mux >= 0) printf(" mux %d", mux); #else #if 0 /* not worth keeping, especially since the default value is not -1... */ if (sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux >= 0) printf(" (mux ignored)"); #endif #endif /* NWSMUX > 0 */ if (ap->console) { sc->id = &wskbd_console_data; } else { sc->id = malloc(sizeof(struct wskbd_internal), M_DEVBUF, M_WAITOK | M_ZERO); sc->id->t_keymap = ap->keymap; wskbd_update_layout(sc->id, ap->keymap->layout); } #if NWSDISPLAY > 0 timeout_set(&sc->sc_repeat_ch, wskbd_repeat, sc); #endif sc->id->t_sc = sc; sc->sc_accessops = ap->accessops; sc->sc_accesscookie = ap->accesscookie; sc->sc_repeating = 0; sc->sc_translating = 1; sc->sc_ledstate = -1; /* force update */ if (wskbd_load_keymap(sc->id->t_keymap, &sc->sc_map, &sc->sc_maplen) != 0) panic("cannot load keymap"); sc->sc_layout = sc->id->t_keymap->layout; /* set default bell and key repeat data */ sc->sc_bell_data = wskbd_default_bell_data; sc->sc_keyrepeat_data = wskbd_default_keyrepeat_data; if (ap->console) { KASSERT(wskbd_console_initted); KASSERT(wskbd_console_device == NULL); wskbd_console_device = sc; printf(": console keyboard"); #if NWSDISPLAY > 0 wsdisplay_set_console_kbd(&sc->sc_base); /* sets sc_displaydv */ if (sc->sc_displaydv != NULL) printf(", using %s", sc->sc_displaydv->dv_xname); #endif } printf("\n"); #if NWSMUX > 0 if (mux >= 0) { error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base); if (error) printf("%s: attach error=%d\n", sc->sc_base.me_dv.dv_xname, error); } #endif #if WSDISPLAY > 0 && NWSMUX == 0 if (ap->console == 0) { /* * In the non-wsmux world, always connect wskbd0 and wsdisplay0 * together. */ extern struct cfdriver wsdisplay_cd; if (wsdisplay_cd.cd_ndevs != 0 && self->dv_unit == 0) { if (wskbd_set_display(self, wsdisplay_cd.cd_devs[0]) == 0) wsdisplay_set_kbd(wsdisplay_cd.cd_devs[0], (struct wsevsrc *)sc); } } #endif }