blob: da4910c15ca1cd26357a43502b8dbab064d7882a [file] [log] [blame]
#include <fcntl.h>
#include <linux/gpio.h>
#include <gpioplus/chip.hpp>
#include <cstring>
#include <string>
#include <system_error>
namespace gpioplus
{
LineFlags::LineFlags(uint32_t flags) :
kernel(flags & GPIOLINE_FLAG_KERNEL), output(flags & GPIOLINE_FLAG_IS_OUT),
active_low(flags & GPIOLINE_FLAG_ACTIVE_LOW),
open_drain(flags & GPIOLINE_FLAG_OPEN_DRAIN),
open_source(flags & GPIOLINE_FLAG_OPEN_SOURCE)
{}
Chip::Chip(unsigned id, const internal::Sys* sys) :
fd(std::string{"/dev/gpiochip"}.append(std::to_string(id)).c_str(),
O_RDONLY | O_CLOEXEC, sys)
{}
ChipInfo Chip::getChipInfo() const
{
struct gpiochip_info info;
memset(&info, 0, sizeof(info));
int r = fd.getSys()->gpio_get_chipinfo(*fd, &info);
if (r < 0)
{
throw std::system_error(-r, std::generic_category(),
"gpio_get_chipinfo");
}
return ChipInfo{info.name, info.label, info.lines};
}
LineInfo Chip::getLineInfo(uint32_t offset) const
{
struct gpioline_info info;
memset(&info, 0, sizeof(info));
info.line_offset = offset;
int r = fd.getSys()->gpio_get_lineinfo(*fd, &info);
if (r < 0)
{
throw std::system_error(-r, std::generic_category(),
"gpio_get_lineinfo");
}
return LineInfo{info.flags, info.name, info.consumer};
}
const internal::Fd& Chip::getFd() const
{
return fd;
}
} // namespace gpioplus