Lines Matching +full:sw +full:- +full:mode

5 /*-
6 * SPDX-License-Identifier: BSD-2-Clause
90 * Note that callout is initialized as not MP-safe to make sure
98 mtx_init(&(s)->ks_lock, "kbdmux", NULL, MTX_DEF|MTX_RECURSE)
100 mtx_destroy(&(s)->ks_lock)
102 mtx_lock(&(s)->ks_lock)
104 mtx_unlock(&(s)->ks_lock)
106 mtx_assert(&(s)->ks_lock, (w))
182 if (state->ks_inq_length == KBDMUX_Q_SIZE) in kbdmux_kbd_putc()
185 p = (state->ks_inq_start + state->ks_inq_length) % KBDMUX_Q_SIZE; in kbdmux_kbd_putc()
186 state->ks_inq[p] = c; in kbdmux_kbd_putc()
187 state->ks_inq_length++; in kbdmux_kbd_putc()
195 if (state->ks_inq_length == 0) in kbdmux_kbd_getc()
196 return (-1); in kbdmux_kbd_getc()
198 c = state->ks_inq[state->ks_inq_start]; in kbdmux_kbd_getc()
199 state->ks_inq_start = (state->ks_inq_start + 1) % KBDMUX_Q_SIZE; in kbdmux_kbd_getc()
200 state->ks_inq_length--; in kbdmux_kbd_getc()
225 if (state->ks_inq_length > 0) in kbdmux_kbd_intr_timo()
226 taskqueue_enqueue(taskqueue_swi_giant, &state->ks_task); in kbdmux_kbd_intr_timo()
228 /* re-schedule timeout */ in kbdmux_kbd_intr_timo()
229 callout_schedule(&state->ks_timo, TICKS); in kbdmux_kbd_intr_timo()
263 continue; /* not open - discard the input */ in kbdmux_kbd_event()
269 if (state->ks_inq_length > 0) in kbdmux_kbd_event()
270 taskqueue_enqueue(taskqueue_swi_giant, &state->ks_task); in kbdmux_kbd_event()
280 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_kbd_event()
281 if (k->kbd == kbd) in kbdmux_kbd_event()
285 kbd_release(k->kbd, &k->kbd); in kbdmux_kbd_event()
286 SLIST_REMOVE(&state->ks_kbds, k, kbdmux_kbd, next); in kbdmux_kbd_event()
288 k->kbd = NULL; in kbdmux_kbd_event()
412 TASK_INIT(&state->ks_task, 0, kbdmux_kbd_intr, (void *) kbd); in kbdmux_init()
413 callout_init(&state->ks_timo, 1); in kbdmux_init()
414 SLIST_INIT(&state->ks_kbds); in kbdmux_init()
419 state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_init()
420 keymap = kbd->kb_keymap; in kbdmux_init()
421 accmap = kbd->kb_accentmap; in kbdmux_init()
422 fkeymap = kbd->kb_fkeytab; in kbdmux_init()
423 fkeymap_size = kbd->kb_fkeytab_size; in kbdmux_init()
435 kbd->kb_data = (void *)state; in kbdmux_init()
442 state->ks_mode = K_XLATE; in kbdmux_init()
447 kbd->kb_config = flags & ~KB_CONF_PROBE_ONLY; in kbdmux_init()
449 kbdmux_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); in kbdmux_init()
451 delay[0] = kbd->kb_delay1; in kbdmux_init()
452 delay[1] = kbd->kb_delay2; in kbdmux_init()
475 state->ks_evdev = evdev; in kbdmux_init()
476 state->ks_evdev_state = 0; in kbdmux_init()
490 callout_reset(&state->ks_timo, TICKS, kbdmux_kbd_intr_timo, state); in kbdmux_init()
519 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_term()
524 while ((k = SLIST_FIRST(&state->ks_kbds)) != NULL) { in kbdmux_term()
525 kbd_release(k->kbd, &k->kbd); in kbdmux_term()
526 SLIST_REMOVE_HEAD(&state->ks_kbds, next); in kbdmux_term()
528 k->kbd = NULL; in kbdmux_term()
534 callout_drain(&state->ks_timo); in kbdmux_term()
535 taskqueue_drain(taskqueue_swi_giant, &state->ks_task); in kbdmux_term()
540 evdev_free(state->ks_evdev); in kbdmux_term()
547 free(kbd->kb_keymap, M_KBDMUX); in kbdmux_term()
548 free(kbd->kb_accentmap, M_KBDMUX); in kbdmux_term()
549 free(kbd->kb_fkeytab, M_KBDMUX); in kbdmux_term()
565 (*kbd->kb_callback.kc_func)(kbd, KBDIO_KEYINPUT, in kbdmux_intr()
566 kbd->kb_callback.kc_arg); in kbdmux_intr()
613 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_read()
620 if (c != -1) in kbdmux_read()
621 kbd->kb_count ++; in kbdmux_read()
623 return (KBD_IS_ACTIVE(kbd)? c : -1); in kbdmux_read()
632 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_check()
639 ready = (state->ks_inq_length > 0) ? TRUE : FALSE; in kbdmux_check()
651 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_read_char()
660 if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char > 0)) { in kbdmux_read_char()
661 action = state->ks_composed_char; in kbdmux_read_char()
662 state->ks_composed_char = 0; in kbdmux_read_char()
676 if (scancode == -1) { in kbdmux_read_char()
677 if (state->ks_polling != 0) { in kbdmux_read_char()
680 SLIST_FOREACH(k, &state->ks_kbds, next) { in kbdmux_read_char()
681 while (kbdd_check_char(k->kbd)) { in kbdmux_read_char()
682 scancode = kbdd_read_char(k->kbd, 0); in kbdmux_read_char()
687 if (!KBD_IS_BUSY(k->kbd)) in kbdmux_read_char()
694 if (state->ks_inq_length > 0) in kbdmux_read_char()
701 /* XXX FIXME: check for -1 if wait == 1! */ in kbdmux_read_char()
703 kbd->kb_count ++; in kbdmux_read_char()
707 if (evdev_rcpt_mask & EVDEV_RCPT_KBDMUX && state->ks_evdev != NULL) { in kbdmux_read_char()
708 uint16_t key = evdev_scancode2key(&state->ks_evdev_state, in kbdmux_read_char()
712 evdev_push_event(state->ks_evdev, EV_KEY, in kbdmux_read_char()
714 evdev_sync(state->ks_evdev); in kbdmux_read_char()
718 if (state->ks_evdev != NULL && evdev_is_grabbed(state->ks_evdev)) in kbdmux_read_char()
722 /* return the byte as is for the K_RAW mode */ in kbdmux_read_char()
723 if (state->ks_mode == K_RAW) { in kbdmux_read_char()
730 switch (state->ks_prefix) { in kbdmux_read_char()
734 if (state->ks_flags & COMPOSE) { in kbdmux_read_char()
735 state->ks_flags &= ~COMPOSE; in kbdmux_read_char()
736 if (state->ks_composed_char > UCHAR_MAX) in kbdmux_read_char()
737 state->ks_composed_char = 0; in kbdmux_read_char()
741 if (!(state->ks_flags & COMPOSE)) { in kbdmux_read_char()
742 state->ks_flags |= COMPOSE; in kbdmux_read_char()
743 state->ks_composed_char = 0; in kbdmux_read_char()
748 state->ks_prefix = scancode; in kbdmux_read_char()
753 state->ks_prefix = 0; in kbdmux_read_char()
770 case 0x46: /* ctrl-pause/break on AT 101 (see below) */ in kbdmux_read_char()
832 * E1-1D-45 E1-9D-C5 in kbdmux_read_char()
833 * Ctrl-pause/break produces: in kbdmux_read_char()
834 * E0-46 E0-C6 (See above.) in kbdmux_read_char()
836 state->ks_prefix = 0; in kbdmux_read_char()
838 state->ks_prefix = 0x1D; in kbdmux_read_char()
842 state->ks_prefix = 0; in kbdmux_read_char()
852 if (state->ks_flags & ALTS) in kbdmux_read_char()
856 if (state->ks_flags & CTLS) in kbdmux_read_char()
861 /* return the key code in the K_CODE mode */ in kbdmux_read_char()
862 if (state->ks_mode == K_CODE) { in kbdmux_read_char()
868 if (state->ks_flags & COMPOSE) { in kbdmux_read_char()
872 state->ks_composed_char *= 10; in kbdmux_read_char()
873 state->ks_composed_char += keycode - 0x40; in kbdmux_read_char()
874 if (state->ks_composed_char > UCHAR_MAX) { in kbdmux_read_char()
880 state->ks_composed_char *= 10; in kbdmux_read_char()
881 state->ks_composed_char += keycode - 0x47; in kbdmux_read_char()
882 if (state->ks_composed_char > UCHAR_MAX) { in kbdmux_read_char()
888 state->ks_composed_char *= 10; in kbdmux_read_char()
889 state->ks_composed_char += keycode - 0x4E; in kbdmux_read_char()
890 if (state->ks_composed_char > UCHAR_MAX) { in kbdmux_read_char()
896 state->ks_composed_char *= 10; in kbdmux_read_char()
897 if (state->ks_composed_char > UCHAR_MAX) { in kbdmux_read_char()
914 if (state->ks_composed_char > 0) { in kbdmux_read_char()
915 state->ks_flags &= ~COMPOSE; in kbdmux_read_char()
916 state->ks_composed_char = 0; in kbdmux_read_char()
926 &state->ks_state, &state->ks_accents); in kbdmux_read_char()
941 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_check_char()
949 if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char != 0)) in kbdmux_check_char()
952 ready = (state->ks_inq_length > 0) ? TRUE : FALSE; in kbdmux_check_char()
965 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_ioctl()
968 int error = 0, mode; in kbdmux_ioctl() local
980 if (ki == NULL || ki->kb_unit < 0 || ki->kb_name[0] == '\0' || in kbdmux_ioctl()
981 strcmp(ki->kb_name, "*") == 0) in kbdmux_ioctl()
986 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
987 if (k->kbd->kb_unit == ki->kb_unit && in kbdmux_ioctl()
988 strcmp(k->kbd->kb_name, ki->kb_name) == 0) in kbdmux_ioctl()
1004 k->kbd = kbd_get_keyboard( in kbdmux_ioctl()
1006 ki->kb_name, in kbdmux_ioctl()
1007 ki->kb_unit, in kbdmux_ioctl()
1008 (void *) &k->kbd, in kbdmux_ioctl()
1010 if (k->kbd == NULL) { in kbdmux_ioctl()
1017 kbdd_enable(k->kbd); in kbdmux_ioctl()
1018 kbdd_clear_state(k->kbd); in kbdmux_ioctl()
1020 /* set K_RAW mode on slave keyboard */ in kbdmux_ioctl()
1021 mode = K_RAW; in kbdmux_ioctl()
1022 error = kbdd_ioctl(k->kbd, KDSKBMODE, (caddr_t)&mode); in kbdmux_ioctl()
1025 mode = state->ks_state & LOCK_MASK; in kbdmux_ioctl()
1026 error = kbdd_ioctl(k->kbd, KDSKBSTATE, (caddr_t)&mode); in kbdmux_ioctl()
1032 kbd_release(k->kbd, &k->kbd); in kbdmux_ioctl()
1033 k->kbd = NULL; in kbdmux_ioctl()
1037 return (error); /* could not set mode */ in kbdmux_ioctl()
1040 SLIST_INSERT_HEAD(&state->ks_kbds, k, next); in kbdmux_ioctl()
1048 if (ki == NULL || ki->kb_unit < 0 || ki->kb_name[0] == '\0' || in kbdmux_ioctl()
1049 strcmp(ki->kb_name, "*") == 0) in kbdmux_ioctl()
1054 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
1055 if (k->kbd->kb_unit == ki->kb_unit && in kbdmux_ioctl()
1056 strcmp(k->kbd->kb_name, ki->kb_name) == 0) in kbdmux_ioctl()
1060 error = kbd_release(k->kbd, &k->kbd); in kbdmux_ioctl()
1062 SLIST_REMOVE(&state->ks_kbds, k, kbdmux_kbd, next); in kbdmux_ioctl()
1064 k->kbd = NULL; in kbdmux_ioctl()
1074 case KDGKBMODE: /* get kyboard mode */ in kbdmux_ioctl()
1076 *(int *)arg = state->ks_mode; in kbdmux_ioctl()
1086 case KDSKBMODE: /* set keyboard mode */ in kbdmux_ioctl()
1091 if (state->ks_mode != K_XLATE) { in kbdmux_ioctl()
1093 state->ks_state &= ~LOCK_MASK; in kbdmux_ioctl()
1094 state->ks_state |= KBD_LED_VAL(kbd); in kbdmux_ioctl()
1100 if (state->ks_mode != *(int *)arg) { in kbdmux_ioctl()
1102 state->ks_mode = *(int *)arg; in kbdmux_ioctl()
1138 if (state->ks_evdev != NULL && in kbdmux_ioctl()
1140 evdev_push_leds(state->ks_evdev, *(int *)arg); in kbdmux_ioctl()
1143 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
1144 (void)kbdd_ioctl(k->kbd, KDSETLED, arg); in kbdmux_ioctl()
1151 *(int *)arg = state->ks_state & LOCK_MASK; in kbdmux_ioctl()
1170 state->ks_state &= ~LOCK_MASK; in kbdmux_ioctl()
1171 state->ks_state |= *(int *)arg; in kbdmux_ioctl()
1174 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
1175 (void)kbdd_ioctl(k->kbd, KDSKBSTATE, arg); in kbdmux_ioctl()
1197 for (i = nitems(kbdelays) - 1; i > 0; i--) in kbdmux_ioctl()
1200 mode = i << 5; in kbdmux_ioctl()
1203 for (i = nitems(kbrates) - 1; i > 0; i--) in kbdmux_ioctl()
1206 mode |= i; in kbdmux_ioctl()
1208 mode = *(int *)arg; in kbdmux_ioctl()
1210 if (mode & ~0x7f) { in kbdmux_ioctl()
1216 kbd->kb_delay1 = kbdelays[(mode >> 5) & 3]; in kbdmux_ioctl()
1217 kbd->kb_delay2 = kbrates[mode & 0x1f]; in kbdmux_ioctl()
1219 if (state->ks_evdev != NULL && in kbdmux_ioctl()
1221 evdev_push_repeats(state->ks_evdev, kbd); in kbdmux_ioctl()
1224 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
1225 (void)kbdd_ioctl(k->kbd, cmd, arg); in kbdmux_ioctl()
1237 state->ks_accents = 0; in kbdmux_ioctl()
1241 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_ioctl()
1242 (void)kbdd_ioctl(k->kbd, cmd, arg); in kbdmux_ioctl()
1272 state->ks_flags &= ~COMPOSE; in kbdmux_clear_state_locked()
1273 state->ks_polling = 0; in kbdmux_clear_state_locked()
1274 state->ks_state &= LOCK_MASK; /* preserve locking key state */ in kbdmux_clear_state_locked()
1275 state->ks_accents = 0; in kbdmux_clear_state_locked()
1276 state->ks_composed_char = 0; in kbdmux_clear_state_locked()
1277 /* state->ks_prefix = 0; XXX */ in kbdmux_clear_state_locked()
1278 state->ks_inq_length = 0; in kbdmux_clear_state_locked()
1284 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_clear_state()
1300 return (-1); in kbdmux_get_state()
1302 bcopy(kbd->kb_data, buf, sizeof(kbdmux_state_t)); /* XXX locking? */ in kbdmux_get_state()
1316 bcopy(buf, kbd->kb_data, sizeof(kbdmux_state_t)); /* XXX locking? */ in kbdmux_set_state()
1327 kbdmux_state_t *state = (kbdmux_state_t *) kbd->kb_data; in kbdmux_poll()
1333 state->ks_polling++; in kbdmux_poll()
1335 state->ks_polling--; in kbdmux_poll()
1338 SLIST_FOREACH(k, &state->ks_kbds, next) in kbdmux_poll()
1339 kbdd_poll(k->kbd, on); in kbdmux_poll()
1373 keyboard_switch_t *sw; in kbdmux_modevent() local
1382 if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) { in kbdmux_modevent()
1389 if ((error = (*sw->probe)(0, NULL, 0)) != 0 || in kbdmux_modevent()
1390 (error = (*sw->init)(0, &kbd, NULL, 0)) != 0) in kbdmux_modevent()
1395 (*sw->term)(kbd); in kbdmux_modevent()
1400 if ((error = (*sw->enable)(kbd)) != 0) in kbdmux_modevent()
1405 if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) { in kbdmux_modevent()
1412 (*sw->disable)(kbd); in kbdmux_modevent()
1416 (*sw->term)(kbd); in kbdmux_modevent()