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 --- |