1*e6d7f4cbSShawn McCarney /** 2*e6d7f4cbSShawn McCarney * Copyright © 2025 IBM Corporation 3*e6d7f4cbSShawn McCarney * 4*e6d7f4cbSShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License"); 5*e6d7f4cbSShawn McCarney * you may not use this file except in compliance with the License. 6*e6d7f4cbSShawn McCarney * You may obtain a copy of the License at 7*e6d7f4cbSShawn McCarney * 8*e6d7f4cbSShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0 9*e6d7f4cbSShawn McCarney * 10*e6d7f4cbSShawn McCarney * Unless required by applicable law or agreed to in writing, software 11*e6d7f4cbSShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS, 12*e6d7f4cbSShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e6d7f4cbSShawn McCarney * See the License for the specific language governing permissions and 14*e6d7f4cbSShawn McCarney * limitations under the License. 15*e6d7f4cbSShawn McCarney */ 16*e6d7f4cbSShawn McCarney #pragma once 17*e6d7f4cbSShawn McCarney 18*e6d7f4cbSShawn McCarney #include <gpiod.hpp> 19*e6d7f4cbSShawn McCarney 20*e6d7f4cbSShawn McCarney #include <string> 21*e6d7f4cbSShawn McCarney 22*e6d7f4cbSShawn McCarney namespace phosphor::power::sequencer 23*e6d7f4cbSShawn McCarney { 24*e6d7f4cbSShawn McCarney 25*e6d7f4cbSShawn McCarney /** 26*e6d7f4cbSShawn McCarney * @class GPIO 27*e6d7f4cbSShawn McCarney * 28*e6d7f4cbSShawn McCarney * Abstract base class for a General-Purpose Input/Output pin. 29*e6d7f4cbSShawn McCarney */ 30*e6d7f4cbSShawn McCarney class GPIO 31*e6d7f4cbSShawn McCarney { 32*e6d7f4cbSShawn McCarney public: 33*e6d7f4cbSShawn McCarney GPIO() = default; 34*e6d7f4cbSShawn McCarney GPIO(const GPIO&) = delete; 35*e6d7f4cbSShawn McCarney GPIO(GPIO&&) = delete; 36*e6d7f4cbSShawn McCarney GPIO& operator=(const GPIO&) = delete; 37*e6d7f4cbSShawn McCarney GPIO& operator=(GPIO&&) = delete; 38*e6d7f4cbSShawn McCarney virtual ~GPIO() = default; 39*e6d7f4cbSShawn McCarney 40*e6d7f4cbSShawn McCarney enum class RequestType 41*e6d7f4cbSShawn McCarney { 42*e6d7f4cbSShawn McCarney Read, 43*e6d7f4cbSShawn McCarney Write 44*e6d7f4cbSShawn McCarney }; 45*e6d7f4cbSShawn McCarney 46*e6d7f4cbSShawn McCarney /** 47*e6d7f4cbSShawn McCarney * Request ownership of the GPIO. 48*e6d7f4cbSShawn McCarney * 49*e6d7f4cbSShawn McCarney * Throws an exception if an error occurs. 50*e6d7f4cbSShawn McCarney * 51*e6d7f4cbSShawn McCarney * This is required before getting or setting the GPIO value. 52*e6d7f4cbSShawn McCarney * 53*e6d7f4cbSShawn McCarney * @param type specifies whether requesting to read or write the GPIO 54*e6d7f4cbSShawn McCarney */ 55*e6d7f4cbSShawn McCarney virtual void request(RequestType type) = 0; 56*e6d7f4cbSShawn McCarney 57*e6d7f4cbSShawn McCarney /** 58*e6d7f4cbSShawn McCarney * Gets the value of the GPIO. 59*e6d7f4cbSShawn McCarney * 60*e6d7f4cbSShawn McCarney * Throws an exception if an error occurs. 61*e6d7f4cbSShawn McCarney * 62*e6d7f4cbSShawn McCarney * @return 0 or 1 63*e6d7f4cbSShawn McCarney */ 64*e6d7f4cbSShawn McCarney virtual int getValue() = 0; 65*e6d7f4cbSShawn McCarney 66*e6d7f4cbSShawn McCarney /** 67*e6d7f4cbSShawn McCarney * Sets the value of the GPIO. 68*e6d7f4cbSShawn McCarney * 69*e6d7f4cbSShawn McCarney * Throws an exception if an error occurs. 70*e6d7f4cbSShawn McCarney * 71*e6d7f4cbSShawn McCarney * @param value new value (0 or 1) 72*e6d7f4cbSShawn McCarney */ 73*e6d7f4cbSShawn McCarney virtual void setValue(int value) = 0; 74*e6d7f4cbSShawn McCarney 75*e6d7f4cbSShawn McCarney /** 76*e6d7f4cbSShawn McCarney * Release ownership of the GPIO. 77*e6d7f4cbSShawn McCarney * 78*e6d7f4cbSShawn McCarney * Throws an exception if an error occurs. 79*e6d7f4cbSShawn McCarney */ 80*e6d7f4cbSShawn McCarney virtual void release() = 0; 81*e6d7f4cbSShawn McCarney }; 82*e6d7f4cbSShawn McCarney 83*e6d7f4cbSShawn McCarney /** 84*e6d7f4cbSShawn McCarney * @class BMCGPIO 85*e6d7f4cbSShawn McCarney * 86*e6d7f4cbSShawn McCarney * Implementation of the GPIO interface using the standard BMC API (libgpiod). 87*e6d7f4cbSShawn McCarney */ 88*e6d7f4cbSShawn McCarney class BMCGPIO : public GPIO 89*e6d7f4cbSShawn McCarney { 90*e6d7f4cbSShawn McCarney public: 91*e6d7f4cbSShawn McCarney BMCGPIO() = delete; 92*e6d7f4cbSShawn McCarney BMCGPIO(const BMCGPIO&) = delete; 93*e6d7f4cbSShawn McCarney BMCGPIO(BMCGPIO&&) = delete; 94*e6d7f4cbSShawn McCarney BMCGPIO& operator=(const BMCGPIO&) = delete; 95*e6d7f4cbSShawn McCarney BMCGPIO& operator=(BMCGPIO&&) = delete; 96*e6d7f4cbSShawn McCarney virtual ~BMCGPIO() = default; 97*e6d7f4cbSShawn McCarney 98*e6d7f4cbSShawn McCarney /** 99*e6d7f4cbSShawn McCarney * Constructor. 100*e6d7f4cbSShawn McCarney * 101*e6d7f4cbSShawn McCarney * Throws an exception if a GPIO with the specified name cannot be found. 102*e6d7f4cbSShawn McCarney * 103*e6d7f4cbSShawn McCarney * @param name GPIO name 104*e6d7f4cbSShawn McCarney */ BMCGPIO(const std::string & name)105*e6d7f4cbSShawn McCarney explicit BMCGPIO(const std::string& name) 106*e6d7f4cbSShawn McCarney { 107*e6d7f4cbSShawn McCarney line = gpiod::find_line(name); 108*e6d7f4cbSShawn McCarney if (!line) 109*e6d7f4cbSShawn McCarney { 110*e6d7f4cbSShawn McCarney throw std::invalid_argument{"Invalid GPIO name: " + name}; 111*e6d7f4cbSShawn McCarney } 112*e6d7f4cbSShawn McCarney } 113*e6d7f4cbSShawn McCarney request(RequestType type)114*e6d7f4cbSShawn McCarney virtual void request(RequestType type) override 115*e6d7f4cbSShawn McCarney { 116*e6d7f4cbSShawn McCarney int lineRequestType; 117*e6d7f4cbSShawn McCarney if (type == RequestType::Read) 118*e6d7f4cbSShawn McCarney { 119*e6d7f4cbSShawn McCarney lineRequestType = gpiod::line_request::DIRECTION_INPUT; 120*e6d7f4cbSShawn McCarney } 121*e6d7f4cbSShawn McCarney else 122*e6d7f4cbSShawn McCarney { 123*e6d7f4cbSShawn McCarney lineRequestType = gpiod::line_request::DIRECTION_OUTPUT; 124*e6d7f4cbSShawn McCarney } 125*e6d7f4cbSShawn McCarney line.request({"phosphor-power-control", lineRequestType, 0}); 126*e6d7f4cbSShawn McCarney } 127*e6d7f4cbSShawn McCarney getValue()128*e6d7f4cbSShawn McCarney virtual int getValue() override 129*e6d7f4cbSShawn McCarney { 130*e6d7f4cbSShawn McCarney return line.get_value(); 131*e6d7f4cbSShawn McCarney } 132*e6d7f4cbSShawn McCarney setValue(int value)133*e6d7f4cbSShawn McCarney virtual void setValue(int value) override 134*e6d7f4cbSShawn McCarney { 135*e6d7f4cbSShawn McCarney line.set_value(value); 136*e6d7f4cbSShawn McCarney } 137*e6d7f4cbSShawn McCarney release()138*e6d7f4cbSShawn McCarney virtual void release() override 139*e6d7f4cbSShawn McCarney { 140*e6d7f4cbSShawn McCarney line.release(); 141*e6d7f4cbSShawn McCarney } 142*e6d7f4cbSShawn McCarney 143*e6d7f4cbSShawn McCarney private: 144*e6d7f4cbSShawn McCarney /** 145*e6d7f4cbSShawn McCarney * GPIO line to access the pin. 146*e6d7f4cbSShawn McCarney */ 147*e6d7f4cbSShawn McCarney gpiod::line line; 148*e6d7f4cbSShawn McCarney }; 149*e6d7f4cbSShawn McCarney 150*e6d7f4cbSShawn McCarney } // namespace phosphor::power::sequencer 151