i8042.hh revision 11007
15831Sgblack@eecs.umich.edu/* 25831Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan 35831Sgblack@eecs.umich.edu * All rights reserved. 45831Sgblack@eecs.umich.edu * 55831Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65831Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75831Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85831Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95831Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105831Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115831Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125831Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135831Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145831Sgblack@eecs.umich.edu * this software without specific prior written permission. 155831Sgblack@eecs.umich.edu * 165831Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175831Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185831Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195831Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205831Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215831Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225831Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235831Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245831Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255831Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265831Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275831Sgblack@eecs.umich.edu * 285831Sgblack@eecs.umich.edu * Authors: Gabe Black 295831Sgblack@eecs.umich.edu */ 305831Sgblack@eecs.umich.edu 315831Sgblack@eecs.umich.edu#ifndef __DEV_X86_I8042_HH__ 325831Sgblack@eecs.umich.edu#define __DEV_X86_I8042_HH__ 335831Sgblack@eecs.umich.edu 3411007Sandreas.sandberg@arm.com#include <deque> 358229Snate@binkert.org 368229Snate@binkert.org#include "dev/x86/intdev.hh" 375831Sgblack@eecs.umich.edu#include "dev/io_device.hh" 385831Sgblack@eecs.umich.edu#include "params/I8042.hh" 395831Sgblack@eecs.umich.edu 405831Sgblack@eecs.umich.edunamespace X86ISA 415831Sgblack@eecs.umich.edu{ 425831Sgblack@eecs.umich.edu 435831Sgblack@eecs.umich.educlass IntPin; 445831Sgblack@eecs.umich.edu 455832Sgblack@eecs.umich.educlass PS2Device 465832Sgblack@eecs.umich.edu{ 475832Sgblack@eecs.umich.edu protected: 4811007Sandreas.sandberg@arm.com std::deque<uint8_t> outBuffer; 495832Sgblack@eecs.umich.edu 505832Sgblack@eecs.umich.edu static const uint16_t NoCommand = (uint16_t)(-1); 515832Sgblack@eecs.umich.edu 525832Sgblack@eecs.umich.edu uint16_t lastCommand; 535832Sgblack@eecs.umich.edu void bufferData(const uint8_t *data, int size); 545832Sgblack@eecs.umich.edu void ack(); 555832Sgblack@eecs.umich.edu void nack(); 565832Sgblack@eecs.umich.edu 575832Sgblack@eecs.umich.edu public: 585832Sgblack@eecs.umich.edu virtual ~PS2Device() 595832Sgblack@eecs.umich.edu {}; 605832Sgblack@eecs.umich.edu 615832Sgblack@eecs.umich.edu PS2Device() : lastCommand(NoCommand) 625832Sgblack@eecs.umich.edu {} 635832Sgblack@eecs.umich.edu 6411007Sandreas.sandberg@arm.com virtual void serialize(const std::string &base, CheckpointOut &cp) const; 6511007Sandreas.sandberg@arm.com virtual void unserialize(const std::string &base, CheckpointIn &cp); 6611007Sandreas.sandberg@arm.com 675832Sgblack@eecs.umich.edu bool hasData() 685832Sgblack@eecs.umich.edu { 695832Sgblack@eecs.umich.edu return !outBuffer.empty(); 705832Sgblack@eecs.umich.edu } 715832Sgblack@eecs.umich.edu 725832Sgblack@eecs.umich.edu uint8_t getData() 735832Sgblack@eecs.umich.edu { 745832Sgblack@eecs.umich.edu uint8_t data = outBuffer.front(); 7511007Sandreas.sandberg@arm.com outBuffer.pop_front(); 765832Sgblack@eecs.umich.edu return data; 775832Sgblack@eecs.umich.edu } 785832Sgblack@eecs.umich.edu 795832Sgblack@eecs.umich.edu virtual bool processData(uint8_t data) = 0; 805832Sgblack@eecs.umich.edu}; 815832Sgblack@eecs.umich.edu 825832Sgblack@eecs.umich.educlass PS2Mouse : public PS2Device 835832Sgblack@eecs.umich.edu{ 845832Sgblack@eecs.umich.edu protected: 855832Sgblack@eecs.umich.edu static const uint8_t ID[]; 865832Sgblack@eecs.umich.edu 875832Sgblack@eecs.umich.edu enum Command 885832Sgblack@eecs.umich.edu { 895832Sgblack@eecs.umich.edu Scale1to1 = 0xE6, 905832Sgblack@eecs.umich.edu Scale2to1 = 0xE7, 915832Sgblack@eecs.umich.edu SetResolution = 0xE8, 925832Sgblack@eecs.umich.edu GetStatus = 0xE9, 935832Sgblack@eecs.umich.edu ReadData = 0xEB, 945832Sgblack@eecs.umich.edu ResetWrapMode = 0xEC, 955832Sgblack@eecs.umich.edu WrapMode = 0xEE, 965832Sgblack@eecs.umich.edu RemoteMode = 0xF0, 975832Sgblack@eecs.umich.edu ReadID = 0xF2, 985832Sgblack@eecs.umich.edu SampleRate = 0xF3, 995832Sgblack@eecs.umich.edu EnableReporting = 0xF4, 1005832Sgblack@eecs.umich.edu DisableReporting = 0xF5, 1015832Sgblack@eecs.umich.edu DefaultsAndDisable = 0xF6, 1025832Sgblack@eecs.umich.edu Resend = 0xFE, 1035832Sgblack@eecs.umich.edu Reset = 0xFF 1045832Sgblack@eecs.umich.edu }; 1055832Sgblack@eecs.umich.edu 1065832Sgblack@eecs.umich.edu BitUnion8(Status) 1075832Sgblack@eecs.umich.edu Bitfield<6> remote; 1085832Sgblack@eecs.umich.edu Bitfield<5> enabled; 1095832Sgblack@eecs.umich.edu Bitfield<4> twoToOne; 1105832Sgblack@eecs.umich.edu Bitfield<2> leftButton; 1115832Sgblack@eecs.umich.edu Bitfield<0> rightButton; 1125832Sgblack@eecs.umich.edu EndBitUnion(Status) 1135832Sgblack@eecs.umich.edu 1145832Sgblack@eecs.umich.edu Status status; 1155832Sgblack@eecs.umich.edu uint8_t resolution; 1165832Sgblack@eecs.umich.edu uint8_t sampleRate; 1175832Sgblack@eecs.umich.edu public: 1185832Sgblack@eecs.umich.edu PS2Mouse() : PS2Device(), status(0), resolution(4), sampleRate(100) 1195832Sgblack@eecs.umich.edu {} 1205832Sgblack@eecs.umich.edu 1215832Sgblack@eecs.umich.edu bool processData(uint8_t data); 1227903Shestness@cs.utexas.edu 12311007Sandreas.sandberg@arm.com void serialize(const std::string &base, 12411007Sandreas.sandberg@arm.com CheckpointOut &cp) const M5_ATTR_OVERRIDE; 12511007Sandreas.sandberg@arm.com void unserialize(const std::string &base, 12611007Sandreas.sandberg@arm.com CheckpointIn &cp) M5_ATTR_OVERRIDE; 1275832Sgblack@eecs.umich.edu}; 1285832Sgblack@eecs.umich.edu 1295832Sgblack@eecs.umich.educlass PS2Keyboard : public PS2Device 1305832Sgblack@eecs.umich.edu{ 1315832Sgblack@eecs.umich.edu protected: 1325832Sgblack@eecs.umich.edu static const uint8_t ID[]; 1335832Sgblack@eecs.umich.edu 1345832Sgblack@eecs.umich.edu enum Command 1355832Sgblack@eecs.umich.edu { 1365832Sgblack@eecs.umich.edu LEDWrite = 0xED, 1375832Sgblack@eecs.umich.edu DiagnosticEcho = 0xEE, 1385832Sgblack@eecs.umich.edu AlternateScanCodes = 0xF0, 1395832Sgblack@eecs.umich.edu ReadID = 0xF2, 1405832Sgblack@eecs.umich.edu TypematicInfo = 0xF3, 1415832Sgblack@eecs.umich.edu Enable = 0xF4, 1425832Sgblack@eecs.umich.edu Disable = 0xF5, 1435832Sgblack@eecs.umich.edu DefaultsAndDisable = 0xF6, 1445832Sgblack@eecs.umich.edu AllKeysToTypematic = 0xF7, 1455832Sgblack@eecs.umich.edu AllKeysToMakeRelease = 0xF8, 1465832Sgblack@eecs.umich.edu AllKeysToMake = 0xF9, 1475832Sgblack@eecs.umich.edu AllKeysToTypematicMakeRelease = 0xFA, 1485832Sgblack@eecs.umich.edu KeyToTypematic = 0xFB, 1495832Sgblack@eecs.umich.edu KeyToMakeRelease = 0xFC, 1505832Sgblack@eecs.umich.edu KeyToMakeOnly = 0xFD, 1515832Sgblack@eecs.umich.edu Resend = 0xFE, 1525832Sgblack@eecs.umich.edu Reset = 0xFF 1535832Sgblack@eecs.umich.edu }; 1545832Sgblack@eecs.umich.edu 1555832Sgblack@eecs.umich.edu public: 1565832Sgblack@eecs.umich.edu bool processData(uint8_t data); 1575832Sgblack@eecs.umich.edu}; 1585832Sgblack@eecs.umich.edu 1595831Sgblack@eecs.umich.educlass I8042 : public BasicPioDevice 1605831Sgblack@eecs.umich.edu{ 1615831Sgblack@eecs.umich.edu protected: 1625832Sgblack@eecs.umich.edu enum Command 1635832Sgblack@eecs.umich.edu { 1645832Sgblack@eecs.umich.edu GetCommandByte = 0x20, 1655832Sgblack@eecs.umich.edu ReadControllerRamBase = 0x20, 1665832Sgblack@eecs.umich.edu WriteCommandByte = 0x60, 1675832Sgblack@eecs.umich.edu WriteControllerRamBase = 0x60, 1685832Sgblack@eecs.umich.edu CheckForPassword = 0xA4, 1695832Sgblack@eecs.umich.edu LoadPassword = 0xA5, 1705832Sgblack@eecs.umich.edu CheckPassword = 0xA6, 1715832Sgblack@eecs.umich.edu DisableMouse = 0xA7, 1725832Sgblack@eecs.umich.edu EnableMouse = 0xA8, 1735832Sgblack@eecs.umich.edu TestMouse = 0xA9, 1745832Sgblack@eecs.umich.edu SelfTest = 0xAA, 1755832Sgblack@eecs.umich.edu InterfaceTest = 0xAB, 1765832Sgblack@eecs.umich.edu DiagnosticDump = 0xAC, 1775832Sgblack@eecs.umich.edu DisableKeyboard = 0xAD, 1785832Sgblack@eecs.umich.edu EnableKeyboard = 0xAE, 1795832Sgblack@eecs.umich.edu ReadInputPort = 0xC0, 1805832Sgblack@eecs.umich.edu ContinuousPollLow = 0xC1, 1815832Sgblack@eecs.umich.edu ContinuousPollHigh = 0xC2, 1825832Sgblack@eecs.umich.edu ReadOutputPort = 0xD0, 1835832Sgblack@eecs.umich.edu WriteOutputPort = 0xD1, 1845832Sgblack@eecs.umich.edu WriteKeyboardOutputBuff = 0xD2, 1855832Sgblack@eecs.umich.edu WriteMouseOutputBuff = 0xD3, 1865832Sgblack@eecs.umich.edu WriteToMouse = 0xD4, 1875832Sgblack@eecs.umich.edu DisableA20 = 0xDD, 1885832Sgblack@eecs.umich.edu EnableA20 = 0xDF, 1895832Sgblack@eecs.umich.edu ReadTestInputs = 0xE0, 1905832Sgblack@eecs.umich.edu PulseOutputBitBase = 0xF0, 1915832Sgblack@eecs.umich.edu SystemReset = 0xFE 1925832Sgblack@eecs.umich.edu }; 1935832Sgblack@eecs.umich.edu 1945831Sgblack@eecs.umich.edu BitUnion8(StatusReg) 1955831Sgblack@eecs.umich.edu Bitfield<7> parityError; 1965831Sgblack@eecs.umich.edu Bitfield<6> timeout; 1975831Sgblack@eecs.umich.edu Bitfield<5> mouseOutputFull; 1985831Sgblack@eecs.umich.edu Bitfield<4> keyboardUnlocked; 1995831Sgblack@eecs.umich.edu Bitfield<3> commandLast; 2005831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 2015831Sgblack@eecs.umich.edu Bitfield<1> inputFull; 2025831Sgblack@eecs.umich.edu Bitfield<0> outputFull; 2035831Sgblack@eecs.umich.edu EndBitUnion(StatusReg) 2045831Sgblack@eecs.umich.edu 2055831Sgblack@eecs.umich.edu BitUnion8(CommandByte) 2065831Sgblack@eecs.umich.edu Bitfield<6> convertScanCodes; 2075831Sgblack@eecs.umich.edu Bitfield<5> disableMouse; 2085831Sgblack@eecs.umich.edu Bitfield<4> disableKeyboard; 2095831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 2105831Sgblack@eecs.umich.edu Bitfield<1> mouseFullInt; 2115831Sgblack@eecs.umich.edu Bitfield<0> keyboardFullInt; 2125831Sgblack@eecs.umich.edu EndBitUnion(CommandByte) 2135831Sgblack@eecs.umich.edu 2145831Sgblack@eecs.umich.edu Tick latency; 2155831Sgblack@eecs.umich.edu Addr dataPort; 2165831Sgblack@eecs.umich.edu Addr commandPort; 2175831Sgblack@eecs.umich.edu 2185831Sgblack@eecs.umich.edu StatusReg statusReg; 2195831Sgblack@eecs.umich.edu CommandByte commandByte; 2205831Sgblack@eecs.umich.edu 2215831Sgblack@eecs.umich.edu uint8_t dataReg; 2225831Sgblack@eecs.umich.edu 2235831Sgblack@eecs.umich.edu static const uint16_t NoCommand = (uint16_t)(-1); 2245831Sgblack@eecs.umich.edu uint16_t lastCommand; 2255831Sgblack@eecs.umich.edu 2265832Sgblack@eecs.umich.edu IntSourcePin *mouseIntPin; 2275832Sgblack@eecs.umich.edu IntSourcePin *keyboardIntPin; 2285831Sgblack@eecs.umich.edu 2295832Sgblack@eecs.umich.edu PS2Mouse mouse; 2305832Sgblack@eecs.umich.edu PS2Keyboard keyboard; 2315831Sgblack@eecs.umich.edu 2325832Sgblack@eecs.umich.edu void writeData(uint8_t newData, bool mouse = false); 2335831Sgblack@eecs.umich.edu uint8_t readDataOut(); 2345831Sgblack@eecs.umich.edu 2355831Sgblack@eecs.umich.edu public: 2365831Sgblack@eecs.umich.edu typedef I8042Params Params; 2375831Sgblack@eecs.umich.edu 2385831Sgblack@eecs.umich.edu const Params * 2395831Sgblack@eecs.umich.edu params() const 2405831Sgblack@eecs.umich.edu { 2415831Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 2425831Sgblack@eecs.umich.edu } 2435831Sgblack@eecs.umich.edu 2449808Sstever@gmail.com I8042(Params *p); 2455831Sgblack@eecs.umich.edu 2469090Sandreas.hansson@arm.com AddrRangeList getAddrRanges() const; 2475831Sgblack@eecs.umich.edu 2485831Sgblack@eecs.umich.edu Tick read(PacketPtr pkt); 2495831Sgblack@eecs.umich.edu 2505831Sgblack@eecs.umich.edu Tick write(PacketPtr pkt); 2517903Shestness@cs.utexas.edu 25211007Sandreas.sandberg@arm.com void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; 25310905Sandreas.sandberg@arm.com void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; 2545831Sgblack@eecs.umich.edu}; 2555831Sgblack@eecs.umich.edu 2567811Ssteve.reinhardt@amd.com} // namespace X86ISA 2575831Sgblack@eecs.umich.edu 2585831Sgblack@eecs.umich.edu#endif //__DEV_X86_I8042_HH__ 259