The keyboard driver mixed up the key press/release events for the
special keys.

Patrick Georgi explained:
The |0x80 codes are "break codes", that means, codes that are emitted
when the key transitions from pressed to non-pressed, so the modifier
was always in the wrong state, as soon as you pressed shift for the
first time.

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3558 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c
index 970dec9..96285d0 100644
--- a/payloads/libpayload/drivers/keyboard.c
+++ b/payloads/libpayload/drivers/keyboard.c
@@ -79,7 +79,7 @@
 
 int keyboard_getchar(void)
 {
-	static int modifier;
+	static int modifier = 0;
 	unsigned char ch;
 	int shift;
 	int ret = 0;
@@ -91,17 +91,17 @@
 	switch (ch) {
 	case 0x36:
 	case 0x2a:
-		modifier &= ~MOD_SHIFT;
+		modifier |= MOD_SHIFT;
 		break;
 	case 0x80 | 0x36:
 	case 0x80 | 0x2a:
-		modifier |= MOD_SHIFT;
+		modifier &= ~MOD_SHIFT;
 		break;
 	case 0x1d:
-		modifier &= ~MOD_CTRL;
+		modifier |= MOD_CTRL;
 		break;
 	case 0x80 | 0x1d:
-		modifier |= MOD_CTRL;
+		modifier &= ~MOD_CTRL;
 		break;
 	case 0x3a:
 		if (modifier & MOD_CAPSLOCK)