diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2009-01-31 23:59:25 -0800 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2009-01-31 23:59:25 -0800 |
commit | c2c5740b98c6601385e143c88aefbd827422f717 (patch) | |
tree | 8a2f6583bc9600d818301d921bdc1cf6ce2fef80 /src/dev/x86/i8042.hh | |
parent | 7cf276bed34c2ed1f8f86bbf46497aab3f8ebc6c (diff) | |
download | gem5-c2c5740b98c6601385e143c88aefbd827422f717.tar.xz |
X86: Refactor and clean up the keyboard controller.
Diffstat (limited to 'src/dev/x86/i8042.hh')
-rw-r--r-- | src/dev/x86/i8042.hh | 169 |
1 files changed, 143 insertions, 26 deletions
diff --git a/src/dev/x86/i8042.hh b/src/dev/x86/i8042.hh index 7eeb5f7e0..8a941f9a5 100644 --- a/src/dev/x86/i8042.hh +++ b/src/dev/x86/i8042.hh @@ -42,9 +42,147 @@ namespace X86ISA class IntPin; +class PS2Device +{ + protected: + std::queue<uint8_t> outBuffer; + + static const uint16_t NoCommand = (uint16_t)(-1); + + uint16_t lastCommand; + void bufferData(const uint8_t *data, int size); + void ack(); + void nack(); + + public: + virtual ~PS2Device() + {}; + + PS2Device() : lastCommand(NoCommand) + {} + + bool hasData() + { + return !outBuffer.empty(); + } + + uint8_t getData() + { + uint8_t data = outBuffer.front(); + outBuffer.pop(); + return data; + } + + virtual bool processData(uint8_t data) = 0; +}; + +class PS2Mouse : public PS2Device +{ + protected: + static const uint8_t ID[]; + + enum Command + { + Scale1to1 = 0xE6, + Scale2to1 = 0xE7, + SetResolution = 0xE8, + GetStatus = 0xE9, + ReadData = 0xEB, + ResetWrapMode = 0xEC, + WrapMode = 0xEE, + RemoteMode = 0xF0, + ReadID = 0xF2, + SampleRate = 0xF3, + EnableReporting = 0xF4, + DisableReporting = 0xF5, + DefaultsAndDisable = 0xF6, + Resend = 0xFE, + Reset = 0xFF + }; + + BitUnion8(Status) + Bitfield<6> remote; + Bitfield<5> enabled; + Bitfield<4> twoToOne; + Bitfield<2> leftButton; + Bitfield<0> rightButton; + EndBitUnion(Status) + + Status status; + uint8_t resolution; + uint8_t sampleRate; + public: + PS2Mouse() : PS2Device(), status(0), resolution(4), sampleRate(100) + {} + + bool processData(uint8_t data); +}; + +class PS2Keyboard : public PS2Device +{ + protected: + static const uint8_t ID[]; + + enum Command + { + LEDWrite = 0xED, + DiagnosticEcho = 0xEE, + AlternateScanCodes = 0xF0, + ReadID = 0xF2, + TypematicInfo = 0xF3, + Enable = 0xF4, + Disable = 0xF5, + DefaultsAndDisable = 0xF6, + AllKeysToTypematic = 0xF7, + AllKeysToMakeRelease = 0xF8, + AllKeysToMake = 0xF9, + AllKeysToTypematicMakeRelease = 0xFA, + KeyToTypematic = 0xFB, + KeyToMakeRelease = 0xFC, + KeyToMakeOnly = 0xFD, + Resend = 0xFE, + Reset = 0xFF + }; + + public: + bool processData(uint8_t data); +}; + class I8042 : public BasicPioDevice { protected: + enum Command + { + GetCommandByte = 0x20, + ReadControllerRamBase = 0x20, + WriteCommandByte = 0x60, + WriteControllerRamBase = 0x60, + CheckForPassword = 0xA4, + LoadPassword = 0xA5, + CheckPassword = 0xA6, + DisableMouse = 0xA7, + EnableMouse = 0xA8, + TestMouse = 0xA9, + SelfTest = 0xAA, + InterfaceTest = 0xAB, + DiagnosticDump = 0xAC, + DisableKeyboard = 0xAD, + EnableKeyboard = 0xAE, + ReadInputPort = 0xC0, + ContinuousPollLow = 0xC1, + ContinuousPollHigh = 0xC2, + ReadOutputPort = 0xD0, + WriteOutputPort = 0xD1, + WriteKeyboardOutputBuff = 0xD2, + WriteMouseOutputBuff = 0xD3, + WriteToMouse = 0xD4, + DisableA20 = 0xDD, + EnableA20 = 0xDF, + ReadTestInputs = 0xE0, + PulseOutputBitBase = 0xF0, + SystemReset = 0xFE + }; + BitUnion8(StatusReg) Bitfield<7> parityError; Bitfield<6> timeout; @@ -77,32 +215,13 @@ class I8042 : public BasicPioDevice static const uint16_t NoCommand = (uint16_t)(-1); uint16_t lastCommand; - BitUnion8(MouseStatus) - Bitfield<6> remote; - Bitfield<5> enabled; - Bitfield<4> twoToOne; - Bitfield<2> leftButton; - Bitfield<0> rightButton; - EndBitUnion(MouseStatus) - IntSourcePin *mouseIntPin; - std::queue<uint8_t> mouseBuffer; - uint16_t lastMouseCommand; - uint8_t mouseResolution; - uint8_t mouseSampleRate; - MouseStatus mouseStatus; + IntSourcePin *keyboardIntPin; + PS2Mouse mouse; + PS2Keyboard keyboard; - IntSourcePin *keyboardIntPin; - std::queue<uint8_t> keyboardBuffer; - uint16_t lastKeyboardCommand; - - bool writeData(uint8_t newData, bool mouse = false); - void keyboardAck(); - void writeKeyboardData(const uint8_t *data, int size); - void mouseAck(); - void mouseNack(); - void writeMouseData(const uint8_t *data, int size); + void writeData(uint8_t newData, bool mouse = false); uint8_t readDataOut(); public: @@ -117,9 +236,7 @@ class I8042 : public BasicPioDevice I8042(Params *p) : BasicPioDevice(p), latency(p->pio_latency), dataPort(p->data_port), commandPort(p->command_port), statusReg(0), commandByte(0), dataReg(0), lastCommand(NoCommand), - mouseIntPin(p->mouse_int_pin), lastMouseCommand(NoCommand), - keyboardIntPin(p->keyboard_int_pin), - lastKeyboardCommand(NoCommand) + mouseIntPin(p->mouse_int_pin), keyboardIntPin(p->keyboard_int_pin) { statusReg.passedSelfTest = 1; statusReg.commandLast = 1; |