diff options
-rw-r--r-- | sys/dev/kbd/kbd.c | 24 | ||||
-rw-r--r-- | sys/dev/syscons/syscons.c | 46 |
2 files changed, 66 insertions, 4 deletions
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c index 9786441..1c004c3 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -185,8 +185,12 @@ kbd_register(keyboard_t *kbd) { const keyboard_driver_t **list; const keyboard_driver_t *p; + keyboard_t *mux; + keyboard_info_t ki; int index; + mux = kbd_get_keyboard(kbd_find_keyboard("kbdmux", -1)); + for (index = 0; index < keyboards; ++index) { if (keyboard[index] == NULL) break; @@ -208,6 +212,16 @@ kbd_register(keyboard_t *kbd) if (strcmp(p->name, kbd->kb_name) == 0) { keyboard[index] = kbd; kbdsw[index] = p->kbdsw; + + if (mux != NULL) { + bzero(&ki, sizeof(ki)); + strcpy(ki.kb_name, kbd->kb_name); + ki.kb_unit = kbd->kb_unit; + + (*kbdsw[mux->kb_index]->ioctl) + (mux, KBADDKBD, (caddr_t) &ki); + } + return (index); } } @@ -216,6 +230,16 @@ kbd_register(keyboard_t *kbd) if (strcmp(p->name, kbd->kb_name) == 0) { keyboard[index] = kbd; kbdsw[index] = p->kbdsw; + + if (mux != NULL) { + bzero(&ki, sizeof(ki)); + strcpy(ki.kb_name, kbd->kb_name); + ki.kb_unit = kbd->kb_unit; + + (*kbdsw[mux->kb_index]->ioctl) + (mux, KBADDKBD, (caddr_t) &ki); + } + return (index); } } diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index e1228d4..d98611b 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -165,6 +165,7 @@ SYSCTL_INT(_machdep, OID_AUTO, enable_panic_key, CTLFLAG_RW, &enable_panic_key, static int debugger; /* prototypes */ +static int sc_allocate_keyboard(sc_softc_t *sc, int unit); static struct tty *sc_alloc_tty(struct cdev *dev); static int scvidprobe(int unit, int flags, int cons); static int sckbdprobe(int unit, int flags, int cons); @@ -1676,8 +1677,7 @@ scrn_timer(void *arg) if ((sc->kbd == NULL) && (sc->config & SC_AUTODETECT_KBD)) { /* try to allocate a keyboard automatically */ if (++kbd_interval >= 25) { - sc->keyboard = kbd_allocate("*", -1, (void *)&sc->keyboard, - sckbdevent, sc); + sc->keyboard = sc_allocate_keyboard(sc, -1); if (sc->keyboard >= 0) { sc->kbd = kbd_get_keyboard(sc->keyboard); kbd_ioctl(sc->kbd, KDSKBMODE, @@ -2663,9 +2663,10 @@ scinit(int unit, int flags) sc->adapter = vid_allocate("*", unit, (void *)&sc->adapter); sc->adp = vid_get_adapter(sc->adapter); /* assert((sc->adapter >= 0) && (sc->adp != NULL)) */ - sc->keyboard = kbd_allocate("*", unit, (void *)&sc->keyboard, - sckbdevent, sc); + + sc->keyboard = sc_allocate_keyboard(sc, unit); DPRINTF(1, ("sc%d: keyboard %d\n", unit, sc->keyboard)); + sc->kbd = kbd_get_keyboard(sc->keyboard); if (sc->kbd != NULL) { DPRINTF(1, ("sc%d: kbd index:%d, unit:%d, flags:0x%x\n", @@ -3610,3 +3611,40 @@ sc_get_stat(struct cdev *devptr) return (&main_console); return (SC_STAT(devptr)); } + +/* + * Allocate active keyboard. Try to allocate "kbdmux" keyboard first, and, + * if found, add all non-busy keyboards to "kbdmux". Otherwise look for + * any keyboard. + */ + +static int +sc_allocate_keyboard(sc_softc_t *sc, int unit) +{ + int idx0, idx; + keyboard_t *k0, *k; + keyboard_info_t ki; + + idx0 = kbd_allocate("kbdmux", -1, (void *)&sc->keyboard, sckbdevent, sc); + if (idx0 != -1) { + k0 = kbd_get_keyboard(idx0); + + for (idx = kbd_find_keyboard2("*", -1, 0); + idx != -1; + idx = kbd_find_keyboard2("*", -1, idx + 1)) { + k = kbd_get_keyboard(idx); + + if (idx == idx0 || KBD_IS_BUSY(k)) + continue; + + bzero(&ki, sizeof(ki)); + strcpy(ki.kb_name, k->kb_name); + ki.kb_unit = k->kb_unit; + + kbd_ioctl(k0, KBADDKBD, (caddr_t) &ki); + } + } else + idx0 = kbd_allocate("*", unit, (void *)&sc->keyboard, sckbdevent, sc); + + return (idx0); +} |