xref: /openbmc/phosphor-buttons/inc/gpio.hpp (revision ccd7db054ccced63c25e66fe7ab8e1847f9d38ae)
1a9d39e30SKuiying Wang /*
2a9d39e30SKuiying Wang // Copyright (c) 2018 Intel Corporation
3a9d39e30SKuiying Wang //
4a9d39e30SKuiying Wang // Licensed under the Apache License, Version 2.0 (the "License");
5a9d39e30SKuiying Wang // you may not use this file except in compliance with the License.
6a9d39e30SKuiying Wang // You may obtain a copy of the License at
7a9d39e30SKuiying Wang //
8a9d39e30SKuiying Wang //      http://www.apache.org/licenses/LICENSE-2.0
9a9d39e30SKuiying Wang //
10a9d39e30SKuiying Wang // Unless required by applicable law or agreed to in writing, software
11a9d39e30SKuiying Wang // distributed under the License is distributed on an "AS IS" BASIS,
12a9d39e30SKuiying Wang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9d39e30SKuiying Wang // See the License for the specific language governing permissions and
14a9d39e30SKuiying Wang // limitations under the License.
15a9d39e30SKuiying Wang */
16a9d39e30SKuiying Wang #pragma once
170d9377d2SPatrick Venture 
183bd1cfcbSNaveen Moses #include <nlohmann/json.hpp>
190d9377d2SPatrick Venture #include <sdbusplus/bus.hpp>
205b98f4dbSGeorge Liu 
21dd5495cfSNaveen Moses #include <string>
22dd5495cfSNaveen Moses #include <vector>
230d9377d2SPatrick Venture 
24*ccd7db05SDelphine CC Chiu struct ButtonConfig;
25*ccd7db05SDelphine CC Chiu 
26d219fa3cSNaveen Moses // enum to represent gpio states
27a6d4e65dSNaveen Moses enum class GpioState
28a6d4e65dSNaveen Moses {
29d219fa3cSNaveen Moses     assert,
30d219fa3cSNaveen Moses     deassert,
31d219fa3cSNaveen Moses     invalid
32d219fa3cSNaveen Moses };
33d219fa3cSNaveen Moses // enum to represent gpio polarity
34d219fa3cSNaveen Moses enum class GpioPolarity
35d219fa3cSNaveen Moses {
36d219fa3cSNaveen Moses     activeLow,
37d219fa3cSNaveen Moses     activeHigh
38d219fa3cSNaveen Moses };
39d219fa3cSNaveen Moses 
40d219fa3cSNaveen Moses struct GPIOBufferValue
41d219fa3cSNaveen Moses {
42d219fa3cSNaveen Moses     char assert;
43d219fa3cSNaveen Moses     char deassert;
44a6d4e65dSNaveen Moses };
45a6d4e65dSNaveen Moses 
46dd5495cfSNaveen Moses // this struct has the gpio config for single gpio
47*ccd7db05SDelphine CC Chiu struct GpioInfo
488605bdffSMatt Spinler {
49dd5495cfSNaveen Moses     int fd; // io fd mapped with the gpio
50dd5495cfSNaveen Moses     uint32_t number;
51d219fa3cSNaveen Moses     std::string name;
52dd5495cfSNaveen Moses     std::string direction;
53d219fa3cSNaveen Moses     GpioPolarity polarity;
54dd5495cfSNaveen Moses };
55dd5495cfSNaveen Moses 
56dd5495cfSNaveen Moses /**
57dd5495cfSNaveen Moses  * @brief iterates over the list of gpios and configures gpios them
58dd5495cfSNaveen Moses  * config which is set from gpio defs json file.
59*ccd7db05SDelphine CC Chiu  * The fd of the configured gpio is stored in ButtonConfig.gpios container
60dd5495cfSNaveen Moses  * @return int returns 0 on successful config of all gpios
61dd5495cfSNaveen Moses  */
62dd5495cfSNaveen Moses 
63*ccd7db05SDelphine CC Chiu int configGroupGpio(ButtonConfig& buttonCfg);
64dd5495cfSNaveen Moses 
65dd5495cfSNaveen Moses /**
66dd5495cfSNaveen Moses  * @brief  configures and initializes the single gpio
67dd5495cfSNaveen Moses  * @return int returns 0 on successful config of all gpios
68dd5495cfSNaveen Moses  */
69dd5495cfSNaveen Moses 
70*ccd7db05SDelphine CC Chiu int configGpio(GpioInfo& gpioConfig, ButtonConfig& buttonIFConfig);
71dd5495cfSNaveen Moses 
72dd5495cfSNaveen Moses uint32_t getGpioNum(const std::string& gpioPin);
73d219fa3cSNaveen Moses // Set gpio state based on polarity
74d219fa3cSNaveen Moses void setGpioState(int fd, GpioPolarity polarity, GpioState state);
75d219fa3cSNaveen Moses // Get gpio state based on polarity
76d219fa3cSNaveen Moses GpioState getGpioState(int fd, GpioPolarity polarity);
77d219fa3cSNaveen Moses 
783bd1cfcbSNaveen Moses // global json object which holds gpio_defs.json configs
793bd1cfcbSNaveen Moses extern nlohmann::json gpioDefs;
80