committed by
Norman Feske
parent
dd15d65800
commit
9c7df24e20
104
include/regulator/component.h
Normal file
104
include/regulator/component.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* \brief Regulator-session component
|
||||
* \author Stefan Kalkowski
|
||||
* \date 2013-06-13
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013-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.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__REGULATOR__COMPONENT_H_
|
||||
#define _INCLUDE__REGULATOR__COMPONENT_H_
|
||||
|
||||
#include <root/component.h>
|
||||
#include <regulator_session/rpc_object.h>
|
||||
#include <regulator/driver.h>
|
||||
|
||||
|
||||
namespace Regulator {
|
||||
class Session_component;
|
||||
class Root;
|
||||
}
|
||||
|
||||
|
||||
class Regulator::Session_component : public Regulator::Session_rpc_object
|
||||
{
|
||||
private:
|
||||
|
||||
Driver_factory & _driver_factory;
|
||||
Driver & _driver;
|
||||
|
||||
public:
|
||||
|
||||
Session_component(Regulator_id regulator_id,
|
||||
Driver_factory & driver_factory)
|
||||
: Session_rpc_object(regulator_id),
|
||||
_driver_factory(driver_factory),
|
||||
_driver(_driver_factory.create(regulator_id)) { }
|
||||
|
||||
~Session_component()
|
||||
{
|
||||
_driver.state(_id, false);
|
||||
_driver_factory.destroy(_driver);
|
||||
}
|
||||
|
||||
|
||||
/***********************************
|
||||
** Regulator session interface **
|
||||
***********************************/
|
||||
|
||||
void level(unsigned long level) override { _driver.level(_id, level); }
|
||||
unsigned long level() override { return _driver.level(_id); }
|
||||
void state(bool enable) override { _driver.state(_id, enable); }
|
||||
bool state() override { return _driver.state(_id); }
|
||||
};
|
||||
|
||||
|
||||
class Regulator::Root :
|
||||
public Genode::Root_component<Regulator::Session_component>
|
||||
{
|
||||
private:
|
||||
|
||||
Regulator::Driver_factory & _driver_factory;
|
||||
|
||||
protected:
|
||||
|
||||
Session_component *_create_session(const char *args) override
|
||||
{
|
||||
using namespace Genode;
|
||||
|
||||
char reg_name[64];
|
||||
Arg_string::find_arg(args, "regulator").string(reg_name,
|
||||
sizeof(reg_name), 0);
|
||||
size_t ram_quota =
|
||||
Arg_string::find_arg(args, "ram_quota").ulong_value(0);
|
||||
|
||||
/* delete ram quota by the memory needed for the session */
|
||||
size_t session_size = max((size_t)4096,
|
||||
sizeof(Session_component));
|
||||
if (ram_quota < session_size)
|
||||
throw Insufficient_ram_quota();
|
||||
|
||||
if (!strlen(reg_name))
|
||||
throw Service_denied();
|
||||
|
||||
return new (md_alloc())
|
||||
Session_component(regulator_id_by_name(reg_name),
|
||||
_driver_factory);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Root(Genode::Env & env,
|
||||
Genode::Allocator & md_alloc,
|
||||
Regulator::Driver_factory & driver_factory)
|
||||
: Genode::Root_component<Regulator::Session_component>(env.ep(),
|
||||
md_alloc),
|
||||
_driver_factory(driver_factory) { }
|
||||
};
|
||||
|
||||
#endif /* _INCLUDE__REGULATOR__COMPONENT_H_ */
|
||||
54
include/regulator/driver.h
Normal file
54
include/regulator/driver.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* \brief Regulator-driver interface
|
||||
* \author Stefan Kalkowski
|
||||
* \date 2013-06-13
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013-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.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__REGULATOR__DRIVER_H_
|
||||
#define _INCLUDE__REGULATOR__DRIVER_H_
|
||||
|
||||
#include <regulator/consts.h>
|
||||
|
||||
namespace Regulator {
|
||||
|
||||
struct Driver;
|
||||
struct Driver_factory;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Interface to be implemented by the device-specific driver code
|
||||
*/
|
||||
struct Regulator::Driver : Genode::Interface
|
||||
{
|
||||
virtual void level(Regulator_id id, unsigned long level) = 0;
|
||||
virtual unsigned long level(Regulator_id id) = 0;
|
||||
virtual void state(Regulator_id id, bool enable) = 0;
|
||||
virtual bool state(Regulator_id id) = 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Interface for constructing the driver object
|
||||
*/
|
||||
struct Regulator::Driver_factory : Genode::Interface
|
||||
{
|
||||
/**
|
||||
* Construct new driver
|
||||
*/
|
||||
virtual Driver &create(Regulator_id regulator) = 0;
|
||||
|
||||
/**
|
||||
* Destroy driver
|
||||
*/
|
||||
virtual void destroy(Driver &driver) = 0;
|
||||
};
|
||||
|
||||
#endif /* _REGULATOR__DRIVER_H_ */
|
||||
Reference in New Issue
Block a user