X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fdev%2Fx86%2Fi8042.hh;h=b14d254ca8e571b5f4796c520a128004074a24e7;hb=6daf44dae6dbe931e2a1493cd0e33ca9732509dd;hp=7eeb5f7e087a9482aaeaf151e2911923918e1448;hpb=7cf276bed34c2ed1f8f86bbf46497aab3f8ebc6c;p=gem5.git diff --git a/src/dev/x86/i8042.hh b/src/dev/x86/i8042.hh index 7eeb5f7e0..b14d254ca 100644 --- a/src/dev/x86/i8042.hh +++ b/src/dev/x86/i8042.hh @@ -42,9 +42,155 @@ namespace X86ISA class IntPin; +class PS2Device +{ + protected: + std::queue 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); + + void serialize(const std::string &base, std::ostream &os); + void unserialize(const std::string &base, Checkpoint *cp, + const std::string §ion); +}; + +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); + + void serialize(const std::string &base, std::ostream &os); + void unserialize(const std::string &base, Checkpoint *cp, + const std::string §ion); +}; + 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 +223,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 mouseBuffer; - uint16_t lastMouseCommand; - uint8_t mouseResolution; - uint8_t mouseSampleRate; - MouseStatus mouseStatus; + IntSourcePin *keyboardIntPin; + PS2Mouse mouse; + PS2Keyboard keyboard; - IntSourcePin *keyboardIntPin; - std::queue 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 +244,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; @@ -135,8 +260,11 @@ class I8042 : public BasicPioDevice Tick read(PacketPtr pkt); Tick write(PacketPtr pkt); + + virtual void serialize(std::ostream &os); + virtual void unserialize(Checkpoint *cp, const std::string §ion); }; -}; // namespace X86ISA +} // namespace X86ISA #endif //__DEV_X86_I8042_HH__