[U-Boot] [PATCH 1/2] usb: kbd: allow multibyte sequences to be put into ring buffer

Marek Vasut marex at denx.de
Fri Feb 23 06:04:06 UTC 2018


On 02/23/2018 06:50 AM, Heinrich Schuchardt wrote:
[...]
>>> When starting an EFI application the xterm escape sequences are
>>> translated to EFI scan codes. See lib/efi_loader/efi_console.c
>>
>> So this is only usable if you have display connected to the board ?
> 
> Why? We are talking about input.
> 
> Neither local nor remote display is needed to hit the F10 key on a USB
> keyboard.

What confused me was the constant usage of xterm control sequences to
describe terminal control sequences. Now it makes sense.

[...]

>>>>>>> +    /* Copy to buffer */
>>>>>>> +    for (i = 0; i < count; ++i) {
>>>>>>> +        ++data->usb_in_pointer;
>>>>>>> +        if (data->usb_in_pointer == USB_KBD_BUFFER_LEN)
>>>>>>> +            data->usb_in_pointer = 0;
>>>>>>> +        data->usb_kbd_buffer[data->usb_in_pointer] = buf[i];
>>>>>>
>>>>>> memcpy() ?
>>>>>
>>>>> Typically we copy only one byte. But escape sequences have a maximum
>>>>> length of 8 bytes (e.g. CTRL+F8).
>>>>>
>>>>> We have to consider the case with wrap around. This would require two
>>>>> memcpy() calls.
>>>>>
>>>>> The coding would neither get faster in the average nor less complex
>>>>> using memcpy(). So let's keep it as it is.
>>>>
>>>> I suspect this block of code needs cleanup .
>>>>
>>>
>>> Could you, please, give some indication of what you dislike.
>>
>> At least the part which looks like ad-hoc implementation of memcpy() ,
>> any other cleanups are welcome.
>>
> 
> Do you really want that ugly monster below for typically copying a
> single byte?
> 
> As said it is slower, has more lines, and gives a larger executable.
> 
> int remaining;
> 
> /* Copy to buffer */
> remaining = data->usb_in_pointer + count - USB_KBD_BUFFER_LEN;
> if (remaining < 0)
>     remaining = 0;
> memcpy(&usb_kbd_buffer[data->usb_in_pointer], buf, count - remaining);
> if (remaining)
>     memcpy(usb_kbd_buffer, buf + count - remaining, remaining);
> data->usb_in_pointer += count;
> if (data->usb_in_pointer >= USB_KBD_BUFFER_LEN)
>     data->usb_in_pointer -= USB_KBD_BUFFER_LEN;

Can the code be tweaked so it doesn't use the circular buffer, but a
linear one , thus two memcpy()s are not needed ?

The whole usb keyboard code is not nice and could use some cleanup.

-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list