#include <palacios/vmm_intr.h>
#include <palacios/vmm_host_events.h>
#include <palacios/vm_guest.h>
+#include <palacios/vmm_debug.h>
#ifndef V3_CONFIG_DEBUG_KEYBOARD
// after having a f0 sent to 60
// we wait for a new output byte on 60
GETSET_SCANCODES,
+ // first send ACK (0xfa)
+ // then wait for reception, and reset kb state
+ SET_DEFAULTS,
} state;
};
+static int keyboard_reset_device(struct keyboard_internal * kbd);
+
+
static int update_kb_irq(struct keyboard_internal * state) {
int irq_num = 0;
#ifdef V3_CONFIG_TELEMETRY
else if (evt->scan_code == 0x41) { // F7 telemetry dump
- v3_print_telemetry(vm);
+ v3_print_global_telemetry(vm);
}
#endif
#ifdef V3_CONFIG_SYMMOD
break;
default:
PrintError("keyboard: unknown scancode set %d selected\n", data);
- return -1;
+ ret = -1;
+ break;
}
kbd->state = NORMAL;
break;
+ case SET_DEFAULTS:
+ keyboard_reset_device(kbd);
+ kbd->state = NORMAL;
+ break;
+
default:
case NORMAL: {
// command is being sent to keyboard controller
kbd->state = GETSET_SCANCODES;
break;
+
+ case 0xf6: // set defaults
+ // ACK command
+ // clear output buffer
+ // reset to init state
+ push_to_output_queue(kbd, 0xfa, COMMAND, KEYBOARD);
+ kbd->state = SET_DEFAULTS;
+ break;
+
case 0xfe: // resend
case 0xfd: // set key type make
case 0xfc: // set key typ make/break
case 0xf9: // set all make
case 0xf8: // set all make/break
case 0xf7: // set all typemaktic
- case 0xf6: // set defaults
+
PrintError("keyboard: unhandled known command 0x%x on output buffer (60h)\n", data);
ret = -1;
break;