mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +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_OBF 0x01 /* Keyboard output buffer full */
|
||||||
#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse 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_exists;
|
||||||
static int kbd_last_ret;
|
static int kbd_last_ret;
|
||||||
|
|
||||||
@ -123,24 +125,24 @@ int kdb_get_kbd_char(void)
|
|||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Special Key */
|
/* Translate special keys to equivalent CTRL control characters */
|
||||||
switch (scancode) {
|
switch (scancode) {
|
||||||
case 0xF: /* Tab */
|
case 0xF: /* Tab */
|
||||||
return 9;
|
return CTRL('I');
|
||||||
case 0x53: /* Del */
|
case 0x53: /* Del */
|
||||||
return 4;
|
return CTRL('D');
|
||||||
case 0x47: /* Home */
|
case 0x47: /* Home */
|
||||||
return 1;
|
return CTRL('A');
|
||||||
case 0x4F: /* End */
|
case 0x4F: /* End */
|
||||||
return 5;
|
return CTRL('E');
|
||||||
case 0x4B: /* Left */
|
case 0x4B: /* Left */
|
||||||
return 2;
|
return CTRL('B');
|
||||||
case 0x48: /* Up */
|
case 0x48: /* Up */
|
||||||
return 16;
|
return CTRL('P');
|
||||||
case 0x50: /* Down */
|
case 0x50: /* Down */
|
||||||
return 14;
|
return CTRL('N');
|
||||||
case 0x4D: /* Right */
|
case 0x4D: /* Right */
|
||||||
return 6;
|
return CTRL('F');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scancode == 0xe0)
|
if (scancode == 0xe0)
|
||||||
@ -172,6 +174,19 @@ int kdb_get_kbd_char(void)
|
|||||||
switch (KTYP(keychar)) {
|
switch (KTYP(keychar)) {
|
||||||
case KT_LETTER:
|
case KT_LETTER:
|
||||||
case KT_LATIN:
|
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))
|
if (isprint(keychar))
|
||||||
break; /* printable characters */
|
break; /* printable characters */
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
Loading…
Reference in New Issue
Block a user