xref: /openbmc/phosphor-power/phosphor-power-sequencer/src/gpio.hpp (revision e6d7f4cb088171139a2ca33e71137806d887da8d)
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