From 2b6795df7874f646ca9fe3966f14214582bcae73 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 17 Nov 2015 15:07:56 +0100 Subject: [PATCH] ps2: support verbose config parameter Fixes #7 --- repos/os/run/input.run | 3 ++- .../src/drivers/input/spec/ps2/pl050/main.cc | 15 +++++++++++-- .../drivers/input/spec/ps2/pl050/target.mk | 2 +- .../src/drivers/input/spec/ps2/ps2_keyboard.h | 22 ++++++++++--------- .../os/src/drivers/input/spec/ps2/ps2_mouse.h | 14 ++++++------ .../os/src/drivers/input/spec/ps2/x86/main.cc | 14 ++++++++++-- .../src/drivers/input/spec/ps2/x86/target.mk | 2 +- 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/repos/os/run/input.run b/repos/os/run/input.run index 9c7fa2ddb..567195458 100644 --- a/repos/os/run/input.run +++ b/repos/os/run/input.run @@ -55,8 +55,9 @@ append config { - + + diff --git a/repos/os/src/drivers/input/spec/ps2/pl050/main.cc b/repos/os/src/drivers/input/spec/ps2/pl050/main.cc index 8e861ade0..acb2c55b4 100644 --- a/repos/os/src/drivers/input/spec/ps2/pl050/main.cc +++ b/repos/os/src/drivers/input/spec/ps2/pl050/main.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include /* local includes */ @@ -43,10 +44,20 @@ struct Main Irq_handler ps2_mouse_irq; Irq_handler ps2_keybd_irq; + bool _check_verbose(const char * verbose) { + using namespace Genode; + try { + return config()->xml_node().attribute(verbose).has_value("yes"); + } catch (...) { return false; } + } + Main(Server::Entrypoint &ep) : ep(ep), root(ep.rpc_ep(), session), - ps2_mouse(*pl050.aux_interface(), session.event_queue()), - ps2_keybd(*pl050.kbd_interface(), session.event_queue(), true), + ps2_mouse(*pl050.aux_interface(), session.event_queue(), + _check_verbose("verbose_mouse")), + ps2_keybd(*pl050.kbd_interface(), session.event_queue(), true, + _check_verbose("verbose_keyboard"), + _check_verbose("verbose_scancodes")), ps2_mouse_irq(ep, PL050_MOUSE_IRQ, pl050.aux_interface(), ps2_mouse), ps2_keybd_irq(ep, PL050_KEYBD_IRQ, pl050.kbd_interface(), ps2_keybd) { diff --git a/repos/os/src/drivers/input/spec/ps2/pl050/target.mk b/repos/os/src/drivers/input/spec/ps2/pl050/target.mk index 4867e6562..07e81b778 100644 --- a/repos/os/src/drivers/input/spec/ps2/pl050/target.mk +++ b/repos/os/src/drivers/input/spec/ps2/pl050/target.mk @@ -1,6 +1,6 @@ TARGET = ps2_drv REQUIRES = pl050 SRC_CC = main.cc -LIBS = base server +LIBS = base server config INC_DIR += $(PRG_DIR) $(PRG_DIR)/.. diff --git a/repos/os/src/drivers/input/spec/ps2/ps2_keyboard.h b/repos/os/src/drivers/input/spec/ps2/ps2_keyboard.h index 7b1d2e92e..c846b0a7f 100644 --- a/repos/os/src/drivers/input/spec/ps2/ps2_keyboard.h +++ b/repos/os/src/drivers/input/spec/ps2/ps2_keyboard.h @@ -27,12 +27,11 @@ class Ps2_keyboard : public Input_driver { private: - static const bool verbose = false; - static const bool verbose_scan_codes = false; - Serial_interface &_kbd; Input::Event_queue &_ev_queue; bool _xlate_mode; + bool _verbose; + bool _verbose_scan_codes; /** * Array for tracking the current keyboard state @@ -62,7 +61,7 @@ class Ps2_keyboard : public Input_driver /** * Process value received from the keyboard */ - virtual void process(unsigned char v) = 0; + virtual void process(unsigned char v, bool) = 0; /** * Return true if packet is complete @@ -122,7 +121,7 @@ class Ps2_keyboard : public Input_driver _key_code = 0; } - void process(unsigned char v) + void process(unsigned char v, bool verbose_scan_codes) { if (verbose_scan_codes) PLOG("process %02x", v); @@ -255,7 +254,7 @@ class Ps2_keyboard : public Input_driver _key_code = 0; } - void process(unsigned char v) + void process(unsigned char v, bool verbose_scan_codes) { if (verbose_scan_codes) PLOG("process %02x", v); @@ -363,9 +362,12 @@ class Ps2_keyboard : public Input_driver * If 'xlate_mode' is true, we do not attempt to manually switch the * keyboard to scan code set 2 but just decode the scan-code set 1. */ - Ps2_keyboard(Serial_interface &kbd, Input::Event_queue &ev_queue, bool xlate_mode) + Ps2_keyboard(Serial_interface &kbd, Input::Event_queue &ev_queue, + bool xlate_mode, bool verbose, bool verbose_scancodes) : - _kbd(kbd), _ev_queue(ev_queue), _xlate_mode(xlate_mode) + _kbd(kbd), _ev_queue(ev_queue), _xlate_mode(xlate_mode), + _verbose(verbose), + _verbose_scan_codes(verbose_scancodes) { for (int i = 0; i <= Input::KEY_MAX; i++) _key_state[i] = false; @@ -420,7 +422,7 @@ class Ps2_keyboard : public Input_driver void handle_event() { - _state_machine->process(_kbd.read()); + _state_machine->process(_kbd.read(), _verbose_scan_codes); if (!_state_machine->ready()) return; @@ -440,7 +442,7 @@ class Ps2_keyboard : public Input_driver /* remember new key state */ _key_state[key_code] = _state_machine->press(); - if (verbose) + if (_verbose) PLOG("post %s, key_code = %d\n", press ? "PRESS" : "RELEASE", key_code); diff --git a/repos/os/src/drivers/input/spec/ps2/ps2_mouse.h b/repos/os/src/drivers/input/spec/ps2/ps2_mouse.h index 8263dae50..cbf8d5b60 100644 --- a/repos/os/src/drivers/input/spec/ps2/ps2_mouse.h +++ b/repos/os/src/drivers/input/spec/ps2/ps2_mouse.h @@ -69,13 +69,12 @@ class Ps2_mouse : public Input_driver private: - static const bool verbose = false; - Serial_interface &_aux; Input::Event_queue &_ev_queue; Type _type; + bool _verbose; bool _button_state[NUM_BUTTONS]; unsigned char _packet[MAX_PACKET_LEN]; @@ -103,7 +102,7 @@ class Ps2_mouse : public Input_driver { if (*old_state == new_state) return; - if (verbose) + if (_verbose) Genode::printf("post %s, key_code = %d\n", new_state ? "PRESS" : "RELEASE", key_code); _check_for_event_queue_overflow(); @@ -160,10 +159,11 @@ class Ps2_mouse : public Input_driver public: - Ps2_mouse(Serial_interface &aux, Input::Event_queue &ev_queue) + Ps2_mouse(Serial_interface &aux, Input::Event_queue &ev_queue, + bool verbose) : _aux(aux), - _ev_queue(ev_queue), _type(PS2), + _ev_queue(ev_queue), _type(PS2), _verbose(verbose), _packet_len(PS2_PACKET_LEN), _packet_idx(0) { for (unsigned i = 0; i < NUM_BUTTONS; ++i) @@ -231,7 +231,7 @@ class Ps2_mouse : public Input_driver /* mirror y axis to make the movement correspond to screen coordinates */ rel_y = -rel_y; - if (verbose) + if (_verbose) Genode::printf("post MOTION, rel_x = %d, rel_y = %d\n", rel_x, rel_y); _check_for_event_queue_overflow(); @@ -253,7 +253,7 @@ class Ps2_mouse : public Input_driver /* mirror y axis to make "scroll up" generate positive values */ rel_z = -rel_z; - if (verbose) + if (_verbose) Genode::printf("post WHEEL, rel_z = %d\n", rel_z); _check_for_event_queue_overflow(); diff --git a/repos/os/src/drivers/input/spec/ps2/x86/main.cc b/repos/os/src/drivers/input/spec/ps2/x86/main.cc index d06ff0fda..3c9d8c13c 100644 --- a/repos/os/src/drivers/input/spec/ps2/x86/main.cc +++ b/repos/os/src/drivers/input/spec/ps2/x86/main.cc @@ -19,6 +19,7 @@ /* os includes */ #include #include +#include #include #include @@ -51,14 +52,23 @@ struct Main enum { REG_IOPORT_DATA = 0, REG_IOPORT_STATUS}; + bool _check_verbose(const char * verbose) { + using namespace Genode; + try { + return config()->xml_node().attribute(verbose).has_value("yes"); + } catch (...) { return false; } + } + Main(Server::Entrypoint &ep) : ep(ep), root(ep.rpc_ep(), session), device_ps2(platform.device("PS2")), i8042(device_ps2.io_port(REG_IOPORT_DATA), device_ps2.io_port(REG_IOPORT_STATUS)), ps2_keybd(*i8042.kbd_interface(), session.event_queue(), - i8042.kbd_xlate()), - ps2_mouse(*i8042.aux_interface(), session.event_queue()), + i8042.kbd_xlate(), _check_verbose("verbose_keyboard"), + _check_verbose("verbose_scancodes")), + ps2_mouse(*i8042.aux_interface(), session.event_queue(), + _check_verbose("verbose_mouse")), ps2_keybd_irq(ep, ps2_keybd, device_ps2.irq(0)), ps2_mouse_irq(ep, ps2_mouse, device_ps2.irq(1)) { diff --git a/repos/os/src/drivers/input/spec/ps2/x86/target.mk b/repos/os/src/drivers/input/spec/ps2/x86/target.mk index dfd42079d..b36d465ca 100644 --- a/repos/os/src/drivers/input/spec/ps2/x86/target.mk +++ b/repos/os/src/drivers/input/spec/ps2/x86/target.mk @@ -1,6 +1,6 @@ TARGET = ps2_drv REQUIRES = x86 ps2 SRC_CC = main.cc -LIBS = base server +LIBS = base server config INC_DIR = $(PRG_DIR)/..