Skip to content
  • Hans de Goede's avatar
    usb: kbd: Fix key repeat not always working · 8454c84a
    Hans de Goede authored
    
    
    The usb-kbd key repeat code assumes that reports get repeated every 40 ms,
    this is never true when using CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP, and
    does not always works for CONFIG_SYS_USB_EVENT_POLL and
    CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE since not all usb keyboards honor
    the usb_set_idle() command.
    
    For CONFIG_SYS_USB_EVENT_POLL we must use usb_set_idle() since we do a
    blocking wait for the hid report, so if we do not tell the keyboard to send
    a hid report every 40ms even if nothing changes then we will block u-boot
    for 1s (the default u-boot usb interrupt packet timeout). Note that in this
    case on keyboards which do not support usb_set_idle() we loose and we actually
    get 1s latencies on other u-boot activities.
    
    For the other poll-methods this commit stops using usb_set_idle() and instead
    repeats the last received hid-report every 40 ms as long as no new hid-report
    is received. This fixes key-repeat not working at all with
    CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP and fixes it not working with
    keyboards which do not implement usb_set_idle() when using
    CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE.
    
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    8454c84a