Deleted Added
full compact
ukbd.c (194099) ukbd.c (194228)
1#include <sys/cdefs.h>
1#include <sys/cdefs.h>
2__FBSDID("$FreeBSD: head/sys/dev/usb/input/ukbd.c 194099 2009-06-13 04:56:45Z thompsa $");
2__FBSDID("$FreeBSD: head/sys/dev/usb/input/ukbd.c 194228 2009-06-15 01:02:43Z thompsa $");
3
4
5/*-
6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
7 * All rights reserved.
8 *
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at

--- 281 unchanged lines hidden (view full) ---

292ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
293{
294 int32_t c;
295
296 mtx_assert(&Giant, MA_OWNED);
297
298 if (sc->sc_inputs == 0) {
299 /* start transfer, if not already started */
3
4
5/*-
6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
7 * All rights reserved.
8 *
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at

--- 281 unchanged lines hidden (view full) ---

292ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
293{
294 int32_t c;
295
296 mtx_assert(&Giant, MA_OWNED);
297
298 if (sc->sc_inputs == 0) {
299 /* start transfer, if not already started */
300 usb2_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
300 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
301 }
302 if (sc->sc_flags & UKBD_FLAG_POLLING) {
303 DPRINTFN(2, "polling\n");
304
305 while (sc->sc_inputs == 0) {
306
301 }
302 if (sc->sc_flags & UKBD_FLAG_POLLING) {
303 DPRINTFN(2, "polling\n");
304
305 while (sc->sc_inputs == 0) {
306
307 usb2_do_poll(sc->sc_xfer, UKBD_N_TRANSFER);
307 usbd_do_poll(sc->sc_xfer, UKBD_N_TRANSFER);
308
309 DELAY(1000); /* delay 1 ms */
310
311 sc->sc_time_ms++;
312
313 /* support repetition of keys: */
314
315 ukbd_interrupt(sc);

--- 133 unchanged lines hidden (view full) ---

449
450 mtx_assert(&Giant, MA_OWNED);
451
452 if (!(sc->sc_flags & UKBD_FLAG_POLLING)) {
453 sc->sc_time_ms += 25; /* milliseconds */
454 }
455 ukbd_interrupt(sc);
456
308
309 DELAY(1000); /* delay 1 ms */
310
311 sc->sc_time_ms++;
312
313 /* support repetition of keys: */
314
315 ukbd_interrupt(sc);

--- 133 unchanged lines hidden (view full) ---

449
450 mtx_assert(&Giant, MA_OWNED);
451
452 if (!(sc->sc_flags & UKBD_FLAG_POLLING)) {
453 sc->sc_time_ms += 25; /* milliseconds */
454 }
455 ukbd_interrupt(sc);
456
457 usb2_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
457 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
458}
459
460static uint8_t
461ukbd_apple_fn(uint8_t keycode) {
462 switch (keycode) {
463 case 0x28: return 0x49; /* RETURN -> INSERT */
464 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
465 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */

--- 30 unchanged lines hidden (view full) ---

496
497 if (len == 0) {
498 DPRINTF("zero length data\n");
499 goto tr_setup;
500 }
501
502 if (sc->sc_kbd_id != 0) {
503 /* check and remove HID ID byte */
458}
459
460static uint8_t
461ukbd_apple_fn(uint8_t keycode) {
462 switch (keycode) {
463 case 0x28: return 0x49; /* RETURN -> INSERT */
464 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
465 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */

--- 30 unchanged lines hidden (view full) ---

496
497 if (len == 0) {
498 DPRINTF("zero length data\n");
499 goto tr_setup;
500 }
501
502 if (sc->sc_kbd_id != 0) {
503 /* check and remove HID ID byte */
504 usb2_copy_out(xfer->frbuffers, 0, &id, 1);
504 usbd_copy_out(xfer->frbuffers, 0, &id, 1);
505 if (id != sc->sc_kbd_id) {
506 DPRINTF("wrong HID ID\n");
507 goto tr_setup;
508 }
509 offset = 1;
510 len--;
511 } else {
512 offset = 0;
513 }
514
515 if (len > sizeof(sc->sc_ndata)) {
516 len = sizeof(sc->sc_ndata);
517 }
518
519 if (len) {
520 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
505 if (id != sc->sc_kbd_id) {
506 DPRINTF("wrong HID ID\n");
507 goto tr_setup;
508 }
509 offset = 1;
510 len--;
511 } else {
512 offset = 0;
513 }
514
515 if (len > sizeof(sc->sc_ndata)) {
516 len = sizeof(sc->sc_ndata);
517 }
518
519 if (len) {
520 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
521 usb2_copy_out(xfer->frbuffers, offset,
521 usbd_copy_out(xfer->frbuffers, offset,
522 &sc->sc_ndata, len);
523
524 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
525 hid_get_data((uint8_t *)&sc->sc_ndata,
526 len, &sc->sc_loc_apple_eject))
527 apple_eject = 1;
528 else
529 apple_eject = 0;

--- 33 unchanged lines hidden (view full) ---

563 }
564
565 ukbd_interrupt(sc);
566 }
567 case USB_ST_SETUP:
568tr_setup:
569 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
570 xfer->frlengths[0] = xfer->max_data_length;
522 &sc->sc_ndata, len);
523
524 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
525 hid_get_data((uint8_t *)&sc->sc_ndata,
526 len, &sc->sc_loc_apple_eject))
527 apple_eject = 1;
528 else
529 apple_eject = 0;

--- 33 unchanged lines hidden (view full) ---

563 }
564
565 ukbd_interrupt(sc);
566 }
567 case USB_ST_SETUP:
568tr_setup:
569 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
570 xfer->frlengths[0] = xfer->max_data_length;
571 usb2_start_hardware(xfer);
571 usbd_transfer_submit(xfer);
572 } else {
573 DPRINTF("input queue is full!\n");
574 }
575 break;
576
577 default: /* Error */
572 } else {
573 DPRINTF("input queue is full!\n");
574 }
575 break;
576
577 default: /* Error */
578 DPRINTF("error=%s\n", usb2_errstr(xfer->error));
578 DPRINTF("error=%s\n", usbd_errstr(xfer->error));
579
580 if (xfer->error != USB_ERR_CANCELLED) {
581 /* try to clear stall first */
582 xfer->flags.stall_pipe = 1;
583 goto tr_setup;
584 }
585 break;
586 }

