diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-04-09 20:07:52 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-04-17 11:16:26 +0000 |
commit | 8f94eeac0c2cd35f883944e5d552a428027a0d70 (patch) | |
tree | 2050149cbdcf34eff829e806655c08b7ac5775bc /src/dev/ps2/mouse.cc | |
parent | c85d51e6d62a9591bd5b99dcb0146aae5dbee43f (diff) | |
download | gem5-8f94eeac0c2cd35f883944e5d552a428027a0d70.tar.xz |
ps2: Unify device data buffering
All PS/2 device currently implement various ad-hoc mechanisms to
handle multi-byte commands. This is error-prone and makes it hard to
implement new devices. Create a buffering mechanism in the base class
to avoid this.
Change-Id: If5638b0ab68decea8de7631ecead0a9ebad1547b
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/9765
Reviewed-by: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/dev/ps2/mouse.cc')
-rw-r--r-- | src/dev/ps2/mouse.cc | 80 |
1 files changed, 34 insertions, 46 deletions
diff --git a/src/dev/ps2/mouse.cc b/src/dev/ps2/mouse.cc index 1bdf39c59..5b6765bcc 100644 --- a/src/dev/ps2/mouse.cc +++ b/src/dev/ps2/mouse.cc @@ -52,57 +52,42 @@ const uint8_t BatSuccessful = 0xaa; PS2Mouse::PS2Mouse(const PS2MouseParams *p) : PS2Device(p), - lastCommand(NoCommand), status(0), resolution(4), sampleRate(100) { } -void -PS2Mouse::recv(uint8_t data) +bool +PS2Mouse::recv(const std::vector<uint8_t> &data) { - if (lastCommand != NoCommand) { - switch(lastCommand) { - case SetResolution: - DPRINTF(PS2, "Mouse resolution set to %d.\n", data); - resolution = data; - sendAck(); - lastCommand = NoCommand; - break; - case SampleRate: - DPRINTF(PS2, "Mouse sample rate %d samples " - "per second.\n", data); - sampleRate = data; - sendAck(); - lastCommand = NoCommand; - break; - default: - panic("Not expecting data for a mouse command.\n"); - } - return; - } - switch (data) { + switch (data[0]) { case Scale1to1: DPRINTF(PS2, "Setting mouse scale to 1:1.\n"); status.twoToOne = 0; sendAck(); - break; + return true; case Scale2to1: DPRINTF(PS2, "Setting mouse scale to 2:1.\n"); status.twoToOne = 1; sendAck(); - break; + return true; case SetResolution: - DPRINTF(PS2, "Setting mouse resolution.\n"); - lastCommand = SetResolution; - sendAck(); - break; + if (data.size() == 1) { + DPRINTF(PS2, "Setting mouse resolution.\n"); + sendAck(); + return false; + } else { + DPRINTF(PS2, "Mouse resolution set to %d.\n", data[1]); + resolution = data[1]; + sendAck(); + return true; + } case GetStatus: DPRINTF(PS2, "Getting mouse status.\n"); sendAck(); send((uint8_t *)&(status), 1); send(&resolution, sizeof(resolution)); send(&sampleRate, sizeof(sampleRate)); - break; + return true; case ReadData: panic("Reading mouse data unimplemented.\n"); case ResetWrapMode: @@ -115,22 +100,29 @@ PS2Mouse::recv(uint8_t data) DPRINTF(PS2, "Mouse ID requested.\n"); sendAck(); send(ID, sizeof(ID)); - break; + return true; case SampleRate: - DPRINTF(PS2, "Setting mouse sample rate.\n"); - lastCommand = SampleRate; - sendAck(); - break; + if (data.size() == 1) { + DPRINTF(PS2, "Setting mouse sample rate.\n"); + sendAck(); + return false; + } else { + DPRINTF(PS2, "Mouse sample rate %d samples " + "per second.\n", data[1]); + sampleRate = data[1]; + sendAck(); + return true; + } case DisableReporting: DPRINTF(PS2, "Disabling data reporting.\n"); status.enabled = 0; sendAck(); - break; + return true; case EnableReporting: DPRINTF(PS2, "Enabling data reporting.\n"); status.enabled = 1; sendAck(); - break; + return true; case DefaultsAndDisable: DPRINTF(PS2, "Disabling and resetting mouse.\n"); sampleRate = 100; @@ -138,7 +130,7 @@ PS2Mouse::recv(uint8_t data) status.twoToOne = 0; status.enabled = 0; sendAck(); - break; + return true; case Resend: panic("Mouse resend unimplemented.\n"); case Reset: @@ -150,11 +142,11 @@ PS2Mouse::recv(uint8_t data) sendAck(); send(&BatSuccessful, sizeof(BatSuccessful)); send(ID, sizeof(ID)); - break; + return true; default: - warn("Unknown mouse command %#02x.\n", data); + warn("Unknown mouse command %#02x.\n", data[0]); send(Resend); - break; + return true; } } @@ -163,8 +155,6 @@ PS2Mouse::serialize(CheckpointOut &cp) const { PS2Device::serialize(cp); - SERIALIZE_SCALAR(lastCommand); - SERIALIZE_SCALAR(status); SERIALIZE_SCALAR(resolution); SERIALIZE_SCALAR(sampleRate); @@ -175,8 +165,6 @@ PS2Mouse::unserialize(CheckpointIn &cp) { PS2Device::unserialize(cp); - UNSERIALIZE_SCALAR(lastCommand); - UNSERIALIZE_SCALAR(status); UNSERIALIZE_SCALAR(resolution); UNSERIALIZE_SCALAR(sampleRate); |