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