2021-07-13 19:19:25 +02:00
|
|
|
#ifndef COMMON_GPIO_GPIODEFINITIONS_H_
|
|
|
|
#define COMMON_GPIO_GPIODEFINITIONS_H_
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
#include <map>
|
2021-07-13 19:19:25 +02:00
|
|
|
#include <string>
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
using gpioId_t = uint16_t;
|
|
|
|
|
|
|
|
namespace gpio {
|
|
|
|
|
2022-05-04 10:27:20 +02:00
|
|
|
enum class Levels : int { LOW = 0, HIGH = 1, FAILED = -1, NONE = 99 };
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-28 14:56:37 +01:00
|
|
|
enum class Direction : int { IN = 0, OUT = 1 };
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-28 14:46:12 +01:00
|
|
|
enum class GpioOperation { READ, WRITE };
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2021-10-11 19:55:37 +02:00
|
|
|
enum class GpioTypes {
|
2022-02-02 10:29:30 +01:00
|
|
|
NONE,
|
|
|
|
GPIO_REGULAR_BY_CHIP,
|
|
|
|
GPIO_REGULAR_BY_LABEL,
|
|
|
|
GPIO_REGULAR_BY_LINE_NAME,
|
2022-02-28 14:56:37 +01:00
|
|
|
CALLBACK
|
2021-07-13 19:19:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
static constexpr gpioId_t NO_GPIO = -1;
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
using gpio_cb_t = void (*)(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Levels value,
|
|
|
|
void* args);
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
} // namespace gpio
|
2021-07-13 19:19:25 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Struct containing information about the GPIO to use. This is
|
|
|
|
* required by the libgpiod to access and drive a GPIO.
|
|
|
|
* @param chipname String of the chipname specifying the group which contains the GPIO to
|
|
|
|
* access. E.g. gpiochip0. To detect names of GPIO groups run gpiodetect on
|
|
|
|
* the linux command line.
|
|
|
|
* @param lineNum The offset of the GPIO within the GPIO group.
|
|
|
|
* @param consumer Name of the consumer. Simply a description of the GPIO configuration.
|
|
|
|
* @param direction Specifies whether the GPIO should be used as in- or output.
|
|
|
|
* @param initValue Defines the initial state of the GPIO when configured as output.
|
|
|
|
* Only required for output GPIOs.
|
|
|
|
* @param lineHandle The handle returned by gpiod_chip_get_line will be later written to this
|
|
|
|
* pointer.
|
|
|
|
*/
|
|
|
|
class GpioBase {
|
2022-02-02 10:29:30 +01:00
|
|
|
public:
|
|
|
|
GpioBase() = default;
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
GpioBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
|
|
|
|
gpio::Levels initValue)
|
|
|
|
: gpioType(gpioType), consumer(consumer), direction(direction), initValue(initValue) {}
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
virtual ~GpioBase(){};
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
// Can be used to cast GpioBase to a concrete child implementation
|
|
|
|
gpio::GpioTypes gpioType = gpio::GpioTypes::NONE;
|
|
|
|
std::string consumer;
|
2022-02-28 14:56:37 +01:00
|
|
|
gpio::Direction direction = gpio::Direction::IN;
|
2022-02-02 10:29:30 +01:00
|
|
|
gpio::Levels initValue = gpio::Levels::NONE;
|
2021-07-13 19:19:25 +02:00
|
|
|
};
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
class GpiodRegularBase : public GpioBase {
|
|
|
|
public:
|
|
|
|
GpiodRegularBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
|
|
|
|
gpio::Levels initValue, int lineNum)
|
|
|
|
: GpioBase(gpioType, consumer, direction, initValue), lineNum(lineNum) {}
|
2021-10-11 19:55:37 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
// line number will be configured at a later point for the open by line name configuration
|
|
|
|
GpiodRegularBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
|
|
|
|
gpio::Levels initValue)
|
|
|
|
: GpioBase(gpioType, consumer, direction, initValue) {}
|
2021-10-11 19:55:37 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
int lineNum = 0;
|
|
|
|
struct gpiod_line* lineHandle = nullptr;
|
2021-09-23 17:58:44 +02:00
|
|
|
};
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
class GpiodRegularByChip : public GpiodRegularBase {
|
|
|
|
public:
|
|
|
|
GpiodRegularByChip()
|
2022-02-28 15:49:11 +01:00
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP, std::string(), gpio::Direction::IN,
|
|
|
|
gpio::Levels::LOW, 0) {}
|
2022-02-02 10:29:30 +01:00
|
|
|
|
|
|
|
GpiodRegularByChip(std::string chipname_, int lineNum_, std::string consumer_,
|
|
|
|
gpio::Direction direction_, gpio::Levels initValue_)
|
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP, consumer_, direction_, initValue_,
|
|
|
|
lineNum_),
|
|
|
|
chipname(chipname_) {}
|
|
|
|
|
|
|
|
GpiodRegularByChip(std::string chipname_, int lineNum_, std::string consumer_)
|
2022-02-28 14:56:37 +01:00
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP, consumer_, gpio::Direction::IN,
|
|
|
|
gpio::Levels::LOW, lineNum_),
|
2022-02-02 10:29:30 +01:00
|
|
|
chipname(chipname_) {}
|
|
|
|
|
|
|
|
std::string chipname;
|
2021-09-23 17:58:44 +02:00
|
|
|
};
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
class GpiodRegularByLabel : public GpiodRegularBase {
|
|
|
|
public:
|
|
|
|
GpiodRegularByLabel(std::string label_, int lineNum_, std::string consumer_,
|
|
|
|
gpio::Direction direction_, gpio::Levels initValue_)
|
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL, consumer_, direction_, initValue_,
|
|
|
|
lineNum_),
|
|
|
|
label(label_) {}
|
|
|
|
|
|
|
|
GpiodRegularByLabel(std::string label_, int lineNum_, std::string consumer_)
|
2022-02-28 14:56:37 +01:00
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL, consumer_, gpio::Direction::IN,
|
|
|
|
gpio::Levels::LOW, lineNum_),
|
2022-02-02 10:29:30 +01:00
|
|
|
label(label_) {}
|
|
|
|
|
|
|
|
std::string label;
|
2021-07-13 19:19:25 +02:00
|
|
|
};
|
|
|
|
|
2021-10-11 19:55:37 +02:00
|
|
|
/**
|
|
|
|
* @brief Passing this GPIO configuration to the GPIO IF object will try to open the GPIO by its
|
|
|
|
* line name. This line name can be set in the device tree and must be unique. Otherwise
|
|
|
|
* the driver will open the first line with the given name.
|
|
|
|
*/
|
2022-02-02 10:29:30 +01:00
|
|
|
class GpiodRegularByLineName : public GpiodRegularBase {
|
|
|
|
public:
|
|
|
|
GpiodRegularByLineName(std::string lineName_, std::string consumer_, gpio::Direction direction_,
|
|
|
|
gpio::Levels initValue_)
|
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME, consumer_, direction_,
|
|
|
|
initValue_),
|
|
|
|
lineName(lineName_) {}
|
|
|
|
|
|
|
|
GpiodRegularByLineName(std::string lineName_, std::string consumer_)
|
2022-02-28 15:49:11 +01:00
|
|
|
: GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME, consumer_, gpio::Direction::IN,
|
|
|
|
gpio::Levels::LOW),
|
2022-02-02 10:29:30 +01:00
|
|
|
lineName(lineName_) {}
|
|
|
|
|
|
|
|
std::string lineName;
|
2021-10-11 19:55:37 +02:00
|
|
|
};
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
class GpioCallback : public GpioBase {
|
|
|
|
public:
|
|
|
|
GpioCallback(std::string consumer, gpio::Direction direction_, gpio::Levels initValue_,
|
|
|
|
gpio::gpio_cb_t callback, void* callbackArgs)
|
2022-02-28 14:56:37 +01:00
|
|
|
: GpioBase(gpio::GpioTypes::CALLBACK, consumer, direction_, initValue_),
|
2022-02-02 10:29:30 +01:00
|
|
|
callback(callback),
|
|
|
|
callbackArgs(callbackArgs) {}
|
2021-07-13 19:19:25 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
gpio::gpio_cb_t callback = nullptr;
|
|
|
|
void* callbackArgs = nullptr;
|
2021-07-13 19:19:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
using GpioMap = std::map<gpioId_t, GpioBase*>;
|
|
|
|
using GpioUnorderedMap = std::unordered_map<gpioId_t, GpioBase*>;
|
|
|
|
using GpioMapIter = GpioMap::iterator;
|
|
|
|
using GpioUnorderedMapIter = GpioUnorderedMap::iterator;
|
|
|
|
|
|
|
|
#endif /* LINUX_GPIO_GPIODEFINITIONS_H_ */
|