mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-22 10:21:04 +00:00
parent
1459085a4d
commit
840f383e46
@ -463,9 +463,9 @@ Separate components:
|
|||||||
by providing an encrypted connection to a remote host. It is plugged between
|
by providing an encrypted connection to a remote host. It is plugged between
|
||||||
NIC server (such as a network driver) and NIC client.
|
NIC server (such as a network driver) and NIC client.
|
||||||
|
|
||||||
:'os/src/server/input_merger':
|
:'os/src/server/input_filter':
|
||||||
A component that merges input events from multiple sources into a single
|
A component that transforms and merges input events from multiple sources
|
||||||
stream.
|
into a single stream.
|
||||||
|
|
||||||
:'libports/src/server/acpi_input':
|
:'libports/src/server/acpi_input':
|
||||||
A component that transforms ACPI events into Genode input events.
|
A component that transforms ACPI events into Genode input events.
|
||||||
|
@ -14,7 +14,7 @@ set build_components {
|
|||||||
drivers/input
|
drivers/input
|
||||||
server/acpi_input
|
server/acpi_input
|
||||||
server/dynamic_rom
|
server/dynamic_rom
|
||||||
server/input_merger
|
server/input_filter
|
||||||
server/report_rom
|
server/report_rom
|
||||||
app/acpica
|
app/acpica
|
||||||
test/input
|
test/input
|
||||||
@ -130,12 +130,18 @@ append config {
|
|||||||
</start>}
|
</start>}
|
||||||
|
|
||||||
append config {
|
append config {
|
||||||
<start name="input_merger">
|
<start name="input_filter">
|
||||||
<resource name="RAM" quantum="1M" />
|
<resource name="RAM" quantum="1M" />
|
||||||
<provides> <service name="Input" /> </provides>
|
<provides> <service name="Input" /> </provides>
|
||||||
<config>
|
<config>
|
||||||
<input label="ps2" />
|
<input label="ps2" />
|
||||||
<input label="acpi" />
|
<input label="acpi" />
|
||||||
|
<output>
|
||||||
|
<merge>
|
||||||
|
<input name="ps2"/>
|
||||||
|
<input name="acpi"/>
|
||||||
|
</merge>
|
||||||
|
</output>
|
||||||
</config>
|
</config>
|
||||||
<route>
|
<route>
|
||||||
<service name="Input" label="ps2"> <child name="ps2_drv" /> </service>
|
<service name="Input" label="ps2"> <child name="ps2_drv" /> </service>
|
||||||
@ -159,7 +165,7 @@ append config {
|
|||||||
<start name="test-input">
|
<start name="test-input">
|
||||||
<resource name="RAM" quantum="1M"/>
|
<resource name="RAM" quantum="1M"/>
|
||||||
<route>
|
<route>
|
||||||
<service name="Input"> <child name="input_merger"/> </service>
|
<service name="Input"> <child name="input_filter"/> </service>
|
||||||
<service name="Timer"> <child name="timer"/> </service>
|
<service name="Timer"> <child name="timer"/> </service>
|
||||||
<any-service> <parent/> </any-service>
|
<any-service> <parent/> </any-service>
|
||||||
</route>
|
</route>
|
||||||
@ -205,7 +211,7 @@ set boot_modules {
|
|||||||
ld.lib.so
|
ld.lib.so
|
||||||
timer
|
timer
|
||||||
ps2_drv
|
ps2_drv
|
||||||
input_merger
|
input_filter
|
||||||
report_rom
|
report_rom
|
||||||
dynamic_rom
|
dynamic_rom
|
||||||
acpica
|
acpica
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
This component merges the input events of multiple sources.
|
|
||||||
|
|
||||||
Example configuration:
|
|
||||||
|
|
||||||
<start name="input_merger">
|
|
||||||
<resource name="RAM" quantum="1M" />
|
|
||||||
<provides>
|
|
||||||
<service name="Input" />
|
|
||||||
</provides>
|
|
||||||
<config>
|
|
||||||
<input label="ps2" />
|
|
||||||
<input label="usb_hid" />
|
|
||||||
</config>
|
|
||||||
<route>
|
|
||||||
<service name="Input" label="ps2">
|
|
||||||
<child name="ps2_drv"/> </service>
|
|
||||||
<service name="Input" label="usb_hid">
|
|
||||||
<child name="usb_drv" /> </service>
|
|
||||||
<any-service> <parent /> <any-child /> </any-service>
|
|
||||||
</route>
|
|
||||||
</start>
|
|
||||||
|
|
||||||
For each 'input' config node, the component opens an 'Input' session with the
|
|
||||||
configured label. This label is then evaluated by 'init' to route the session
|
|
||||||
request to a specific input source component.
|
|
@ -1,141 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Input event merger
|
|
||||||
* \author Christian Prochaska
|
|
||||||
* \date 2014-09-29
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2014-2017 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU Affero General Public License version 3.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Genode includes */
|
|
||||||
#include <input/component.h>
|
|
||||||
#include <input_session/connection.h>
|
|
||||||
#include <os/static_root.h>
|
|
||||||
#include <base/component.h>
|
|
||||||
#include <base/attached_rom_dataspace.h>
|
|
||||||
#include <base/attached_dataspace.h>
|
|
||||||
#include <base/heap.h>
|
|
||||||
#include <base/session_label.h>
|
|
||||||
#include <util/list.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace Input_merger
|
|
||||||
{
|
|
||||||
using namespace Genode;
|
|
||||||
|
|
||||||
struct Input_source;
|
|
||||||
struct Main;
|
|
||||||
|
|
||||||
typedef List<Input_source> Input_sources;
|
|
||||||
typedef String<Session_label::capacity()> Label;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct Input_merger::Input_source : Input_sources::Element
|
|
||||||
{
|
|
||||||
Input::Connection conn;
|
|
||||||
Input::Session_component &sink;
|
|
||||||
|
|
||||||
Genode::Signal_handler<Input_source> event_handler;
|
|
||||||
|
|
||||||
void handle_events()
|
|
||||||
{
|
|
||||||
conn.for_each_event([&] (Input::Event const &e) { sink.submit(e); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Input_source(Genode::Env &env, Label const &label, Input::Session_component &sink)
|
|
||||||
:
|
|
||||||
conn(env, label.string()), sink(sink),
|
|
||||||
event_handler(env.ep(), *this, &Input_source::handle_events)
|
|
||||||
{
|
|
||||||
conn.sigh(event_handler);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/******************
|
|
||||||
** Main program **
|
|
||||||
******************/
|
|
||||||
|
|
||||||
struct Input_merger::Main
|
|
||||||
{
|
|
||||||
Env &env;
|
|
||||||
|
|
||||||
Attached_rom_dataspace config_rom { env, "config" };
|
|
||||||
|
|
||||||
Heap heap { env.ram(), env.rm() };
|
|
||||||
|
|
||||||
Input_sources input_source_list { };
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Input session provided to our client
|
|
||||||
*/
|
|
||||||
Input::Session_component input_session_component { env, env.ram() };
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Attach root interface to the entry point
|
|
||||||
*/
|
|
||||||
Static_root<Input::Session> input_root { env.ep().manage(input_session_component) };
|
|
||||||
|
|
||||||
void handle_config_update()
|
|
||||||
{
|
|
||||||
config_rom.update();
|
|
||||||
|
|
||||||
while (Input_source *input_source = input_source_list.first()) {
|
|
||||||
input_source_list.remove(input_source);
|
|
||||||
destroy(heap, input_source);
|
|
||||||
}
|
|
||||||
|
|
||||||
config_rom.xml().for_each_sub_node("input", [&] (Xml_node input_node) {
|
|
||||||
try {
|
|
||||||
Label label = input_node.attribute_value("label", Label());
|
|
||||||
|
|
||||||
try {
|
|
||||||
Input_source *input_source = new (heap)
|
|
||||||
Input_source(env, label.string(), input_session_component);
|
|
||||||
|
|
||||||
input_source_list.insert(input_source);
|
|
||||||
|
|
||||||
} catch (Genode::Service_denied) {
|
|
||||||
error("parent denied input source '", label, "'");
|
|
||||||
}
|
|
||||||
} catch (Xml_node::Nonexistent_attribute) {
|
|
||||||
error("ignoring invalid input node '", input_node);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Signal_handler<Main> config_update_handler
|
|
||||||
{ env.ep(), *this, &Main::handle_config_update };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
Main(Genode::Env &env) : env(env)
|
|
||||||
{
|
|
||||||
input_session_component.event_queue().enabled(true);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply initial configuration
|
|
||||||
*/
|
|
||||||
handle_config_update();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Register signal handler
|
|
||||||
*/
|
|
||||||
config_rom.sigh(config_update_handler);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Announce service
|
|
||||||
*/
|
|
||||||
env.parent().announce(env.ep().manage(input_root));
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void Component::construct(Genode::Env &env) { static Input_merger::Main inst(env); }
|
|
@ -1,3 +0,0 @@
|
|||||||
TARGET = input_merger
|
|
||||||
SRC_CC = main.cc
|
|
||||||
LIBS = base
|
|
@ -102,7 +102,7 @@ catch { exec dd if=/dev/urandom of=bin/test.bin bs=4096 count=8160 }
|
|||||||
# Step 1: prepare and start the actual VM
|
# Step 1: prepare and start the actual VM
|
||||||
#
|
#
|
||||||
set build_components {
|
set build_components {
|
||||||
server/input_merger
|
server/input_filter
|
||||||
server/report_rom server/fs_rom server/vfs
|
server/report_rom server/fs_rom server/vfs
|
||||||
server/tcp_terminal drivers/nic
|
server/tcp_terminal drivers/nic
|
||||||
lib/vfs/lwip lib/vfs/pipe lib/vfs/import
|
lib/vfs/lwip lib/vfs/pipe lib/vfs/import
|
||||||
@ -118,7 +118,7 @@ set boot_modules {
|
|||||||
vfs fs_rom
|
vfs fs_rom
|
||||||
posix.lib.so bash.tar coreutils.tar
|
posix.lib.so bash.tar coreutils.tar
|
||||||
tcp_terminal vfs_lwip.lib.so vfs_pipe.lib.so vfs_import.lib.so
|
tcp_terminal vfs_lwip.lib.so vfs_pipe.lib.so vfs_import.lib.so
|
||||||
ipxe_nic_drv report_rom input_merger
|
ipxe_nic_drv report_rom input_filter
|
||||||
test.bin template.bat
|
test.bin template.bat
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,17 +245,26 @@ set config_of_app {
|
|||||||
</config>
|
</config>
|
||||||
</start>
|
</start>
|
||||||
|
|
||||||
<start name="input_merger" priority="-1">
|
<start name="input_filter" priority="-1">
|
||||||
<resource name="RAM" quantum="1M" />
|
<resource name="RAM" quantum="1M" />
|
||||||
<provides>
|
<provides>
|
||||||
<service name="Input" />
|
<service name="Input" />
|
||||||
</provides>
|
</provides>
|
||||||
<config>}
|
<config>}
|
||||||
append_if [expr $use_ps2] config_of_app {
|
append_if [expr $use_ps2] config_of_app {
|
||||||
<input label="ps2" /> }
|
<input label="ps2"/> }
|
||||||
append_if [expr $use_usb] config_of_app {
|
append_if [expr $use_usb] config_of_app {
|
||||||
<input label="usb_hid" />}
|
<input label="usb_hid"/>}
|
||||||
append config_of_app {
|
append config_of_app {
|
||||||
|
<output>
|
||||||
|
<merge>}
|
||||||
|
append_if [expr $use_ps2] config_of_app {
|
||||||
|
<input name="ps2"/>}
|
||||||
|
append_if [expr $use_usb] config_of_app {
|
||||||
|
<input name="usb_hid"/>}
|
||||||
|
append config_of_app {
|
||||||
|
</merge>
|
||||||
|
</output>
|
||||||
</config>
|
</config>
|
||||||
<route> }
|
<route> }
|
||||||
append_if [expr $use_ps2] config_of_app {
|
append_if [expr $use_ps2] config_of_app {
|
||||||
@ -272,7 +281,7 @@ append config_of_app {
|
|||||||
<provides><service name="Nitpicker"/></provides>
|
<provides><service name="Nitpicker"/></provides>
|
||||||
<route>
|
<route>
|
||||||
<service name="Framebuffer"> <child name="fb_drv" /> </service>
|
<service name="Framebuffer"> <child name="fb_drv" /> </service>
|
||||||
<service name="Input"> <child name="input_merger" /> </service>
|
<service name="Input"> <child name="input_filter" /> </service>
|
||||||
<service name="Report"> <child name="report_rom" /> </service>
|
<service name="Report"> <child name="report_rom" /> </service>
|
||||||
<any-service> <parent/> <any-child /> </any-service>
|
<any-service> <parent/> <any-child /> </any-service>
|
||||||
</route>
|
</route>
|
||||||
@ -337,7 +346,7 @@ append config_of_app {
|
|||||||
<child name="ram_fs_to"/>
|
<child name="ram_fs_to"/>
|
||||||
</service>
|
</service>
|
||||||
<service name="File_system"> <child name="rump_fs"/> </service>
|
<service name="File_system"> <child name="rump_fs"/> </service>
|
||||||
<service name="Input"> <child name="input_merger"/> </service>
|
<service name="Input"> <child name="input_filter"/> </service>
|
||||||
<any-service> <parent/> <any-child/> </any-service>
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
</route>
|
</route>
|
||||||
</start>
|
</start>
|
||||||
|
@ -25,7 +25,7 @@ if {[info exists flavor_extension]} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set build_components {
|
set build_components {
|
||||||
server/input_merger
|
server/input_filter
|
||||||
drivers/nic
|
drivers/nic
|
||||||
drivers/audio
|
drivers/audio
|
||||||
server/report_rom
|
server/report_rom
|
||||||
@ -33,7 +33,7 @@ set build_components {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set boot_modules {
|
set boot_modules {
|
||||||
input_merger
|
input_filter
|
||||||
ipxe_nic_drv
|
ipxe_nic_drv
|
||||||
audio_drv
|
audio_drv
|
||||||
report_rom
|
report_rom
|
||||||
@ -45,17 +45,26 @@ if {$use_vbox5_nova} { set virtualbox5_binary "virtualbox5-nova" }
|
|||||||
|
|
||||||
set config_of_app {
|
set config_of_app {
|
||||||
|
|
||||||
<start name="input_merger">
|
<start name="input_filter">
|
||||||
<resource name="RAM" quantum="1M" />
|
<resource name="RAM" quantum="1M" />
|
||||||
<provides>
|
<provides>
|
||||||
<service name="Input" />
|
<service name="Input" />
|
||||||
</provides>
|
</provides>
|
||||||
<config>}
|
<config>}
|
||||||
append_if [expr $use_ps2] config_of_app {
|
append_if [expr $use_ps2] config_of_app {
|
||||||
<input label="ps2" /> }
|
<input label="ps2"/> }
|
||||||
append_if [expr $use_usb] config_of_app {
|
append_if [expr $use_usb] config_of_app {
|
||||||
<input label="usb_hid" />}
|
<input label="usb_hid"/>}
|
||||||
append config_of_app {
|
append config_of_app {
|
||||||
|
<output>
|
||||||
|
<merge>}
|
||||||
|
append_if [expr $use_ps2] config_of_app {
|
||||||
|
<input name="ps2"/>}
|
||||||
|
append_if [expr $use_usb] config_of_app {
|
||||||
|
<input name="usb_hid"/>}
|
||||||
|
append config_of_app {
|
||||||
|
</merge>
|
||||||
|
</output>
|
||||||
</config>
|
</config>
|
||||||
<route> }
|
<route> }
|
||||||
append_if [expr $use_ps2] config_of_app {
|
append_if [expr $use_ps2] config_of_app {
|
||||||
@ -120,7 +129,7 @@ append config_of_app {
|
|||||||
<configfile name="nitpicker.config"/>
|
<configfile name="nitpicker.config"/>
|
||||||
<route>
|
<route>
|
||||||
<service name="Framebuffer"> <child name="fb_drv" /> </service>
|
<service name="Framebuffer"> <child name="fb_drv" /> </service>
|
||||||
<service name="Input"> <child name="input_merger" /> </service>
|
<service name="Input"> <child name="input_filter" /> </service>
|
||||||
<service name="Report"> <child name="report_rom" /> </service>
|
<service name="Report"> <child name="report_rom" /> </service>
|
||||||
<service name="ROM" label="nitpicker.config"> <child name="dynamic-config"/> </service>
|
<service name="ROM" label="nitpicker.config"> <child name="dynamic-config"/> </service>
|
||||||
<any-service> <parent/> <any-child /> </any-service>
|
<any-service> <parent/> <any-child /> </any-service>
|
||||||
|
@ -25,7 +25,7 @@ append build_components { drivers/input }
|
|||||||
append build_components { drivers/rtc }
|
append build_components { drivers/rtc }
|
||||||
append build_components { drivers/usb }
|
append build_components { drivers/usb }
|
||||||
append build_components { drivers/nic }
|
append build_components { drivers/nic }
|
||||||
append build_components { server/input_merger }
|
append build_components { server/input_filter }
|
||||||
|
|
||||||
append_platform_drv_build_components
|
append_platform_drv_build_components
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ append config {
|
|||||||
</route>
|
</route>
|
||||||
</start>
|
</start>
|
||||||
|
|
||||||
<start name="input_merger" priority="-2">
|
<start name="input_filter" priority="-2">
|
||||||
<resource name="RAM" quantum="1M" />
|
<resource name="RAM" quantum="1M" />
|
||||||
<provides>
|
<provides>
|
||||||
<service name="Input" />
|
<service name="Input" />
|
||||||
@ -118,6 +118,12 @@ append config {
|
|||||||
<config>
|
<config>
|
||||||
<input label="ps2" />
|
<input label="ps2" />
|
||||||
<input label="usb_hid" />
|
<input label="usb_hid" />
|
||||||
|
<output>
|
||||||
|
<merge>
|
||||||
|
<input name="ps2"/>
|
||||||
|
<input name="usb_hid"/>
|
||||||
|
</merge>
|
||||||
|
</output>
|
||||||
</config>
|
</config>
|
||||||
<route>
|
<route>
|
||||||
<service name="Input" label="ps2"> <child name="ps2_drv" /> </service>
|
<service name="Input" label="ps2"> <child name="ps2_drv" /> </service>
|
||||||
@ -339,7 +345,7 @@ append config {
|
|||||||
</vfs>
|
</vfs>
|
||||||
</config>
|
</config>
|
||||||
<route>
|
<route>
|
||||||
<service name="Input"><child name="input_merger" /></service>
|
<service name="Input"><child name="input_filter" /></service>
|
||||||
<service name="Nic"> <child name="router2"/> </service>
|
<service name="Nic"> <child name="router2"/> </service>
|
||||||
<service name="Report"> <child name="report_rom"/> </service>
|
<service name="Report"> <child name="report_rom"/> </service>
|
||||||
<any-service> <parent /> <any-child /> </any-service>
|
<any-service> <parent /> <any-child /> </any-service>
|
||||||
@ -389,7 +395,7 @@ append boot_modules { rtc_drv }
|
|||||||
append boot_modules { usb_drv }
|
append boot_modules { usb_drv }
|
||||||
append boot_modules { vfs.lib.so }
|
append boot_modules { vfs.lib.so }
|
||||||
append boot_modules { ipxe_nic_drv }
|
append boot_modules { ipxe_nic_drv }
|
||||||
append boot_modules { input_merger }
|
append boot_modules { input_filter }
|
||||||
append boot_modules { log_terminal }
|
append boot_modules { log_terminal }
|
||||||
append_platform_drv_boot_modules
|
append_platform_drv_boot_modules
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user