Automated merge with ssh://hg@repo.m5sim.org/m5
[gem5.git] / src / dev / x86 / i8042.hh
index 7eeb5f7e087a9482aaeaf151e2911923918e1448..b14d254ca8e571b5f4796c520a128004074a24e7 100644 (file)
@@ -42,9 +42,155 @@ 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);
+
+    void serialize(const std::string &base, std::ostream &os);
+    void unserialize(const std::string &base, Checkpoint *cp,
+            const std::string &section);
+};
+
+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 &section);
+};
+
 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<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 +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 &section);
 };
 
-}; // namespace X86ISA
+} // namespace X86ISA
 
 #endif //__DEV_X86_I8042_HH__