diff options
Diffstat (limited to 'common/usb_kbd.c')
| -rw-r--r-- | common/usb_kbd.c | 18 | 
1 files changed, 17 insertions, 1 deletions
| diff --git a/common/usb_kbd.c b/common/usb_kbd.c index 19f01db1c..4efbcfe90 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -94,6 +94,15 @@ static const unsigned char usb_kbd_num_keypad[] = {  };  /* + * map arrow keys to ^F/^B ^N/^P, can't really use the proper + * ANSI sequence for arrow keys because the queuing code breaks + * when a single keypress expands to 3 queue elements + */ +static const unsigned char usb_kbd_arrow[] = { +	0x6, 0x2, 0xe, 0x10 +}; + +/*   * NOTE: It's important for the NUM, CAPS, SCROLL-lock bits to be in this   *       order. See usb_kbd_setled() function!   */ @@ -112,7 +121,7 @@ struct usb_kbd_pdata {  	uint32_t	usb_out_pointer;  	uint8_t		usb_kbd_buffer[USB_KBD_BUFFER_LEN]; -	uint8_t		new[8]; +	uint8_t		*new;  	uint8_t		old[8];  	uint8_t		flags; @@ -224,6 +233,10 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,  			keycode = usb_kbd_numkey[scancode - 0x1e];  	} +	/* Arrow keys */ +	if ((scancode >= 0x4f) && (scancode <= 0x52)) +		keycode = usb_kbd_arrow[scancode - 0x4f]; +  	/* Numeric keypad */  	if ((scancode >= 0x54) && (scancode <= 0x67))  		keycode = usb_kbd_num_keypad[scancode - 0x54]; @@ -435,6 +448,9 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)  	/* Clear private data */  	memset(data, 0, sizeof(struct usb_kbd_pdata)); +	/* allocate input buffer aligned and sized to USB DMA alignment */ +	data->new = memalign(USB_DMA_MINALIGN, roundup(8, USB_DMA_MINALIGN)); +  	/* Insert private data into USB device structure */  	dev->privptr = data; |