summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/kbd/kbd.c24
-rw-r--r--sys/dev/syscons/syscons.c46
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);
+}
OpenPOWER on IntegriCloud