--- 25 unchanged lines hidden (view full) ---

612 buf[0] = sc->sc_led_id;
613 buf[1] = sc->sc_leds;
614 } else {
615 req.wLength[0] = 1;
616 buf[0] = sc->sc_leds;
617 buf[1] = 0;
618 }
619
579
580 if (xfer->error != USB_ERR_CANCELLED) {
581 /* try to clear stall first */
582 xfer->flags.stall_pipe = 1;
583 goto tr_setup;
584 }
585 break;
586 }

--- 25 unchanged lines hidden (view full) ---

612 buf[0] = sc->sc_led_id;
613 buf[1] = sc->sc_leds;
614 } else {
615 req.wLength[0] = 1;
616 buf[0] = sc->sc_leds;
617 buf[1] = 0;
618 }
619
620 usb2_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
621 usb2_copy_in(xfer->frbuffers + 1, 0, buf, sizeof(buf));
620 usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
621 usbd_copy_in(xfer->frbuffers + 1, 0, buf, sizeof(buf));
622
623 xfer->frlengths[0] = sizeof(req);
624 xfer->frlengths[1] = req.wLength[0];
625 xfer->nframes = 2;
622
623 xfer->frlengths[0] = sizeof(req);
624 xfer->frlengths[1] = req.wLength[0];
625 xfer->nframes = 2;
626 usb2_start_hardware(xfer);
626 usbd_transfer_submit(xfer);
627 }
628 return;
629
630 default: /* Error */
627 }
628 return;
629
630 default: /* Error */
631 DPRINTFN(0, "error=%s\n", usb2_errstr(xfer->error));
631 DPRINTFN(0, "error=%s\n", usbd_errstr(xfer->error));
632 return;
633 }
634}
635
636static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
637
638 [UKBD_INTR_DT] = {
639 .type = UE_INTERRUPT,

--- 32 unchanged lines hidden (view full) ---

672 return (ENXIO);
673 }
674
675 if (uaa->info.bInterfaceClass != UICLASS_HID)
676 return (ENXIO);
677
678 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
679 (uaa->info.bInterfaceProtocol == UPROTO_BOOT_KEYBOARD)) {
632 return;
633 }
634}
635
636static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
637
638 [UKBD_INTR_DT] = {
639 .type = UE_INTERRUPT,

--- 32 unchanged lines hidden (view full) ---

672 return (ENXIO);
673 }
674
675 if (uaa->info.bInterfaceClass != UICLASS_HID)
676 return (ENXIO);
677
678 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
679 (uaa->info.bInterfaceProtocol == UPROTO_BOOT_KEYBOARD)) {
680 if (usb2_test_quirk(uaa, UQ_KBD_IGNORE))
680 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
681 return (ENXIO);
682 else
683 return (0);
684 }
685
681 return (ENXIO);
682 else
683 return (0);
684 }
685
686 error = usb2_req_get_hid_desc(uaa->device, NULL,
686 error = usbd_req_get_hid_desc(uaa->device, NULL,
687 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
688
689 if (error)
690 return (ENXIO);
691
692 if (hid_is_collection(d_ptr, d_len,
693 HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_KEYBOARD))) {
687 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
688
689 if (error)
690 return (ENXIO);
691
692 if (hid_is_collection(d_ptr, d_len,
693 HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_KEYBOARD))) {
694 if (usb2_test_quirk(uaa, UQ_KBD_IGNORE))
694 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
695 error = ENXIO;
696 else
697 error = 0;
698 } else
699 error = ENXIO;
700
701 free(d_ptr, M_TEMP);
702 return (error);

--- 13 unchanged lines hidden (view full) ---

716 uint16_t hid_len;
717
718 mtx_assert(&Giant, MA_OWNED);
719
720 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
721
722 kbd->kb_data = (void *)sc;
723
695 error = ENXIO;
696 else
697 error = 0;
698 } else
699 error = ENXIO;
700
701 free(d_ptr, M_TEMP);
702 return (error);

