kmi.hh revision 11168
17754SWilliam.Wang@arm.com/* 27754SWilliam.Wang@arm.com * Copyright (c) 2010 ARM Limited 37754SWilliam.Wang@arm.com * All rights reserved 47754SWilliam.Wang@arm.com * 57754SWilliam.Wang@arm.com * The license below extends only to copyright in the software and shall 67754SWilliam.Wang@arm.com * not be construed as granting a license to any other intellectual 77754SWilliam.Wang@arm.com * property including but not limited to intellectual property relating 87754SWilliam.Wang@arm.com * to a hardware implementation of the functionality of the software 97754SWilliam.Wang@arm.com * licensed hereunder. You may use the software subject to the license 107754SWilliam.Wang@arm.com * terms below provided that you ensure that this notice is replicated 117754SWilliam.Wang@arm.com * unmodified and in its entirety in all distributions of the software, 127754SWilliam.Wang@arm.com * modified or unmodified, in source code or in binary form. 137754SWilliam.Wang@arm.com * 147754SWilliam.Wang@arm.com * Copyright (c) 2005 The Regents of The University of Michigan 157754SWilliam.Wang@arm.com * All rights reserved. 167754SWilliam.Wang@arm.com * 177754SWilliam.Wang@arm.com * Redistribution and use in source and binary forms, with or without 187754SWilliam.Wang@arm.com * modification, are permitted provided that the following conditions are 197754SWilliam.Wang@arm.com * met: redistributions of source code must retain the above copyright 207754SWilliam.Wang@arm.com * notice, this list of conditions and the following disclaimer; 217754SWilliam.Wang@arm.com * redistributions in binary form must reproduce the above copyright 227754SWilliam.Wang@arm.com * notice, this list of conditions and the following disclaimer in the 237754SWilliam.Wang@arm.com * documentation and/or other materials provided with the distribution; 247754SWilliam.Wang@arm.com * neither the name of the copyright holders nor the names of its 257754SWilliam.Wang@arm.com * contributors may be used to endorse or promote products derived from 267754SWilliam.Wang@arm.com * this software without specific prior written permission. 277754SWilliam.Wang@arm.com * 287754SWilliam.Wang@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 297754SWilliam.Wang@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 307754SWilliam.Wang@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 317754SWilliam.Wang@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 327754SWilliam.Wang@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 337754SWilliam.Wang@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 347754SWilliam.Wang@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 357754SWilliam.Wang@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 367754SWilliam.Wang@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 377754SWilliam.Wang@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 387754SWilliam.Wang@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 397754SWilliam.Wang@arm.com * 407754SWilliam.Wang@arm.com * Authors: William Wang 417754SWilliam.Wang@arm.com */ 427754SWilliam.Wang@arm.com 437754SWilliam.Wang@arm.com 447754SWilliam.Wang@arm.com/** @file 457754SWilliam.Wang@arm.com * Implementiation of a PL050 KMI 467754SWilliam.Wang@arm.com */ 477754SWilliam.Wang@arm.com 487754SWilliam.Wang@arm.com#ifndef __DEV_ARM_PL050_HH__ 497754SWilliam.Wang@arm.com#define __DEV_ARM_PL050_HH__ 507754SWilliam.Wang@arm.com 517950SAli.Saidi@ARM.com#include <list> 527950SAli.Saidi@ARM.com 539330Schander.sudanthi@arm.com#include "base/vnc/vncinput.hh" 547950SAli.Saidi@ARM.com#include "dev/arm/amba_device.hh" 557754SWilliam.Wang@arm.com#include "params/Pl050.hh" 567754SWilliam.Wang@arm.com 577950SAli.Saidi@ARM.comclass Pl050 : public AmbaIntDevice, public VncKeyboard, public VncMouse 587754SWilliam.Wang@arm.com{ 597754SWilliam.Wang@arm.com protected: 607754SWilliam.Wang@arm.com static const int kmiCr = 0x000; 617754SWilliam.Wang@arm.com static const int kmiStat = 0x004; 627754SWilliam.Wang@arm.com static const int kmiData = 0x008; 637754SWilliam.Wang@arm.com static const int kmiClkDiv = 0x00C; 647754SWilliam.Wang@arm.com static const int kmiISR = 0x010; 657754SWilliam.Wang@arm.com 667950SAli.Saidi@ARM.com BitUnion8(ControlReg) 677950SAli.Saidi@ARM.com Bitfield<0> force_clock_low; 687950SAli.Saidi@ARM.com Bitfield<1> force_data_low; 697950SAli.Saidi@ARM.com Bitfield<2> enable; 707950SAli.Saidi@ARM.com Bitfield<3> txint_enable; 717950SAli.Saidi@ARM.com Bitfield<4> rxint_enable; 727950SAli.Saidi@ARM.com Bitfield<5> type; 737950SAli.Saidi@ARM.com EndBitUnion(ControlReg) 747754SWilliam.Wang@arm.com 757950SAli.Saidi@ARM.com /** control register 767950SAli.Saidi@ARM.com */ 777950SAli.Saidi@ARM.com ControlReg control; 787754SWilliam.Wang@arm.com 797950SAli.Saidi@ARM.com /** KMI status register */ 807950SAli.Saidi@ARM.com BitUnion8(StatusReg) 817950SAli.Saidi@ARM.com Bitfield<0> data_in; 827950SAli.Saidi@ARM.com Bitfield<1> clk_in; 837950SAli.Saidi@ARM.com Bitfield<2> rxparity; 847950SAli.Saidi@ARM.com Bitfield<3> rxbusy; 857950SAli.Saidi@ARM.com Bitfield<4> rxfull; 867950SAli.Saidi@ARM.com Bitfield<5> txbusy; 877950SAli.Saidi@ARM.com Bitfield<6> txempty; 887950SAli.Saidi@ARM.com EndBitUnion(StatusReg) 897754SWilliam.Wang@arm.com 907950SAli.Saidi@ARM.com StatusReg status; 917950SAli.Saidi@ARM.com 927950SAli.Saidi@ARM.com /** clock divisor register 937950SAli.Saidi@ARM.com * This register is just kept around to satisfy reads after driver does 947950SAli.Saidi@ARM.com * writes. The divsor does nothing, as we're not actually signaling ps2 957950SAli.Saidi@ARM.com * serial commands to anything. 967950SAli.Saidi@ARM.com */ 977754SWilliam.Wang@arm.com uint8_t clkdiv; 987754SWilliam.Wang@arm.com 997950SAli.Saidi@ARM.com BitUnion8(InterruptReg) 1007950SAli.Saidi@ARM.com Bitfield<0> rx; 1017950SAli.Saidi@ARM.com Bitfield<1> tx; 1027950SAli.Saidi@ARM.com EndBitUnion(InterruptReg) 1037754SWilliam.Wang@arm.com 1047950SAli.Saidi@ARM.com /** interrupt status register. */ 1057950SAli.Saidi@ARM.com InterruptReg interrupts; 1067754SWilliam.Wang@arm.com 1077950SAli.Saidi@ARM.com /** raw interrupt register (unmasked) */ 1087950SAli.Saidi@ARM.com InterruptReg rawInterrupts; 1097754SWilliam.Wang@arm.com 1107950SAli.Saidi@ARM.com /** If the controller should ignore the next data byte and acknowledge it. 1117950SAli.Saidi@ARM.com * The driver is attempting to setup some feature we don't care about 1127950SAli.Saidi@ARM.com */ 1137950SAli.Saidi@ARM.com int ackNext; 1147754SWilliam.Wang@arm.com 1157950SAli.Saidi@ARM.com /** is the shift key currently down */ 1167950SAli.Saidi@ARM.com bool shiftDown; 1177950SAli.Saidi@ARM.com 1187950SAli.Saidi@ARM.com /** The vnc server we're connected to (if any) */ 1199330Schander.sudanthi@arm.com VncInput *vnc; 1207950SAli.Saidi@ARM.com 1217950SAli.Saidi@ARM.com /** If the linux driver has initialized the device yet and thus can we send 1227950SAli.Saidi@ARM.com * mouse data */ 1237950SAli.Saidi@ARM.com bool driverInitialized; 1247950SAli.Saidi@ARM.com 1257950SAli.Saidi@ARM.com /** Update the status of the interrupt registers and schedule an interrupt 1267950SAli.Saidi@ARM.com * if required */ 1277950SAli.Saidi@ARM.com void updateIntStatus(); 1287754SWilliam.Wang@arm.com 1297754SWilliam.Wang@arm.com /** Function to generate interrupt */ 1307754SWilliam.Wang@arm.com void generateInterrupt(); 1317754SWilliam.Wang@arm.com 1327754SWilliam.Wang@arm.com /** Wrapper to create an event out of the thing */ 1337754SWilliam.Wang@arm.com EventWrapper<Pl050, &Pl050::generateInterrupt> intEvent; 1347754SWilliam.Wang@arm.com 1357950SAli.Saidi@ARM.com /** Receive queue. This list contains all the pending commands that 1367950SAli.Saidi@ARM.com * need to be sent to the driver 1377950SAli.Saidi@ARM.com */ 1387950SAli.Saidi@ARM.com std::list<uint8_t> rxQueue; 1397950SAli.Saidi@ARM.com 1407950SAli.Saidi@ARM.com /** Handle a command sent to the kmi and respond appropriately 1417950SAli.Saidi@ARM.com */ 1427950SAli.Saidi@ARM.com void processCommand(uint8_t byte); 1437950SAli.Saidi@ARM.com 1447754SWilliam.Wang@arm.com public: 1457754SWilliam.Wang@arm.com typedef Pl050Params Params; 1467754SWilliam.Wang@arm.com const Params * 1477754SWilliam.Wang@arm.com params() const 1487754SWilliam.Wang@arm.com { 1497754SWilliam.Wang@arm.com return dynamic_cast<const Params *>(_params); 1507754SWilliam.Wang@arm.com } 1517754SWilliam.Wang@arm.com 1527754SWilliam.Wang@arm.com Pl050(const Params *p); 1537754SWilliam.Wang@arm.com 1547754SWilliam.Wang@arm.com virtual Tick read(PacketPtr pkt); 1557754SWilliam.Wang@arm.com virtual Tick write(PacketPtr pkt); 1567754SWilliam.Wang@arm.com 1577950SAli.Saidi@ARM.com virtual void mouseAt(uint16_t x, uint16_t y, uint8_t buttons); 1587950SAli.Saidi@ARM.com virtual void keyPress(uint32_t key, bool down); 1597950SAli.Saidi@ARM.com 16011168Sandreas.hansson@arm.com void serialize(CheckpointOut &cp) const override; 16111168Sandreas.hansson@arm.com void unserialize(CheckpointIn &cp) override; 1627754SWilliam.Wang@arm.com}; 1637754SWilliam.Wang@arm.com 1647950SAli.Saidi@ARM.com#endif // __DEV_ARM_PL050_HH__ 165