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
This commit is contained in:
Stefan Reinauer 2008-09-02 09:35:43 +00:00 committed by Stefan Reinauer
parent 093f6d5379
commit 56471f14db
1 changed files with 5 additions and 5 deletions

View File

@ -79,7 +79,7 @@ unsigned char keyboard_get_scancode(void)
int keyboard_getchar(void) int keyboard_getchar(void)
{ {
static int modifier; static int modifier = 0;
unsigned char ch; unsigned char ch;
int shift; int shift;
int ret = 0; int ret = 0;
@ -91,17 +91,17 @@ int keyboard_getchar(void)
switch (ch) { switch (ch) {
case 0x36: case 0x36:
case 0x2a: case 0x2a:
modifier &= ~MOD_SHIFT; modifier |= MOD_SHIFT;
break; break;
case 0x80 | 0x36: case 0x80 | 0x36:
case 0x80 | 0x2a: case 0x80 | 0x2a:
modifier |= MOD_SHIFT; modifier &= ~MOD_SHIFT;
break; break;
case 0x1d: case 0x1d:
modifier &= ~MOD_CTRL; modifier |= MOD_CTRL;
break; break;
case 0x80 | 0x1d: case 0x80 | 0x1d:
modifier |= MOD_CTRL; modifier &= ~MOD_CTRL;
break; break;
case 0x3a: case 0x3a:
if (modifier & MOD_CAPSLOCK) if (modifier & MOD_CAPSLOCK)