Lines Matching defs:kb8042

48 #include "kb8042.h"
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);
154 static char module_name[] = "kb8042";
179 struct kb8042 Kdws = {0};
265 kb8042_is_input_avail(struct kb8042 *kb8042, int timeout_usec, boolean_t polled)
273 if (ddi_get8(kb8042->handle, kb8042->addr + port) != 0)
283 kb8042_clear_input_buffer(struct kb8042 *kb8042, boolean_t polled)
288 while (kb8042_is_input_avail(kb8042, MIN_DELAY_USECS, polled)) {
289 (void) ddi_get8(kb8042->handle, kb8042->addr + port);
297 kb8042_send_and_expect(struct kb8042 *kb8042, uint8_t send, uint8_t expect,
304 ddi_put8(kb8042->handle,
305 kb8042->addr + I8042_POLL_OUTPUT_DATA, send);
307 if (kb8042_is_input_avail(kb8042, timeout, B_TRUE)) {
309 datab = ddi_get8(kb8042->handle,
310 kb8042->addr + I8042_POLL_INPUT_DATA);
342 kb8042_read_scanset(struct kb8042 *kb8042)
348 kb8042_clear_input_buffer(kb8042, B_TRUE);
354 if (kb8042_send_and_expect(kb8042, KB_SET_SCAN, KB_ACK, MAX_WAIT_USECS,
363 if (kb8042_send_and_expect(kb8042, 0, KB_ACK, MAX_WAIT_USECS, &err,
373 while (kb8042_is_input_avail(kb8042, MAX_WAIT_USECS, B_TRUE) &&
374 (scanset = ddi_get8(kb8042->handle,
375 kb8042->addr + I8042_POLL_INPUT_DATA)) == KB_ACK)
406 struct kb8042 *kb8042 = &Kdws;
415 leds = kb8042->leds.commanded;
416 kb8042->w_init = 0;
417 kb8042_init(kb8042, B_TRUE);
418 kb8042_setled(kb8042, leds, B_FALSE);
419 mutex_enter(&kb8042->w_hw_mutex);
420 kb8042->suspended = B_FALSE;
421 if (kb8042->w_qp != NULL) {
422 enableok(WR(kb8042->w_qp));
423 qenable(WR(kb8042->w_qp));
425 cv_broadcast(&kb8042->suspend_cv);
426 mutex_exit(&kb8042->w_hw_mutex);
439 kb8042->debugger.mod1 = 58; /* Left Ctrl */
440 kb8042->debugger.mod2 = 60; /* Left Alt */
441 kb8042->debugger.trigger = 33; /* D */
442 kb8042->debugger.mod1_down = B_FALSE;
443 kb8042->debugger.mod2_down = B_FALSE;
444 kb8042->debugger.enabled = B_FALSE;
447 kb8042->init_state = KB8042_UNINITIALIZED;
449 kb8042->polled_synthetic_release_pending = B_FALSE;
456 kb8042->init_state |= KB8042_MINOR_NODE_CREATED;
458 rc = ddi_regs_map_setup(devi, 0, (caddr_t *)&kb8042->addr,
459 (offset_t)0, (offset_t)0, &attr, &kb8042->handle);
467 kb8042->init_state |= KB8042_REGS_MAPPED;
469 if (ddi_get_iblock_cookie(devi, 0, &kb8042->w_iblock) !=
475 mutex_init(&kb8042->w_hw_mutex, NULL, MUTEX_DRIVER, kb8042->w_iblock);
476 cv_init(&kb8042->ops_cv, NULL, CV_DRIVER, NULL);
477 cv_init(&kb8042->suspend_cv, NULL, CV_DRIVER, NULL);
478 cv_init(&kb8042->cmd_cv, NULL, CV_DRIVER, NULL);
479 kb8042->init_state |= KB8042_HW_MUTEX_INITTED;
481 kb8042_init(kb8042, B_FALSE);
485 scanset = kb8042_read_scanset(kb8042);
494 "`set kb8042:kb8042_default_scanset=%d' to /etc/system ",
500 cmn_err(CE_CONT, "`set kb8042:kb8042_warn_unknown_scanset=0' "
510 if (KeyboardConvertScan_init(kb8042, scanset) != DDI_SUCCESS) {
521 &kb8042->w_iblock, (ddi_idevice_cookie_t *)NULL,
522 kb8042_intr, (caddr_t)kb8042) != DDI_SUCCESS) {
527 kb8042->init_state |= KB8042_INTR_ADDED;
539 kb8042_cleanup(kb8042);
546 struct kb8042 *kb8042 = &Kdws;
550 mutex_enter(&kb8042->w_hw_mutex);
551 ASSERT(kb8042->ops >= 0);
552 while (kb8042->ops > 0)
553 cv_wait(&kb8042->ops_cv, &kb8042->w_hw_mutex);
554 kb8042->suspended = B_TRUE;
555 mutex_exit(&kb8042->w_hw_mutex);
560 if (kb8042->w_qp != NULL)
565 kb8042_cleanup(kb8042);
605 kb8042_cleanup(struct kb8042 *kb8042)
609 if (kb8042->init_state & KB8042_INTR_ADDED)
610 ddi_remove_intr(kb8042_dip, 0, kb8042->w_iblock);
612 if (kb8042->init_state & KB8042_HW_MUTEX_INITTED) {
613 cv_destroy(&kb8042->cmd_cv);
614 cv_destroy(&kb8042->suspend_cv);
615 cv_destroy(&kb8042->ops_cv);
616 mutex_destroy(&kb8042->w_hw_mutex);
619 if (kb8042->init_state & KB8042_REGS_MAPPED)
620 ddi_regs_map_free(&kb8042->handle);
622 if (kb8042->init_state & KB8042_MINOR_NODE_CREATED)
625 kb8042->init_state = KB8042_UNINITIALIZED;
630 kb8042_init(struct kb8042 *kb8042, boolean_t from_resume)
632 if (kb8042->w_init)
636 kb8042->w_kblayout = 0; /* Default to US */
637 kb8042->w_qp = (queue_t *)NULL;
638 kb8042->simulated_kbd_type = KB_PC;
639 kb8042->leds.commanded = -1; /* Unknown initial state */
640 kb8042->leds.desired = -1; /* Unknown initial state */
643 kb8042_wait_poweron(kb8042);
645 kb8042->kb_old_key_pos = 0;
652 (void) ddi_get8(kb8042->handle, kb8042->addr + I8042_LOCK);
654 kb8042_send_to_keyboard(kb8042, KB_ENABLE, B_TRUE);
655 (void) ddi_get8(kb8042->handle, kb8042->addr + I8042_UNLOCK);
657 kb8042->w_init++;
666 struct kb8042 *kb8042;
671 kb8042 = &Kdws;
673 mutex_enter(&kb8042->w_hw_mutex);
675 kb8042->w_dev = *devp;
676 mutex_exit(&kb8042->w_hw_mutex);
681 mutex_exit(&kb8042->w_hw_mutex);
685 while (kb8042->suspended) {
686 if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) ==
688 mutex_exit(&kb8042->w_hw_mutex);
693 kb8042->w_dev = *devp;
694 qp->q_ptr = (caddr_t)kb8042;
696 if (!kb8042->w_qp)
697 kb8042->w_qp = qp;
699 ASSERT(kb8042->ops >= 0);
700 kb8042->ops++;
701 mutex_exit(&kb8042->w_hw_mutex);
703 kb8042_get_initial_leds(kb8042, &initial_leds, &initial_led_mask);
705 (struct kbtrans_hardware *)kb8042, &kb8042_callbacks,
706 &kb8042->hw_kbtrans,
711 kbtrans_streams_set_keyboard(kb8042->hw_kbtrans, KB_PC, &keyindex_pc);
713 kb8042->polledio.cons_polledio_version = CONSPOLLEDIO_V1;
714 kb8042->polledio.cons_polledio_argument =
715 (cons_polledio_arg_t)kb8042;
716 kb8042->polledio.cons_polledio_putchar = NULL;
717 kb8042->polledio.cons_polledio_getchar =
719 kb8042->polledio.cons_polledio_ischar =
721 kb8042->polledio.cons_polledio_enter = NULL;
722 kb8042->polledio.cons_polledio_exit = NULL;
723 kb8042->polledio.cons_polledio_setled =
725 kb8042->polledio.cons_polledio_keycheck =
731 kbtrans_streams_enable(kb8042->hw_kbtrans);
734 mutex_enter(&kb8042->w_hw_mutex);
735 ASSERT(kb8042->ops > 0);
736 kb8042->ops--;
737 if (kb8042->ops == 0)
738 cv_broadcast(&kb8042->ops_cv);
739 mutex_exit(&kb8042->w_hw_mutex);
748 struct kb8042 *kb8042;
753 kb8042 = (struct kb8042 *)qp->q_ptr;
755 mutex_enter(&kb8042->w_hw_mutex);
756 while (kb8042->suspended) {
757 if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) ==
759 mutex_exit(&kb8042->w_hw_mutex);
764 ASSERT(kb8042->ops >= 0);
765 kb8042->ops++;
766 mutex_exit(&kb8042->w_hw_mutex);
768 (void) kbtrans_streams_fini(kb8042->hw_kbtrans);
770 kb8042->w_qp = (queue_t *)NULL;
773 mutex_enter(&kb8042->w_hw_mutex);
774 ASSERT(kb8042->ops > 0);
775 kb8042->ops--;
776 if (kb8042->ops == 0)
777 cv_broadcast(&kb8042->ops_cv);
778 mutex_exit(&kb8042->w_hw_mutex);
786 struct kb8042 *kb8042;
791 kb8042 = (struct kb8042 *)qp->q_ptr;
793 mutex_enter(&kb8042->w_hw_mutex);
794 suspended = kb8042->suspended;
795 ASSERT(kb8042->ops >= 0);
797 kb8042->ops++;
798 mutex_exit(&kb8042->w_hw_mutex);
810 switch (kbtrans_streams_message(kb8042->hw_kbtrans, mp)) {
818 kb8042_ioctlmsg(kb8042, qp, mp);
844 mutex_enter(&kb8042->w_hw_mutex);
846 ASSERT(kb8042->ops > 0);
847 kb8042->ops--;
848 if (kb8042->ops == 0)
849 cv_broadcast(&kb8042->ops_cv);
851 mutex_exit(&kb8042->w_hw_mutex);
857 kb8042_ioctlmsg(struct kb8042 *kb8042, queue_t *qp, mblk_t *mp)
883 &kb8042->polledio;
899 kb8042->debugger.enabled = *(intptr_t *)mp->b_cont->b_rptr;
917 kb8042->simulated_kbd_type = tmp;
922 if (kb8042->w_kblayout == -1) {
932 if (kb8042->simulated_kbd_type == KB_USB)
935 *(int *)datap->b_wptr = kb8042->w_kblayout;
953 kb8042->w_kblayout = *(intptr_t *)mp->b_cont->b_rptr;
964 kb8042_type4_cmd(kb8042, *(int *)mp->b_cont->b_rptr);
1009 struct kb8042 *kb8042,
1022 mutex_enter(&kb8042->w_hw_mutex);
1023 kb8042->acked = 1;
1024 cv_signal(&kb8042->cmd_cv);
1025 mutex_exit(&kb8042->w_hw_mutex);
1028 mutex_enter(&kb8042->w_hw_mutex);
1029 kb8042->need_retry = 1;
1030 cv_signal(&kb8042->cmd_cv);
1031 mutex_exit(&kb8042->w_hw_mutex);
1035 if (!kb8042->w_init) /* can't do anything anyway */
1038 legit = KeyboardConvertScan(kb8042, scancode, &key_pos, &state,
1050 if (key_pos == kb8042->debugger.mod1) {
1051 kb8042->debugger.mod1_down = (state == KEY_PRESSED);
1053 if (key_pos == kb8042->debugger.mod2) {
1054 kb8042->debugger.mod2_down = (state == KEY_PRESSED);
1056 if (kb8042->debugger.enabled &&
1057 key_pos == kb8042->debugger.trigger &&
1058 kb8042->debugger.mod1_down &&
1059 kb8042->debugger.mod2_down) {
1063 kb8042->debugger.mod1_down = B_FALSE;
1064 kb8042->debugger.mod2_down = B_FALSE;
1075 if (kb8042->w_qp == NULL) {
1085 if (kb8042_autorepeat_detect(kb8042, key_pos, state)) {
1090 kb8042_process_key(kb8042, key_pos, state);
1098 (void) kb8042_autorepeat_detect(kb8042, key_pos, KEY_RELEASED);
1099 kb8042_process_key(kb8042, key_pos, state);
1105 kb8042_process_key(struct kb8042 *kb8042, kbtrans_key_t key_pos,
1111 if (kb8042->simulated_kbd_type == KB_PC) {
1112 kbtrans_streams_key(kb8042->hw_kbtrans, key_pos, state);
1113 } else if (kb8042->simulated_kbd_type == KB_USB) {
1116 kbtrans_streams_key(kb8042->hw_kbtrans, key, state);
1129 struct kb8042 *kb8042 = (struct kb8042 *)arg;
1133 if (kb8042->init_state == KB8042_UNINITIALIZED)
1139 while (ddi_get8(kb8042->handle, kb8042->addr + I8042_INT_INPUT_AVAIL)
1143 scancode = ddi_get8(kb8042->handle,
1144 kb8042->addr + I8042_INT_INPUT_DATA);
1146 kb8042_received_byte(kb8042, scancode);
1176 struct kb8042 *kb8042 = (struct kb8042 *)hw;
1181 if (kb8042->polled_synthetic_release_pending) {
1182 *key = kb8042->polled_synthetic_release_key;
1184 kb8042->polled_synthetic_release_pending = B_FALSE;
1185 (void) kb8042_autorepeat_detect(kb8042, *key, *state);
1190 if (ddi_get8(kb8042->handle,
1191 kb8042->addr + I8042_POLL_INPUT_AVAIL) == 0) {
1195 scancode = ddi_get8(kb8042->handle,
1196 kb8042->addr + I8042_POLL_INPUT_DATA);
1198 legit = KeyboardConvertScan(kb8042, scancode, key, state,
1209 (void) kb8042_autorepeat_detect(kb8042, *key, *state);
1219 kb8042->polled_synthetic_release_pending = B_TRUE;
1220 kb8042->polled_synthetic_release_key = *key;
1223 if (kb8042->simulated_kbd_type == KB_USB) {
1231 kb8042_setled(struct kb8042 *kb8042, int led_state, boolean_t polled)
1233 kb8042->leds.desired = led_state;
1236 mutex_enter(&kb8042->w_hw_mutex);
1238 if (kb8042->leds.desired != kb8042->leds.commanded) {
1239 kb8042_send_to_keyboard(kb8042, KB_SET_LED, polled);
1243 mutex_exit(&kb8042->w_hw_mutex);
1249 struct kb8042 *kb8042 = (struct kb8042 *)hw;
1250 kb8042_setled(kb8042, led_state, B_TRUE);
1256 struct kb8042 *kb8042 = (struct kb8042 *)hw;
1257 kb8042_setled(kb8042, led_state, B_FALSE);
1262 kb8042_send_and_wait(struct kb8042 *kb8042, uint8_t u8, boolean_t polled)
1264 uint8_t *outp = kb8042->addr +
1266 uint8_t *inavp = kb8042->addr +
1268 uint8_t *inp = kb8042->addr +
1277 kb8042->acked = 0;
1278 kb8042->need_retry = 0;
1282 ddi_put8(kb8042->handle, outp, u8);
1284 while (!kb8042->acked && !kb8042->need_retry && !timedout) {
1287 if (ddi_get8(kb8042->handle, inavp)) {
1288 b = ddi_get8(kb8042->handle, inp);
1291 kb8042->acked = 1;
1294 kb8042->need_retry = 1;
1314 if (!kb8042->acked) {
1330 if (cv_timedwait(&kb8042->cmd_cv,
1331 &kb8042->w_hw_mutex, expire) == -1 &&
1332 !kb8042->acked && !kb8042->need_retry) {
1338 } while ((kb8042->need_retry || timedout) &&
1341 return (kb8042->acked);
1349 kb8042_send_to_keyboard(struct kb8042 *kb8042, int byte, boolean_t polled)
1362 (void) ddi_get8(kb8042->handle, kb8042->addr +
1366 if (kb8042_send_and_wait(kb8042, KB_SET_LED, polled)) {
1371 (void) kb8042_send_and_wait(kb8042,
1372 kb8042_xlate_leds(kb8042->leds.desired), polled);
1376 (void) ddi_get8(kb8042->handle, kb8042->addr +
1379 kb8042->leds.commanded = kb8042->leds.desired;
1384 (void) ddi_get8(kb8042->handle, kb8042->addr +
1388 (void) kb8042_send_and_wait(kb8042, KB_ENABLE, polled);
1391 (void) ddi_get8(kb8042->handle, kb8042->addr +
1398 ddi_put8(kb8042->handle,
1399 kb8042->addr + I8042_POLL_OUTPUT_DATA, byte);
1401 ddi_put8(kb8042->handle,
1402 kb8042->addr + I8042_INT_OUTPUT_DATA, byte);
1417 kb8042_wait_poweron(struct kb8042 *kb8042)
1424 ready = ddi_get8(kb8042->handle,
1425 kb8042->addr + I8042_INT_INPUT_AVAIL);
1437 (void) ddi_get8(kb8042->handle,
1438 kb8042->addr + I8042_INT_INPUT_DATA);
1462 struct kb8042 *kb8042,
1488 struct kb8042 *kb8042,
1493 if (kb8042->kb_old_key_pos == key_pos)
1494 kb8042->kb_old_key_pos = 0;
1496 if (kb8042->kb_old_key_pos == key_pos) {
1499 kb8042->kb_old_key_pos = key_pos;
1506 kb8042_type4_cmd(struct kb8042 *kb8042, int cmd)
1525 struct kb8042 *kb8042;
1527 kb8042 = (struct kb8042 *)arg;
1529 return (kbtrans_getchar(kb8042->hw_kbtrans));
1538 struct kb8042 *kb8042;
1540 kb8042 = (struct kb8042 *)arg;
1542 return (kbtrans_ischar(kb8042->hw_kbtrans));