i8042.hh revision 5831
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 455831Sgblack@eecs.umich.educlass I8042 : public BasicPioDevice 465831Sgblack@eecs.umich.edu{ 475831Sgblack@eecs.umich.edu protected: 485831Sgblack@eecs.umich.edu BitUnion8(StatusReg) 495831Sgblack@eecs.umich.edu Bitfield<7> parityError; 505831Sgblack@eecs.umich.edu Bitfield<6> timeout; 515831Sgblack@eecs.umich.edu Bitfield<5> mouseOutputFull; 525831Sgblack@eecs.umich.edu Bitfield<4> keyboardUnlocked; 535831Sgblack@eecs.umich.edu Bitfield<3> commandLast; 545831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 555831Sgblack@eecs.umich.edu Bitfield<1> inputFull; 565831Sgblack@eecs.umich.edu Bitfield<0> outputFull; 575831Sgblack@eecs.umich.edu EndBitUnion(StatusReg) 585831Sgblack@eecs.umich.edu 595831Sgblack@eecs.umich.edu BitUnion8(CommandByte) 605831Sgblack@eecs.umich.edu Bitfield<6> convertScanCodes; 615831Sgblack@eecs.umich.edu Bitfield<5> disableMouse; 625831Sgblack@eecs.umich.edu Bitfield<4> disableKeyboard; 635831Sgblack@eecs.umich.edu Bitfield<2> passedSelfTest; 645831Sgblack@eecs.umich.edu Bitfield<1> mouseFullInt; 655831Sgblack@eecs.umich.edu Bitfield<0> keyboardFullInt; 665831Sgblack@eecs.umich.edu EndBitUnion(CommandByte) 675831Sgblack@eecs.umich.edu 685831Sgblack@eecs.umich.edu Tick latency; 695831Sgblack@eecs.umich.edu Addr dataPort; 705831Sgblack@eecs.umich.edu Addr commandPort; 715831Sgblack@eecs.umich.edu 725831Sgblack@eecs.umich.edu StatusReg statusReg; 735831Sgblack@eecs.umich.edu CommandByte commandByte; 745831Sgblack@eecs.umich.edu 755831Sgblack@eecs.umich.edu uint8_t dataReg; 765831Sgblack@eecs.umich.edu 775831Sgblack@eecs.umich.edu static const uint16_t NoCommand = (uint16_t)(-1); 785831Sgblack@eecs.umich.edu uint16_t lastCommand; 795831Sgblack@eecs.umich.edu 805831Sgblack@eecs.umich.edu BitUnion8(MouseStatus) 815831Sgblack@eecs.umich.edu Bitfield<6> remote; 825831Sgblack@eecs.umich.edu Bitfield<5> enabled; 835831Sgblack@eecs.umich.edu Bitfield<4> twoToOne; 845831Sgblack@eecs.umich.edu Bitfield<2> leftButton; 855831Sgblack@eecs.umich.edu Bitfield<0> rightButton; 865831Sgblack@eecs.umich.edu EndBitUnion(MouseStatus) 875831Sgblack@eecs.umich.edu 885831Sgblack@eecs.umich.edu IntSourcePin *mouseIntPin; 895831Sgblack@eecs.umich.edu std::queue<uint8_t> mouseBuffer; 905831Sgblack@eecs.umich.edu uint16_t lastMouseCommand; 915831Sgblack@eecs.umich.edu uint8_t mouseResolution; 925831Sgblack@eecs.umich.edu uint8_t mouseSampleRate; 935831Sgblack@eecs.umich.edu MouseStatus mouseStatus; 945831Sgblack@eecs.umich.edu 955831Sgblack@eecs.umich.edu 965831Sgblack@eecs.umich.edu IntSourcePin *keyboardIntPin; 975831Sgblack@eecs.umich.edu std::queue<uint8_t> keyboardBuffer; 985831Sgblack@eecs.umich.edu uint16_t lastKeyboardCommand; 995831Sgblack@eecs.umich.edu 1005831Sgblack@eecs.umich.edu bool writeData(uint8_t newData, bool mouse = false); 1015831Sgblack@eecs.umich.edu void keyboardAck(); 1025831Sgblack@eecs.umich.edu void writeKeyboardData(const uint8_t *data, int size); 1035831Sgblack@eecs.umich.edu void mouseAck(); 1045831Sgblack@eecs.umich.edu void mouseNack(); 1055831Sgblack@eecs.umich.edu void writeMouseData(const uint8_t *data, int size); 1065831Sgblack@eecs.umich.edu uint8_t readDataOut(); 1075831Sgblack@eecs.umich.edu 1085831Sgblack@eecs.umich.edu public: 1095831Sgblack@eecs.umich.edu typedef I8042Params Params; 1105831Sgblack@eecs.umich.edu 1115831Sgblack@eecs.umich.edu const Params * 1125831Sgblack@eecs.umich.edu params() const 1135831Sgblack@eecs.umich.edu { 1145831Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1155831Sgblack@eecs.umich.edu } 1165831Sgblack@eecs.umich.edu 1175831Sgblack@eecs.umich.edu I8042(Params *p) : BasicPioDevice(p), latency(p->pio_latency), 1185831Sgblack@eecs.umich.edu dataPort(p->data_port), commandPort(p->command_port), 1195831Sgblack@eecs.umich.edu statusReg(0), commandByte(0), dataReg(0), lastCommand(NoCommand), 1205831Sgblack@eecs.umich.edu mouseIntPin(p->mouse_int_pin), lastMouseCommand(NoCommand), 1215831Sgblack@eecs.umich.edu keyboardIntPin(p->keyboard_int_pin), 1225831Sgblack@eecs.umich.edu lastKeyboardCommand(NoCommand) 1235831Sgblack@eecs.umich.edu { 1245831Sgblack@eecs.umich.edu statusReg.passedSelfTest = 1; 1255831Sgblack@eecs.umich.edu statusReg.commandLast = 1; 1265831Sgblack@eecs.umich.edu statusReg.keyboardUnlocked = 1; 1275831Sgblack@eecs.umich.edu 1285831Sgblack@eecs.umich.edu commandByte.convertScanCodes = 1; 1295831Sgblack@eecs.umich.edu commandByte.passedSelfTest = 1; 1305831Sgblack@eecs.umich.edu commandByte.keyboardFullInt = 1; 1315831Sgblack@eecs.umich.edu } 1325831Sgblack@eecs.umich.edu 1335831Sgblack@eecs.umich.edu void addressRanges(AddrRangeList &range_list); 1345831Sgblack@eecs.umich.edu 1355831Sgblack@eecs.umich.edu Tick read(PacketPtr pkt); 1365831Sgblack@eecs.umich.edu 1375831Sgblack@eecs.umich.edu Tick write(PacketPtr pkt); 1385831Sgblack@eecs.umich.edu}; 1395831Sgblack@eecs.umich.edu 1405831Sgblack@eecs.umich.edu}; // namespace X86ISA 1415831Sgblack@eecs.umich.edu 1425831Sgblack@eecs.umich.edu#endif //__DEV_X86_I8042_HH__ 143