@@ -150,7 +150,12 @@
q->count++;
s->update_irq(s->update_arg, 1);
}
-
+void ps2_clear_queue(void *opaque)
+{
+ PS2State *s = (PS2State *)opaque;
+ PS2Queue *q = &s->queue;
+ q->wptr = q->rptr = q->count = 0;
+}
/*
keycode is expressed as follow:
bit 7 - 0 key pressed, 1 = key released
@@ -207,6 +207,8 @@
KBDState *s = opaque;
int val;
val = s->status;
+ if(s->write-cmd == KBD_CCMD_KBD_ENABLE)
+ val &= ~KBD_STAT_OBF;
DPRINTF("kbd: read status=0x%02x\n", val);
return val;
}
@@ -251,9 +253,10 @@
else
val = KBD_CCMD_NO_OP;
}
-
+ s->write_cmd = 0;
switch(val) {
case KBD_CCMD_READ_MODE:
+ ps2_clear_queue(s->kbd);
kbd_queue(s, s->mode, 0);
break;
case KBD_CCMD_WRITE_MODE:
@@ -284,6 +287,7 @@
kbd_update_irq(s);
break;
case KBD_CCMD_KBD_ENABLE:
+ s->write_cmd = KBD_CCMD_KBD_ENABLE;
s->mode &= ~KBD_MODE_DISABLE_KBD;
kbd_update_irq(s);
break;