libpayload: Fix handling of CAPS LOCK key on PS/2 keyboards
authorPatrick Georgi <patrick.georgi@secunet.com>
Thu, 10 Nov 2011 14:48:37 +0000 (15:48 +0100)
committerStefan Reinauer <stefan.reinauer@coreboot.org>
Thu, 10 Nov 2011 16:51:53 +0000 (17:51 +0100)
The PS/2 keyboard driver set and reset the caps LED to show the
keyboard status. Unfortunately, that configuration happens over
the same path used to transmit keypresses.

In face of certain error conditions, the keyboard stopped working.
This change makes keyboard handling more robust.

Change-Id: I0489a9983ea7dab00357220e09398dd1a8538839
Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Reviewed-on: http://review.coreboot.org/430
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
payloads/libpayload/drivers/keyboard.c

index 0663f47bc636f2e1acd88f0ef2aafceb118555bb..717ee5541cd70919e0a8e9130ac8e1dabbf47961 100644 (file)
@@ -166,11 +166,13 @@ static struct layout_maps keyboard_layouts[] = {
 
 static void keyboard_cmd(unsigned char cmd, unsigned char val)
 {
+       while (inb(0x64) & 2);
        outb(cmd, 0x60);
-       /* wait until keyboard controller accepts cmds: */
+       mdelay(20);
+
        while (inb(0x64) & 2);
        outb(val, 0x60);
-       while (inb(0x64) & 2);
+       mdelay(20);
 }
 
 int keyboard_havechar(void)