From b34ddf8422d4eb3b6d5aa103c2dcb9f0a558f39e Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 14 Jan 2008 12:44:14 +0000 Subject: [PATCH] * Fixed incorrect key code for DELETE. Ctrl-Alt-Del will reset the system when pressed during the boot process, as intended. * Removed other incorrect key codes, except the one for BREAK, since it is used (but won't work). * Ctrl-Alt-Del now also resets the machine when in KDL, at least when waiting for user input. * arch_debug_blue_screen_getchar() does also generate the respective escape sequences for HOME, END, and DELETE, now. Furthermore it generates characters for Ctrl-A through Ctrl-Z. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23512 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/arch/x86/arch_debug_console.c | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/src/system/kernel/arch/x86/arch_debug_console.c b/src/system/kernel/arch/x86/arch_debug_console.c index fd62379a08..8ca293a8db 100644 --- a/src/system/kernel/arch/x86/arch_debug_console.c +++ b/src/system/kernel/arch/x86/arch_debug_console.c @@ -50,18 +50,18 @@ enum keycodes { RIGHT_SHIFT = 54, LEFT_CONTROL = 29, - RIGHT_CONTROL = 157, LEFT_ALT = 56, - RIGHT_ALT = 184, CURSOR_LEFT = 75, CURSOR_RIGHT = 77, CURSOR_UP = 72, CURSOR_DOWN = 80, + CURSOR_HOME = 71, + CURSOR_END = 79, - BREAK = 198, - DELETE = 201, + BREAK = 198, // TODO: >= 128 can't be valid + DELETE = 83, F12 = 88, }; @@ -99,6 +99,7 @@ static bool sBochsOutput = false; static spinlock sSerialOutputSpinlock = 0; + static void put_char(const char c) { @@ -126,7 +127,7 @@ put_char(const char c) static int32 debug_keyboard_interrupt(void *data) { - static bool controlPressed; + static bool controlPressed = false; static bool altPressed; uint8 key; @@ -201,8 +202,11 @@ arch_debug_blue_screen_getchar(void) /* polling the keyboard, similar to code in keyboard * driver, but without using an interrupt */ - static bool shift = false; + static bool shiftPressed = false; + static bool controlPressed = false; + static bool altPressed = false; static uint8 special = 0; + static uint8 special2 = 0; uint8 key, ascii = 0; if (special & 0x80) { @@ -214,6 +218,11 @@ arch_debug_blue_screen_getchar(void) special = 0; return key; } + if (special2 != 0) { + key = special2; + special2 = 0; + return key; + } while (true) { uint8 status = in8(PS2_PORT_CTRL); @@ -234,14 +243,32 @@ arch_debug_blue_screen_getchar(void) if (key & 0x80) { // key up - if (key == (0x80 | LEFT_SHIFT) || key == (0x80 | RIGHT_SHIFT)) - shift = false; + switch (key & ~0x80) { + case LEFT_SHIFT: + case RIGHT_SHIFT: + shiftPressed = false; + break; + case LEFT_CONTROL: + controlPressed = false; + break; + case LEFT_ALT: + altPressed = false; + break; + } } else { // key down switch (key) { case LEFT_SHIFT: case RIGHT_SHIFT: - shift = true; + shiftPressed = true; + break; + + case LEFT_CONTROL: + controlPressed = true; + break; + + case LEFT_ALT: + altPressed = true; break; // start escape sequence for cursor movement @@ -257,9 +284,30 @@ arch_debug_blue_screen_getchar(void) case CURSOR_LEFT: special = 0x80 | 'D'; return '\x1b'; + case CURSOR_HOME: + special = 0x80 | 'H'; + return '\x1b'; + case CURSOR_END: + special = 0x80 | 'F'; + return '\x1b'; + + case DELETE: + if (controlPressed && altPressed) + arch_cpu_shutdown(true); + + special = 0x80 | '3'; + special2 = '~'; + return '\x1b'; default: - return shift ? kShiftedKeymap[key] : kUnshiftedKeymap[key]; + if (controlPressed) { + char c = kShiftedKeymap[key]; + if (c >= 'A' && c <= 'Z') + return 0x1f & c; + } + + return shiftPressed + ? kShiftedKeymap[key] : kUnshiftedKeymap[key]; } } }