i8042.hh revision 10905
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 348229Snate@binkert.org#include <queue> 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: 485832Sgblack@eecs.umich.edu std::queue<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 645832Sgblack@eecs.umich.edu bool hasData() 655832Sgblack@eecs.umich.edu { 665832Sgblack@eecs.umich.edu return !outBuffer.empty(); 675832Sgblack@eecs.umich.edu } 685832Sgblack@eecs.umich.edu 695832Sgblack@eecs.umich.edu uint8_t getData() 705832Sgblack@eecs.umich.edu { 715832Sgblack@eecs.umich.edu uint8_t data = outBuffer.front(); 725832Sgblack@eecs.umich.edu outBuffer.pop(); 735832Sgblack@eecs.umich.edu return data; 745832Sgblack@eecs.umich.edu } 755832Sgblack@eecs.umich.edu 765832Sgblack@eecs.umich.edu virtual bool processData(uint8_t data) = 0; 775832Sgblack@eecs.umich.edu}; 785832Sgblack@eecs.umich.edu 795832Sgblack@eecs.umich.educlass PS2Mouse : public PS2Device 805832Sgblack@eecs.umich.edu{ 815832Sgblack@eecs.umich.edu protected: 825832Sgblack@eecs.umich.edu static const uint8_t ID[]; 835832Sgblack@eecs.umich.edu 845832Sgblack@eecs.umich.edu enum Command 855832Sgblack@eecs.umich.edu { 865832Sgblack@eecs.umich.edu Scale1to1 = 0xE6, 875832Sgblack@eecs.umich.edu Scale2to1 = 0xE7, 885832Sgblack@eecs.umich.edu SetResolution = 0xE8, 895832Sgblack@eecs.umich.edu GetStatus = 0xE9, 905832Sgblack@eecs.umich.edu ReadData = 0xEB, 915832Sgblack@eecs.umich.edu ResetWrapMode = 0xEC, 925832Sgblack@eecs.umich.edu WrapMode = 0xEE, 935832Sgblack@eecs.umich.edu RemoteMode = 0xF0, 945832Sgblack@eecs.umich.edu ReadID = 0xF2, 955832Sgblack@eecs.umich.edu SampleRate = 0xF3, 965832Sgblack@eecs.umich.edu EnableReporting = 0xF4, 975832Sgblack@eecs.umich.edu DisableReporting = 0xF5, 985832Sgblack@eecs.umich.edu DefaultsAndDisable = 0xF6, 995832Sgblack@eecs.umich.edu Resend = 0xFE, 1005832Sgblack@eecs.umich.edu Reset = 0xFF 1015832Sgblack@eecs.umich.edu }; 1025832Sgblack@eecs.umich.edu 1035832Sgblack@eecs.umich.edu BitUnion8(Status) 1045832Sgblack@eecs.umich.edu Bitfield<6> remote; 1055832Sgblack@eecs.umich.edu Bitfield<5> enabled; 1065832Sgblack@eecs.umich.edu Bitfield<4> twoToOne; 1075832Sgblack@eecs.umich.edu Bitfield<2> leftButton; 1085832Sgblack@eecs.umich.edu Bitfield<0> rightButton; 1095832Sgblack@eecs.umich.edu EndBitUnion(Status) 1105832Sgblack@eecs.umich.edu 1115832Sgblack@eecs.umich.edu Status status; 1125832Sgblack@eecs.umich.edu uint8_t resolution; 1135832Sgblack@eecs.umich.edu uint8_t sampleRate; 1145832Sgblack@eecs.umich.edu public: 1155832Sgblack@eecs.umich.edu PS2Mouse() : PS2Device(), status(0), resolution(4), sampleRate(100) 1165832Sgblack@eecs.umich.edu {} 1175832Sgblack@eecs.umich.edu 1185832Sgblack@eecs.umich.edu bool processData(uint8_t data); 1197903Shestness@cs.utexas.edu 12010905Sandreas.sandberg@arm.com void serialize(const std::string &base, CheckpointOut &cp); 12110905Sandreas.sandberg@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 1225832Sgblack@eecs.umich.edu}; 1235832Sgblack@eecs.umich.edu 1245832Sgblack@eecs.umich.educlass PS2Keyboard : public PS2Device 1255832Sgblack@eecs.umich.edu{ 1265832Sgblack@eecs.umich.edu protected: 1275832Sgblack@eecs.umich.edu static const uint8_t ID[]; 1285832Sgblack@eecs.umich.edu 1295832Sgblack@eecs.umich.edu enum Command 1305832Sgblack@eecs.umich.edu { 1315832Sgblack@eecs.umich.edu LEDWrite = 0xED, 1325832Sgblack@eecs.umich.edu DiagnosticEcho = 0xEE, 1335832Sgblack@eecs.umich.edu AlternateScanCodes = 0xF0, 1345832Sgblack@eecs.umich.edu ReadID = 0xF2, 1355832Sgblack@eecs.umich.edu TypematicInfo = 0xF3, 1365832Sgblack@eecs.umich.edu Enable = 0xF4, 1375832Sgblack@eecs.umich.edu Disable = 0xF5, 1385832Sgblack@eecs.umich.edu DefaultsAndDisable = 0xF6, 1395832Sgblack@eecs.umich.edu AllKeysToTypematic = 0xF7, 1405832Sgblack@eecs.umich.edu AllKeysToMakeRelease = 0xF8, 1415832Sgblack@eecs.umich.edu AllKeysToMake = 0xF9, 1425832Sgblack@eecs.umich.edu AllKeysToTypematicMakeRelease = 0xFA, 1435832Sgblack@eecs.umich.edu KeyToTypematic = 0xFB, 1445832Sgblack@eecs.umich.edu KeyToMakeRelease = 0xFC, 1455832Sgblack@eecs.umich.edu KeyToMakeOnly = 0xFD, 1465832Sgblack@eecs.umich.edu Resend = 0xFE, 1475832Sgblack@eecs.umich.edu Reset = 0xFF 1485832Sgblack@eecs.umich.edu }; 1495832Sgblack@eecs.umich.edu 1505832Sgblack@eecs.umich.edu public: 1515832Sgblack@eecs.umich.edu bool processData(uint8_t data); 1527903Shestness@cs.utexas.edu 15310905Sandreas.sandberg@arm.com void serialize(const std::string &base, CheckpointOut &cp); 15410905Sandreas.sandberg@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 1555832Sgblack@eecs.umich.edu}; 1565832Sgblack@eecs.umich.edu 1575831Sgblack@eecs.umich.educlass I8042 : public BasicPioDevice 1585831Sgblack@eecs.umich.edu{ 1595831Sgblack@eecs.umich.edu protected: 1605832Sgblack@eecs.umich.edu enum Command 1615832Sgblack@eecs.umich.edu { 1625832Sgblack@eecs.umich.edu GetCommandByte = 0x20, 1635832Sgblack@eecs.umich.edu ReadControllerRamBase = 0x20, 1645832Sgblack@eecs.umich.edu WriteCommandByte = 0x60, 1655832Sgblack@eecs.umich.edu WriteControllerRamBase = 0x60, 1665832Sgblack@eecs.umich.edu CheckForPassword = 0xA4, 1675832Sgblack@eecs.umich.edu LoadPassword = 0xA5, 1685832Sgblack@eecs.umich.edu CheckPassword = 0xA6, 1695832Sgblack@eecs.umich.edu DisableMouse = 0xA7, 1705832Sgblack@eecs.umich.edu EnableMouse = 0xA8, 1715832Sgblack@eecs.umich.edu TestMouse = 0xA9, 1725832Sgblack@eecs.umich.edu SelfTest = 0xAA, 1735832Sgblack@eecs.umich.edu InterfaceTest = 0xAB, 1745832Sgblack@eecs.umich.edu DiagnosticDump = 0xAC, 1755832Sgblack@eecs.umich.edu DisableKeyboard = 0xAD, 1765832Sgblack@eecs.umich.edu EnableKeyboard = 0xAE, 1775832Sgblack@eecs.umich.edu ReadInputPort = 0xC0, 1785832Sgblack@eecs.umich.edu ContinuousPollLow = 0xC1, 1795832Sgblack@eecs.umich.edu ContinuousPollHigh = 0xC2, 1805832Sgblack@eecs.umich.edu ReadOutputPort = 0xD0, 1815832Sgblack@eecs.umich.edu WriteOutputPort = 0xD1, 1825832Sgblack@eecs.umich.edu WriteKeyboardOutputBuff = 0xD2, 1835832Sgblack@eecs.umich.edu WriteMouseOutputBuff = 0xD3, 1845832Sgblack@eecs.umich.edu WriteToMouse = 0xD4, 1855832Sgblack@eecs.umich.edu DisableA20 = 0xDD, 1865832Sgblack@eecs.umich.edu EnableA20 = 0xDF, 1875832Sgblack@eecs.umich.edu ReadTestInputs = 0xE0, 1885832Sgblack@eecs.umich.edu PulseOutputBitBase = 0xF0, 1895832Sgblack@eecs.umich.edu SystemReset = 0xFE 1905832Sgblack@eecs.umich.edu }; 1915832Sgblack@eecs.umich.edu 1925831Sgblack@eecs.umich.edu BitUnion8(StatusReg) 1935831Sgblack@eecs.umich.edu Bitfield<7> parityError; 1945831Sgblack@eecs.umich.edu Bitfield<6> timeout; 1955831Sgblack@eecs.umich.edu Bitfield<5> mouseOutputFull; 1965831Sgblack@eecs.umich.edu Bitfield<4> keyboardUnlocked; 1975831Sgblack@eecs.umich.edu Bitfield<3> commandLast; 1985831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 1995831Sgblack@eecs.umich.edu Bitfield<1> inputFull; 2005831Sgblack@eecs.umich.edu Bitfield<0> outputFull; 2015831Sgblack@eecs.umich.edu EndBitUnion(StatusReg) 2025831Sgblack@eecs.umich.edu 2035831Sgblack@eecs.umich.edu BitUnion8(CommandByte) 2045831Sgblack@eecs.umich.edu Bitfield<6> convertScanCodes; 2055831Sgblack@eecs.umich.edu Bitfield<5> disableMouse; 2065831Sgblack@eecs.umich.edu Bitfield<4> disableKeyboard; 2075831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 2085831Sgblack@eecs.umich.edu Bitfield<1> mouseFullInt; 2095831Sgblack@eecs.umich.edu Bitfield<0> keyboardFullInt; 2105831Sgblack@eecs.umich.edu EndBitUnion(CommandByte) 2115831Sgblack@eecs.umich.edu 2125831Sgblack@eecs.umich.edu Tick latency; 2135831Sgblack@eecs.umich.edu Addr dataPort; 2145831Sgblack@eecs.umich.edu Addr commandPort; 2155831Sgblack@eecs.umich.edu 2165831Sgblack@eecs.umich.edu StatusReg statusReg; 2175831Sgblack@eecs.umich.edu CommandByte commandByte; 2185831Sgblack@eecs.umich.edu 2195831Sgblack@eecs.umich.edu uint8_t dataReg; 2205831Sgblack@eecs.umich.edu 2215831Sgblack@eecs.umich.edu static const uint16_t NoCommand = (uint16_t)(-1); 2225831Sgblack@eecs.umich.edu uint16_t lastCommand; 2235831Sgblack@eecs.umich.edu 2245832Sgblack@eecs.umich.edu IntSourcePin *mouseIntPin; 2255832Sgblack@eecs.umich.edu IntSourcePin *keyboardIntPin; 2265831Sgblack@eecs.umich.edu 2275832Sgblack@eecs.umich.edu PS2Mouse mouse; 2285832Sgblack@eecs.umich.edu PS2Keyboard keyboard; 2295831Sgblack@eecs.umich.edu 2305832Sgblack@eecs.umich.edu void writeData(uint8_t newData, bool mouse = false); 2315831Sgblack@eecs.umich.edu uint8_t readDataOut(); 2325831Sgblack@eecs.umich.edu 2335831Sgblack@eecs.umich.edu public: 2345831Sgblack@eecs.umich.edu typedef I8042Params Params; 2355831Sgblack@eecs.umich.edu 2365831Sgblack@eecs.umich.edu const Params * 2375831Sgblack@eecs.umich.edu params() const 2385831Sgblack@eecs.umich.edu { 2395831Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 2405831Sgblack@eecs.umich.edu } 2415831Sgblack@eecs.umich.edu 2429808Sstever@gmail.com I8042(Params *p); 2435831Sgblack@eecs.umich.edu 2449090Sandreas.hansson@arm.com AddrRangeList getAddrRanges() const; 2455831Sgblack@eecs.umich.edu 2465831Sgblack@eecs.umich.edu Tick read(PacketPtr pkt); 2475831Sgblack@eecs.umich.edu 2485831Sgblack@eecs.umich.edu Tick write(PacketPtr pkt); 2497903Shestness@cs.utexas.edu 25010905Sandreas.sandberg@arm.com void serializeOld(CheckpointOut &cp) M5_ATTR_OVERRIDE; 25110905Sandreas.sandberg@arm.com void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; 2525831Sgblack@eecs.umich.edu}; 2535831Sgblack@eecs.umich.edu 2547811Ssteve.reinhardt@amd.com} // namespace X86ISA 2555831Sgblack@eecs.umich.edu 2565831Sgblack@eecs.umich.edu#endif //__DEV_X86_I8042_HH__ 257