mouse.cc (12653:4f6b6c1a8e2f) mouse.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
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2008 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 *
40 * Authors: Gabe Black
41 * Andreas Sandberg
42 */
43
44#include "dev/ps2/mouse.hh"
45
46#include "base/logging.hh"
47#include "debug/PS2.hh"
48#include "params/PS2Mouse.hh"
49
50const uint8_t PS2Mouse::ID[] = {0x00};
51const uint8_t BatSuccessful = 0xaa;
52
53PS2Mouse::PS2Mouse(const PS2MouseParams *p)
54 : PS2Device(p),
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
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2008 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 *
40 * Authors: Gabe Black
41 * Andreas Sandberg
42 */
43
44#include "dev/ps2/mouse.hh"
45
46#include "base/logging.hh"
47#include "debug/PS2.hh"
48#include "params/PS2Mouse.hh"
49
50const uint8_t PS2Mouse::ID[] = {0x00};
51const uint8_t BatSuccessful = 0xaa;
52
53PS2Mouse::PS2Mouse(const PS2MouseParams *p)
54 : PS2Device(p),
55 lastCommand(NoCommand),
56 status(0), resolution(4), sampleRate(100)
57{
58}
59
55 status(0), resolution(4), sampleRate(100)
56{
57}
58
60void
61PS2Mouse::recv(uint8_t data)
59bool
60PS2Mouse::recv(const std::vector<uint8_t> &data)
62{
61{
63 if (lastCommand != NoCommand) {
64 switch(lastCommand) {
65 case SetResolution:
66 DPRINTF(PS2, "Mouse resolution set to %d.\n", data);
67 resolution = data;
68 sendAck();
69 lastCommand = NoCommand;
70 break;
71 case SampleRate:
72 DPRINTF(PS2, "Mouse sample rate %d samples "
73 "per second.\n", data);
74 sampleRate = data;
75 sendAck();
76 lastCommand = NoCommand;
77 break;
78 default:
79 panic("Not expecting data for a mouse command.\n");
80 }
81 return;
82 }
83 switch (data) {
62 switch (data[0]) {
84 case Scale1to1:
85 DPRINTF(PS2, "Setting mouse scale to 1:1.\n");
86 status.twoToOne = 0;
87 sendAck();
63 case Scale1to1:
64 DPRINTF(PS2, "Setting mouse scale to 1:1.\n");
65 status.twoToOne = 0;
66 sendAck();
88 break;
67 return true;
89 case Scale2to1:
90 DPRINTF(PS2, "Setting mouse scale to 2:1.\n");
91 status.twoToOne = 1;
92 sendAck();
68 case Scale2to1:
69 DPRINTF(PS2, "Setting mouse scale to 2:1.\n");
70 status.twoToOne = 1;
71 sendAck();
93 break;
72 return true;
94 case SetResolution:
73 case SetResolution:
95 DPRINTF(PS2, "Setting mouse resolution.\n");
96 lastCommand = SetResolution;
97 sendAck();
98 break;
74 if (data.size() == 1) {
75 DPRINTF(PS2, "Setting mouse resolution.\n");
76 sendAck();
77 return false;
78 } else {
79 DPRINTF(PS2, "Mouse resolution set to %d.\n", data[1]);
80 resolution = data[1];
81 sendAck();
82 return true;
83 }
99 case GetStatus:
100 DPRINTF(PS2, "Getting mouse status.\n");
101 sendAck();
102 send((uint8_t *)&(status), 1);
103 send(&resolution, sizeof(resolution));
104 send(&sampleRate, sizeof(sampleRate));
84 case GetStatus:
85 DPRINTF(PS2, "Getting mouse status.\n");
86 sendAck();
87 send((uint8_t *)&(status), 1);
88 send(&resolution, sizeof(resolution));
89 send(&sampleRate, sizeof(sampleRate));
105 break;
90 return true;
106 case ReadData:
107 panic("Reading mouse data unimplemented.\n");
108 case ResetWrapMode:
109 panic("Resetting mouse wrap mode unimplemented.\n");
110 case WrapMode:
111 panic("Setting mouse wrap mode unimplemented.\n");
112 case RemoteMode:
113 panic("Setting mouse remote mode unimplemented.\n");
114 case ReadID:
115 DPRINTF(PS2, "Mouse ID requested.\n");
116 sendAck();
117 send(ID, sizeof(ID));
91 case ReadData:
92 panic("Reading mouse data unimplemented.\n");
93 case ResetWrapMode:
94 panic("Resetting mouse wrap mode unimplemented.\n");
95 case WrapMode:
96 panic("Setting mouse wrap mode unimplemented.\n");
97 case RemoteMode:
98 panic("Setting mouse remote mode unimplemented.\n");
99 case ReadID:
100 DPRINTF(PS2, "Mouse ID requested.\n");
101 sendAck();
102 send(ID, sizeof(ID));
118 break;
103 return true;
119 case SampleRate:
104 case SampleRate:
120 DPRINTF(PS2, "Setting mouse sample rate.\n");
121 lastCommand = SampleRate;
122 sendAck();
123 break;
105 if (data.size() == 1) {
106 DPRINTF(PS2, "Setting mouse sample rate.\n");
107 sendAck();
108 return false;
109 } else {
110 DPRINTF(PS2, "Mouse sample rate %d samples "
111 "per second.\n", data[1]);
112 sampleRate = data[1];
113 sendAck();
114 return true;
115 }
124 case DisableReporting:
125 DPRINTF(PS2, "Disabling data reporting.\n");
126 status.enabled = 0;
127 sendAck();
116 case DisableReporting:
117 DPRINTF(PS2, "Disabling data reporting.\n");
118 status.enabled = 0;
119 sendAck();
128 break;
120 return true;
129 case EnableReporting:
130 DPRINTF(PS2, "Enabling data reporting.\n");
131 status.enabled = 1;
132 sendAck();
121 case EnableReporting:
122 DPRINTF(PS2, "Enabling data reporting.\n");
123 status.enabled = 1;
124 sendAck();
133 break;
125 return true;
134 case DefaultsAndDisable:
135 DPRINTF(PS2, "Disabling and resetting mouse.\n");
136 sampleRate = 100;
137 resolution = 4;
138 status.twoToOne = 0;
139 status.enabled = 0;
140 sendAck();
126 case DefaultsAndDisable:
127 DPRINTF(PS2, "Disabling and resetting mouse.\n");
128 sampleRate = 100;
129 resolution = 4;
130 status.twoToOne = 0;
131 status.enabled = 0;
132 sendAck();
141 break;
133 return true;
142 case Resend:
143 panic("Mouse resend unimplemented.\n");
144 case Reset:
145 DPRINTF(PS2, "Resetting the mouse.\n");
146 sampleRate = 100;
147 resolution = 4;
148 status.twoToOne = 0;
149 status.enabled = 0;
150 sendAck();
151 send(&BatSuccessful, sizeof(BatSuccessful));
152 send(ID, sizeof(ID));
134 case Resend:
135 panic("Mouse resend unimplemented.\n");
136 case Reset:
137 DPRINTF(PS2, "Resetting the mouse.\n");
138 sampleRate = 100;
139 resolution = 4;
140 status.twoToOne = 0;
141 status.enabled = 0;
142 sendAck();
143 send(&BatSuccessful, sizeof(BatSuccessful));
144 send(ID, sizeof(ID));
153 break;
145 return true;
154 default:
146 default:
155 warn("Unknown mouse command %#02x.\n", data);
147 warn("Unknown mouse command %#02x.\n", data[0]);
156 send(Resend);
148 send(Resend);
157 break;
149 return true;
158 }
159}
160
161void
162PS2Mouse::serialize(CheckpointOut &cp) const
163{
164 PS2Device::serialize(cp);
165
150 }
151}
152
153void
154PS2Mouse::serialize(CheckpointOut &cp) const
155{
156 PS2Device::serialize(cp);
157
166 SERIALIZE_SCALAR(lastCommand);
167
168 SERIALIZE_SCALAR(status);
169 SERIALIZE_SCALAR(resolution);
170 SERIALIZE_SCALAR(sampleRate);
171}
172
173void
174PS2Mouse::unserialize(CheckpointIn &cp)
175{
176 PS2Device::unserialize(cp);
177
158 SERIALIZE_SCALAR(status);
159 SERIALIZE_SCALAR(resolution);
160 SERIALIZE_SCALAR(sampleRate);
161}
162
163void
164PS2Mouse::unserialize(CheckpointIn &cp)
165{
166 PS2Device::unserialize(cp);
167
178 UNSERIALIZE_SCALAR(lastCommand);
179
180 UNSERIALIZE_SCALAR(status);
181 UNSERIALIZE_SCALAR(resolution);
182 UNSERIALIZE_SCALAR(sampleRate);
183}
184
185PS2Mouse *
186PS2MouseParams::create()
187{
188 return new PS2Mouse(this);
189}
168 UNSERIALIZE_SCALAR(status);
169 UNSERIALIZE_SCALAR(resolution);
170 UNSERIALIZE_SCALAR(sampleRate);
171}
172
173PS2Mouse *
174PS2MouseParams::create()
175{
176 return new PS2Mouse(this);
177}