1*e634411bSHenry Wu #pragma once 2*e634411bSHenry Wu 3*e634411bSHenry Wu #include <gpiod.hpp> 4*e634411bSHenry Wu 5*e634411bSHenry Wu #include <string> 6*e634411bSHenry Wu 7*e634411bSHenry Wu std::vector<std::unique_ptr<::gpiod::line_bulk>> requestMuxGPIOs( 8*e634411bSHenry Wu const std::vector<std::string>& gpioLines, 9*e634411bSHenry Wu const std::vector<bool>& gpioPolarities, bool inverted); 10*e634411bSHenry Wu 11*e634411bSHenry Wu /* 12*e634411bSHenry Wu * @class GPIOGroup 13*e634411bSHenry Wu * @brief A group of GPIO lines to be muxed together 14*e634411bSHenry Wu */ 15*e634411bSHenry Wu class GPIOGroup 16*e634411bSHenry Wu { 17*e634411bSHenry Wu public: 18*e634411bSHenry Wu GPIOGroup(std::vector<std::string> lines, std::vector<bool> polarities); 19*e634411bSHenry Wu 20*e634411bSHenry Wu ~GPIOGroup(); 21*e634411bSHenry Wu 22*e634411bSHenry Wu // GPIOs set to route mux to the BMC 23*e634411bSHenry Wu bool muxToBMC(); 24*e634411bSHenry Wu // GPIOs set to the opposite values to route mux to the external device 25*e634411bSHenry Wu bool muxToDevice(); 26*e634411bSHenry Wu 27*e634411bSHenry Wu void releaseAll(); 28*e634411bSHenry Wu 29*e634411bSHenry Wu GPIOGroup(const GPIOGroup&) = delete; 30*e634411bSHenry Wu GPIOGroup& operator=(const GPIOGroup&) = delete; 31*e634411bSHenry Wu GPIOGroup(GPIOGroup&& /*other*/) noexcept; 32*e634411bSHenry Wu GPIOGroup& operator=(GPIOGroup&& /*other*/) noexcept; 33*e634411bSHenry Wu 34*e634411bSHenry Wu private: 35*e634411bSHenry Wu bool mux(bool inverted); 36*e634411bSHenry Wu 37*e634411bSHenry Wu std::vector<std::string> lines; 38*e634411bSHenry Wu std::vector<bool> polarities; 39*e634411bSHenry Wu std::vector<std::unique_ptr<::gpiod::line_bulk>> activeBulks; 40*e634411bSHenry Wu }; 41*e634411bSHenry Wu 42*e634411bSHenry Wu /* 43*e634411bSHenry Wu * @class ScopedBmcMux 44*e634411bSHenry Wu * @brief A RAII wrapper to mux GPIO lines to BMC on construction 45*e634411bSHenry Wu * and back to device on destruction 46*e634411bSHenry Wu */ 47*e634411bSHenry Wu class ScopedBmcMux 48*e634411bSHenry Wu { 49*e634411bSHenry Wu public: 50*e634411bSHenry Wu explicit ScopedBmcMux(GPIOGroup& group); 51*e634411bSHenry Wu ~ScopedBmcMux(); 52*e634411bSHenry Wu 53*e634411bSHenry Wu ScopedBmcMux(const ScopedBmcMux&) = delete; 54*e634411bSHenry Wu ScopedBmcMux& operator=(const ScopedBmcMux&) = delete; 55*e634411bSHenry Wu 56*e634411bSHenry Wu ScopedBmcMux(ScopedBmcMux&& /*other*/) = delete; 57*e634411bSHenry Wu ScopedBmcMux& operator=(ScopedBmcMux&& /*other*/) = delete; 58*e634411bSHenry Wu 59*e634411bSHenry Wu private: 60*e634411bSHenry Wu GPIOGroup& gpioGroup; 61*e634411bSHenry Wu }; 62