mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-13 04:38:20 +00:00
@ -34,8 +34,7 @@
|
||||
|
||||
namespace Gpio {
|
||||
|
||||
class Invalid_gpio_number : Genode::Exception {};
|
||||
class Invalid_mode : Genode::Exception {};
|
||||
class Invalid_mode : Genode::Exception {};
|
||||
|
||||
static void process_config(Genode::Xml_node const &config, Gpio::Driver &driver);
|
||||
}
|
||||
@ -43,41 +42,37 @@ namespace Gpio {
|
||||
|
||||
void Gpio::process_config(Genode::Xml_node const &config, Gpio::Driver &driver)
|
||||
{
|
||||
try {
|
||||
Genode::Xml_node gpio_node = config.sub_node("gpio");
|
||||
|
||||
for (;; gpio_node = gpio_node.next("gpio")) {
|
||||
unsigned num = 0;
|
||||
char mode[2] = {0};
|
||||
unsigned value = 0;
|
||||
|
||||
try {
|
||||
gpio_node.attribute("num").value(&num);
|
||||
if (!driver.gpio_valid(num)) throw Invalid_gpio_number();
|
||||
gpio_node.attribute("mode").value(mode, sizeof(mode));
|
||||
if (mode[0] == 'O' || mode[0] == 'o') {
|
||||
gpio_node.attribute("value").value(&value);
|
||||
driver.write(num, value);
|
||||
driver.direction(num, false);
|
||||
} else if (mode[0] == 'I' || mode[0] == 'i') {
|
||||
driver.direction(num, true);
|
||||
} else throw Invalid_mode();
|
||||
|
||||
Genode::log("gpio ", num, " "
|
||||
"mode ", Genode::Cstring(mode), " "
|
||||
"value=", value);
|
||||
|
||||
} catch(Genode::Xml_node::Nonexistent_attribute) {
|
||||
Genode::warning("missing attribute. Ignore node.");
|
||||
} catch(Gpio::Invalid_gpio_number) {
|
||||
Genode::warning("invalid GPIO number ", num, ", ignore node");
|
||||
}
|
||||
if (gpio_node.last("gpio")) break;
|
||||
}
|
||||
}
|
||||
catch (Genode::Xml_node::Nonexistent_sub_node) {
|
||||
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);
|
||||
if (!driver.gpio_valid(num)) {
|
||||
Genode::warning("invalid GPIO number ", num, ", ignore node");
|
||||
return;
|
||||
}
|
||||
|
||||
typedef Genode::String<2> Mode;
|
||||
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(num, value);
|
||||
driver.direction(num, false);
|
||||
}
|
||||
else if (mode == "I" || mode == "i") {
|
||||
driver.direction(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_ */
|
||||
|
Reference in New Issue
Block a user