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

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

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

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

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}