mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 00:35:01 +00:00
kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode
Problem: When using kdb via keyboard it does not react to control characters which are supported in serial mode. Example: Chords such as ctrl+a/e/d/p do not work in keyboard mode Solution: Before disregarding non-printable key characters, check if they are one of the supported control characters, I have took the control characters from the switch case upwards in this function that translates scan codes of arrow keys/backspace/home/.. to the control characters. Suggested-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Nir Lichtman <nir@lichtman.org> Reviewed-by: Douglas Anderson <dianders@chromium.org> Link: https://lore.kernel.org/r/20241111215622.GA161253@lichtman.org Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
This commit is contained in:
parent
9c98750eb3
commit
24b2455fe8
@ -25,6 +25,8 @@
|
||||
#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */
|
||||
#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */
|
||||
|
||||
#define CTRL(c) ((c) - 64)
|
||||
|
||||
static int kbd_exists;
|
||||
static int kbd_last_ret;
|
||||
|
||||
@ -123,24 +125,24 @@ int kdb_get_kbd_char(void)
|
||||
return 8;
|
||||
}
|
||||
|
||||
/* Special Key */
|
||||
/* Translate special keys to equivalent CTRL control characters */
|
||||
switch (scancode) {
|
||||
case 0xF: /* Tab */
|
||||
return 9;
|
||||
return CTRL('I');
|
||||
case 0x53: /* Del */
|
||||
return 4;
|
||||
return CTRL('D');
|
||||
case 0x47: /* Home */
|
||||
return 1;
|
||||
return CTRL('A');
|
||||
case 0x4F: /* End */
|
||||
return 5;
|
||||
return CTRL('E');
|
||||
case 0x4B: /* Left */
|
||||
return 2;
|
||||
return CTRL('B');
|
||||
case 0x48: /* Up */
|
||||
return 16;
|
||||
return CTRL('P');
|
||||
case 0x50: /* Down */
|
||||
return 14;
|
||||
return CTRL('N');
|
||||
case 0x4D: /* Right */
|
||||
return 6;
|
||||
return CTRL('F');
|
||||
}
|
||||
|
||||
if (scancode == 0xe0)
|
||||
@ -172,6 +174,19 @@ int kdb_get_kbd_char(void)
|
||||
switch (KTYP(keychar)) {
|
||||
case KT_LETTER:
|
||||
case KT_LATIN:
|
||||
switch (keychar) {
|
||||
/* non-printable supported control characters */
|
||||
case CTRL('A'): /* Home */
|
||||
case CTRL('B'): /* Left */
|
||||
case CTRL('D'): /* Del */
|
||||
case CTRL('E'): /* End */
|
||||
case CTRL('F'): /* Right */
|
||||
case CTRL('I'): /* Tab */
|
||||
case CTRL('N'): /* Down */
|
||||
case CTRL('P'): /* Up */
|
||||
return keychar;
|
||||
}
|
||||
|
||||
if (isprint(keychar))
|
||||
break; /* printable characters */
|
||||
fallthrough;
|
||||
|
Loading…
Reference in New Issue
Block a user