aboutsummaryrefslogtreecommitdiff
path: root/payloads
diff options
context:
space:
mode:
authorStefan Reinauer <stepan@coresystems.de>2008-09-02 09:35:43 +0000
committerStefan Reinauer <stepan@openbios.org>2008-09-02 09:35:43 +0000
commit56471f14db710f9368a53fa709fe79465220f245 (patch)
tree2eaec68d60db1285e81b3a0fb04ddc4f686881f9 /payloads
parent093f6d5379ed64efcf35a2f25398047f14784714 (diff)
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
Diffstat (limited to 'payloads')
-rw-r--r--payloads/libpayload/drivers/keyboard.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c
index 970dec94c7..96285d0d15 100644
--- a/payloads/libpayload/drivers/keyboard.c
+++ b/payloads/libpayload/drivers/keyboard.c
@@ -79,7 +79,7 @@ unsigned char keyboard_get_scancode(void)
int keyboard_getchar(void)
{
- static int modifier;
+ static int modifier = 0;
unsigned char ch;
int shift;
int ret = 0;
@@ -91,17 +91,17 @@ int keyboard_getchar(void)
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)