[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patch that fixes an 'at_keyboard' module issue (unreliable key presses)

From: Michael Bideau
Subject: Patch that fixes an 'at_keyboard' module issue (unreliable key presses)
Date: Sat, 24 Aug 2019 21:09:13 +0200

Hi all,

This patch fixes an issue that prevented the 'at_keyboard' module to
work (for me).

The cause is a bad/wrong return value in the function
'grub_at_keyboard_getkey()' in file
'grub-core/term/at_keyboard.c' at line 234.

///////// patch /////////
diff --git a/grub-core/term/at_keyboard.c b/grub-core/term/at_keyboard.c
index f0a986eb1..597111077 100644
--- a/grub-core/term/at_keyboard.c
+++ b/grub-core/term/at_keyboard.c
@@ -234,7 +234,7 @@ grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused)))

- return -1;
+ return GRUB_TERM_NO_KEY;
at_key = grub_inb (KEYBOARD_REG_DATA);
old_led = ps2_state.led_status;
///////// end of patch /////////

My symptoms were to have an unresponsive keyboard: keys needed to be
pressed 10x and more to
effectively be printed, sometimes generating multiple key presses
(after 1 or 2 sec of no printing).
Very problematic for typing passphrase in early stage (with
When switching to 'console' terminal input, keyboard works perfectly.
It also worked great with grub 2.02 packaged by Debian (2.02+dfsg1-20).
It was not an output issue, but an input one.

I've managed to analyse the issue and found where it came from: the
following commit:
///////// commit /////////
Commit: 216950a4eea1a1ead1c28eaca94e34ea2ef2ad19
Author: Vladimir Serbinenko <address@hidden>
Date: Mon May 8 21:41:22 2017 +0200

at_keyboard: Split protocol from controller code.

On vexpress controller is different but protocol is the same, so reuse the
///////// end of commit /////////

3 lines where moved from the function 'fetch_key()' in file 'grub-
core/term/at_keyboard.c', to the
begining of function 'grub_at_keyboard_getkey()' (same file).
But returning '-1' made sense when in function 'fetch_key()' but not
anymore in function
'grub_at_keyboard_getkey()', which should return 'GRUB_TERM_NO_KEY'.

See by yourself:

///////// git diff /////////
~> git diff ac6b41b89fbb82a3ba843a7ed19115d81432b604 216950a4eea1a1ead1c28eaca94e34ea2ef2ad19


diff --git a/grub-core/term/at_keyboard.c b/grub-core/term/at_keyboard.c
index b4ea9ff7e..3ab4e205f 100644
--- a/grub-core/term/at_keyboard.c
+++ b/grub-core/term/at_keyboard.c


@@ -386,164 +195,10 @@ keyboard_controller_led (grub_uint8_t leds)
grub_outb (leds & 0x7, KEYBOARD_REG_DATA);

-static int
-fetch_key (int *is_break)
- int was_ext = 0;
- grub_uint8_t at_key;
- int ret = 0;
- return -1;
- at_key = grub_inb (KEYBOARD_REG_DATA);


@@ -566,51 +221,28 @@ grub_at_keyboard_is_alive (void)
static int
grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused)))
- int code;
+ grub_uint8_t at_key;


if (!grub_at_keyboard_is_alive ())


+ return -1;
+ at_key = grub_inb (KEYBOARD_REG_DATA);

///////// end of git diff /////////

If you want me to fill a bug, just tell me and I'll do it.

PS: this is my first contribution to grub, to "low level" code, and in
C, so please be kind ;-)

Best regards, and thank you all, for your great work on grub.
Michael Bideau [FR|France].

reply via email to

[Prev in Thread] Current Thread [Next in Thread]