Turn framebuffer drivers into capture clients
Issue genodelabs/genode#3813
This commit is contained in:
@@ -8,13 +8,11 @@
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="Timer"/>
|
||||
<service name="Capture"/>
|
||||
</parent-provides>
|
||||
|
||||
<default caps="100"/>
|
||||
|
||||
<service name="Framebuffer">
|
||||
<default-policy> <child name="fb_drv"/> </default-policy> </service>
|
||||
|
||||
<service name="Input">
|
||||
<default-policy> <child name="input_filter"/> </default-policy> </service>
|
||||
|
||||
@@ -29,17 +27,17 @@
|
||||
|
||||
<start name="fb_drv">
|
||||
<binary name="exynos5_fb_drv"/>
|
||||
<resource name="RAM" quantum="10M"/>
|
||||
<provides> <service name="Framebuffer"/> </provides>
|
||||
<resource name="RAM" quantum="18M"/>
|
||||
<config/>
|
||||
<route>
|
||||
<service name="IRQ"> <parent/> </service>
|
||||
<service name="IO_MEM"> <parent/> </service>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <parent/> </service>
|
||||
<service name="IRQ"> <parent/> </service>
|
||||
<service name="IO_MEM"> <parent/> </service>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <parent/> </service>
|
||||
<service name="Capture"> <parent/> </service>
|
||||
<service name="Regulator"> <child name="arndale_platform_drv"/> </service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
@@ -8,29 +8,27 @@
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="Timer"/>
|
||||
<service name="Capture"/>
|
||||
</parent-provides>
|
||||
|
||||
<default caps="100"/>
|
||||
|
||||
<service name="Framebuffer">
|
||||
<default-policy> <child name="fb_drv"/> </default-policy> </service>
|
||||
|
||||
<service name="Input">
|
||||
<default-policy> <child name="input_filter"/> </default-policy> </service>
|
||||
|
||||
<start name="fb_drv">
|
||||
<binary name="omap4_fb_drv"/>
|
||||
<resource name="RAM" quantum="10M"/>
|
||||
<provides> <service name="Framebuffer"/> </provides>
|
||||
<config/>
|
||||
<route>
|
||||
<service name="IRQ"> <parent/> </service>
|
||||
<service name="IO_MEM"> <parent/> </service>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <parent/> </service>
|
||||
<service name="IRQ"> <parent/> </service>
|
||||
<service name="IO_MEM"> <parent/> </service>
|
||||
<service name="ROM"> <parent/> </service>
|
||||
<service name="PD"> <parent/> </service>
|
||||
<service name="CPU"> <parent/> </service>
|
||||
<service name="LOG"> <parent/> </service>
|
||||
<service name="Timer"> <parent/> </service>
|
||||
<service name="Capture"> <parent/> </service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
base
|
||||
os
|
||||
blit
|
||||
framebuffer_session
|
||||
capture_session
|
||||
input_session
|
||||
gpio_session
|
||||
timer_session
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
base
|
||||
os
|
||||
blit
|
||||
framebuffer_session
|
||||
capture_session
|
||||
input_session
|
||||
gpio_session
|
||||
timer_session
|
||||
|
||||
@@ -37,18 +37,18 @@ append config {
|
||||
<binary name="init"/>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Capture"> <child name="nitpicker"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
<provides>
|
||||
<service name="Input"/> <service name="Framebuffer"/>
|
||||
</provides>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
</start>
|
||||
|
||||
<start name="nitpicker">
|
||||
<resource name="RAM" quantum="8M"/>
|
||||
<provides><service name="Gui"/></provides>
|
||||
<config>
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<config request_framebuffer="no">
|
||||
<capture/>
|
||||
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
|
||||
<domain name="default" layer="2" content="client" label="no" focus="click" hover="always" />
|
||||
<policy label_prefix="pointer" domain="pointer"/>
|
||||
|
||||
15
run/flif.run
15
run/flif.run
@@ -42,20 +42,21 @@ install_config {
|
||||
<binary name="init"/>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Capture"> <child name="nitpicker"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
<provides>
|
||||
<service name="Input"/> <service name="Framebuffer"/>
|
||||
</provides>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
</start>
|
||||
|
||||
<start name="nitpicker">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides><service name="Gui"/></provides>
|
||||
<config>
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<config request_framebuffer="no">
|
||||
<capture/>
|
||||
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
|
||||
<domain name="default" layer="2" content="client" label="no" hover="always" focus="click" />
|
||||
<domain name="default" layer="2" content="client" label="no"
|
||||
hover="always" focus="click" width="1024" height="768"/>
|
||||
|
||||
<policy label_prefix="pointer" domain="pointer"/>
|
||||
<default-policy domain="default"/>
|
||||
|
||||
@@ -53,12 +53,11 @@ install_config {
|
||||
<binary name="init"/>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Capture"> <child name="nitpicker"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
<provides>
|
||||
<service name="Input"/> <service name="Framebuffer"/>
|
||||
</provides>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
</start>
|
||||
|
||||
<start name="timer">
|
||||
@@ -69,10 +68,12 @@ install_config {
|
||||
|
||||
<start name="nitpicker">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides><service name="Gui"/></provides>
|
||||
<config focus="rom">
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<config focus="rom" request_framebuffer="no">
|
||||
<capture/>
|
||||
|
||||
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
|
||||
<domain name="default" layer="2" content="client" label="no" hover="always"/>
|
||||
<domain name="default" layer="2" content="client" label="no" hover="always" width="1024" height="768"/>
|
||||
|
||||
<policy label_prefix="pointer" domain="pointer"/>
|
||||
<default-policy domain="default"/>
|
||||
|
||||
@@ -26,6 +26,7 @@ set build_components {
|
||||
server/nitpicker
|
||||
server/rom_filter
|
||||
server/terminal_log
|
||||
server/input_event_bridge
|
||||
test/nitpicker
|
||||
}
|
||||
|
||||
@@ -63,15 +64,22 @@ append config {
|
||||
<default caps="128"/>
|
||||
<start name="fb_sdl" ld="no">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides>
|
||||
<service name="Input"/>
|
||||
<service name="Framebuffer"/>
|
||||
</provides>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
<config width="800" height="600"/>
|
||||
<route> <any-service> <parent/> <any-child/> </any-service> </route>
|
||||
</start>
|
||||
<alias name="fb_drv" child="fb_sdl"/>
|
||||
<alias name="input_drv" child="fb_sdl"/>
|
||||
<start name="input_event_bridge">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides>
|
||||
<service name="Event"/>
|
||||
<service name="Input"/>
|
||||
</provides>
|
||||
<config/>
|
||||
<route>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="input_event_bridge"/>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Timer"/></provides>
|
||||
@@ -99,7 +107,9 @@ append config {
|
||||
<attribute name="enabled" /> </input>
|
||||
|
||||
<output node="config">
|
||||
<attribute name="request_framebuffer" value="no"/>
|
||||
<inline>
|
||||
<capture/>
|
||||
<report focus="yes" xray="yes" hover="yes" />
|
||||
<domain name="pointer" layer="2" content="client" label="no" origin="pointer" />
|
||||
</inline>
|
||||
@@ -138,10 +148,9 @@ append config {
|
||||
|
||||
<start name="nitpicker">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides><service name="Gui"/></provides>
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <child name="nitpicker_config"/> </service>
|
||||
<service name="Framebuffer"> <child name="fb_drv" /> </service>
|
||||
<service name="Input"> <child name="input_drv" /> </service>
|
||||
<service name="Report"> <child name="report_rom" /> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
@@ -301,6 +310,7 @@ set boot_modules {
|
||||
testnit
|
||||
timer
|
||||
global_keys_handler
|
||||
input_event_bridge
|
||||
}
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
@@ -235,11 +235,12 @@ append_if $use_interactive_pkg config {
|
||||
<binary name="init"/>
|
||||
<route>
|
||||
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Timer"> <child name="timer"/> </service>
|
||||
<service name="Capture"> <child name="nitpicker"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
<provides>
|
||||
<service name="Input"/> <service name="Framebuffer"/>
|
||||
<service name="Input"/>
|
||||
<service name="Platform"/>
|
||||
</provides>
|
||||
</start>}
|
||||
@@ -250,7 +251,6 @@ if { !$use_interactive_pkg } {
|
||||
append_if [have_spec x86] config {
|
||||
<start name="intel_fb_drv" caps="1000">
|
||||
<resource name="RAM" quantum="60M"/>
|
||||
<provides><service name="Framebuffer"/></provides>
|
||||
<route>
|
||||
<any-service> <parent/> <any-child /> </any-service>
|
||||
</route>
|
||||
@@ -342,12 +342,13 @@ append config {
|
||||
<start name="nitpicker" caps="110">
|
||||
<resource name="RAM" quantum="1216K"/>
|
||||
<resource name="CPU" quantum="20"/>
|
||||
<provides><service name="Gui"/></provides>
|
||||
<config>
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<config request_framebuffer="no">
|
||||
<capture/>
|
||||
<report focus="yes" />
|
||||
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
|
||||
<domain name="panel" layer="2" content="client" label="no" focus="none" />
|
||||
<domain name="client" layer="3" content="client" label="no" focus="click"/>
|
||||
<domain name="client" layer="3" content="client" label="no" focus="click" width="1024" height="768"/>
|
||||
<policy label_prefix="pointer" domain="pointer"/>
|
||||
<default-policy domain="client"/>
|
||||
</config>
|
||||
|
||||
@@ -2,7 +2,7 @@ set build_components { test/sdl }
|
||||
|
||||
set app_config {
|
||||
<start name="test-sdl">
|
||||
<resource name="RAM" quantum="32M"/>
|
||||
<resource name="RAM" quantum="48M"/>
|
||||
<config>
|
||||
<vfs> <dir name="dev"> <log/> </dir> </vfs>
|
||||
<libc stdout="/dev/log"/>
|
||||
|
||||
@@ -2,7 +2,7 @@ set build_components { test/sdl2 }
|
||||
|
||||
set app_config {
|
||||
<start name="test-sdl2">
|
||||
<resource name="RAM" quantum="32M"/>
|
||||
<resource name="RAM" quantum="48M"/>
|
||||
<config ld_verbose="yes">
|
||||
<vfs> <dir name="dev"> <log/> </dir> </vfs>
|
||||
<libc stdout="/dev/log"/>
|
||||
|
||||
@@ -18,6 +18,7 @@ set build_components {
|
||||
drivers/gpu/intel
|
||||
server/liquid_framebuffer
|
||||
server/nitpicker
|
||||
server/input_event_bridge
|
||||
lib/mesa/swrast
|
||||
app/launchpad
|
||||
app/pointer
|
||||
@@ -55,20 +56,26 @@ set config {
|
||||
append_if [have_spec linux] config {
|
||||
<start name="fb_sdl" caps="200" ld="no">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
</start>
|
||||
<start name="input_event_bridge">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides>
|
||||
<service name="Event"/>
|
||||
<service name="Input"/>
|
||||
<service name="Framebuffer"/>
|
||||
</provides>
|
||||
</start>}
|
||||
<config/>
|
||||
<route>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
<alias name="input_drv" child="input_event_bridge"/> }
|
||||
|
||||
append_platform_drv_config
|
||||
|
||||
append_if [expr ![have_spec linux]] config {
|
||||
<start name="fb_drv">
|
||||
<resource name="RAM" quantum="10M"/>
|
||||
<provides>
|
||||
<service name="Framebuffer"/>
|
||||
</provides>
|
||||
<route><any-service> <parent /> <any-child/> </any-service> </route>
|
||||
</start>}
|
||||
|
||||
@@ -76,7 +83,8 @@ append_if [have_spec ps2] config {
|
||||
<start name="ps2_drv">
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides> <service name="Input"/> </provides>
|
||||
</start> }
|
||||
</start>
|
||||
<alias name="input_drv" child="ps2_drv"/> }
|
||||
|
||||
append config {
|
||||
<start name="timer">
|
||||
@@ -85,14 +93,18 @@ append config {
|
||||
</start>
|
||||
<start name="nitpicker">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides> <service name="Gui"/> </provides>
|
||||
<config>
|
||||
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
|
||||
<config request_framebuffer="no">
|
||||
<capture/>
|
||||
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
|
||||
<domain name="default" layer="2" content="client" label="no" focus="click" hover="always" />
|
||||
<policy label_prefix="pointer" domain="pointer"/>
|
||||
<default-policy domain="default"/>
|
||||
</config>
|
||||
<route><any-service><parent/><any-child/></any-service></route>
|
||||
<route>
|
||||
<service name="Input"> <child name="input_drv"/> </service>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
<start name="pointer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
@@ -120,7 +132,7 @@ set launchpad_config {
|
||||
<service name="RM"/>
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="Nitpicker"/>
|
||||
<service name="Gui"/>
|
||||
<service name="Timer"/>
|
||||
<service name="Gpu"/>
|
||||
</parent-provides>
|
||||
@@ -178,8 +190,9 @@ install_config $config
|
||||
set boot_modules {
|
||||
core init ld.lib.so timer nitpicker pointer liquid_fb
|
||||
launchpad
|
||||
input_event_bridge
|
||||
|
||||
libc.lib.so vfs.lib.so libm.lib.so pthread.lib.so
|
||||
libc.lib.so vfs.lib.so libm.lib.so
|
||||
egl.lib.so mesa.lib.so stdcxx.lib.so
|
||||
expat.lib.so glapi.lib.so sdl.lib.so
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class Timer_delayer : public Mmio::Delayer, public Timer::Connection
|
||||
|
||||
Timer_delayer(Genode::Env &env) : Timer::Connection(env) { }
|
||||
|
||||
void usleep(uint64_t us) { Timer::Connection::usleep(us); }
|
||||
void usleep(uint64_t us) override { Timer::Connection::usleep(us); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
/*
|
||||
* \brief Framebuffer driver for Exynos5 HDMI
|
||||
* \author Martin Stein
|
||||
* \author Norman Feske
|
||||
* \date 2013-08-09
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013-2017 Genode Labs GmbH
|
||||
* Copyright (C) 2013-2020 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.
|
||||
@@ -13,122 +14,67 @@
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/attached_rom_dataspace.h>
|
||||
#include <base/attached_ram_dataspace.h>
|
||||
#include <base/component.h>
|
||||
#include <framebuffer_session/framebuffer_session.h>
|
||||
#include <timer_session/connection.h>
|
||||
#include <dataspace/client.h>
|
||||
#include <capture_session/connection.h>
|
||||
#include <base/log.h>
|
||||
#include <os/static_root.h>
|
||||
#include <util/string.h>
|
||||
|
||||
/* local includes */
|
||||
#include <driver.h>
|
||||
|
||||
namespace Framebuffer
|
||||
{
|
||||
namespace Framebuffer {
|
||||
using namespace Genode;
|
||||
|
||||
/**
|
||||
* Framebuffer session backend
|
||||
*/
|
||||
class Session_component;
|
||||
struct Main;
|
||||
};
|
||||
|
||||
class Framebuffer::Session_component
|
||||
:
|
||||
public Genode::Rpc_object<Framebuffer::Session>
|
||||
|
||||
struct Framebuffer::Main
|
||||
{
|
||||
private:
|
||||
using Area = Capture::Area;
|
||||
using Pixel = Capture::Pixel;
|
||||
|
||||
Genode::Env &_env;
|
||||
Env &_env;
|
||||
|
||||
unsigned _width;
|
||||
unsigned _height;
|
||||
size_t _size;
|
||||
Dataspace_capability _ds;
|
||||
addr_t _phys_base;
|
||||
Timer::Connection _timer { _env };
|
||||
Attached_rom_dataspace _config { _env, "config" };
|
||||
|
||||
public:
|
||||
Driver _driver { _env };
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param driver driver backend that communicates with hardware
|
||||
* \param width width of framebuffer in pixel
|
||||
* \param height height of framebuffer in pixel
|
||||
* \param output targeted output device
|
||||
*/
|
||||
Session_component(Genode::Env &env, Driver &driver,
|
||||
unsigned width, unsigned height)
|
||||
:
|
||||
_env(env),
|
||||
_width(width),
|
||||
_height(height),
|
||||
_size(driver.buffer_size(width, height)),
|
||||
_ds(_env.ram().alloc(_size, WRITE_COMBINED)),
|
||||
_phys_base(Dataspace_client(_ds).phys_addr())
|
||||
{
|
||||
if (driver.init(width, height, _phys_base)) {
|
||||
error("could not initialize display");
|
||||
struct Could_not_initialize_display : Exception { };
|
||||
throw Could_not_initialize_display();
|
||||
}
|
||||
}
|
||||
Area const _size { _config.xml().attribute_value("width", 1920u),
|
||||
_config.xml().attribute_value("height", 1080u) };
|
||||
|
||||
/************************************
|
||||
** Framebuffer::Session interface **
|
||||
************************************/
|
||||
Attached_ram_dataspace _fb_ds { _env.ram(), _env.rm(),
|
||||
_driver.buffer_size(_size.w(), _size.h()),
|
||||
WRITE_COMBINED };
|
||||
|
||||
Dataspace_capability dataspace() override { return _ds; }
|
||||
addr_t const _fb_phys = Dataspace_client(_fb_ds.cap()).phys_addr();
|
||||
|
||||
Mode mode() const override
|
||||
{
|
||||
return Mode { .area = { _width, _height } };
|
||||
}
|
||||
Capture::Connection _capture { _env };
|
||||
|
||||
void mode_sigh(Genode::Signal_context_capability) override { }
|
||||
Capture::Connection::Screen _captured_screen { _capture, _env.rm(), _size };
|
||||
|
||||
void sync_sigh(Genode::Signal_context_capability sigh) override
|
||||
{
|
||||
_timer.sigh(sigh);
|
||||
_timer.trigger_periodic(10*1000);
|
||||
}
|
||||
Timer::Connection _timer { _env };
|
||||
|
||||
void refresh(int, int, int, int) override { }
|
||||
};
|
||||
Signal_handler<Main> _timer_handler { _env.ep(), *this, &Main::_handle_timer };
|
||||
|
||||
|
||||
static unsigned config_dimension(Genode::Xml_node node, char const *attr,
|
||||
unsigned default_value)
|
||||
{
|
||||
return node.attribute_value(attr, default_value);
|
||||
}
|
||||
|
||||
|
||||
struct Main
|
||||
{
|
||||
Genode::Env &_env;
|
||||
Genode::Entrypoint &_ep;
|
||||
|
||||
Genode::Attached_rom_dataspace _config { _env, "config" };
|
||||
|
||||
Framebuffer::Driver _driver { _env };
|
||||
|
||||
Framebuffer::Session_component _fb_session { _env, _driver,
|
||||
config_dimension(_config.xml(), "width", 1920),
|
||||
config_dimension(_config.xml(), "height", 1080)
|
||||
};
|
||||
|
||||
Genode::Static_root<Framebuffer::Session> _fb_root { _ep.manage(_fb_session) };
|
||||
|
||||
Main(Genode::Env &env) : _env(env), _ep(_env.ep())
|
||||
void _handle_timer()
|
||||
{
|
||||
/* announce service and relax */
|
||||
_env.parent().announce(_ep.manage(_fb_root));
|
||||
Surface<Pixel> surface(_fb_ds.local_addr<Pixel>(), _size);
|
||||
|
||||
_captured_screen.apply_to_surface(surface);
|
||||
}
|
||||
|
||||
Main(Env &env) : _env(env)
|
||||
{
|
||||
if (_driver.init(_size.w(), _size.h(), _fb_phys)) {
|
||||
error("could not initialize display");
|
||||
throw Exception();
|
||||
}
|
||||
|
||||
_timer.sigh(_timer_handler);
|
||||
_timer.trigger_periodic(10*1000);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void Component::construct(Genode::Env &env) { static Main main(env); }
|
||||
void Component::construct(Genode::Env &env) { static Framebuffer::Main main(env); }
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
TARGET = exynos5_fb_drv
|
||||
REQUIRES = arm_v7
|
||||
SRC_CC += main.cc driver.cc
|
||||
LIBS += base
|
||||
LIBS += base blit
|
||||
INC_DIR += $(PRG_DIR)
|
||||
INC_DIR += $(call select_from_repositories,include/spec/exynos5)
|
||||
|
||||
CC_CXX_WARN_STRICT :=
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2012-2017 Genode Labs GmbH
|
||||
* Copyright (C) 2012-2020 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.
|
||||
@@ -13,176 +13,78 @@
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/attached_rom_dataspace.h>
|
||||
#include <base/attached_ram_dataspace.h>
|
||||
#include <base/component.h>
|
||||
#include <base/log.h>
|
||||
#include <framebuffer_session/framebuffer_session.h>
|
||||
#include <dataspace/client.h>
|
||||
#include <blit/blit.h>
|
||||
#include <os/static_root.h>
|
||||
#include <timer_session/connection.h>
|
||||
#include <capture_session/connection.h>
|
||||
|
||||
/* local includes */
|
||||
#include <driver.h>
|
||||
|
||||
|
||||
namespace Framebuffer {
|
||||
using namespace Genode;
|
||||
class Session_component;
|
||||
class Main;
|
||||
};
|
||||
|
||||
|
||||
class Framebuffer::Session_component : public Genode::Rpc_object<Framebuffer::Session>
|
||||
struct Framebuffer::Main
|
||||
{
|
||||
private:
|
||||
using Area = Capture::Area;
|
||||
using Pixel = Capture::Pixel;
|
||||
|
||||
/*
|
||||
* Noncopyable
|
||||
*/
|
||||
Session_component(Session_component const &);
|
||||
Session_component &operator = (Session_component const &);
|
||||
Env &_env;
|
||||
|
||||
size_t _width;
|
||||
size_t _height;
|
||||
bool _buffered;
|
||||
Mode _mode { };
|
||||
size_t _size;
|
||||
|
||||
/* dataspace uses a back buffer (if '_buffered' is true) */
|
||||
Genode::Dataspace_capability _bb_ds;
|
||||
void *_bb_addr;
|
||||
|
||||
/* dataspace of physical frame buffer */
|
||||
Genode::Dataspace_capability _fb_ds;
|
||||
void *_fb_addr;
|
||||
|
||||
Signal_context_capability _sync_sigh { };
|
||||
|
||||
Timer::Connection _timer;
|
||||
|
||||
void _refresh_buffered(int x, int y, int w, int h)
|
||||
{
|
||||
Mode _mode = mode();
|
||||
|
||||
/* clip specified coordinates against screen boundaries */
|
||||
int x2 = min(x + w - 1, (int)_mode.area.w() - 1),
|
||||
y2 = min(y + h - 1, (int)_mode.area.h() - 1);
|
||||
int x1 = max(x, 0),
|
||||
y1 = max(y, 0);
|
||||
if (x1 > x2 || y1 > y2) return;
|
||||
|
||||
int bypp = _mode.bytes_per_pixel();
|
||||
|
||||
/* copy pixels from back buffer to physical frame buffer */
|
||||
char *src = (char *)_bb_addr + bypp*(_mode.area.w()*y1 + x1),
|
||||
*dst = (char *)_fb_addr + bypp*(_mode.area.w()*y1 + x1);
|
||||
|
||||
blit(src, bypp*_mode.area.w(), dst, bypp*_mode.area.h(),
|
||||
bypp*(x2 - x1 + 1), y2 - y1 + 1);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Session_component(Genode::Env &env, Driver &driver, size_t width, size_t height,
|
||||
Driver::Output output, bool buffered)
|
||||
: _width(width),
|
||||
_height(height),
|
||||
_buffered(buffered),
|
||||
_size(driver.buffer_size(width, height)),
|
||||
_bb_ds(buffered ? env.ram().alloc(_size)
|
||||
: Genode::Ram_dataspace_capability()),
|
||||
_bb_addr(buffered ? (void*)env.rm().attach(_bb_ds) : 0),
|
||||
_fb_ds(env.ram().alloc(_size, WRITE_COMBINED)),
|
||||
_fb_addr((void*)env.rm().attach(_fb_ds)),
|
||||
_timer(env)
|
||||
{
|
||||
if (!driver.init(width, height, output,
|
||||
Dataspace_client(_fb_ds).phys_addr())) {
|
||||
error("Could not initialize display");
|
||||
struct Could_not_initialize_display : Exception { };
|
||||
throw Could_not_initialize_display();
|
||||
}
|
||||
|
||||
Genode::log("using ", width, "x", height,
|
||||
output == Driver::OUTPUT_HDMI ? " HDMI" : " LCD");
|
||||
}
|
||||
|
||||
/************************************
|
||||
** Framebuffer::Session interface **
|
||||
************************************/
|
||||
|
||||
Dataspace_capability dataspace() override
|
||||
{
|
||||
return _buffered ? _bb_ds : _fb_ds;
|
||||
}
|
||||
|
||||
Mode mode() const override
|
||||
{
|
||||
return Mode { .area = { _width, _height } };
|
||||
}
|
||||
|
||||
void mode_sigh(Genode::Signal_context_capability) override { }
|
||||
|
||||
void sync_sigh(Genode::Signal_context_capability sigh) override
|
||||
{
|
||||
_sync_sigh = sigh;
|
||||
|
||||
_timer.sigh(_sync_sigh);
|
||||
_timer.trigger_periodic(10*1000);
|
||||
}
|
||||
|
||||
void refresh(int x, int y, int w, int h) override
|
||||
{
|
||||
if (_buffered)
|
||||
_refresh_buffered(x, y, w, h);
|
||||
|
||||
if (_sync_sigh.valid())
|
||||
Signal_transmitter(_sync_sigh).submit();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
static T config_attribute(Genode::Xml_node node, char const *attr_name, T const &default_value)
|
||||
{
|
||||
return node.attribute_value(attr_name, default_value);
|
||||
}
|
||||
|
||||
static Framebuffer::Driver::Output config_output(Genode::Xml_node node,
|
||||
Framebuffer::Driver::Output default_value)
|
||||
{
|
||||
Framebuffer::Driver::Output value = default_value;
|
||||
|
||||
if (node.attribute_value("output", Genode::String<8>()) == "LDC")
|
||||
value = Framebuffer::Driver::OUTPUT_LCD;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
struct Main
|
||||
{
|
||||
Genode::Env &_env;
|
||||
Genode::Entrypoint &_ep;
|
||||
|
||||
Genode::Attached_rom_dataspace _config { _env, "config" };
|
||||
Attached_rom_dataspace _config { _env, "config" };
|
||||
|
||||
Framebuffer::Driver _driver { _env };
|
||||
|
||||
Framebuffer::Session_component _fb_session { _env, _driver,
|
||||
config_attribute(_config.xml(), "width", 1024u),
|
||||
config_attribute(_config.xml(), "height", 768u),
|
||||
config_output(_config.xml(), Framebuffer::Driver::OUTPUT_HDMI),
|
||||
config_attribute(_config.xml(), "buffered", false),
|
||||
};
|
||||
|
||||
Genode::Static_root<Framebuffer::Session> _fb_root { _ep.manage(_fb_session) };
|
||||
|
||||
Main(Genode::Env &env) : _env(env), _ep(_env.ep())
|
||||
Driver::Output _configured_output() const
|
||||
{
|
||||
/* announce service */
|
||||
_env.parent().announce(_ep.manage(_fb_root));
|
||||
Driver::Output value = Driver::OUTPUT_HDMI;
|
||||
|
||||
if (_config.xml().attribute_value("output", String<8>()) == "LDC")
|
||||
value = Driver::OUTPUT_LCD;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
Area const _size { _config.xml().attribute_value("width", 1024u),
|
||||
_config.xml().attribute_value("height", 768u) };
|
||||
|
||||
Attached_ram_dataspace _fb_ds { _env.ram(), _env.rm(),
|
||||
_driver.buffer_size(_size.w(), _size.h()),
|
||||
WRITE_COMBINED };
|
||||
|
||||
addr_t const _fb_phys = Dataspace_client(_fb_ds.cap()).phys_addr();
|
||||
|
||||
Capture::Connection _capture { _env };
|
||||
|
||||
Capture::Connection::Screen _captured_screen { _capture, _env.rm(), _size };
|
||||
|
||||
Timer::Connection _timer { _env };
|
||||
|
||||
Signal_handler<Main> _timer_handler { _env.ep(), *this, &Main::_handle_timer };
|
||||
|
||||
void _handle_timer()
|
||||
{
|
||||
Surface<Pixel> surface(_fb_ds.local_addr<Pixel>(), _size);
|
||||
|
||||
_captured_screen.apply_to_surface(surface);
|
||||
}
|
||||
|
||||
Main(Env &env) : _env(env)
|
||||
{
|
||||
if (!_driver.init(_size.w(), _size.h(), _configured_output(), _fb_phys)) {
|
||||
error("Could not initialize display");
|
||||
throw Exception();
|
||||
}
|
||||
|
||||
_timer.sigh(_timer_handler);
|
||||
_timer.trigger_periodic(10*1000);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void Component::construct(Genode::Env &env) { static Main main(env); }
|
||||
void Component::construct(Genode::Env &env) { static Framebuffer::Main main(env); }
|
||||
|
||||
Reference in New Issue
Block a user