X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common%2Fusb_kbd.c;h=d84865fbbe26bb337d9453a86c03d8dbb06ae43d;hb=0745008145e0a30db06b21533512893ba0f706a2;hp=5a90f843f2a83149448957b51371529678b9ce16;hpb=24b852a7a2b8eca71789100983bdb5104cc00696;p=u-boot diff --git a/common/usb_kbd.c b/common/usb_kbd.c index 5a90f843f2..d84865fbbe 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -199,7 +199,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode, } } - if ((scancode > 0x1d) && (scancode < 0x3a)) { + if ((scancode > 0x1d) && (scancode < 0x39)) { /* Shift pressed */ if (modifier & (LEFT_SHIFT | RIGHT_SHIFT)) keycode = usb_kbd_numkey_shifted[scancode - 0x1e]; @@ -411,13 +411,13 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum) iface = &dev->config.if_desc[ifnum]; - if (iface->desc.bInterfaceClass != 3) + if (iface->desc.bInterfaceClass != USB_CLASS_HID) return 0; - if (iface->desc.bInterfaceSubClass != 1) + if (iface->desc.bInterfaceSubClass != USB_SUB_HID_BOOT) return 0; - if (iface->desc.bInterfaceProtocol != 1) + if (iface->desc.bInterfaceProtocol != USB_PROT_HID_KEYBOARD) return 0; if (iface->desc.bNumEndpoints != 1) @@ -476,6 +476,9 @@ static int usb_kbd_probe_dev(struct usb_device *dev, unsigned int ifnum) USB_KBD_BOOT_REPORT_SIZE, data->new, data->intinterval); if (!data->intq) { +#elif defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP) + if (usb_get_report(dev, iface->desc.bInterfaceNumber, + 1, 0, data->new, USB_KBD_BOOT_REPORT_SIZE) < 0) { #else if (usb_submit_int_msg(dev, data->intpipe, data->new, data->intpktsize, data->intinterval) < 0) { @@ -541,35 +544,6 @@ int drv_usb_kbd_init(void) int error, i; debug("%s: Probing for keyboard\n", __func__); -#ifdef CONFIG_DM_USB - /* - * TODO: We should add U_BOOT_USB_DEVICE() declarations to each USB - * keyboard driver and then most of this file can be removed. - */ - struct udevice *bus; - struct uclass *uc; - int ret; - - ret = uclass_get(UCLASS_USB, &uc); - if (ret) - return ret; - uclass_foreach_dev(bus, uc) { - for (i = 0; i < USB_MAX_DEVICE; i++) { - struct usb_device *dev; - - dev = usb_get_dev_index(bus, i); /* get device */ - debug("i=%d, %p\n", i, dev); - if (!dev) - break; /* no more devices available */ - - error = probe_usb_keyboard(dev); - if (!error) - return 1; - if (error && error != -ENOENT) - return error; - } /* for */ - } -#else /* Scan all USB Devices */ for (i = 0; i < USB_MAX_DEVICE; i++) { struct usb_device *dev; @@ -588,7 +562,6 @@ int drv_usb_kbd_init(void) if (error && error != -ENOENT) return error; } -#endif /* No USB Keyboard found */ return -1; @@ -638,6 +611,41 @@ static int usb_kbd_probe(struct udevice *dev) return ret; } +static int usb_kbd_remove(struct udevice *dev) +{ + struct usb_device *udev = dev_get_parent_priv(dev); + struct usb_kbd_pdata *data; + struct stdio_dev *sdev; + int ret; + + sdev = stdio_get_by_name(DEVNAME); + if (!sdev) { + ret = -ENXIO; + goto err; + } + data = udev->privptr; + if (stdio_deregister_dev(sdev, true)) { + ret = -EPERM; + goto err; + } +#ifdef CONFIG_CONSOLE_MUX + if (iomux_doenv(stdin, getenv("stdin"))) { + ret = -ENOLINK; + goto err; + } +#endif +#ifdef CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE + destroy_int_queue(udev, data->intq); +#endif + free(data->new); + free(data); + + return 0; +err: + printf("%s: warning, ret=%d", __func__, ret); + return ret; +} + static const struct udevice_id usb_kbd_ids[] = { { .compatible = "usb-keyboard" }, { } @@ -648,6 +656,7 @@ U_BOOT_DRIVER(usb_kbd) = { .id = UCLASS_KEYBOARD, .of_match = usb_kbd_ids, .probe = usb_kbd_probe, + .remove = usb_kbd_remove, }; static const struct usb_device_id kbd_id_table[] = { @@ -656,8 +665,8 @@ static const struct usb_device_id kbd_id_table[] = { USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL, .bInterfaceClass = USB_CLASS_HID, - .bInterfaceSubClass = 1, - .bInterfaceProtocol = 1, + .bInterfaceSubClass = USB_SUB_HID_BOOT, + .bInterfaceProtocol = USB_PROT_HID_KEYBOARD, }, { } /* Terminating entry */ };