xref: /openbmc/phosphor-gpio-monitor/evdev.cpp (revision 2a8848c6fb8e2b98e79baa441d4381a52a1df719)
1  #include "evdev.hpp"
2  
3  #include "xyz/openbmc_project/Common/error.hpp"
4  
5  #include <fcntl.h>
6  #include <libevdev/libevdev.h>
7  
8  #include <phosphor-logging/elog-errors.hpp>
9  #include <phosphor-logging/elog.hpp>
10  #include <phosphor-logging/lg2.hpp>
11  
12  namespace phosphor
13  {
14  namespace gpio
15  {
16  
17  using namespace phosphor::logging;
18  using namespace sdbusplus::xyz::openbmc_project::Common::Error;
19  
20  // Populate the file descriptor for passed in device
openDevice()21  int Evdev::openDevice()
22  {
23      auto fd = open(path.c_str(), O_RDONLY | O_NONBLOCK);
24      if (fd < 0)
25      {
26          lg2::error("Failed to open {DEVICEPATH}: {ERRNO}", "DEVICEPATH", path,
27                     "ERRNO", errno);
28          elog<InternalFailure>();
29      }
30      return fd;
31  }
32  
33  // Initializes the event device with the fd
initEvDev()34  void Evdev::initEvDev()
35  {
36      if (devicePtr)
37      {
38          // Init can be done only once per device
39          return;
40      }
41  
42      struct libevdev* evdev = nullptr;
43      auto rc = libevdev_new_from_fd((fd)(), &evdev);
44      if (rc < 0)
45      {
46          lg2::error("Failed to initialize evdev");
47          elog<InternalFailure>();
48          return;
49      }
50  
51      // Packing in the unique_ptr
52      devicePtr.reset(evdev);
53  }
54  
55  // Attaches the FD to event loop and registers the callback handler
registerCallback()56  void Evdev::registerCallback()
57  {
58      decltype(eventSource.get()) sourcePtr = nullptr;
59      auto rc = sd_event_add_io(event.get(), &sourcePtr, (fd)(), EPOLLIN,
60                                callbackHandler, this);
61      eventSource.reset(sourcePtr);
62  
63      if (rc < 0)
64      {
65          lg2::error("Failed to register callback handler: {RC}", "RC", rc);
66          elog<InternalFailure>();
67      }
68  }
69  
70  } // namespace gpio
71  } // namespace phosphor
72