blob: d99a031d5de1552ffbe37028b621fdb26324f936 [file] [log] [blame]
Patrick Ventureb28f4322018-09-14 10:19:14 -07001#include "gpio_handle.hpp"
2
3#include <cstdlib>
4#include <gpioplus/chip.hpp>
5#include <gpioplus/handle.hpp>
6#include <memory>
7#include <phosphor-logging/log.hpp>
8#include <string>
9
10namespace gpio
11{
12
13using namespace phosphor::logging;
14
Patrick Venturee3e0f972018-12-19 08:58:21 -080015std::unique_ptr<gpioplus::HandleInterface>
16 BuildGpioHandle(const std::string& gpiochip, const std::string& line)
Patrick Ventureb28f4322018-09-14 10:19:14 -070017{
18 char *gpioEnd, *lineEnd;
19 unsigned long chipId = std::strtoul(gpiochip.c_str(), &gpioEnd, 10);
20 unsigned long lineOffset = std::strtoul(line.c_str(), &lineEnd, 10);
21
22 if (!gpioEnd || gpioEnd != &gpiochip.c_str()[gpiochip.length()])
23 {
24 log<level::ERR>("Unable to handle giochip entry",
25 entry("GPIOCHIP=%s", gpiochip.c_str()));
26 return nullptr;
27 }
28
29 if (!lineEnd || lineEnd != &line.c_str()[line.length()])
30 {
31 log<level::ERR>("Unable to handle line entry",
32 entry("LINE=%s", line.c_str()));
33 return nullptr;
34 }
35
36 try
37 {
38 gpioplus::Chip chip(chipId);
39 gpioplus::HandleFlags flags(chip.getLineInfo(lineOffset).flags);
40 flags.output = true;
41 std::vector<gpioplus::Handle::Line> lines = {
42 {static_cast<uint32_t>(lineOffset), 0}};
43
44 return std::make_unique<gpioplus::Handle>(chip, lines, flags,
45 "phosphor-hwmon");
46 }
47 catch (const std::exception& e)
48 {
49 log<level::ERR>("Unable to set up GPIO handle",
50 entry("ERROR=%s", e.what()));
51 return nullptr;
52 }
53}
54
55} // namespace gpio