adcsensor: improve bridge gpio handling
This commit improves bridge gpio handling using name based gpio line
access and polarity setting support.
Tested: P3VBAT sensor reading worked correctly.
Change-Id: Iff174c52dba90cc068f4b5e527d4ab1c381817d0
Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
diff --git a/include/ADCSensor.hpp b/include/ADCSensor.hpp
index b5a9e9a..e061138 100644
--- a/include/ADCSensor.hpp
+++ b/include/ADCSensor.hpp
@@ -1,10 +1,50 @@
#pragma once
#include <Thresholds.hpp>
+#include <gpiod.hpp>
#include <optional>
#include <sdbusplus/asio/object_server.hpp>
#include <sensor.hpp>
+class BridgeGpio
+{
+ public:
+ BridgeGpio(const std::string& name, const int polarity)
+ {
+ line = gpiod::find_line(name);
+ if (!line)
+ {
+ std::cerr << "Error finding gpio: " << name << "\n";
+ }
+ else
+ {
+ try
+ {
+ line.request({"adcsensor",
+ gpiod::line_request::DIRECTION_OUTPUT,
+ polarity == gpiod::line::ACTIVE_HIGH
+ ? 0
+ : gpiod::line_request::FLAG_ACTIVE_LOW});
+ }
+ catch (std::system_error&)
+ {
+ std::cerr << "Error requesting gpio: " << name << "\n";
+ }
+ }
+ }
+
+ void set(int value)
+ {
+ if (line)
+ {
+ line.set_value(value);
+ }
+ }
+
+ private:
+ gpiod::line line;
+};
+
class ADCSensor : public Sensor
{
public:
@@ -15,7 +55,7 @@
std::vector<thresholds::Threshold>&& thresholds,
const double scaleFactor, PowerState readState,
const std::string& sensorConfiguration,
- std::optional<int> bridgeGpio);
+ std::optional<BridgeGpio> bridgeGpio);
~ADCSensor();
private:
@@ -26,7 +66,7 @@
std::string path;
int errCount;
double scaleFactor;
- std::optional<int> bridgeGpio;
+ std::optional<BridgeGpio> bridgeGpio;
PowerState readState;
thresholds::ThresholdTimer thresholdTimer;
void setupRead(void);