From 216db3af2c31303ba2388b51fa064693b8c47ac2 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 23 Nov 2019 18:15:18 +0100 Subject: usb: kbd: fix typo %s/a interrupt/an interrupt/ Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- common/usb_kbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index d178af248af..8c09e61f456 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -339,7 +339,7 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev) #if defined(CONFIG_SYS_USB_EVENT_POLL) struct usb_kbd_pdata *data = dev->privptr; - /* Submit a interrupt transfer request */ + /* Submit an interrupt transfer request */ if (usb_int_msg(dev, data->intpipe, &data->new[0], data->intpktsize, data->intinterval, true) >= 0) usb_kbd_irq_worker(dev); -- cgit v1.3.1 From 28dfa7d80d8ddf7ef795f518230964d2c393b25b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 23 Nov 2019 18:15:19 +0100 Subject: usb: kbd: signature of usb_kbd_put_queue() usb_kbd_buffer is defined as u8[]. So let usb_kbd_put_queue() use u8 as type of the parameter for the new byte. Signed-off-by: Heinrich Schuchardt --- common/usb_kbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index 8c09e61f456..e4711eb6555 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -127,7 +127,7 @@ extern int __maybe_unused net_busy_flag; 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) +static void usb_kbd_put_queue(struct usb_kbd_pdata *data, u8 c) { if (data->usb_in_pointer == USB_KBD_BUFFER_LEN - 1) { /* Check for buffer full. */ -- cgit v1.3.1 From 3352c2114b69aeadf54feb8140071a55fb580c30 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 23 Nov 2019 18:15:20 +0100 Subject: usb: kbd: simplify coding for arrow keys Avoid duplicate translation of arrow key codes. Reduce code size by avoiding strings and eliminating usb_kbd_put_sequence(). Signed-off-by: Heinrich Schuchardt --- common/usb_kbd.c | 47 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) (limited to 'common') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index e4711eb6555..d177b97d67e 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -75,13 +75,8 @@ 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 +static const u8 usb_special_keys[] = { + 'C', 'D', 'B', 'A' }; /* @@ -146,12 +141,6 @@ static void usb_kbd_put_queue(struct usb_kbd_pdata *data, u8 c) data->usb_kbd_buffer[data->usb_in_pointer] = c; } -static void usb_kbd_put_sequence(struct usb_kbd_pdata *data, char *s) -{ - for (; *s; s++) - usb_kbd_put_queue(data, *s); -} - /* * Set the LEDs. Since this is used in the irq routine, the control job is * issued with a timeout of 0. This means, that the job is queued without @@ -214,10 +203,6 @@ 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]; @@ -242,28 +227,20 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode, } /* Report keycode if any */ - if (keycode) + if (keycode) { debug("%c", keycode); - - switch (keycode) { - case 0x0e: /* Down arrow key */ - usb_kbd_put_sequence(data, "\e[B"); - break; - case 0x10: /* Up arrow key */ - usb_kbd_put_sequence(data, "\e[A"); - break; - case 0x06: /* Right arrow key */ - usb_kbd_put_sequence(data, "\e[C"); - break; - case 0x02: /* Left arrow key */ - usb_kbd_put_sequence(data, "\e[D"); - break; - default: usb_kbd_put_queue(data, keycode); - break; + return 0; } - return 0; + /* Left, Right, Up, Down */ + if (scancode > 0x4e && scancode < 0x53) { + usb_kbd_put_queue(data, 0x1b); + usb_kbd_put_queue(data, '['); + usb_kbd_put_queue(data, usb_special_keys[scancode - 0x4f]); + return 0; + } + return 1; } static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up) -- cgit v1.3.1 From 87e91bccaee63d70fd3ada0bee5e861edf8967a5 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 23 Nov 2019 18:15:21 +0100 Subject: usb: kbd: implement special keys Provide support for F1-F12, Insert, Delete, Home, End, Page Up, Page Down. As this leads to a size increase provide a customizing setting CONFIG_USB_KEYBOARD_FN_KEYS. Signed-off-by: Heinrich Schuchardt --- common/usb_kbd.c | 42 ++++++++++++++++++++++++++++++++++++++++++ drivers/usb/Kconfig | 6 ++++++ 2 files changed, 48 insertions(+) (limited to 'common') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index d177b97d67e..d6b340bbe7b 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -76,7 +76,11 @@ static const unsigned char usb_kbd_num_keypad[] = { }; static const u8 usb_special_keys[] = { +#ifdef CONFIG_USB_KEYBOARD_FN_KEYS + '2', 'H', '5', '3', 'F', '6', 'C', 'D', 'B', 'A' +#else 'C', 'D', 'B', 'A' +#endif }; /* @@ -233,6 +237,43 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode, return 0; } +#ifdef CONFIG_USB_KEYBOARD_FN_KEYS + if (scancode < 0x3a || scancode > 0x52 || + scancode == 0x46 || scancode == 0x47) + return 1; + + usb_kbd_put_queue(data, 0x1b); + if (scancode < 0x3e) { + /* F1 - F4 */ + usb_kbd_put_queue(data, 0x4f); + usb_kbd_put_queue(data, scancode - 0x3a + 'P'); + return 0; + } + usb_kbd_put_queue(data, '['); + if (scancode < 0x42) { + /* F5 - F8 */ + usb_kbd_put_queue(data, '1'); + if (scancode == 0x3e) + --scancode; + keycode = scancode - 0x3f + '7'; + } else if (scancode < 0x49) { + /* F9 - F12 */ + usb_kbd_put_queue(data, '2'); + if (scancode > 0x43) + ++scancode; + keycode = scancode - 0x42 + '0'; + } else { + /* + * INSERT, HOME, PAGE UP, DELETE, END, PAGE DOWN, + * RIGHT, LEFT, DOWN, UP + */ + keycode = usb_special_keys[scancode - 0x49]; + } + usb_kbd_put_queue(data, keycode); + if (scancode < 0x4f && scancode != 0x4a && scancode != 0x4d) + usb_kbd_put_queue(data, '~'); + return 0; +#else /* Left, Right, Up, Down */ if (scancode > 0x4e && scancode < 0x53) { usb_kbd_put_queue(data, 0x1b); @@ -241,6 +282,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode, return 0; } return 1; +#endif /* CONFIG_USB_KEYBOARD_FN_KEYS */ } static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up) diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 9af78e88226..bea4a92b61f 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -100,6 +100,12 @@ config USB_KEYBOARD if USB_KEYBOARD +config USB_KEYBOARD_FN_KEYS + bool "USB keyboard function key support" + help + Say Y here if you want support for keys F1 - F12, INS, HOME, DELETE, + END, PAGE UP, and PAGE DOWN. + choice prompt "USB keyboard polling" default SYS_USB_EVENT_POLL -- cgit v1.3.1 From e91a411938afcbdf191df52448216e41bbcbd288 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 23 Nov 2019 18:15:22 +0100 Subject: usb: kbd: move USB_KBD_BOOT_REPORT_SIZE to usb.h Move constant USB_KBD_BOOT_REPORT_SIZE. This allows us to reuse it. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- common/usb_kbd.c | 6 ------ include/usb.h | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/usb_kbd.c b/common/usb_kbd.c index d6b340bbe7b..a6221ef7164 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -95,12 +95,6 @@ static const u8 usb_special_keys[] = { #define USB_KBD_LEDMASK \ (USB_KBD_NUMLOCK | USB_KBD_CAPSLOCK | USB_KBD_SCROLLLOCK) -/* - * USB Keyboard reports are 8 bytes in boot protocol. - * Appendix B of HID Device Class Definition 1.11 - */ -#define USB_KBD_BOOT_REPORT_SIZE 8 - struct usb_kbd_pdata { unsigned long intpipe; int intpktsize; diff --git a/include/usb.h b/include/usb.h index bcad552f85f..efb67ea33ff 100644 --- a/include/usb.h +++ b/include/usb.h @@ -242,6 +242,12 @@ int usb_host_eth_scan(int mode); #ifdef CONFIG_USB_KEYBOARD +/* + * USB Keyboard reports are 8 bytes in boot protocol. + * Appendix B of HID Device Class Definition 1.11 + */ +#define USB_KBD_BOOT_REPORT_SIZE 8 + int drv_usb_kbd_init(void); int usb_kbd_deregister(int force); -- cgit v1.3.1