device.hh revision 12653
15625Sgblack@eecs.umich.edu/* 25625Sgblack@eecs.umich.edu * Copyright (c) 2017-2018 ARM Limited 35625Sgblack@eecs.umich.edu * All rights reserved 45625Sgblack@eecs.umich.edu * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 127087Snate@binkert.org * modified or unmodified, in source code or in binary form. 135625Sgblack@eecs.umich.edu * 147087Snate@binkert.org * Copyright (c) 2008 The Regents of The University of Michigan 157087Snate@binkert.org * All rights reserved. 167087Snate@binkert.org * 177087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 187087Snate@binkert.org * modification, are permitted provided that the following conditions are 197087Snate@binkert.org * met: redistributions of source code must retain the above copyright 207087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 217087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 225625Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 237087Snate@binkert.org * documentation and/or other materials provided with the distribution; 245625Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 255625Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 265625Sgblack@eecs.umich.edu * this software without specific prior written permission. 275625Sgblack@eecs.umich.edu * 285625Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 295625Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 305625Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 315625Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 325625Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 335625Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 345625Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 355625Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 365625Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 375625Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 385625Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 395625Sgblack@eecs.umich.edu * 405625Sgblack@eecs.umich.edu * Authors: Gabe Black 415625Sgblack@eecs.umich.edu * Andreas Sandberg 425625Sgblack@eecs.umich.edu */ 435625Sgblack@eecs.umich.edu 445625Sgblack@eecs.umich.edu#ifndef __DEV_PS2_DEVICE_HH__ 455625Sgblack@eecs.umich.edu#define __DEV_PS2_DEVICE_HH__ 465625Sgblack@eecs.umich.edu 475625Sgblack@eecs.umich.edu#include <deque> 485625Sgblack@eecs.umich.edu 495625Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 505625Sgblack@eecs.umich.edu 515625Sgblack@eecs.umich.edustruct PS2DeviceParams; 528229Snate@binkert.org 535625Sgblack@eecs.umich.educlass PS2Device : public SimObject 545625Sgblack@eecs.umich.edu{ 555625Sgblack@eecs.umich.edu public: 565625Sgblack@eecs.umich.edu PS2Device(const PS2DeviceParams *p); 575625Sgblack@eecs.umich.edu 585625Sgblack@eecs.umich.edu void serialize(CheckpointOut &cp) const override; 595625Sgblack@eecs.umich.edu void unserialize(CheckpointIn &cp) override; 605625Sgblack@eecs.umich.edu 615625Sgblack@eecs.umich.edu public: /* Host interface */ 625625Sgblack@eecs.umich.edu /** 635625Sgblack@eecs.umich.edu * Register a data available callback into the PS/2 interface 645625Sgblack@eecs.umich.edu * 655625Sgblack@eecs.umich.edu * @param c Callback instance from host interface 665625Sgblack@eecs.umich.edu */ 675625Sgblack@eecs.umich.edu void hostRegDataAvailable(const std::function<void()> &c); 685625Sgblack@eecs.umich.edu 695625Sgblack@eecs.umich.edu /** 705625Sgblack@eecs.umich.edu * Check if there is pending data from the PS/2 device. 715625Sgblack@eecs.umich.edu * 725625Sgblack@eecs.umich.edu * @return true if there is data pending that can be read using 735625Sgblack@eecs.umich.edu * the readData() method. 745625Sgblack@eecs.umich.edu */ 755625Sgblack@eecs.umich.edu bool hostDataAvailable() const { return !outBuffer.empty(); } 765625Sgblack@eecs.umich.edu 775625Sgblack@eecs.umich.edu /** 785625Sgblack@eecs.umich.edu * Read a character from the device. 795625Sgblack@eecs.umich.edu * 805625Sgblack@eecs.umich.edu * @return Character from the device's output buffer, undefined if 815625Sgblack@eecs.umich.edu * no data is pending. 825625Sgblack@eecs.umich.edu */ 835625Sgblack@eecs.umich.edu uint8_t hostRead(); 845625Sgblack@eecs.umich.edu 855625Sgblack@eecs.umich.edu /** 865625Sgblack@eecs.umich.edu * Transmit a character from the host interface to the device. 875625Sgblack@eecs.umich.edu * 885625Sgblack@eecs.umich.edu * @param c Received data. 895625Sgblack@eecs.umich.edu */ 905625Sgblack@eecs.umich.edu void hostWrite(uint8_t c); 915625Sgblack@eecs.umich.edu 925625Sgblack@eecs.umich.edu protected: /* Device interface */ 935625Sgblack@eecs.umich.edu /** 945625Sgblack@eecs.umich.edu * Data received from host. 955625Sgblack@eecs.umich.edu */ 965625Sgblack@eecs.umich.edu virtual void recv(uint8_t data) = 0; 975625Sgblack@eecs.umich.edu 985625Sgblack@eecs.umich.edu /** 995625Sgblack@eecs.umich.edu * Send data from a PS/2 device to a host 1005625Sgblack@eecs.umich.edu * 1015625Sgblack@eecs.umich.edu * @param data Pointer to data array 1025625Sgblack@eecs.umich.edu * @param size Size of the data array 1035625Sgblack@eecs.umich.edu */ 1045625Sgblack@eecs.umich.edu void send(const uint8_t *data, size_t size); 1055625Sgblack@eecs.umich.edu void send(const std::vector<uint8_t> &data) { 1065625Sgblack@eecs.umich.edu send(data.data(), data.size()); 1075625Sgblack@eecs.umich.edu } 1085625Sgblack@eecs.umich.edu 1095625Sgblack@eecs.umich.edu /** 1105625Sgblack@eecs.umich.edu * Send a byte of data from a PS/2 device to a host 1115625Sgblack@eecs.umich.edu * 1125625Sgblack@eecs.umich.edu * @param data Byte to send 1135625Sgblack@eecs.umich.edu */ 1145625Sgblack@eecs.umich.edu void send(uint8_t data) { send(&data, 1); } 1155625Sgblack@eecs.umich.edu 1165625Sgblack@eecs.umich.edu /** Send an ACK byte to the host */ 1175625Sgblack@eecs.umich.edu void sendAck(); 1185625Sgblack@eecs.umich.edu 1195625Sgblack@eecs.umich.edu /** 1205625Sgblack@eecs.umich.edu * Output buffer size 1215625Sgblack@eecs.umich.edu * 1225625Sgblack@eecs.umich.edu * Device models may use this method to query the size of the 1235625Sgblack@eecs.umich.edu * output buffer to do rate limiting. 1245625Sgblack@eecs.umich.edu */ 1255625Sgblack@eecs.umich.edu size_t sendPending() const { return outBuffer.size(); } 1265625Sgblack@eecs.umich.edu 1275625Sgblack@eecs.umich.edu private: 1285625Sgblack@eecs.umich.edu /** Device -> host FIFO */ 1295625Sgblack@eecs.umich.edu std::deque<uint8_t> outBuffer; 1305625Sgblack@eecs.umich.edu 1315625Sgblack@eecs.umich.edu std::function<void()> dataAvailableCallback; 1325625Sgblack@eecs.umich.edu}; 1335625Sgblack@eecs.umich.edu 1345625Sgblack@eecs.umich.edu#endif // __DEV_PS2_HOUSE_HH__ 1355625Sgblack@eecs.umich.edu