#include "evdev.hpp" #include "xyz/openbmc_project/Common/error.hpp" #include #include #include #include #include namespace phosphor { namespace gpio { using namespace phosphor::logging; using namespace sdbusplus::xyz::openbmc_project::Common::Error; // Populate the file descriptor for passed in device int Evdev::openDevice() { using namespace phosphor::logging; auto fd = open(path.c_str(), O_RDONLY | O_NONBLOCK); if (fd < 0) { log("Failed to open device path", entry("DEVICEPATH=%s", path.c_str()), entry("ERRNO=%d", errno)); elog(); } return fd; } // Initializes the event device with the fd void Evdev::initEvDev() { if (devicePtr) { // Init can be done only once per device return; } struct libevdev* evdev = nullptr; auto rc = libevdev_new_from_fd((fd)(), &evdev); if (rc < 0) { log("Failed to initialize evdev"); elog(); return; } // Packing in the unique_ptr devicePtr.reset(evdev); } // Attaches the FD to event loop and registers the callback handler void Evdev::registerCallback() { decltype(eventSource.get()) sourcePtr = nullptr; auto rc = sd_event_add_io(event.get(), &sourcePtr, (fd)(), EPOLLIN, callbackHandler, this); eventSource.reset(sourcePtr); if (rc < 0) { log("Failed to register callback handler", entry("ERROR=%s", strerror(-rc))); elog(); } } } // namespace gpio } // namespace phosphor