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