From d7475386bb75ec4e49be66d83775edb043dbfb43 Mon Sep 17 00:00:00 2001 From: Allen Martin Date: Wed, 24 Oct 2012 08:32:04 +0000 Subject: USB: make usb_kbd obey USB DMA alignment requirements Change usb_kbd driver to obey alignment requirements for USB DMA on the buffer used for data transfer. This is necessary for architectures that enable dcache and enable USB DMA. Signed-off-by: Allen Martin Tested-by: Stephen Warren Reviewed-by: Stephen Warren --- common/usb_kbd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'common/usb_kbd.c') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index 19f01db1ca..24467cec14 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -112,7 +112,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; @@ -435,6 +435,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; -- cgit From 4151a400cfcd4762ca422a04890cd5869bac155c Mon Sep 17 00:00:00 2001 From: Allen Martin Date: Tue, 6 Nov 2012 13:26:03 -0800 Subject: USB: add arrow key support to usb_kbd Check for scancodes for arrow keys and map them to ^F/^B, ^N/^P. Control characters are used instead of ANSI sequence because the queueing code in usb_kbd doesn't handle the data increase when one keypress generates 3 keycodes. The real fix is to convert this driver to use the input subsystem and queue, but this allows arrow keys to work until this driver is converted. Signed-off-by: Allen Martin --- common/usb_kbd.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'common/usb_kbd.c') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index 24467cec14..4efbcfe90d 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -93,6 +93,15 @@ static const unsigned char usb_kbd_num_keypad[] = { '.', 0, 0, 0, '=' }; +/* + * 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! @@ -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]; -- cgit