/*
* \brief Access to GPIO driver configuration
* \author Stefan Kalkowski
* \date 2013-05-06
*
* Taken from the OMAP4 GPIO driver written by Ivan Loskutov.
*
* Configure GPIO
* Example:
*
*
*
*
*
* num - GPIO pin number
* mode - input(I) or output(O)
* value - output level (1 or 0), only for output mode
*/
/*
* Copyright (C) 2010-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__GPIO__CONFIG_H_
#define _INCLUDE__GPIO__CONFIG_H_
/* Genode includes */
#include
#include
#include
namespace Gpio {
class Invalid_mode : Genode::Exception {};
static void process_config(Genode::Xml_node const &config, Gpio::Driver &driver);
}
void Gpio::process_config(Genode::Xml_node const &config, Gpio::Driver &driver)
{
if (!config.has_sub_node("gpio"))
Genode::warning("no GPIO config");
config.for_each_sub_node("gpio", [&] (Genode::Xml_node const &gpio_node) {
unsigned const num = gpio_node.attribute_value("num", 0U);
Pin gpio { num };
if (!driver.gpio_valid(gpio)) {
Genode::warning("invalid GPIO number ", num, ", ignore node");
return;
}
using Mode = Genode::String<2>;
Mode const mode = gpio_node.attribute_value("mode", Mode());
unsigned value = 0;
if (mode == "O" || mode == "o") {
value = gpio_node.attribute_value("value", value);
driver.write(gpio, value);
driver.direction(Pin {num}, false);
}
else if (mode == "I" || mode == "i") {
driver.direction(Pin {num}, true);
}
else {
Genode::error("gpio ", num, " has invalid mode, must be I or O");
throw Invalid_mode();
}
Genode::log("gpio ", num, " mode ", mode, " value=", value);
});
}
#endif /* _INCLUDE__GPIO__CONFIG_H_ */