From a3e6255be244e8681177ce2e83567e12ce9b9a86 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 27 May 2009 20:27:35 +0000 Subject: [PATCH] Clear up debugger prompt from "mouse excrements". Tested in QEMU, Bochs, VirtualBox. svn path=/trunk/; revision=41156 --- reactos/ntoskrnl/kdbg/kdb_cli.c | 2 +- reactos/ntoskrnl/kdbg/kdb_keyboard.c | 62 +++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/reactos/ntoskrnl/kdbg/kdb_cli.c b/reactos/ntoskrnl/kdbg/kdb_cli.c index 58d08a7e5f2..0a2040b334c 100644 --- a/reactos/ntoskrnl/kdbg/kdb_cli.c +++ b/reactos/ntoskrnl/kdbg/kdb_cli.c @@ -2258,7 +2258,7 @@ KdbpReadCommand( /* Read the next char - this is to throw away a \n which most clients should * send after \r. */ - KeStallExecutionProcessor(100000); + KeStallExecutionProcessor(100000); if (KdbDebugState & KD_DEBUG_KDSERIAL) NextKey = KdbpTryGetCharSerial(5); else diff --git a/reactos/ntoskrnl/kdbg/kdb_keyboard.c b/reactos/ntoskrnl/kdbg/kdb_keyboard.c index f1e2a63d154..e2af88fbdfc 100644 --- a/reactos/ntoskrnl/kdbg/kdb_keyboard.c +++ b/reactos/ntoskrnl/kdbg/kdb_keyboard.c @@ -16,18 +16,25 @@ #if 1 -#define KBD_STATUS_REG 0x64 -#define KBD_CNTL_REG 0x64 -#define KBD_DATA_REG 0x60 +#define KBD_STATUS_REG 0x64 +#define KBD_CNTL_REG 0x64 +#define KBD_DATA_REG 0x60 + +#define KBD_STAT_OBF 0x01 +#define KBD_STAT_IBF 0x02 + +#define CTRL_WRITE_MOUSE 0xD4 +#define MOU_ENAB 0xF4 +#define MOU_DISAB 0xF5 +#define MOUSE_ACK 0xFA #define KBD_DISABLE_MOUSE 0xA7 #define KBD_ENABLE_MOUSE 0xA8 -#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ - -#define kbd_write_command(cmd) WRITE_PORT_UCHAR((PUCHAR)KBD_STATUS_REG,cmd) -#define kbd_read_input() READ_PORT_UCHAR((PUCHAR)KBD_DATA_REG) -#define kbd_read_status() READ_PORT_UCHAR((PUCHAR)KBD_STATUS_REG) +#define kbd_write_command(cmd) WRITE_PORT_UCHAR((PUCHAR)KBD_CNTL_REG,cmd) +#define kbd_write_data(cmd) WRITE_PORT_UCHAR((PUCHAR)KBD_DATA_REG,cmd) +#define kbd_read_input() READ_PORT_UCHAR((PUCHAR)KBD_DATA_REG) +#define kbd_read_status() READ_PORT_UCHAR((PUCHAR)KBD_STATUS_REG) static unsigned char keyb_layout[2][128] = { @@ -50,14 +57,49 @@ static unsigned char keyb_layout[2][128] = typedef UCHAR byte_t; +/* FUNCTIONS *****************************************************************/ + +static VOID +KbdSendCommandToMouse(UCHAR Command) +{ + ULONG Retry = 20000; + + while (kbd_read_status() & KBD_STAT_OBF && Retry--) + { + kbd_read_input(); + KeStallExecutionProcessor(50); + } + + Retry = 20000; + while (kbd_read_status() & KBD_STAT_IBF && Retry--) + KeStallExecutionProcessor(50); + + kbd_write_command(CTRL_WRITE_MOUSE); + + Retry = 20000; + while (kbd_read_status() & KBD_STAT_IBF && Retry--) + KeStallExecutionProcessor(50); + + kbd_write_data(Command); + + Retry = 20000; + while (!(kbd_read_status() & KBD_STAT_OBF) && Retry--) + KeStallExecutionProcessor(50); + + if (kbd_read_input() != MOUSE_ACK) { ; } + return; +} + VOID KbdEnableMouse() { - kbd_write_command(KBD_ENABLE_MOUSE); + KbdSendCommandToMouse(MOU_ENAB); + // kbd_write_command(KBD_ENABLE_MOUSE); } VOID KbdDisableMouse() { - kbd_write_command(KBD_DISABLE_MOUSE); + KbdSendCommandToMouse(MOU_DISAB); + // kbd_write_command(KBD_DISABLE_MOUSE); } CHAR