i8042.hh revision 14290
13900Ssaidi@eecs.umich.edu/*
22632Sstever@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan
32632Sstever@eecs.umich.edu * All rights reserved.
42632Sstever@eecs.umich.edu *
52632Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62632Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
72632Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92632Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112632Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122632Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132632Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142632Sstever@eecs.umich.edu * this software without specific prior written permission.
152632Sstever@eecs.umich.edu *
162632Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172632Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182632Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192632Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202632Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212632Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222632Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232632Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242632Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252632Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262632Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272632Sstever@eecs.umich.edu *
282632Sstever@eecs.umich.edu * Authors: Gabe Black
292632Sstever@eecs.umich.edu */
302632Sstever@eecs.umich.edu
312022SN/A#ifndef __DEV_X86_I8042_HH__
322022SN/A#define __DEV_X86_I8042_HH__
332022SN/A
342022SN/A#include <deque>
352022SN/A
362469SN/A#include "dev/intpin.hh"
372469SN/A#include "dev/io_device.hh"
382469SN/A#include "dev/ps2/device.hh"
392469SN/A#include "params/I8042.hh"
402516SN/A
412516SN/Anamespace X86ISA
422944Sgblack@eecs.umich.edu{
432482SN/A
443598Sgblack@eecs.umich.educlass I8042 : public BasicPioDevice
453056Sgblack@eecs.umich.edu{
462469SN/A  protected:
473056Sgblack@eecs.umich.edu    enum Command
483056Sgblack@eecs.umich.edu    {
493056Sgblack@eecs.umich.edu        GetCommandByte = 0x20,
503598Sgblack@eecs.umich.edu        ReadControllerRamBase = 0x20,
512516SN/A        WriteCommandByte = 0x60,
523056Sgblack@eecs.umich.edu        WriteControllerRamBase = 0x60,
533598Sgblack@eecs.umich.edu        CheckForPassword = 0xA4,
543056Sgblack@eecs.umich.edu        LoadPassword = 0xA5,
553056Sgblack@eecs.umich.edu        CheckPassword = 0xA6,
563056Sgblack@eecs.umich.edu        DisableMouse = 0xA7,
573056Sgblack@eecs.umich.edu        EnableMouse = 0xA8,
583056Sgblack@eecs.umich.edu        TestMouse = 0xA9,
593056Sgblack@eecs.umich.edu        SelfTest = 0xAA,
603056Sgblack@eecs.umich.edu        InterfaceTest = 0xAB,
613598Sgblack@eecs.umich.edu        DiagnosticDump = 0xAC,
623056Sgblack@eecs.umich.edu        DisableKeyboard = 0xAD,
633056Sgblack@eecs.umich.edu        EnableKeyboard = 0xAE,
643598Sgblack@eecs.umich.edu        ReadInputPort = 0xC0,
654004Sgblack@eecs.umich.edu        ContinuousPollLow = 0xC1,
664004Sgblack@eecs.umich.edu        ContinuousPollHigh = 0xC2,
673056Sgblack@eecs.umich.edu        ReadOutputPort = 0xD0,
683056Sgblack@eecs.umich.edu        WriteOutputPort = 0xD1,
693056Sgblack@eecs.umich.edu        WriteKeyboardOutputBuff = 0xD2,
703056Sgblack@eecs.umich.edu        WriteMouseOutputBuff = 0xD3,
713056Sgblack@eecs.umich.edu        WriteToMouse = 0xD4,
723056Sgblack@eecs.umich.edu        DisableA20 = 0xDD,
733056Sgblack@eecs.umich.edu        EnableA20 = 0xDF,
743056Sgblack@eecs.umich.edu        ReadTestInputs = 0xE0,
753056Sgblack@eecs.umich.edu        PulseOutputBitBase = 0xF0,
763056Sgblack@eecs.umich.edu        SystemReset = 0xFE
773056Sgblack@eecs.umich.edu    };
783056Sgblack@eecs.umich.edu
793056Sgblack@eecs.umich.edu    BitUnion8(StatusReg)
803056Sgblack@eecs.umich.edu        Bitfield<7> parityError;
813056Sgblack@eecs.umich.edu        Bitfield<6> timeout;
823056Sgblack@eecs.umich.edu        Bitfield<5> mouseOutputFull;
833056Sgblack@eecs.umich.edu        Bitfield<4> keyboardUnlocked;
842482SN/A        Bitfield<3> commandLast;
853598Sgblack@eecs.umich.edu        Bitfield<2> passedSelfTest;
863598Sgblack@eecs.umich.edu        Bitfield<1> inputFull;
873598Sgblack@eecs.umich.edu        Bitfield<0> outputFull;
883598Sgblack@eecs.umich.edu    EndBitUnion(StatusReg)
893598Sgblack@eecs.umich.edu
903598Sgblack@eecs.umich.edu    BitUnion8(CommandByte)
913598Sgblack@eecs.umich.edu        Bitfield<6> convertScanCodes;
923598Sgblack@eecs.umich.edu        Bitfield<5> disableMouse;
933598Sgblack@eecs.umich.edu        Bitfield<4> disableKeyboard;
943598Sgblack@eecs.umich.edu        Bitfield<2> passedSelfTest;
953598Sgblack@eecs.umich.edu        Bitfield<1> mouseFullInt;
963598Sgblack@eecs.umich.edu        Bitfield<0> keyboardFullInt;
973598Sgblack@eecs.umich.edu    EndBitUnion(CommandByte)
983598Sgblack@eecs.umich.edu
993598Sgblack@eecs.umich.edu    Tick latency;
1003598Sgblack@eecs.umich.edu    Addr dataPort;
1013598Sgblack@eecs.umich.edu    Addr commandPort;
1023598Sgblack@eecs.umich.edu
1033598Sgblack@eecs.umich.edu    StatusReg statusReg;
1043598Sgblack@eecs.umich.edu    CommandByte commandByte;
1053598Sgblack@eecs.umich.edu
1064004Sgblack@eecs.umich.edu    uint8_t dataReg;
1074004Sgblack@eecs.umich.edu
1083598Sgblack@eecs.umich.edu    static const uint16_t NoCommand = (uint16_t)(-1);
1093598Sgblack@eecs.umich.edu    uint16_t lastCommand;
1103598Sgblack@eecs.umich.edu
1113598Sgblack@eecs.umich.edu    std::vector<::IntSourcePin<I8042> *> mouseIntPin;
1123598Sgblack@eecs.umich.edu    std::vector<::IntSourcePin<I8042> *> keyboardIntPin;
1133598Sgblack@eecs.umich.edu
1143598Sgblack@eecs.umich.edu    PS2Device *mouse;
1153598Sgblack@eecs.umich.edu    PS2Device *keyboard;
1163598Sgblack@eecs.umich.edu
1172516SN/A    void writeData(uint8_t newData, bool mouse = false);
1182516SN/A    uint8_t readDataOut();
1192516SN/A
1202516SN/A  public:
1212482SN/A    typedef I8042Params Params;
1222482SN/A
1232591SN/A    const Params *
1242516SN/A    params() const
1252580SN/A    {
1262580SN/A        return dynamic_cast<const Params *>(_params);
1272482SN/A    }
1282482SN/A
1292591SN/A    I8042(Params *p);
1302516SN/A
1312580SN/A    Port &
1322580SN/A    getPort(const std::string &if_name, PortID idx=InvalidPortID) override
1332482SN/A    {
1342482SN/A        if (if_name == "mouse_int_pin")
1352591SN/A            return *mouseIntPin.at(idx);
1362516SN/A        else if (if_name == "keyboard_int_pin")
1372580SN/A            return *keyboardIntPin.at(idx);
1382580SN/A        else
1392482SN/A            return BasicPioDevice::getPort(if_name, idx);
1402482SN/A    }
1412591SN/A
1422516SN/A    AddrRangeList getAddrRanges() const override;
1432580SN/A
1442580SN/A    Tick read(PacketPtr pkt) override;
1452482SN/A
1462482SN/A    Tick write(PacketPtr pkt) override;
1472591SN/A
1482516SN/A    void serialize(CheckpointOut &cp) const override;
1492580SN/A    void unserialize(CheckpointIn &cp) override;
1502580SN/A};
1512482SN/A
1522482SN/A} // namespace X86ISA
1532591SN/A
1542516SN/A#endif //__DEV_X86_I8042_HH__
1552580SN/A