2021-03-13 14:42:30 +01:00
|
|
|
#include <bsp_q7s/gpio/gpioCallbacks.h>
|
|
|
|
#include <fsfwconfig/devices/gpioIds.h>
|
|
|
|
#include <linux/gpio/LinuxLibgpioIF.h>
|
|
|
|
#include <linux/gpio/GpioCookie.h>
|
|
|
|
#include <fsfw/serviceinterface/ServiceInterface.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace gpioCallbacks {
|
|
|
|
|
|
|
|
GpioIF* gpioComInterface;
|
|
|
|
|
|
|
|
void initTcsBoardDecoder(GpioIF* gpioComIF) {
|
|
|
|
|
|
|
|
ReturnValue_t result;
|
|
|
|
|
|
|
|
if (gpioComIF == nullptr) {
|
|
|
|
sif::debug << "initTcsBoardDecoder: Invalid gpioComIF" << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
gpioComInterface = gpioComIF;
|
|
|
|
|
|
|
|
GpioCookie* spiMuxGpios = new GpioCookie;
|
|
|
|
/**
|
|
|
|
* Initial values of the spi mux gpios can all be set to an arbitrary value expect for spi mux
|
|
|
|
* bit 1. Setting spi mux bit 1 to high will pull all decoder outputs to high voltage level.
|
|
|
|
*/
|
2021-03-24 12:53:25 +01:00
|
|
|
GpiodRegular* spiMuxBit1 = new GpiodRegular(std::string("gpiochip7"), 13,
|
|
|
|
std::string("SPI Mux Bit 1"), gpio::OUT, 1);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_1, spiMuxBit1);
|
|
|
|
GpiodRegular* spiMuxBit2 = new GpiodRegular(std::string("gpiochip7"), 14,
|
|
|
|
std::string("SPI Mux Bit 2"), gpio::OUT, 0);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit2);
|
|
|
|
GpiodRegular* spiMuxBit3 = new GpiodRegular(std::string("gpiochip7"), 15,
|
|
|
|
std::string("SPI Mux Bit 3"), gpio::OUT, 0);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit3);
|
|
|
|
GpiodRegular* spiMuxBit4 = new GpiodRegular(std::string("gpiochip7"), 16,
|
|
|
|
std::string("SPI Mux Bit 4"), gpio::OUT, 0);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_4, spiMuxBit4);
|
|
|
|
GpiodRegular* spiMuxBit5 = new GpiodRegular(std::string("gpiochip7"), 17,
|
|
|
|
std::string("SPI Mux Bit 5"), gpio::OUT, 0);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_5, spiMuxBit5);
|
|
|
|
GpiodRegular* spiMuxBit6 = new GpiodRegular(std::string("gpiochip7"), 18,
|
|
|
|
std::string("SPI Mux Bit 6"), gpio::OUT, 0);
|
|
|
|
spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_6, spiMuxBit6);
|
2021-03-13 14:42:30 +01:00
|
|
|
|
|
|
|
result = gpioComInterface->addGpios(spiMuxGpios);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
sif::error << "initTcsBoardDecoder: Failed to add mux bit gpios to gpioComIF"
|
|
|
|
<< std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void tcsBoardDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, int value,
|
|
|
|
void* args) {
|
|
|
|
|
|
|
|
if (gpioComInterface == nullptr) {
|
|
|
|
sif::debug << "tcsBoardDecoderCallback: No gpioComIF specified. Call initTcsBoardDecoder "
|
|
|
|
<< "to specify gpioComIF" << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Read is not supported by the callback function */
|
|
|
|
if (gpioOp == gpio::GpioOperation::READ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value == 1) {
|
|
|
|
/* This will pull all 16 decoder outputs to high */
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
}
|
|
|
|
else if (value == 0) {
|
|
|
|
switch (gpioId) {
|
|
|
|
case(gpioIds::RTD_IC3): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC4): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC5): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC6): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC7): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC8): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC9): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC10): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC11): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC12): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC13): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC14): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC15): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC16): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC17): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case(gpioIds::RTD_IC18): {
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1);
|
|
|
|
gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5);
|
|
|
|
gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
sif::debug << "tcsBoardDecoderCallback: Invalid gpioid " << gpioId << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
sif::debug << "tcsBoardDecoderCallback: Invalid value. Must be 0 or 1" << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|