Lines Matching refs:kb8042

122 static void kb8042_init(struct kb8042 *kb8042, boolean_t from_resume);
124 static void kb8042_wait_poweron(struct kb8042 *kb8042);
125 static void kb8042_send_to_keyboard(struct kb8042 *, int, boolean_t);
127 static void kb8042_setled(struct kb8042 *, int led_state, boolean_t polled);
133 static void kb8042_get_initial_leds(struct kb8042 *, int *, int *);
134 static boolean_t kb8042_autorepeat_detect(struct kb8042 *kb8042, int key_pos,
136 static void kb8042_type4_cmd(struct kb8042 *kb8042, int cmd);
137 static void kb8042_ioctlmsg(struct kb8042 *kb8042, queue_t *, mblk_t *);
139 static void kb8042_process_key(struct kb8042 *, kbtrans_key_t, enum keystate);
142 static void kb8042_cleanup(struct kb8042 *kb8042);
143 static void kb8042_received_byte(struct kb8042 *, int);
205 struct kb8042 Kdws = {0};
293 kb8042_is_input_avail(struct kb8042 *kb8042, int timeout_usec, boolean_t polled) in kb8042_is_input_avail() argument
301 if (ddi_get8(kb8042->handle, kb8042->addr + port) != 0) in kb8042_is_input_avail()
311 kb8042_clear_input_buffer(struct kb8042 *kb8042, boolean_t polled) in kb8042_clear_input_buffer() argument
316 while (kb8042_is_input_avail(kb8042, MIN_DELAY_USECS, polled)) { in kb8042_clear_input_buffer()
317 (void) ddi_get8(kb8042->handle, kb8042->addr + port); in kb8042_clear_input_buffer()
325 kb8042_send_and_expect(struct kb8042 *kb8042, uint8_t send, uint8_t expect, in kb8042_send_and_expect() argument
332 ddi_put8(kb8042->handle, in kb8042_send_and_expect()
333 kb8042->addr + I8042_POLL_OUTPUT_DATA, send); in kb8042_send_and_expect()
335 if (kb8042_is_input_avail(kb8042, timeout, B_TRUE)) { in kb8042_send_and_expect()
337 datab = ddi_get8(kb8042->handle, in kb8042_send_and_expect()
338 kb8042->addr + I8042_POLL_INPUT_DATA); in kb8042_send_and_expect()
370 kb8042_read_scanset(struct kb8042 *kb8042) in kb8042_read_scanset() argument
376 kb8042_clear_input_buffer(kb8042, B_TRUE); in kb8042_read_scanset()
382 if (kb8042_send_and_expect(kb8042, KB_SET_SCAN, KB_ACK, MAX_WAIT_USECS, in kb8042_read_scanset()
391 if (kb8042_send_and_expect(kb8042, 0, KB_ACK, MAX_WAIT_USECS, &err, in kb8042_read_scanset()
401 while (kb8042_is_input_avail(kb8042, MAX_WAIT_USECS, B_TRUE) && in kb8042_read_scanset()
402 (scanset = ddi_get8(kb8042->handle, in kb8042_read_scanset()
403 kb8042->addr + I8042_POLL_INPUT_DATA)) == KB_ACK) in kb8042_read_scanset()
434 struct kb8042 *kb8042 = &Kdws; in kb8042_attach() local
443 leds = kb8042->leds.commanded; in kb8042_attach()
444 kb8042->w_init = 0; in kb8042_attach()
445 kb8042_init(kb8042, B_TRUE); in kb8042_attach()
446 kb8042_setled(kb8042, leds, B_FALSE); in kb8042_attach()
447 mutex_enter(&kb8042->w_hw_mutex); in kb8042_attach()
448 kb8042->suspended = B_FALSE; in kb8042_attach()
449 if (kb8042->w_qp != NULL) { in kb8042_attach()
450 enableok(WR(kb8042->w_qp)); in kb8042_attach()
451 qenable(WR(kb8042->w_qp)); in kb8042_attach()
453 cv_broadcast(&kb8042->suspend_cv); in kb8042_attach()
454 mutex_exit(&kb8042->w_hw_mutex); in kb8042_attach()
467 kb8042->debugger.mod1 = 58; /* Left Ctrl */ in kb8042_attach()
468 kb8042->debugger.mod2 = 60; /* Left Alt */ in kb8042_attach()
469 kb8042->debugger.trigger = 33; /* D */ in kb8042_attach()
470 kb8042->debugger.mod1_down = B_FALSE; in kb8042_attach()
471 kb8042->debugger.mod2_down = B_FALSE; in kb8042_attach()
472 kb8042->debugger.enabled = B_FALSE; in kb8042_attach()
475 kb8042->init_state = KB8042_UNINITIALIZED; in kb8042_attach()
477 kb8042->polled_synthetic_release_pending = B_FALSE; in kb8042_attach()
484 kb8042->init_state |= KB8042_MINOR_NODE_CREATED; in kb8042_attach()
486 rc = ddi_regs_map_setup(devi, 0, (caddr_t *)&kb8042->addr, in kb8042_attach()
487 (offset_t)0, (offset_t)0, &attr, &kb8042->handle); in kb8042_attach()
495 kb8042->init_state |= KB8042_REGS_MAPPED; in kb8042_attach()
497 if (ddi_get_iblock_cookie(devi, 0, &kb8042->w_iblock) != in kb8042_attach()
503 mutex_init(&kb8042->w_hw_mutex, NULL, MUTEX_DRIVER, kb8042->w_iblock); in kb8042_attach()
504 cv_init(&kb8042->ops_cv, NULL, CV_DRIVER, NULL); in kb8042_attach()
505 cv_init(&kb8042->suspend_cv, NULL, CV_DRIVER, NULL); in kb8042_attach()
506 cv_init(&kb8042->cmd_cv, NULL, CV_DRIVER, NULL); in kb8042_attach()
507 kb8042->init_state |= KB8042_HW_MUTEX_INITTED; in kb8042_attach()
509 kb8042_init(kb8042, B_FALSE); in kb8042_attach()
513 scanset = kb8042_read_scanset(kb8042); in kb8042_attach()
538 if (KeyboardConvertScan_init(kb8042, scanset) != DDI_SUCCESS) { in kb8042_attach()
549 &kb8042->w_iblock, (ddi_idevice_cookie_t *)NULL, in kb8042_attach()
550 kb8042_intr, (caddr_t)kb8042) != DDI_SUCCESS) { in kb8042_attach()
555 kb8042->init_state |= KB8042_INTR_ADDED; in kb8042_attach()
567 kb8042_cleanup(kb8042); in kb8042_attach()
574 struct kb8042 *kb8042 = &Kdws; in kb8042_detach() local
578 mutex_enter(&kb8042->w_hw_mutex); in kb8042_detach()
579 ASSERT(kb8042->ops >= 0); in kb8042_detach()
580 while (kb8042->ops > 0) in kb8042_detach()
581 cv_wait(&kb8042->ops_cv, &kb8042->w_hw_mutex); in kb8042_detach()
582 kb8042->suspended = B_TRUE; in kb8042_detach()
583 mutex_exit(&kb8042->w_hw_mutex); in kb8042_detach()
588 if (kb8042->w_qp != NULL) in kb8042_detach()
593 kb8042_cleanup(kb8042); in kb8042_detach()
636 kb8042_cleanup(struct kb8042 *kb8042) in kb8042_cleanup() argument
640 if (kb8042->init_state & KB8042_INTR_ADDED) in kb8042_cleanup()
641 ddi_remove_intr(kb8042_dip, 0, kb8042->w_iblock); in kb8042_cleanup()
643 if (kb8042->init_state & KB8042_HW_MUTEX_INITTED) { in kb8042_cleanup()
644 cv_destroy(&kb8042->cmd_cv); in kb8042_cleanup()
645 cv_destroy(&kb8042->suspend_cv); in kb8042_cleanup()
646 cv_destroy(&kb8042->ops_cv); in kb8042_cleanup()
647 mutex_destroy(&kb8042->w_hw_mutex); in kb8042_cleanup()
650 if (kb8042->init_state & KB8042_REGS_MAPPED) in kb8042_cleanup()
651 ddi_regs_map_free(&kb8042->handle); in kb8042_cleanup()
653 if (kb8042->init_state & KB8042_MINOR_NODE_CREATED) in kb8042_cleanup()
656 kb8042->init_state = KB8042_UNINITIALIZED; in kb8042_cleanup()
661 kb8042_init(struct kb8042 *kb8042, boolean_t from_resume) in kb8042_init() argument
663 if (kb8042->w_init) in kb8042_init()
667 kb8042->w_kblayout = 0; /* Default to US */ in kb8042_init()
668 kb8042->w_qp = (queue_t *)NULL; in kb8042_init()
669 kb8042->simulated_kbd_type = KB_PC; in kb8042_init()
670 kb8042->leds.commanded = -1; /* Unknown initial state */ in kb8042_init()
671 kb8042->leds.desired = -1; /* Unknown initial state */ in kb8042_init()
674 kb8042_wait_poweron(kb8042); in kb8042_init()
676 kb8042->kb_old_key_pos = 0; in kb8042_init()
683 (void) ddi_get8(kb8042->handle, kb8042->addr + I8042_LOCK); in kb8042_init()
685 kb8042_send_to_keyboard(kb8042, KB_ENABLE, B_TRUE); in kb8042_init()
686 (void) ddi_get8(kb8042->handle, kb8042->addr + I8042_UNLOCK); in kb8042_init()
688 kb8042->w_init++; in kb8042_init()
697 struct kb8042 *kb8042; in kb8042_open() local
702 kb8042 = &Kdws; in kb8042_open()
704 mutex_enter(&kb8042->w_hw_mutex); in kb8042_open()
706 kb8042->w_dev = *devp; in kb8042_open()
707 mutex_exit(&kb8042->w_hw_mutex); in kb8042_open()
712 mutex_exit(&kb8042->w_hw_mutex); in kb8042_open()
716 while (kb8042->suspended) { in kb8042_open()
717 if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) == in kb8042_open()
719 mutex_exit(&kb8042->w_hw_mutex); in kb8042_open()
724 kb8042->w_dev = *devp; in kb8042_open()
725 qp->q_ptr = (caddr_t)kb8042; in kb8042_open()
727 if (!kb8042->w_qp) in kb8042_open()
728 kb8042->w_qp = qp; in kb8042_open()
730 ASSERT(kb8042->ops >= 0); in kb8042_open()
731 kb8042->ops++; in kb8042_open()
732 mutex_exit(&kb8042->w_hw_mutex); in kb8042_open()
734 kb8042_get_initial_leds(kb8042, &initial_leds, &initial_led_mask); in kb8042_open()
736 (struct kbtrans_hardware *)kb8042, &kb8042_callbacks, in kb8042_open()
737 &kb8042->hw_kbtrans, in kb8042_open()
742 kbtrans_streams_set_keyboard(kb8042->hw_kbtrans, KB_PC, &keyindex_pc); in kb8042_open()
744 kb8042->polledio.cons_polledio_version = CONSPOLLEDIO_V1; in kb8042_open()
745 kb8042->polledio.cons_polledio_argument = in kb8042_open()
746 (cons_polledio_arg_t)kb8042; in kb8042_open()
747 kb8042->polledio.cons_polledio_putchar = NULL; in kb8042_open()
748 kb8042->polledio.cons_polledio_getchar = in kb8042_open()
750 kb8042->polledio.cons_polledio_ischar = in kb8042_open()
752 kb8042->polledio.cons_polledio_enter = NULL; in kb8042_open()
753 kb8042->polledio.cons_polledio_exit = NULL; in kb8042_open()
754 kb8042->polledio.cons_polledio_setled = in kb8042_open()
756 kb8042->polledio.cons_polledio_keycheck = in kb8042_open()
762 kbtrans_streams_enable(kb8042->hw_kbtrans); in kb8042_open()
765 mutex_enter(&kb8042->w_hw_mutex); in kb8042_open()
766 ASSERT(kb8042->ops > 0); in kb8042_open()
767 kb8042->ops--; in kb8042_open()
768 if (kb8042->ops == 0) in kb8042_open()
769 cv_broadcast(&kb8042->ops_cv); in kb8042_open()
770 mutex_exit(&kb8042->w_hw_mutex); in kb8042_open()
779 struct kb8042 *kb8042; in kb8042_close() local
784 kb8042 = (struct kb8042 *)qp->q_ptr; in kb8042_close()
786 mutex_enter(&kb8042->w_hw_mutex); in kb8042_close()
787 while (kb8042->suspended) { in kb8042_close()
788 if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) == in kb8042_close()
790 mutex_exit(&kb8042->w_hw_mutex); in kb8042_close()
795 ASSERT(kb8042->ops >= 0); in kb8042_close()
796 kb8042->ops++; in kb8042_close()
797 mutex_exit(&kb8042->w_hw_mutex); in kb8042_close()
799 (void) kbtrans_streams_fini(kb8042->hw_kbtrans); in kb8042_close()
801 kb8042->w_qp = (queue_t *)NULL; in kb8042_close()
804 mutex_enter(&kb8042->w_hw_mutex); in kb8042_close()
805 ASSERT(kb8042->ops > 0); in kb8042_close()
806 kb8042->ops--; in kb8042_close()
807 if (kb8042->ops == 0) in kb8042_close()
808 cv_broadcast(&kb8042->ops_cv); in kb8042_close()
809 mutex_exit(&kb8042->w_hw_mutex); in kb8042_close()
818 struct kb8042 *kb8042; in kb8042_rsrv() local
822 kb8042 = (struct kb8042 *)qp->q_ptr; in kb8042_rsrv()
823 kb8042_received_byte(kb8042, *mp->b_rptr); in kb8042_rsrv()
833 struct kb8042 *kb8042; local
838 kb8042 = (struct kb8042 *)qp->q_ptr;
840 mutex_enter(&kb8042->w_hw_mutex);
841 suspended = kb8042->suspended;
842 ASSERT(kb8042->ops >= 0);
844 kb8042->ops++;
845 mutex_exit(&kb8042->w_hw_mutex);
857 switch (kbtrans_streams_message(kb8042->hw_kbtrans, mp)) {
865 kb8042_ioctlmsg(kb8042, qp, mp);
891 mutex_enter(&kb8042->w_hw_mutex);
893 ASSERT(kb8042->ops > 0);
894 kb8042->ops--;
895 if (kb8042->ops == 0)
896 cv_broadcast(&kb8042->ops_cv);
898 mutex_exit(&kb8042->w_hw_mutex);
904 kb8042_ioctlmsg(struct kb8042 *kb8042, queue_t *qp, mblk_t *mp) argument
930 &kb8042->polledio;
946 kb8042->debugger.enabled = *(intptr_t *)mp->b_cont->b_rptr;
964 kb8042->simulated_kbd_type = tmp;
969 if (kb8042->w_kblayout == -1) {
979 if (kb8042->simulated_kbd_type == KB_USB)
982 *(int *)datap->b_wptr = kb8042->w_kblayout;
1000 kb8042->w_kblayout = *(intptr_t *)mp->b_cont->b_rptr;
1011 kb8042_type4_cmd(kb8042, *(int *)mp->b_cont->b_rptr);
1056 struct kb8042 *kb8042, argument
1064 if (!kb8042->w_init) /* can't do anything anyway */
1067 legit = KeyboardConvertScan(kb8042, scancode, &key_pos, &state,
1079 if (key_pos == kb8042->debugger.mod1) {
1080 kb8042->debugger.mod1_down = (state == KEY_PRESSED);
1082 if (key_pos == kb8042->debugger.mod2) {
1083 kb8042->debugger.mod2_down = (state == KEY_PRESSED);
1085 if (kb8042->debugger.enabled &&
1086 key_pos == kb8042->debugger.trigger &&
1087 kb8042->debugger.mod1_down &&
1088 kb8042->debugger.mod2_down) {
1092 kb8042->debugger.mod1_down = B_FALSE;
1093 kb8042->debugger.mod2_down = B_FALSE;
1104 if (kb8042->w_qp == NULL) {
1114 if (kb8042_autorepeat_detect(kb8042, key_pos, state)) {
1119 kb8042_process_key(kb8042, key_pos, state);
1127 (void) kb8042_autorepeat_detect(kb8042, key_pos, KEY_RELEASED);
1128 kb8042_process_key(kb8042, key_pos, state);
1134 kb8042_process_key(struct kb8042 *kb8042, kbtrans_key_t key_pos, argument
1140 if (kb8042->simulated_kbd_type == KB_PC) {
1141 kbtrans_streams_key(kb8042->hw_kbtrans, key_pos, state);
1142 } else if (kb8042->simulated_kbd_type == KB_USB) {
1145 kbtrans_streams_key(kb8042->hw_kbtrans, key, state);
1158 struct kb8042 *kb8042 = (struct kb8042 *)arg; local
1162 if (kb8042->init_state == KB8042_UNINITIALIZED)
1168 while (ddi_get8(kb8042->handle, kb8042->addr + I8042_INT_INPUT_AVAIL)
1174 scancode = ddi_get8(kb8042->handle,
1175 kb8042->addr + I8042_INT_INPUT_DATA);
1183 mutex_enter(&kb8042->w_hw_mutex);
1184 kb8042->acked = 1;
1185 cv_signal(&kb8042->cmd_cv);
1186 mutex_exit(&kb8042->w_hw_mutex);
1189 mutex_enter(&kb8042->w_hw_mutex);
1190 kb8042->need_retry = 1;
1191 cv_signal(&kb8042->cmd_cv);
1192 mutex_exit(&kb8042->w_hw_mutex);
1201 if (putq(RD(kb8042->w_qp), mp) == 0)
1232 struct kb8042 *kb8042 = (struct kb8042 *)hw; local
1237 if (kb8042->polled_synthetic_release_pending) {
1238 *key = kb8042->polled_synthetic_release_key;
1240 kb8042->polled_synthetic_release_pending = B_FALSE;
1241 (void) kb8042_autorepeat_detect(kb8042, *key, *state);
1246 if (ddi_get8(kb8042->handle,
1247 kb8042->addr + I8042_POLL_INPUT_AVAIL) == 0) {
1251 scancode = ddi_get8(kb8042->handle,
1252 kb8042->addr + I8042_POLL_INPUT_DATA);
1254 legit = KeyboardConvertScan(kb8042, scancode, key, state,
1265 (void) kb8042_autorepeat_detect(kb8042, *key, *state);
1275 kb8042->polled_synthetic_release_pending = B_TRUE;
1276 kb8042->polled_synthetic_release_key = *key;
1279 if (kb8042->simulated_kbd_type == KB_USB) {
1287 kb8042_setled(struct kb8042 *kb8042, int led_state, boolean_t polled) argument
1289 kb8042->leds.desired = led_state;
1292 mutex_enter(&kb8042->w_hw_mutex);
1294 if (kb8042->leds.desired != kb8042->leds.commanded) {
1295 kb8042_send_to_keyboard(kb8042, KB_SET_LED, polled);
1299 mutex_exit(&kb8042->w_hw_mutex);
1305 struct kb8042 *kb8042 = (struct kb8042 *)hw; local
1306 kb8042_setled(kb8042, led_state, B_TRUE);
1312 struct kb8042 *kb8042 = (struct kb8042 *)hw; local
1313 kb8042_setled(kb8042, led_state, B_FALSE);
1318 kb8042_send_and_wait(struct kb8042 *kb8042, uint8_t u8, boolean_t polled) argument
1320 uint8_t *outp = kb8042->addr +
1322 uint8_t *inavp = kb8042->addr +
1324 uint8_t *inp = kb8042->addr +
1333 kb8042->acked = 0;
1334 kb8042->need_retry = 0;
1338 ddi_put8(kb8042->handle, outp, u8);
1340 while (!kb8042->acked && !kb8042->need_retry && !timedout) {
1343 if (ddi_get8(kb8042->handle, inavp)) {
1344 b = ddi_get8(kb8042->handle, inp);
1347 kb8042->acked = 1;
1350 kb8042->need_retry = 1;
1370 if (!kb8042->acked) {
1386 if (cv_timedwait(&kb8042->cmd_cv,
1387 &kb8042->w_hw_mutex, expire) == -1 &&
1388 !kb8042->acked && !kb8042->need_retry) {
1394 } while ((kb8042->need_retry || timedout) &&
1397 return (kb8042->acked);
1405 kb8042_send_to_keyboard(struct kb8042 *kb8042, int byte, boolean_t polled) argument
1418 (void) ddi_get8(kb8042->handle, kb8042->addr +
1422 if (kb8042_send_and_wait(kb8042, KB_SET_LED, polled)) {
1427 (void) kb8042_send_and_wait(kb8042,
1428 kb8042_xlate_leds(kb8042->leds.desired), polled);
1432 (void) ddi_get8(kb8042->handle, kb8042->addr +
1435 kb8042->leds.commanded = kb8042->leds.desired;
1440 (void) ddi_get8(kb8042->handle, kb8042->addr +
1444 (void) kb8042_send_and_wait(kb8042, KB_ENABLE, polled);
1447 (void) ddi_get8(kb8042->handle, kb8042->addr +
1454 ddi_put8(kb8042->handle,
1455 kb8042->addr + I8042_POLL_OUTPUT_DATA, byte);
1457 ddi_put8(kb8042->handle,
1458 kb8042->addr + I8042_INT_OUTPUT_DATA, byte);
1473 kb8042_wait_poweron(struct kb8042 *kb8042) argument
1480 ready = ddi_get8(kb8042->handle,
1481 kb8042->addr + I8042_INT_INPUT_AVAIL);
1493 (void) ddi_get8(kb8042->handle,
1494 kb8042->addr + I8042_INT_INPUT_DATA);
1518 struct kb8042 *kb8042, argument
1544 struct kb8042 *kb8042, argument
1549 if (kb8042->kb_old_key_pos == key_pos)
1550 kb8042->kb_old_key_pos = 0;
1552 if (kb8042->kb_old_key_pos == key_pos) {
1555 kb8042->kb_old_key_pos = key_pos;
1562 kb8042_type4_cmd(struct kb8042 *kb8042, int cmd) argument
1581 struct kb8042 *kb8042; local
1583 kb8042 = (struct kb8042 *)arg;
1585 return (kbtrans_getchar(kb8042->hw_kbtrans));
1594 struct kb8042 *kb8042; local
1596 kb8042 = (struct kb8042 *)arg;
1598 return (kbtrans_ischar(kb8042->hw_kbtrans));