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