From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=49497 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Om4bu-0002mE-5p for qemu-devel@nongnu.org; Thu, 19 Aug 2010 08:52:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Om4bs-0004j4-Tg for qemu-devel@nongnu.org; Thu, 19 Aug 2010 08:52:46 -0400 Received: from demumfd001.nsn-inter.net ([93.183.12.32]:14878) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Om4bs-0004iX-Iv for qemu-devel@nongnu.org; Thu, 19 Aug 2010 08:52:44 -0400 From: Bernhard Kohl Date: Thu, 19 Aug 2010 14:52:12 +0200 Message-Id: <1282222332-20906-1-git-send-email-bernhard.kohl@nsn.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH RESENT] pckbd: support for commands 0xf0-0xff: Pulse output bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: blauwirbel@gmail.com, Bernhard Kohl I have a guest OS which sends the command 0xfd to the keyboard controller during initialization. To get rid of the message "qemu: unsupported keyboard cmd=3D0x%02x\n" I added support for the pulse output bit commands. I found the following explanation here: http://www.win.tue.nl/~aeb/linux/kbd/scancodes-11.html#ss11.3 Command 0xf0-0xff: Pulse output bit Bits 3-0 of the output port P2 of the keyboard controller may be pulsed low for approximately 6 =C2=B5seconds. Bits 3-0 of this command specify the output port bits to be pulsed. 0: Bit should be pulsed. 1: Bit should not be modified. The only useful version of this command is Command 0xfe. (For MCA, replace 3-0 by 1-0 in the above.) Command 0xfe: System reset Pulse bit 0 of the output port P2 of the keyboard controller. This will reset the CPU. Signed-off-by: Bernhard Kohl --- hw/pckbd.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff --git a/hw/pckbd.c b/hw/pckbd.c index 0533b1d..6e4e406 100644 --- a/hw/pckbd.c +++ b/hw/pckbd.c @@ -56,7 +56,9 @@ #define KBD_CCMD_WRITE_MOUSE 0xD4 /* Write the following byte to the mou= se */ #define KBD_CCMD_DISABLE_A20 0xDD /* HP vectra only ? */ #define KBD_CCMD_ENABLE_A20 0xDF /* HP vectra only ? */ -#define KBD_CCMD_RESET 0xFE +#define KBD_CCMD_PULSE_BITS_3_0 0xF0 /* Pulse bits 3-0 of the output = port P2. */ +#define KBD_CCMD_RESET 0xFE /* Pulse bit 0 of the output por= t P2 =3D CPU reset. */ +#define KBD_CCMD_NO_OP 0xFF /* Pulse no bits of the output p= ort P2. */ =20 /* Keyboard Commands */ #define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ @@ -238,6 +240,21 @@ static void kbd_write_command(void *opaque, uint32_t= addr, uint32_t val) KBDState *s =3D opaque; =20 DPRINTF("kbd: write cmd=3D0x%02x\n", val); + + /* Bits 3-0 of the output port P2 of the keyboard controller may be = pulsed + * low for approximately 6 micro seconds. Bits 3-0 of the KBD_CCMD_P= ULSE + * command specify the output port bits to be pulsed. + * 0: Bit should be pulsed. 1: Bit should not be modified. + * The only useful version of this command is pulsing bit 0, + * which does a CPU reset. + */ + if((val & KBD_CCMD_PULSE_BITS_3_0) =3D=3D KBD_CCMD_PULSE_BITS_3_0) { + if(!(val & 1)) + val =3D KBD_CCMD_RESET; + else + val =3D KBD_CCMD_NO_OP; + } + switch(val) { case KBD_CCMD_READ_MODE: kbd_queue(s, s->mode, 0); @@ -294,8 +311,8 @@ static void kbd_write_command(void *opaque, uint32_t = addr, uint32_t val) case KBD_CCMD_RESET: qemu_system_reset_request(); break; - case 0xff: - /* ignore that - I don't know what is its use */ + case KBD_CCMD_NO_OP: + /* ignore that */ break; default: fprintf(stderr, "qemu: unsupported keyboard cmd=3D0x%02x\n", val= ); --=20 1.7.2.1