device.cc (12653:4f6b6c1a8e2f) device.cc (12656:335489e574f3)
1/*
2 * Copyright (c) 2017-2018 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 30 unchanged lines hidden (view full) ---

39 *
40 * Authors: Gabe Black
41 * Andreas Sandberg
42 */
43
44#include "dev/ps2/device.hh"
45
46#include "base/logging.hh"
1/*
2 * Copyright (c) 2017-2018 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 30 unchanged lines hidden (view full) ---

39 *
40 * Authors: Gabe Black
41 * Andreas Sandberg
42 */
43
44#include "dev/ps2/device.hh"
45
46#include "base/logging.hh"
47#include "debug/PS2.hh"
47#include "dev/ps2.hh"
48#include "params/PS2Device.hh"
49
50PS2Device::PS2Device(const PS2DeviceParams *p)
51 : SimObject(p)
52{
48#include "dev/ps2.hh"
49#include "params/PS2Device.hh"
50
51PS2Device::PS2Device(const PS2DeviceParams *p)
52 : SimObject(p)
53{
54 inBuffer.reserve(16);
53}
54
55void
56PS2Device::serialize(CheckpointOut &cp) const
57{
58 std::vector<uint8_t> buffer(outBuffer.size());
59 std::copy(outBuffer.begin(), outBuffer.end(), buffer.begin());
60 arrayParamOut(cp, "outBuffer", buffer);
55}
56
57void
58PS2Device::serialize(CheckpointOut &cp) const
59{
60 std::vector<uint8_t> buffer(outBuffer.size());
61 std::copy(outBuffer.begin(), outBuffer.end(), buffer.begin());
62 arrayParamOut(cp, "outBuffer", buffer);
63
64 SERIALIZE_CONTAINER(inBuffer);
61}
62
63void
64PS2Device::unserialize(CheckpointIn &cp)
65{
66 std::vector<uint8_t> buffer;
67 arrayParamIn(cp, "outBuffer", buffer);
68 for (auto c : buffer)
69 outBuffer.push_back(c);
65}
66
67void
68PS2Device::unserialize(CheckpointIn &cp)
69{
70 std::vector<uint8_t> buffer;
71 arrayParamIn(cp, "outBuffer", buffer);
72 for (auto c : buffer)
73 outBuffer.push_back(c);
74
75 UNSERIALIZE_CONTAINER(inBuffer);
70}
71
72void
73PS2Device::hostRegDataAvailable(const std::function<void()> &c)
74{
75 fatal_if(dataAvailableCallback,
76 "A data pending callback has already been associated with this "
77 "PS/2 device.\n");

--- 7 unchanged lines hidden (view full) ---

85 uint8_t data = outBuffer.front();
86 outBuffer.pop_front();
87 return data;
88}
89
90void
91PS2Device::hostWrite(uint8_t c)
92{
76}
77
78void
79PS2Device::hostRegDataAvailable(const std::function<void()> &c)
80{
81 fatal_if(dataAvailableCallback,
82 "A data pending callback has already been associated with this "
83 "PS/2 device.\n");

--- 7 unchanged lines hidden (view full) ---

91 uint8_t data = outBuffer.front();
92 outBuffer.pop_front();
93 return data;
94}
95
96void
97PS2Device::hostWrite(uint8_t c)
98{
93 recv(c);
99 DPRINTF(PS2, "PS2: Host -> device: %#x\n", c);
100 inBuffer.push_back(c);
101 if (recv(inBuffer))
102 inBuffer.clear();
94}
95
96void
97PS2Device::send(const uint8_t *data, size_t size)
98{
99 assert(data || size == 0);
100 while (size) {
103}
104
105void
106PS2Device::send(const uint8_t *data, size_t size)
107{
108 assert(data || size == 0);
109 while (size) {
110 DPRINTF(PS2, "PS2: Device -> host: %#x\n", *data);
101 outBuffer.push_back(*(data++));
102 size--;
103 }
104
105 // Registering a callback is optional.
106 if (dataAvailableCallback)
107 dataAvailableCallback();
108}
109
110void
111PS2Device::sendAck()
112{
113 send(Ps2::Ack);
114}
111 outBuffer.push_back(*(data++));
112 size--;
113 }
114
115 // Registering a callback is optional.
116 if (dataAvailableCallback)
117 dataAvailableCallback();
118}
119
120void
121PS2Device::sendAck()
122{
123 send(Ps2::Ack);
124}