Patchwork [RESENT] pckbd: support for commands 0xf0-0xff: Pulse output bit

login
register
mail settings
Submitter Bernhard Kohl
Date Aug. 19, 2010, 12:52 p.m.
Message ID <1282222332-20906-1-git-send-email-bernhard.kohl@nsn.com>
Download mbox | patch
Permalink /patch/62153/
State New
Headers show

Comments

Bernhard Kohl - Aug. 19, 2010, 12:52 p.m.
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=0x%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 ┬Áseconds. 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 <bernhard.kohl@nsn.com>
---
 hw/pckbd.c |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)
Anthony Liguori - Aug. 22, 2010, 9:30 p.m.
On 08/19/2010 07:52 AM, Bernhard Kohl wrote:
> 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=0x%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 ┬Áseconds. 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<bernhard.kohl@nsn.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
> ---
>   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 mouse */
>   #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 port P2 = CPU reset. */
> +#define KBD_CCMD_NO_OP          0xFF    /* Pulse no bits of the output port P2. */
>
>   /* 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 = opaque;
>
>       DPRINTF("kbd: write cmd=0x%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_PULSE
> +     * 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) == KBD_CCMD_PULSE_BITS_3_0) {
> +        if(!(val&  1))
> +            val = KBD_CCMD_RESET;
> +        else
> +            val = 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=0x%02x\n", val);
>

Patch

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 mouse */
 #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 port P2 = CPU reset. */
+#define KBD_CCMD_NO_OP          0xFF    /* Pulse no bits of the output port P2. */
 
 /* 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 = opaque;
 
     DPRINTF("kbd: write cmd=0x%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_PULSE
+     * 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) == KBD_CCMD_PULSE_BITS_3_0) {
+        if(!(val & 1))
+            val = KBD_CCMD_RESET;
+        else
+            val = 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=0x%02x\n", val);