i8042.hh revision 5832
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 345831Sgblack@eecs.umich.edu#include "dev/io_device.hh" 355831Sgblack@eecs.umich.edu#include "dev/x86/intdev.hh" 365831Sgblack@eecs.umich.edu#include "params/I8042.hh" 375831Sgblack@eecs.umich.edu 385831Sgblack@eecs.umich.edu#include <queue> 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); 1195832Sgblack@eecs.umich.edu}; 1205832Sgblack@eecs.umich.edu 1215832Sgblack@eecs.umich.educlass PS2Keyboard : public PS2Device 1225832Sgblack@eecs.umich.edu{ 1235832Sgblack@eecs.umich.edu protected: 1245832Sgblack@eecs.umich.edu static const uint8_t ID[]; 1255832Sgblack@eecs.umich.edu 1265832Sgblack@eecs.umich.edu enum Command 1275832Sgblack@eecs.umich.edu { 1285832Sgblack@eecs.umich.edu LEDWrite = 0xED, 1295832Sgblack@eecs.umich.edu DiagnosticEcho = 0xEE, 1305832Sgblack@eecs.umich.edu AlternateScanCodes = 0xF0, 1315832Sgblack@eecs.umich.edu ReadID = 0xF2, 1325832Sgblack@eecs.umich.edu TypematicInfo = 0xF3, 1335832Sgblack@eecs.umich.edu Enable = 0xF4, 1345832Sgblack@eecs.umich.edu Disable = 0xF5, 1355832Sgblack@eecs.umich.edu DefaultsAndDisable = 0xF6, 1365832Sgblack@eecs.umich.edu AllKeysToTypematic = 0xF7, 1375832Sgblack@eecs.umich.edu AllKeysToMakeRelease = 0xF8, 1385832Sgblack@eecs.umich.edu AllKeysToMake = 0xF9, 1395832Sgblack@eecs.umich.edu AllKeysToTypematicMakeRelease = 0xFA, 1405832Sgblack@eecs.umich.edu KeyToTypematic = 0xFB, 1415832Sgblack@eecs.umich.edu KeyToMakeRelease = 0xFC, 1425832Sgblack@eecs.umich.edu KeyToMakeOnly = 0xFD, 1435832Sgblack@eecs.umich.edu Resend = 0xFE, 1445832Sgblack@eecs.umich.edu Reset = 0xFF 1455832Sgblack@eecs.umich.edu }; 1465832Sgblack@eecs.umich.edu 1475832Sgblack@eecs.umich.edu public: 1485832Sgblack@eecs.umich.edu bool processData(uint8_t data); 1495832Sgblack@eecs.umich.edu}; 1505832Sgblack@eecs.umich.edu 1515831Sgblack@eecs.umich.educlass I8042 : public BasicPioDevice 1525831Sgblack@eecs.umich.edu{ 1535831Sgblack@eecs.umich.edu protected: 1545832Sgblack@eecs.umich.edu enum Command 1555832Sgblack@eecs.umich.edu { 1565832Sgblack@eecs.umich.edu GetCommandByte = 0x20, 1575832Sgblack@eecs.umich.edu ReadControllerRamBase = 0x20, 1585832Sgblack@eecs.umich.edu WriteCommandByte = 0x60, 1595832Sgblack@eecs.umich.edu WriteControllerRamBase = 0x60, 1605832Sgblack@eecs.umich.edu CheckForPassword = 0xA4, 1615832Sgblack@eecs.umich.edu LoadPassword = 0xA5, 1625832Sgblack@eecs.umich.edu CheckPassword = 0xA6, 1635832Sgblack@eecs.umich.edu DisableMouse = 0xA7, 1645832Sgblack@eecs.umich.edu EnableMouse = 0xA8, 1655832Sgblack@eecs.umich.edu TestMouse = 0xA9, 1665832Sgblack@eecs.umich.edu SelfTest = 0xAA, 1675832Sgblack@eecs.umich.edu InterfaceTest = 0xAB, 1685832Sgblack@eecs.umich.edu DiagnosticDump = 0xAC, 1695832Sgblack@eecs.umich.edu DisableKeyboard = 0xAD, 1705832Sgblack@eecs.umich.edu EnableKeyboard = 0xAE, 1715832Sgblack@eecs.umich.edu ReadInputPort = 0xC0, 1725832Sgblack@eecs.umich.edu ContinuousPollLow = 0xC1, 1735832Sgblack@eecs.umich.edu ContinuousPollHigh = 0xC2, 1745832Sgblack@eecs.umich.edu ReadOutputPort = 0xD0, 1755832Sgblack@eecs.umich.edu WriteOutputPort = 0xD1, 1765832Sgblack@eecs.umich.edu WriteKeyboardOutputBuff = 0xD2, 1775832Sgblack@eecs.umich.edu WriteMouseOutputBuff = 0xD3, 1785832Sgblack@eecs.umich.edu WriteToMouse = 0xD4, 1795832Sgblack@eecs.umich.edu DisableA20 = 0xDD, 1805832Sgblack@eecs.umich.edu EnableA20 = 0xDF, 1815832Sgblack@eecs.umich.edu ReadTestInputs = 0xE0, 1825832Sgblack@eecs.umich.edu PulseOutputBitBase = 0xF0, 1835832Sgblack@eecs.umich.edu SystemReset = 0xFE 1845832Sgblack@eecs.umich.edu }; 1855832Sgblack@eecs.umich.edu 1865831Sgblack@eecs.umich.edu BitUnion8(StatusReg) 1875831Sgblack@eecs.umich.edu Bitfield<7> parityError; 1885831Sgblack@eecs.umich.edu Bitfield<6> timeout; 1895831Sgblack@eecs.umich.edu Bitfield<5> mouseOutputFull; 1905831Sgblack@eecs.umich.edu Bitfield<4> keyboardUnlocked; 1915831Sgblack@eecs.umich.edu Bitfield<3> commandLast; 1925831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 1935831Sgblack@eecs.umich.edu Bitfield<1> inputFull; 1945831Sgblack@eecs.umich.edu Bitfield<0> outputFull; 1955831Sgblack@eecs.umich.edu EndBitUnion(StatusReg) 1965831Sgblack@eecs.umich.edu 1975831Sgblack@eecs.umich.edu BitUnion8(CommandByte) 1985831Sgblack@eecs.umich.edu Bitfield<6> convertScanCodes; 1995831Sgblack@eecs.umich.edu Bitfield<5> disableMouse; 2005831Sgblack@eecs.umich.edu Bitfield<4> disableKeyboard; 2015831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 2025831Sgblack@eecs.umich.edu Bitfield<1> mouseFullInt; 2035831Sgblack@eecs.umich.edu Bitfield<0> keyboardFullInt; 2045831Sgblack@eecs.umich.edu EndBitUnion(CommandByte) 2055831Sgblack@eecs.umich.edu 2065831Sgblack@eecs.umich.edu Tick latency; 2075831Sgblack@eecs.umich.edu Addr dataPort; 2085831Sgblack@eecs.umich.edu Addr commandPort; 2095831Sgblack@eecs.umich.edu 2105831Sgblack@eecs.umich.edu StatusReg statusReg; 2115831Sgblack@eecs.umich.edu CommandByte commandByte; 2125831Sgblack@eecs.umich.edu 2135831Sgblack@eecs.umich.edu uint8_t dataReg; 2145831Sgblack@eecs.umich.edu 2155831Sgblack@eecs.umich.edu static const uint16_t NoCommand = (uint16_t)(-1); 2165831Sgblack@eecs.umich.edu uint16_t lastCommand; 2175831Sgblack@eecs.umich.edu 2185832Sgblack@eecs.umich.edu IntSourcePin *mouseIntPin; 2195832Sgblack@eecs.umich.edu IntSourcePin *keyboardIntPin; 2205831Sgblack@eecs.umich.edu 2215832Sgblack@eecs.umich.edu PS2Mouse mouse; 2225832Sgblack@eecs.umich.edu PS2Keyboard keyboard; 2235831Sgblack@eecs.umich.edu 2245832Sgblack@eecs.umich.edu void writeData(uint8_t newData, bool mouse = false); 2255831Sgblack@eecs.umich.edu uint8_t readDataOut(); 2265831Sgblack@eecs.umich.edu 2275831Sgblack@eecs.umich.edu public: 2285831Sgblack@eecs.umich.edu typedef I8042Params Params; 2295831Sgblack@eecs.umich.edu 2305831Sgblack@eecs.umich.edu const Params * 2315831Sgblack@eecs.umich.edu params() const 2325831Sgblack@eecs.umich.edu { 2335831Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 2345831Sgblack@eecs.umich.edu } 2355831Sgblack@eecs.umich.edu 2365831Sgblack@eecs.umich.edu I8042(Params *p) : BasicPioDevice(p), latency(p->pio_latency), 2375831Sgblack@eecs.umich.edu dataPort(p->data_port), commandPort(p->command_port), 2385831Sgblack@eecs.umich.edu statusReg(0), commandByte(0), dataReg(0), lastCommand(NoCommand), 2395832Sgblack@eecs.umich.edu mouseIntPin(p->mouse_int_pin), keyboardIntPin(p->keyboard_int_pin) 2405831Sgblack@eecs.umich.edu { 2415831Sgblack@eecs.umich.edu statusReg.passedSelfTest = 1; 2425831Sgblack@eecs.umich.edu statusReg.commandLast = 1; 2435831Sgblack@eecs.umich.edu statusReg.keyboardUnlocked = 1; 2445831Sgblack@eecs.umich.edu 2455831Sgblack@eecs.umich.edu commandByte.convertScanCodes = 1; 2465831Sgblack@eecs.umich.edu commandByte.passedSelfTest = 1; 2475831Sgblack@eecs.umich.edu commandByte.keyboardFullInt = 1; 2485831Sgblack@eecs.umich.edu } 2495831Sgblack@eecs.umich.edu 2505831Sgblack@eecs.umich.edu void addressRanges(AddrRangeList &range_list); 2515831Sgblack@eecs.umich.edu 2525831Sgblack@eecs.umich.edu Tick read(PacketPtr pkt); 2535831Sgblack@eecs.umich.edu 2545831Sgblack@eecs.umich.edu Tick write(PacketPtr pkt); 2555831Sgblack@eecs.umich.edu}; 2565831Sgblack@eecs.umich.edu 2575831Sgblack@eecs.umich.edu}; // namespace X86ISA 2585831Sgblack@eecs.umich.edu 2595831Sgblack@eecs.umich.edu#endif //__DEV_X86_I8042_HH__ 260