fome-fw/firmware/controllers/system/efiGpio.cpp

52 lines
1.3 KiB
C++
Raw Normal View History

2014-09-26 06:02:50 -07:00
/**
* @file efiGpio.cpp
*
* @date Sep 26, 2014
* @author Andrey Belomutskiy, (c) 2012-2014
*/
#include "main.h"
#include "efiGpio.h"
#include "io_pins.h"
// todo: clean this mess, this should become 'static'/private
OutputPin outputs[IO_PIN_COUNT];
2014-09-27 15:03:08 -07:00
pin_output_mode_e *pinDefaultState[IO_PIN_COUNT];
2014-09-26 06:02:50 -07:00
2014-09-27 12:03:45 -07:00
int getOutputPinValue(io_pin_e pin) {
return getLogicPinValue(&outputs[pin]);
}
2014-09-26 06:02:50 -07:00
2014-09-27 12:03:45 -07:00
/**
2014-11-08 08:09:38 -08:00
* This is used from fatal error handler so it's a macro to be sure that stack is not used
2014-09-27 12:03:45 -07:00
*/
int getElectricalValue(int logicalValue, pin_output_mode_e mode) {
efiAssert(mode <= OM_OPENDRAIN_INVERTED, "invalid pin_output_mode_e", -1);
return logicalValue ? getElectricalValue1(mode) : getElectricalValue0(mode);
}
2014-09-27 15:03:08 -07:00
/**
* @brief Sets the value according to current electrical settings
*/
void setOutputPinValue(io_pin_e pin, int logicValue) {
2014-09-27 16:02:54 -07:00
#if EFI_PROD_CODE
2014-09-27 15:03:08 -07:00
if (outputs[pin].port == GPIO_NULL)
return;
efiAssertVoid(pinDefaultState[pin]!=NULL, "pin mode not initialized");
pin_output_mode_e mode = *pinDefaultState[pin];
2014-10-13 06:03:11 -07:00
#else
pin_output_mode_e mode = OM_DEFAULT;
#endif
2014-09-27 15:03:08 -07:00
setPinValue(&outputs[pin], getElectricalValue(logicValue, mode), logicValue);
}
2014-09-29 17:02:57 -07:00
bool isPinAssigned(io_pin_e pin) {
#if EFI_PROD_CODE
return outputs[pin].port != GPIO_NULL;
#else
return true;
#endif
}