mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-20 06:07:59 +00:00
framebuffer.run: refresh screen after test step
The commit also refactors initialization and generic functions into a test-environment class. Fixes #1092.
This commit is contained in:
parent
83cc8da588
commit
8de324245c
@ -1,11 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* \brief Basic test for framebuffer session
|
* \brief Basic test for framebuffer session
|
||||||
* \author Martin Stein
|
* \author Martin Stein
|
||||||
|
* \author Christian Helmuth
|
||||||
* \date 2012-01-09
|
* \date 2012-01-09
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2012-2013 Genode Labs GmbH
|
* Copyright (C) 2012-2014 Genode Labs GmbH
|
||||||
*
|
*
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
* under the terms of the GNU General Public License version 2.
|
* under the terms of the GNU General Public License version 2.
|
||||||
@ -18,31 +19,54 @@
|
|||||||
#include <base/env.h>
|
#include <base/env.h>
|
||||||
#include <timer_session/connection.h>
|
#include <timer_session/connection.h>
|
||||||
|
|
||||||
using namespace Genode;
|
|
||||||
|
class Test_environment
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Timer::Connection _timer;
|
||||||
|
Framebuffer::Connection _fb;
|
||||||
|
Framebuffer::Mode const _mode{_fb.mode()};
|
||||||
|
|
||||||
|
Genode::Dataspace_capability const _ds_cap{_fb.dataspace()};
|
||||||
|
void * const _base{Genode::env()->rm_session()->attach(_ds_cap)};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Test_environment()
|
||||||
|
{
|
||||||
|
PINF("framebuffer is %dx%d@%d",
|
||||||
|
_mode.width(), _mode.height(), _mode.format());
|
||||||
|
|
||||||
|
if (_mode.bytes_per_pixel() != 2) {
|
||||||
|
PERR("pixel format not supported");
|
||||||
|
throw -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_step()
|
||||||
|
{
|
||||||
|
_fb.refresh(0, 0, _mode.width(), _mode.height());
|
||||||
|
_timer.msleep(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
Framebuffer::Mode fb_mode() const { return _mode; }
|
||||||
|
unsigned fb_bpp() const { return _mode.bytes_per_pixel(); }
|
||||||
|
Genode::addr_t fb_base() const { return (Genode::addr_t) _base; }
|
||||||
|
Genode::size_t fb_size() const { return _mode.width()
|
||||||
|
* _mode.height()
|
||||||
|
* _mode.bytes_per_pixel(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
printf("--- Test framebuffer ---\n");
|
using namespace Genode;
|
||||||
static Timer::Connection timer;
|
|
||||||
|
|
||||||
/* create framebuffer */
|
printf("--- Test framebuffer ---\n");
|
||||||
static Framebuffer::Connection fb;
|
static Test_environment te;
|
||||||
Framebuffer::Mode const mode = fb.mode();
|
|
||||||
PINF("framebuffer is %dx%d@%d\n", mode.width(), mode.height(), mode.format());
|
addr_t const stripe_width = te.fb_mode().width() / 4;
|
||||||
Dataspace_capability fb_ds_cap = fb.dataspace();
|
|
||||||
if (!fb_ds_cap.valid()) {
|
|
||||||
PERR("Could not request dataspace for frame buffer");
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
/* drive framebuffer */
|
|
||||||
addr_t const fb_base = (addr_t)env()->rm_session()->attach(fb_ds_cap);
|
|
||||||
unsigned const fb_bpp = (unsigned)mode.bytes_per_pixel();
|
|
||||||
if (fb_bpp != 2) {
|
|
||||||
PERR("pixel format not supported");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
size_t const fb_size = (unsigned)(mode.width() * mode.height() * fb_bpp);
|
|
||||||
addr_t const stripe_width = mode.width() / 4;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
enum {
|
enum {
|
||||||
BLACK = 0x0,
|
BLACK = 0x0,
|
||||||
@ -54,33 +78,36 @@ int main()
|
|||||||
PINF("black & white stripes");
|
PINF("black & white stripes");
|
||||||
addr_t stripe_o = 0;
|
addr_t stripe_o = 0;
|
||||||
bool stripe = 0;
|
bool stripe = 0;
|
||||||
for (addr_t o = 0; o < fb_size; o += fb_bpp) {
|
for (addr_t o = 0; o < te.fb_size(); o += te.fb_bpp()) {
|
||||||
stripe_o++;
|
stripe_o++;
|
||||||
if (stripe_o == stripe_width) {
|
if (stripe_o == stripe_width) {
|
||||||
stripe_o = 0;
|
stripe_o = 0;
|
||||||
stripe = !stripe;
|
stripe = !stripe;
|
||||||
}
|
}
|
||||||
*(uint16_t volatile *)(fb_base + o) = stripe ? BLACK : WHITE;
|
*(uint16_t volatile *)(te.fb_base() + o) = stripe ? BLACK : WHITE;
|
||||||
}
|
}
|
||||||
timer.msleep(2000);
|
te.complete_step();
|
||||||
|
|
||||||
PINF("blue");
|
PINF("blue");
|
||||||
for (addr_t o = 0; o < fb_size; o += fb_bpp)
|
for (addr_t o = 0; o < te.fb_size(); o += te.fb_bpp())
|
||||||
*(uint16_t volatile *)(fb_base + o) = BLUE;
|
*(uint16_t volatile *)(te.fb_base() + o) = BLUE;
|
||||||
timer.msleep(2000);
|
te.complete_step();
|
||||||
|
|
||||||
PINF("green");
|
PINF("green");
|
||||||
for (addr_t o = 0; o < fb_size; o += fb_bpp)
|
for (addr_t o = 0; o < te.fb_size(); o += te.fb_bpp())
|
||||||
*(uint16_t volatile *)(fb_base + o) = GREEN;
|
*(uint16_t volatile *)(te.fb_base() + o) = GREEN;
|
||||||
timer.msleep(2000);
|
te.complete_step();
|
||||||
|
|
||||||
PINF("red");
|
PINF("red");
|
||||||
for (addr_t o = 0; o < fb_size; o += fb_bpp)
|
for (addr_t o = 0; o < te.fb_size(); o += te.fb_bpp())
|
||||||
*(uint16_t volatile *)(fb_base + o) = RED;
|
*(uint16_t volatile *)(te.fb_base() + o) = RED;
|
||||||
timer.msleep(2000);
|
te.complete_step();
|
||||||
|
|
||||||
PINF("all colors mixed");
|
PINF("all colors mixed");
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
for (addr_t o = 0; o < fb_size; o += fb_bpp, i++)
|
for (addr_t o = 0; o < te.fb_size(); o += te.fb_bpp(), i++)
|
||||||
*(uint16_t volatile *)(fb_base + o) = i;
|
*(uint16_t volatile *)(te.fb_base() + o) = i;
|
||||||
timer.msleep(2000);
|
te.complete_step();
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user