[U-Boot] [PATCH 1/2] usb: kbd: allow multibyte sequences to be put into ring buffer
Heinrich Schuchardt
xypron.glpk at gmx.de
Fri Feb 23 07:09:32 UTC 2018
On 02/23/2018 07:04 AM, Marek Vasut wrote:
> 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 ?
This would require copying the whole buffer with memcpy() when
withdrawing a byte.
Somehow we tend to reinvent the wheel. Let's use lib/circbuf.c here.
Regards
Heinrich
>
> The whole usb keyboard code is not nice and could use some cleanup.
>
More information about the U-Boot
mailing list