diff --git a/src/dev/ps2/keyboard.cc b/src/dev/ps2/keyboard.cc index fb63d480ce..e3b13acbf6 100644 --- a/src/dev/ps2/keyboard.cc +++ b/src/dev/ps2/keyboard.cc @@ -128,9 +128,26 @@ PS2Keyboard::recv(const std::vector &data) return true; } case keyboard::DiagnosticEcho: - panic("Keyboard diagnostic echo unimplemented.\n"); + send(keyboard::DiagnosticEcho); + return true; case keyboard::AlternateScanCodes: - panic("Accessing alternate scan codes unimplemented.\n"); + if (data.size() == 1) { + DPRINTF(PS2, "Got scan code set command.\n"); + sendAck(); + return false; + } else { + sendAck(); + uint8_t scan_code = data[1]; + if (scan_code == 0) { + DPRINTF(PS2, "Sending hard coded current scan code set 2.\n"); + send(0x2); + } else { + DPRINTF(PS2, "Setting scan code set to %d.\n", scan_code); + panic_if(scan_code != 0x2, + "PS/2 scan code set %d not supported.", scan_code); + } + } + return true; case keyboard::TypematicInfo: if (data.size() == 1) { DPRINTF(PS2, "Setting typematic info.\n");