Lines Matching +full:sw +full:- +full:reset +full:- +full:number
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
85 #define HAS_QUIRK(p, q) (((atkbdc_softc_t *)(p))->quirks & q)
99 keyboard_switch_t *sw; in atkbd_probe_unit() local
103 sw = kbd_get_switch(ATKBD_DRIVER_NAME); in atkbd_probe_unit()
104 if (sw == NULL) in atkbd_probe_unit()
109 error = (*sw->probe)(device_get_unit(dev), args, flags); in atkbd_probe_unit()
118 keyboard_switch_t *sw; in atkbd_attach_unit() local
124 sw = kbd_get_switch(ATKBD_DRIVER_NAME); in atkbd_attach_unit()
125 if (sw == NULL) in atkbd_attach_unit()
128 /* reset, initialize and enable the device */ in atkbd_attach_unit()
133 error = (*sw->probe)(unit, args, flags); in atkbd_attach_unit()
136 error = (*sw->init)(unit, kbd, args, flags); in atkbd_attach_unit()
139 (*sw->enable)(*kbd); in atkbd_attach_unit()
152 state = (atkbd_state_t *)(*kbd)->kb_data; in atkbd_attach_unit()
153 callout_init(&state->ks_timer, 0); in atkbd_attach_unit()
157 (*sw->diag)(*kbd, bootverbose); in atkbd_attach_unit()
176 * This ugly hack calls the low-level interrupt routine if input in atkbd_timeout()
180 * it's a keyboard scan code or mouse data. The low-level in atkbd_timeout()
187 * This is necessary to handle edge triggered interrupts - if we in atkbd_timeout()
189 * would be no more keyboard IRQs until the keyboard is reset by in atkbd_timeout()
198 * We have seen the lock flag is not set. Let's reset in atkbd_timeout()
208 state = (atkbd_state_t *)kbd->kb_data; in atkbd_timeout()
209 callout_reset_sbt(&state->ks_timer, SBT_1S / atkbdhz, 0, in atkbd_timeout()
214 /* LOW-LEVEL */
299 * to tickle keyboard drivers when the low-level console is being initialized.
302 * NOTE: because of the way the low-level console is initialized, this routine
322 kbd->kb_flags &= ~KB_REGISTERED; in atkbd_configure()
332 arg[0] = -1; in atkbd_configure()
333 arg[1] = -1; in atkbd_configure()
340 /* return the number of found keyboards */ in atkbd_configure()
344 /* low-level functions */
369 /* reset and initialize the device */
416 state = (atkbd_state_t *)kbd->kb_data; in atkbd_init()
418 keymap = kbd->kb_keymap; in atkbd_init()
419 accmap = kbd->kb_accentmap; in atkbd_init()
420 fkeymap = kbd->kb_fkeytab; in atkbd_init()
421 fkeymap_size = kbd->kb_fkeytab_size; in atkbd_init()
426 state->kbdc = atkbdc_open(data[0]); in atkbd_init()
427 if (state->kbdc == NULL) { in atkbd_init()
438 kbd->kb_data = (void *)state; in atkbd_init()
440 if (probe_keyboard(state->kbdc, flags)) { /* shouldn't happen */ in atkbd_init()
449 state->ks_mode = K_XLATE; in atkbd_init()
457 kbd->kb_config = flags & ~KB_CONF_PROBE_ONLY; in atkbd_init()
459 && init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config) in atkbd_init()
460 && (kbd->kb_config & KB_CONF_FAIL_IF_NO_KBD)) { in atkbd_init()
465 atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); in atkbd_init()
467 delay[0] = kbd->kb_delay1; in atkbd_init()
468 delay[1] = kbd->kb_delay2; in atkbd_init()
473 if (state->ks_evdev == NULL) { in atkbd_init()
493 state->ks_evdev = evdev; in atkbd_init()
494 state->ks_evdev_state = 0; in atkbd_init()
531 atkbd_state_t *state = (atkbd_state_t *)kbd->kb_data; in atkbd_term()
534 callout_drain(&state->ks_timer); in atkbd_term()
542 atkbd_state_t *state = (atkbd_state_t *)kbd->kb_data; in atkbd_intr()
551 init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config); in atkbd_intr()
553 atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); in atkbd_intr()
555 delay[0] = kbd->kb_delay1; in atkbd_intr()
556 delay[1] = kbd->kb_delay2; in atkbd_intr()
560 if (state->ks_polling) in atkbd_intr()
565 (*kbd->kb_callback.kc_func)(kbd, KBDIO_KEYINPUT, in atkbd_intr()
566 kbd->kb_callback.kc_arg); in atkbd_intr()
584 empty_both_buffers(((atkbd_state_t *)kbd->kb_data)->kbdc, 10); in atkbd_test_if()
586 if (!test_controller(((atkbd_state_t *)kbd->kb_data)->kbdc)) in atkbd_test_if()
588 else if (test_kbd_port(((atkbd_state_t *)kbd->kb_data)->kbdc) != 0) in atkbd_test_if()
629 c = read_kbd_data(((atkbd_state_t *)kbd->kb_data)->kbdc); in atkbd_read()
631 c = read_kbd_data_no_wait(((atkbd_state_t *)kbd->kb_data)->kbdc); in atkbd_read()
632 if (c != -1) in atkbd_read()
633 ++kbd->kb_count; in atkbd_read()
634 return (KBD_IS_ACTIVE(kbd) ? c : -1); in atkbd_read()
643 return kbdc_data_ready(((atkbd_state_t *)kbd->kb_data)->kbdc); in atkbd_check()
655 state = (atkbd_state_t *)kbd->kb_data; in atkbd_read_char()
658 if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char > 0)) { in atkbd_read_char()
659 action = state->ks_composed_char; in atkbd_read_char()
660 state->ks_composed_char = 0; in atkbd_read_char()
669 scancode = read_kbd_data(state->kbdc); in atkbd_read_char()
670 } while (scancode == -1); in atkbd_read_char()
672 scancode = read_kbd_data_no_wait(state->kbdc); in atkbd_read_char()
673 if (scancode == -1) in atkbd_read_char()
676 ++kbd->kb_count; in atkbd_read_char()
684 if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && state->ks_evdev != NULL) { in atkbd_read_char()
686 if (state->ks_evdev_state == 0 && in atkbd_read_char()
688 keycode = evdev_scancode2key(&state->ks_evdev_state, in atkbd_read_char()
690 evdev_push_event(state->ks_evdev, EV_KEY, in atkbd_read_char()
692 evdev_sync(state->ks_evdev); in atkbd_read_char()
695 keycode = evdev_scancode2key(&state->ks_evdev_state, in atkbd_read_char()
699 evdev_push_event(state->ks_evdev, EV_KEY, in atkbd_read_char()
701 evdev_sync(state->ks_evdev); in atkbd_read_char()
705 if (state->ks_evdev != NULL && evdev_is_grabbed(state->ks_evdev)) in atkbd_read_char()
710 if (state->ks_mode == K_RAW) in atkbd_read_char()
715 switch (state->ks_prefix) { in atkbd_read_char()
719 if (state->ks_flags & COMPOSE) { in atkbd_read_char()
720 state->ks_flags &= ~COMPOSE; in atkbd_read_char()
721 if (state->ks_composed_char > UCHAR_MAX) in atkbd_read_char()
722 state->ks_composed_char = 0; in atkbd_read_char()
726 if (!(state->ks_flags & COMPOSE)) { in atkbd_read_char()
727 state->ks_flags |= COMPOSE; in atkbd_read_char()
728 state->ks_composed_char = 0; in atkbd_read_char()
733 state->ks_prefix = scancode; in atkbd_read_char()
738 state->ks_prefix = 0; in atkbd_read_char()
755 case 0x46: /* ctrl-pause/break on AT 101 (see below) */ in atkbd_read_char()
814 * E1-1D-45 E1-9D-C5 in atkbd_read_char()
815 * Ctrl-pause/break produces: in atkbd_read_char()
816 * E0-46 E0-C6 (See above.) in atkbd_read_char()
818 state->ks_prefix = 0; in atkbd_read_char()
820 state->ks_prefix = 0x1D; in atkbd_read_char()
824 state->ks_prefix = 0; in atkbd_read_char()
831 if (kbd->kb_type == KB_84) { in atkbd_read_char()
834 if (state->ks_flags & SHIFTS) in atkbd_read_char()
838 if (state->ks_flags & CTLS) in atkbd_read_char()
842 if (state->ks_flags & CTLS) in atkbd_read_char()
846 } else if (kbd->kb_type == KB_101) { in atkbd_read_char()
849 if (state->ks_flags & ALTS) in atkbd_read_char()
853 if (state->ks_flags & CTLS) in atkbd_read_char()
860 if (state->ks_mode == K_CODE) in atkbd_read_char()
864 if (state->ks_flags & COMPOSE) { in atkbd_read_char()
868 state->ks_composed_char *= 10; in atkbd_read_char()
869 state->ks_composed_char += keycode - 0x40; in atkbd_read_char()
870 if (state->ks_composed_char > UCHAR_MAX) in atkbd_read_char()
874 state->ks_composed_char *= 10; in atkbd_read_char()
875 state->ks_composed_char += keycode - 0x47; in atkbd_read_char()
876 if (state->ks_composed_char > UCHAR_MAX) in atkbd_read_char()
880 state->ks_composed_char *= 10; in atkbd_read_char()
881 state->ks_composed_char += keycode - 0x4E; in atkbd_read_char()
882 if (state->ks_composed_char > UCHAR_MAX) in atkbd_read_char()
886 state->ks_composed_char *= 10; in atkbd_read_char()
887 if (state->ks_composed_char > UCHAR_MAX) in atkbd_read_char()
902 if (state->ks_composed_char > 0) { in atkbd_read_char()
903 state->ks_flags &= ~COMPOSE; in atkbd_read_char()
904 state->ks_composed_char = 0; in atkbd_read_char()
913 &state->ks_state, &state->ks_accents); in atkbd_read_char()
928 state = (atkbd_state_t *)kbd->kb_data; in atkbd_check_char()
929 if (!(state->ks_flags & COMPOSE) && (state->ks_composed_char > 0)) in atkbd_check_char()
931 return kbdc_data_ready(state->kbdc); in atkbd_check_char()
942 atkbd_state_t *state = kbd->kb_data; in atkbd_ioctl()
954 *(int *)arg = state->ks_mode; in atkbd_ioctl()
966 if (state->ks_mode != K_XLATE) { in atkbd_ioctl()
968 state->ks_state &= ~LOCK_MASK; in atkbd_ioctl()
969 state->ks_state |= KBD_LED_VAL(kbd); in atkbd_ioctl()
974 if (state->ks_mode != *(int *)arg) { in atkbd_ioctl()
976 state->ks_mode = *(int *)arg; in atkbd_ioctl()
1003 if (state->ks_mode == K_XLATE && in atkbd_ioctl()
1004 kbd->kb_keymap->n_keys > ALTGR_OFFSET) { in atkbd_ioctl()
1011 error = write_kbd(state->kbdc, KBDC_SET_LEDS, in atkbd_ioctl()
1020 if (state->ks_evdev != NULL && in atkbd_ioctl()
1022 evdev_push_leds(state->ks_evdev, *(int *)arg); in atkbd_ioctl()
1028 *(int *)arg = state->ks_state & LOCK_MASK; in atkbd_ioctl()
1042 state->ks_state &= ~LOCK_MASK; in atkbd_ioctl()
1043 state->ks_state |= *(int *)arg; in atkbd_ioctl()
1053 error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, i); in atkbd_ioctl()
1055 kbd->kb_delay1 = typematic_delay(i); in atkbd_ioctl()
1056 kbd->kb_delay2 = typematic_rate(i); in atkbd_ioctl()
1058 if (state->ks_evdev != NULL && in atkbd_ioctl()
1060 evdev_push_repeats(state->ks_evdev, kbd); in atkbd_ioctl()
1076 error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, *(int *)arg); in atkbd_ioctl()
1078 kbd->kb_delay1 = typematic_delay(*(int *)arg); in atkbd_ioctl()
1079 kbd->kb_delay2 = typematic_rate(*(int *)arg); in atkbd_ioctl()
1081 if (state->ks_evdev != NULL && in atkbd_ioctl()
1083 evdev_push_repeats(state->ks_evdev, kbd); in atkbd_ioctl()
1095 state->ks_accents = 0; in atkbd_ioctl()
1110 return kbdc_lock(((atkbd_state_t *)kbd->kb_data)->kbdc, lock); in atkbd_lock()
1119 state = (atkbd_state_t *)kbd->kb_data; in atkbd_clear_state()
1120 state->ks_flags = 0; in atkbd_clear_state()
1121 state->ks_polling = 0; in atkbd_clear_state()
1122 state->ks_state &= LOCK_MASK; /* preserve locking key state */ in atkbd_clear_state()
1123 state->ks_accents = 0; in atkbd_clear_state()
1124 state->ks_composed_char = 0; in atkbd_clear_state()
1126 state->ks_prefix = 0; /* XXX */ in atkbd_clear_state()
1137 return -1; in atkbd_get_state()
1138 bcopy(kbd->kb_data, buf, sizeof(atkbd_state_t)); in atkbd_get_state()
1148 if (((atkbd_state_t *)kbd->kb_data)->kbdc in atkbd_set_state()
1149 != ((atkbd_state_t *)buf)->kbdc) in atkbd_set_state()
1151 bcopy(buf, kbd->kb_data, sizeof(atkbd_state_t)); in atkbd_set_state()
1161 state = (atkbd_state_t *)kbd->kb_data; in atkbd_poll()
1164 ++state->ks_polling; in atkbd_poll()
1166 --state->ks_polling; in atkbd_poll()
1174 /* reset keyboard hardware */ in atkbd_reset()
1178 * Keyboard reset may fail either because the keyboard in atkbd_reset()
1180 * the self-test, or the keyboard controller on the in atkbd_reset()
1198 printf("atkbd: failed to reset the keyboard.\n"); in atkbd_reset()
1226 atkbd_state_t *state = kbd->kb_data; in set_typematic()
1229 error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, val); in set_typematic()
1231 kbd->kb_delay1 = typematic_delay(val); in set_typematic()
1232 kbd->kb_delay2 = typematic_rate(val); in set_typematic()
1294 * Don't try to print anything in this function. The low-level in probe_keyboard()
1315 if (c == -1) { in probe_keyboard()
1339 * to the system later. It is NOT recommended to hot-plug in probe_keyboard()
1377 if (c == -1) { in init_keyboard()
1406 * Check if we have an XT keyboard before we attempt to reset it. in init_keyboard()
1411 codeset = -1; in init_keyboard()
1440 case -1: /* AT 84 keyboard doesn't return ID */ in init_keyboard()
1481 * the reset command before they will send keystrokes to us in init_keyboard()
1525 if ((c == -1) in write_kbd()
1566 id1 = id2 = -1; in get_kbd_id()
1568 return -1; in get_kbd_id()
1572 if (id1 != -1) in get_kbd_id()
1575 if ((id1 == -1) || (id2 == -1)) { in get_kbd_id()
1579 return -1; in get_kbd_id()
1602 for (i = nitems(kbdelays) - 1; i > 0; --i) { in typematic()
1607 for (i = nitems(kbrates) - 1; i > 0; --i) { in typematic()