summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/ps2/PS2.py2
-rw-r--r--src/dev/ps2/keyboard.cc35
-rw-r--r--src/dev/ps2/keyboard.hh12
-rw-r--r--src/dev/x86/I8042.py2
4 files changed, 48 insertions, 3 deletions
diff --git a/src/dev/ps2/PS2.py b/src/dev/ps2/PS2.py
index 5db3b6e17..fcbbc28c3 100644
--- a/src/dev/ps2/PS2.py
+++ b/src/dev/ps2/PS2.py
@@ -48,6 +48,8 @@ class PS2Keyboard(PS2Device):
type = 'PS2Keyboard'
cxx_header = "dev/ps2/keyboard.hh"
+ vnc = Param.VncInput(Parent.any, "VNC server providing keyboard input")
+
class PS2Mouse(PS2Device):
type = 'PS2Mouse'
cxx_header = "dev/ps2/mouse.hh"
diff --git a/src/dev/ps2/keyboard.cc b/src/dev/ps2/keyboard.cc
index a942d3457..46b89facc 100644
--- a/src/dev/ps2/keyboard.cc
+++ b/src/dev/ps2/keyboard.cc
@@ -45,14 +45,19 @@
#include "base/logging.hh"
#include "debug/PS2.hh"
+#include "dev/ps2.hh"
#include "params/PS2Keyboard.hh"
const uint8_t PS2Keyboard::ID[] = {0xab, 0x83};
PS2Keyboard::PS2Keyboard(const PS2KeyboardParams *p)
: PS2Device(p),
- lastCommand(NoCommand)
+ lastCommand(NoCommand),
+ shiftDown(false),
+ enabled(false)
{
+ if (p->vnc)
+ p->vnc->setKeyboard(this);
}
void
@@ -60,6 +65,8 @@ PS2Keyboard::serialize(CheckpointOut &cp) const
{
PS2Device::serialize(cp);
SERIALIZE_SCALAR(lastCommand);
+ SERIALIZE_SCALAR(shiftDown);
+ SERIALIZE_SCALAR(enabled);
}
void
@@ -67,6 +74,8 @@ PS2Keyboard::unserialize(CheckpointIn &cp)
{
PS2Device::unserialize(cp);
UNSERIALIZE_SCALAR(lastCommand);
+ UNSERIALIZE_SCALAR(shiftDown);
+ UNSERIALIZE_SCALAR(enabled);
}
void
@@ -114,14 +123,17 @@ PS2Keyboard::recv(uint8_t data)
break;
case Enable:
DPRINTF(PS2, "Enabling the keyboard.\n");
+ enabled = true;
sendAck();
break;
case Disable:
DPRINTF(PS2, "Disabling the keyboard.\n");
+ enabled = false;
sendAck();
break;
case DefaultsAndDisable:
DPRINTF(PS2, "Disabling and resetting the keyboard.\n");
+ enabled = false;
sendAck();
break;
case AllKeysToTypematic:
@@ -148,6 +160,27 @@ PS2Keyboard::recv(uint8_t data)
}
}
+void
+PS2Keyboard::keyPress(uint32_t key, bool down)
+{
+ std::list<uint8_t> keys;
+
+ // convert the X11 keysym into ps2 codes and update the shift
+ // state (shiftDown)
+ Ps2::keySymToPs2(key, down, shiftDown, keys);
+
+ // Drop key presses if the keyboard hasn't been enabled by the
+ // host. We do that after translating the key code to ensure that
+ // we keep track of the shift state.
+ if (!enabled)
+ return;
+
+ // Insert into our queue of characters
+ for (uint8_t c : keys)
+ send(c);
+}
+
+
PS2Keyboard *
PS2KeyboardParams::create()
{
diff --git a/src/dev/ps2/keyboard.hh b/src/dev/ps2/keyboard.hh
index 8943e7fcb..f5d83049f 100644
--- a/src/dev/ps2/keyboard.hh
+++ b/src/dev/ps2/keyboard.hh
@@ -44,11 +44,12 @@
#ifndef __DEV_PS2_KEYBOARD_HH__
#define __DEV_PS2_KEYBOARD_HH__
+#include "base/vnc/vncinput.hh"
#include "dev/ps2/device.hh"
struct PS2KeyboardParams;
-class PS2Keyboard : public PS2Device
+class PS2Keyboard : public PS2Device, VncKeyboard
{
protected:
static const uint8_t ID[];
@@ -78,6 +79,12 @@ class PS2Keyboard : public PS2Device
uint16_t lastCommand;
+ /** is the shift key currently down */
+ bool shiftDown;
+
+ /** Is the device enabled? */
+ bool enabled;
+
public:
PS2Keyboard(const PS2KeyboardParams *p);
@@ -86,6 +93,9 @@ class PS2Keyboard : public PS2Device
protected: // PS2Device
void recv(uint8_t data) override;
+
+ public: // VncKeyboard
+ void keyPress(uint32_t key, bool down) override;
};
#endif // __DEV_PS2_KEYBOARD_hH__
diff --git a/src/dev/x86/I8042.py b/src/dev/x86/I8042.py
index 9203f40f5..43e70d6e4 100644
--- a/src/dev/x86/I8042.py
+++ b/src/dev/x86/I8042.py
@@ -45,5 +45,5 @@ class I8042(BasicPioDevice):
keyboard_int_pin = Param.X86IntSourcePin(X86IntSourcePin(),
'Pin to signal the keyboard has data')
- keyboard = Param.PS2Device(PS2Keyboard(), "PS/2 keyboard device")
+ keyboard = Param.PS2Device(PS2Keyboard(vnc=NULL), "PS/2 keyboard device")
mouse = Param.PS2Device(PS2Mouse(), "PS/2 mouse device")