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

Marek Vasut marex at denx.de
Thu Feb 22 14:20:57 UTC 2018


On 02/22/2018 01:04 PM, Heinrich Schuchardt wrote:
> The USB keyboard driver provides a ring buffer for key strokes.
> 
> Function keys cannot be encoded as single bytes. Instead xterm control
> sequences have to be put into the ring buffer.

Does it work without xterm or with any other terminal ?

> This preparatory patch changes function usb_kbd_put_queue() to allow adding
> multiple characters at once. If the buffer cannot accommodate the whole
> sequence, it is rejected completely.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  common/usb_kbd.c | 42 +++++++++++++++++++++++++-----------------
>  1 file changed, 25 insertions(+), 17 deletions(-)
> 
> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
> index 8cbdba6ac2..706cc350a6 100644
> --- a/common/usb_kbd.c
> +++ b/common/usb_kbd.c
> @@ -125,24 +125,32 @@ extern int __maybe_unused net_busy_flag;
>  /* The period of time between two calls of usb_kbd_testc(). */
>  static unsigned long __maybe_unused kbd_testc_tms;
>  
> -/* Puts character in the queue and sets up the in and out pointer. */
> -static void usb_kbd_put_queue(struct usb_kbd_pdata *data, char c)
> +/*
> + * Put characters into ring buffer.
> + *
> + * @data:	private data
> + * @buf		buffer with data to be queued
> + * @count:	number of characters to be queued
> + */
> +static void usb_kbd_put_queue(struct usb_kbd_pdata *data,
> +			      uint8_t *buf, int count)
>  {
> -	if (data->usb_in_pointer == USB_KBD_BUFFER_LEN - 1) {
> -		/* Check for buffer full. */
> -		if (data->usb_out_pointer == 0)
> -			return;
> -
> -		data->usb_in_pointer = 0;
> -	} else {
> -		/* Check for buffer full. */
> -		if (data->usb_in_pointer == data->usb_out_pointer - 1)
> -			return;
> -
> -		data->usb_in_pointer++;
> +	int i, used;
> +
> +	/* Check if buffer holds at least 'count' free slots */
> +	used = data->usb_in_pointer - data->usb_out_pointer;
> +	if (used < 0)
> +		used += USB_KBD_BUFFER_LEN;
> +	if (used + count >= USB_KBD_BUFFER_LEN)
> +		return;
> +
> +	/* 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() ?

>  	}
> -
> -	data->usb_kbd_buffer[data->usb_in_pointer] = c;
>  }
>  
>  /*
> @@ -237,7 +245,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
>  	/* Report keycode if any */
>  	if (keycode) {
>  		debug("%c", keycode);
> -		usb_kbd_put_queue(data, keycode);
> +		usb_kbd_put_queue(data, &keycode, 1);
>  	}
>  
>  	return 0;
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list