--- 13 unchanged lines hidden (view full) ---

716 uint16_t hid_len;
717
718 mtx_assert(&Giant, MA_OWNED);
719
720 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
721
722 kbd->kb_data = (void *)sc;
723
724 device_set_usb2_desc(dev);
724 device_set_usb_desc(dev);
725
726 sc->sc_udev = uaa->device;
727 sc->sc_iface = uaa->iface;
728 sc->sc_iface_index = uaa->info.bIfaceIndex;
729 sc->sc_iface_no = uaa->info.bIfaceNum;
730 sc->sc_mode = K_XLATE;
731
725
726 sc->sc_udev = uaa->device;
727 sc->sc_iface = uaa->iface;
728 sc->sc_iface_index = uaa->info.bIfaceIndex;
729 sc->sc_iface_no = uaa->info.bIfaceNum;
730 sc->sc_mode = K_XLATE;
731
732 usb2_callout_init_mtx(&sc->sc_callout, &Giant, 0);
732 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
733
733
734 err = usb2_transfer_setup(uaa->device,
734 err = usbd_transfer_setup(uaa->device,
735 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
736 UKBD_N_TRANSFER, sc, &Giant);
737
738 if (err) {
735 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
736 UKBD_N_TRANSFER, sc, &Giant);
737
738 if (err) {
739 DPRINTF("error=%s\n", usb2_errstr(err));
739 DPRINTF("error=%s\n", usbd_errstr(err));
740 goto detach;
741 }
742 /* setup default keyboard maps */
743
744 sc->sc_keymap = key_map;
745 sc->sc_accmap = accent_map;
746 for (n = 0; n < UKBD_NFKEY; n++) {
747 sc->sc_fkeymap[n] = fkey_tab[n];

--- 8 unchanged lines hidden (view full) ---

756
757 /*
758 * FIXME: set the initial value for lock keys in "sc_state"
759 * according to the BIOS data?
760 */
761 KBD_PROBE_DONE(kbd);
762
763 /* figure out if there is an ID byte in the data */
740 goto detach;
741 }
742 /* setup default keyboard maps */
743
744 sc->sc_keymap = key_map;
745 sc->sc_accmap = accent_map;
746 for (n = 0; n < UKBD_NFKEY; n++) {
747 sc->sc_fkeymap[n] = fkey_tab[n];

--- 8 unchanged lines hidden (view full) ---

756
757 /*
758 * FIXME: set the initial value for lock keys in "sc_state"
759 * according to the BIOS data?
760 */
761 KBD_PROBE_DONE(kbd);
762
763 /* figure out if there is an ID byte in the data */
764 err = usb2_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
764 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
765 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
766 if (err == 0) {
767 uint8_t temp_id;
768
769 /* investigate if this is an Apple Keyboard */
770 if (hid_locate(hid_ptr, hid_len,
771 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
772 hid_input, 0, &sc->sc_loc_apple_eject, &flags,

--- 23 unchanged lines hidden (view full) ---

796
797 /* investigate if we need an ID-byte for the leds */
798 hid_report_size(hid_ptr, hid_len, hid_output, &sc->sc_led_id);
799
800 free(hid_ptr, M_TEMP);
801 }
802
803 /* ignore if SETIDLE fails, hence it is not crucial */
765 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
766 if (err == 0) {
767 uint8_t temp_id;
768
769 /* investigate if this is an Apple Keyboard */
770 if (hid_locate(hid_ptr, hid_len,
771 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
772 hid_input, 0, &sc->sc_loc_apple_eject, &flags,

--- 23 unchanged lines hidden (view full) ---

796
797 /* investigate if we need an ID-byte for the leds */
798 hid_report_size(hid_ptr, hid_len, hid_output, &sc->sc_led_id);
799
800 free(hid_ptr, M_TEMP);
801 }
802
803 /* ignore if SETIDLE fails, hence it is not crucial */
804 err = usb2_req_set_idle(sc->sc_udev, &Giant, sc->sc_iface_index, 0, 0);
804 err = usbd_req_set_idle(sc->sc_udev, &Giant, sc->sc_iface_index, 0, 0);
805
806 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
807
808 KBD_INIT_DONE(kbd);
809
810 if (kbd_register(kbd) < 0) {
811 goto detach;
812 }

--- 12 unchanged lines hidden (view full) ---

825 genkbd_diag(kbd, bootverbose);
826 }
827 /* lock keyboard mutex */
828
829 mtx_lock(&Giant);
830
831 /* start the keyboard */
832
805
806 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
807
808 KBD_INIT_DONE(kbd);
809
810 if (kbd_register(kbd) < 0) {
811 goto detach;
812 }

--- 12 unchanged lines hidden (view full) ---

825 genkbd_diag(kbd, bootverbose);
826 }
827 /* lock keyboard mutex */
828
829 mtx_lock(&Giant);
830
831 /* start the keyboard */
832
833 usb2_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
833 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
834
835 /* start the timer */
836
837 ukbd_timeout(sc);
838 mtx_unlock(&Giant);
839 return (0); /* success */
840
841detach:

--- 11 unchanged lines hidden (view full) ---

853
854 DPRINTF("\n");
855
856 if (sc->sc_flags & UKBD_FLAG_POLLING) {
857 panic("cannot detach polled keyboard!\n");
858 }
859 sc->sc_flags |= UKBD_FLAG_GONE;
860
834
835 /* start the timer */
836
837 ukbd_timeout(sc);
838 mtx_unlock(&Giant);
839 return (0); /* success */
840
841detach:

--- 11 unchanged lines hidden (view full) ---

853
854 DPRINTF("\n");
855
856 if (sc->sc_flags & UKBD_FLAG_POLLING) {
857 panic("cannot detach polled keyboard!\n");
858 }
859 sc->sc_flags |= UKBD_FLAG_GONE;
860
861 usb2_callout_stop(&sc->sc_callout);
861 usb_callout_stop(&sc->sc_callout);
862
863 ukbd_disable(&sc->sc_kbd);
864
865#ifdef KBD_INSTALL_CDEV
866 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
867 error = kbd_detach(&sc->sc_kbd);
868 if (error) {
869 /* usb attach cannot return an error */

--- 7 unchanged lines hidden (view full) ---

877 if (error) {
878 /* usb attach cannot return an error */
879 device_printf(dev, "WARNING: kbd_unregister() "
880 "returned non-zero! (ignored)\n");
881 }
882 }
883 sc->sc_kbd.kb_flags = 0;
884
862
863 ukbd_disable(&sc->sc_kbd);
864
865#ifdef KBD_INSTALL_CDEV
866 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
867 error = kbd_detach(&sc->sc_kbd);
868 if (error) {
869 /* usb attach cannot return an error */

--- 7 unchanged lines hidden (view full) ---

877 if (error) {
878 /* usb attach cannot return an error */
879 device_printf(dev, "WARNING: kbd_unregister() "
880 "returned non-zero! (ignored)\n");
881 }
882 }
883 sc->sc_kbd.kb_flags = 0;
884
885 usb2_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
885 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
886
886
887 usb2_callout_drain(&sc->sc_callout);
887 usb_callout_drain(&sc->sc_callout);
888
889 DPRINTF("%s: disconnected\n",
890 device_get_nameunit(dev));
891
892 return (0);
893}
894
895static int

--- 591 unchanged lines hidden (view full) ---

1487{
1488 DPRINTF("leds=0x%02x\n", leds);
1489
1490 sc->sc_leds = leds;
1491 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1492
1493 /* start transfer, if not already started */
1494
888
889 DPRINTF("%s: disconnected\n",
890 device_get_nameunit(dev));
891
892 return (0);
893}
894
895static int

--- 591 unchanged lines hidden (view full) ---

1487{
1488 DPRINTF("leds=0x%02x\n", leds);
1489
1490 sc->sc_leds = leds;
1491 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1492
1493 /* start transfer, if not already started */
1494
1495 usb2_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1495 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1496}
1497
1498static int
1499ukbd_set_typematic(keyboard_t *kbd, int code)
1500{
1501 static const int delays[] = {250, 500, 750, 1000};
1502 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1503 68, 76, 84, 92, 100, 110, 118, 126,

--- 117 unchanged lines hidden ---
1496}
1497
1498static int
1499ukbd_set_typematic(keyboard_t *kbd, int code)
1500{
1501 static const int delays[] = {250, 500, 750, 1000};
1502 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1503 68, 76, 84, 92, 100, 110, 118, 126,

--- 117 unchanged lines hidden ---