1 #include "util.hpp" 2 3 #include <gpiod.hpp> 4 5 namespace phosphor::power::psu 6 { 7 8 const UtilBase& getUtils() 9 { 10 static Util util; 11 return util; 12 } 13 14 GPIOInterface::GPIOInterface(const std::string& namedGpio) 15 { 16 try 17 { 18 line = gpiod::find_line(namedGpio); 19 if (!line) 20 { 21 throw std::runtime_error("Line does not exist: " + namedGpio); 22 } 23 } 24 catch (const std::exception& e) 25 { 26 phosphor::logging::log<phosphor::logging::level::ERR>( 27 fmt::format("Failed to find line: {}", e.what()).c_str()); 28 throw; 29 } 30 } 31 32 std::unique_ptr<GPIOInterfaceBase> 33 GPIOInterface::createGPIO(const std::string& namedGpio) 34 { 35 return std::make_unique<GPIOInterface>(namedGpio); 36 } 37 38 std::string GPIOInterface::getName() const 39 { 40 return line.name(); 41 } 42 43 int GPIOInterface::read() 44 { 45 using namespace phosphor::logging; 46 47 int value = -1; 48 49 if (!line) 50 { 51 log<level::ERR>("Failed line"); 52 throw std::runtime_error{std::string{"Failed to find line"}}; 53 } 54 55 try 56 { 57 line.request({__FUNCTION__, gpiod::line_request::DIRECTION_INPUT, 58 gpiod::line_request::FLAG_ACTIVE_LOW}); 59 try 60 { 61 value = line.get_value(); 62 } 63 catch (const std::exception& e) 64 { 65 log<level::ERR>( 66 fmt::format("Failed to get_value of GPIO line: {}", e.what()) 67 .c_str()); 68 line.release(); 69 throw; 70 } 71 72 line.release(); 73 } 74 catch (const std::exception& e) 75 { 76 log<level::ERR>("Failed to request GPIO line", 77 entry("MSG=%s", e.what())); 78 throw; 79 } 80 81 return value; 82 } 83 84 void GPIOInterface::write(int value, std::bitset<32> flags) 85 { 86 using namespace phosphor::logging; 87 88 if (!line) 89 { 90 log<level::ERR>("Failed line"); 91 throw std::runtime_error{std::string{"Failed to find line"}}; 92 } 93 94 try 95 { 96 line.request( 97 {__FUNCTION__, gpiod::line_request::DIRECTION_OUTPUT, flags}, 98 value); 99 100 line.release(); 101 } 102 catch (std::exception& e) 103 { 104 log<level::ERR>("Failed to set GPIO line", entry("MSG=%s", e.what()), 105 entry("VALUE=%d", value)); 106 throw; 107 } 108 } 109 110 std::unique_ptr<GPIOInterfaceBase> createGPIO(const std::string& namedGpio) 111 { 112 return GPIOInterface::createGPIO(namedGpio); 113 } 114 115 } // namespace phosphor::power::psu 116