[coreboot] r3270 - in trunk/payloads/libpayload: drivers include libc

svn at coreboot.org svn at coreboot.org
Sat Apr 26 01:09:39 CEST 2008


Author: jcrouse
Date: 2008-04-26 01:09:39 +0200 (Sat, 26 Apr 2008)
New Revision: 3270

Modified:
   trunk/payloads/libpayload/drivers/keyboard.c
   trunk/payloads/libpayload/include/libpayload.h
   trunk/payloads/libpayload/libc/console.c
Log:
libpayload:  Enable keyboard translation so that we can use scancode set 1

The qemu keyboard controller defaults to using scancode set 2, we use set 1.
Turn on the translate mode in the keyboard controller to force the issue.

Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
Acked-by: Peter Stuge <peter at stuge.se>


Modified: trunk/payloads/libpayload/drivers/keyboard.c
===================================================================
--- trunk/payloads/libpayload/drivers/keyboard.c	2008-04-25 23:08:47 UTC (rev 3269)
+++ trunk/payloads/libpayload/drivers/keyboard.c	2008-04-25 23:09:39 UTC (rev 3270)
@@ -29,6 +29,11 @@
 
 #include <libpayload.h>
 
+#define I8042_CMD_READ_MODE  0x20
+#define I8042_CMD_WRITE_MODE 0x60
+
+#define I8042_MODE_XLATE     0x40
+
 unsigned char map[2][0x57] = {
 	{
 	 0x00, 0x1B, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
@@ -118,3 +123,54 @@
 
 	return ret;
 }
+
+static int keyboard_wait_read(void)
+{
+	int timeout = 10000;
+
+	while(timeout-- && !(inb(0x64) & 0x01))
+		udelay(50);
+
+	return (timeout <= 0) ? -1 : 0;
+}
+
+static int keyboard_wait_write(void)
+{
+	int timeout = 10000;
+
+	while(timeout-- && (inb(0x64) & 0x02))
+		udelay(50);
+
+	return (timeout <= 0) ? -1 : 0;
+}
+
+static unsigned char keyboard_get_mode(void)
+{
+	outb(I8042_CMD_READ_MODE, 0x64);
+	keyboard_wait_read();
+	return inb(0x60);
+}
+
+static void keyboard_set_mode(unsigned char mode)
+{
+	outb(I8042_CMD_WRITE_MODE, 0x64);
+	keyboard_wait_write();
+	outb(mode, 0x60);
+}
+
+void keyboard_init(void)
+{
+	u8 mode;
+
+	/* Read the current mode */
+	mode = keyboard_get_mode();
+
+	/* Turn on scancode translate mode so that we can
+	   use the scancode set 1 tables */
+
+	mode |= I8042_MODE_XLATE;
+
+	/* Write the new mode */
+	keyboard_set_mode(mode);
+}
+

Modified: trunk/payloads/libpayload/include/libpayload.h
===================================================================
--- trunk/payloads/libpayload/include/libpayload.h	2008-04-25 23:08:47 UTC (rev 3269)
+++ trunk/payloads/libpayload/include/libpayload.h	2008-04-25 23:09:39 UTC (rev 3270)
@@ -67,6 +67,7 @@
 void nvram_write(u8 val, u8 addr);
 
 /* drivers/keyboard.c */
+void keyboard_init(void);
 int keyboard_havechar(void);
 unsigned char keyboard_get_scancode(void);
 int keyboard_getchar(void);

Modified: trunk/payloads/libpayload/libc/console.c
===================================================================
--- trunk/payloads/libpayload/libc/console.c	2008-04-25 23:08:47 UTC (rev 3269)
+++ trunk/payloads/libpayload/libc/console.c	2008-04-25 23:09:39 UTC (rev 3270)
@@ -37,6 +37,9 @@
 #ifdef CONFIG_SERIAL_CONSOLE
 	serial_init();
 #endif
+#ifdef CONFIG_PC_KEYBOARD
+	keyboard_init();
+#endif
 }
 
 static void device_putchar(unsigned char c)





More information about the coreboot mailing list