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