rusefi/firmware/controllers/system/efi_gpio.h

176 lines
4.6 KiB
C
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
2019-03-29 06:11:13 -07:00
* @file efi_gpio.h
2017-04-21 10:36:51 -07:00
* @brief EFI-related GPIO code
*
2015-07-10 06:01:56 -07:00
*
* @date Sep 26, 2014
2020-01-07 21:02:40 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*/
#pragma once
2015-07-10 06:01:56 -07:00
2018-09-16 19:26:57 -07:00
#include "global.h"
#include "io_pins.h"
2019-09-19 18:41:52 -07:00
#include "engine_configuration.h"
2022-09-07 16:35:52 -07:00
#include "injection_gpio.h"
2015-07-10 06:01:56 -07:00
void initPrimaryPins();
2023-11-24 11:37:01 -08:00
void initMiscOutputPins();
2017-04-21 10:36:51 -07:00
2019-04-12 19:07:03 -07:00
#if EFI_GPIO_HARDWARE
2017-04-21 10:36:51 -07:00
void turnAllPinsOff(void);
2017-04-21 12:14:37 -07:00
#else /* EFI_GPIO_HARDWARE */
2017-04-21 10:36:51 -07:00
#define turnAllPinsOff() {}
2017-04-21 12:14:37 -07:00
#endif /* EFI_GPIO_HARDWARE */
2016-10-31 19:02:12 -07:00
class IgnitionOutputPin : public NamedOutputPin {
public:
IgnitionOutputPin();
void setHigh() override;
void setLow() override;
2016-10-31 19:02:12 -07:00
void reset();
2016-11-01 20:01:54 -07:00
int signalFallSparkId;
bool outOfOrder; // https://sourceforge.net/p/rusefi/tickets/319/
int8_t coilIndex;
2016-10-31 19:02:12 -07:00
};
2020-11-09 16:47:10 -08:00
/**
* OutputPin with semi-automated init/deinit on configuration change
*/
class RegisteredOutputPin : public virtual OutputPin {
public:
2022-10-23 05:25:47 -07:00
RegisteredOutputPin(const char *registrationName, size_t pinOffset, size_t pinModeOffset);
2023-06-05 07:23:20 -07:00
RegisteredOutputPin(const char *registrationName, size_t pinOffset);
void init();
void unregister();
2022-10-23 05:25:47 -07:00
RegisteredOutputPin* const next;
2023-11-01 14:54:57 -07:00
const char* getRegistrationName() const {
return registrationName;
}
private:
2023-11-01 14:54:57 -07:00
const char* const registrationName;
2022-10-23 05:25:47 -07:00
const uint16_t m_pinOffset;
2023-06-05 07:23:20 -07:00
const bool m_hasPinMode;
2022-10-23 05:25:47 -07:00
const uint16_t m_pinModeOffset;
bool isPinConfigurationChanged();
};
class RegisteredNamedOutputPin : public RegisteredOutputPin, public NamedOutputPin {
public:
2023-10-15 14:59:39 -07:00
RegisteredNamedOutputPin(const char* name, size_t pinOffset, size_t pinModeOffset);
2023-10-31 05:56:16 -07:00
RegisteredNamedOutputPin(const char* name, size_t pinOffset);
};
class EnginePins {
2016-09-06 21:02:11 -07:00
public:
2016-11-03 20:02:58 -07:00
EnginePins();
2021-07-09 14:02:25 -07:00
void startPins();
2016-11-01 06:02:29 -07:00
void reset();
static void debug();
2016-11-03 20:02:58 -07:00
bool stopPins();
2021-07-09 14:02:25 -07:00
void unregisterPins();
2023-10-11 07:33:39 -07:00
OutputPin *getOutputPinForBenchMode(bench_mode_e idx);
RegisteredOutputPin mainRelay;
2020-11-03 10:19:56 -08:00
/**
* High Pressure Fuel Pump valve control
*/
2020-11-09 18:41:13 -08:00
RegisteredNamedOutputPin hpfpValve;
2020-03-24 22:28:37 -07:00
// this one cranks engine
RegisteredOutputPin starterControl;
2020-11-02 20:52:26 -08:00
// this one prevents driver from cranking engine
RegisteredOutputPin starterRelayDisable;
2020-03-24 22:28:37 -07:00
RegisteredOutputPin fanRelay;
RegisteredOutputPin fanRelay2;
2019-09-08 13:45:02 -07:00
// see acRelayPin
RegisteredOutputPin acRelay;
RegisteredOutputPin fuelPumpRelay;
2023-10-31 05:56:16 -07:00
#if EFI_HD_ACR
RegisteredNamedOutputPin harleyAcr;
2023-03-05 18:19:57 -08:00
RegisteredOutputPin harleyAcr2;
2023-10-31 05:56:16 -07:00
#endif // EFI_HD_ACR
2023-11-15 12:55:12 -08:00
// todo: shall we rename this to narrowBandO2heater or even remove the whole questionable feature?
2015-07-10 06:01:56 -07:00
OutputPin o2heater;
2022-08-24 10:20:14 -07:00
OutputPin luaOutputPins[LUA_PWM_COUNT];
2017-01-30 03:02:53 -08:00
/**
* brain board RED LED by default
*/
2017-02-24 16:42:34 -08:00
OutputPin errorLedPin;
2018-07-26 12:51:06 -07:00
OutputPin communicationLedPin; // blue LED on brain board by default
OutputPin warningLedPin; // orange LED on brain board by default
OutputPin runningLedPin; // green LED on brain board by default
2017-02-24 16:42:34 -08:00
OutputPin debugTriggerSync;
RegisteredOutputPin boostPin;
RegisteredOutputPin idleSolenoidPin;
RegisteredOutputPin secondIdleSolenoidPin;
RegisteredOutputPin alternatorPin;
2017-01-30 03:02:53 -08:00
/**
* this one is usually on the gauge cluster, not on the ECU
*/
RegisteredOutputPin checkEnginePin;
2017-11-26 19:30:37 -08:00
2023-10-15 14:59:39 -07:00
RegisteredOutputPin tachOut;
RegisteredOutputPin triggerDecoderErrorPin;
2023-10-15 14:59:39 -07:00
RegisteredOutputPin speedoOut;
2016-09-14 16:03:00 -07:00
OutputPin sdCsPin;
2017-08-27 21:08:37 -07:00
OutputPin accelerometerCs;
2016-09-13 21:03:14 -07:00
InjectorOutputPin injectors[MAX_CYLINDER_COUNT];
InjectorOutputPin injectorsStage2[MAX_CYLINDER_COUNT];
IgnitionOutputPin coils[MAX_CYLINDER_COUNT];
IgnitionOutputPin trailingCoils[MAX_CYLINDER_COUNT];
2017-11-26 19:30:37 -08:00
NamedOutputPin auxValve[AUX_DIGITAL_VALVE_COUNT];
2020-12-22 11:03:54 -08:00
OutputPin tcuSolenoids[TCU_SOLENOID_COUNT];
OutputPin tcuTccOnoffSolenoid;
OutputPin tcuTccPwmSolenoid;
OutputPin tcuPcSolenoid;
OutputPin tcu32Solenoid;
2020-12-22 11:03:54 -08:00
private:
2021-07-09 14:02:25 -07:00
void startInjectionPins();
void startIgnitionPins();
void startAuxValves();
2021-07-09 14:02:25 -07:00
void stopInjectionPins();
void stopIgnitionPins();
void stopAuxValves();
2016-09-06 21:02:11 -07:00
};
2015-07-10 06:01:56 -07:00
/**
* it's a macro to be sure that stack is not used
* @return 0 for OM_DEFAULT and OM_OPENDRAIN
*/
#define getElectricalValue0(mode) ((mode) == OM_INVERTED || (mode) == OM_OPENDRAIN_INVERTED)
/**
* it's a macro to be sure that stack is not used
* @return 1 for OM_DEFAULT and OM_OPENDRAIN
*/
#define getElectricalValue1(mode) ((mode) == OM_DEFAULT || (mode) == OM_OPENDRAIN)
#define getElectricalValue(logicalValue, mode) \
(logicalValue ? getElectricalValue1(mode) : getElectricalValue0(mode))
2019-04-12 19:07:03 -07:00
#if EFI_GPIO_HARDWARE
2017-04-21 14:38:13 -07:00
2023-08-30 20:59:40 -07:00
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin);
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin);
2023-05-24 06:30:19 -07:00
ioportid_t * getGpioPorts();
2017-04-21 13:20:06 -07:00
const char *portname(ioportid_t GPIOx);
2017-04-21 09:31:17 -07:00
2017-04-21 13:20:06 -07:00
#endif /* EFI_GPIO_HARDWARE */
brain_pin_e parseBrainPin(const char *str);
extern EnginePins enginePins;
2023-06-04 23:32:14 -07:00
#ifndef LED_PIN_MODE
#define LED_PIN_MODE OM_DEFAULT
#endif /* LED_PIN_MODE */