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:
Nir Lichtman 2024-11-11 21:56:22 +00:00 committed by Daniel Thompson
parent 9c98750eb3
commit 24b2455fe8

View File

@ -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;