19#if EFI_ELECTRONIC_THROTTLE_BODY
26static const char*
const sparkNames[] = {
"Coil 1",
"Coil 2",
"Coil 3",
"Coil 4",
"Coil 5",
"Coil 6",
"Coil 7",
"Coil 8",
27 "Coil 9",
"Coil 10",
"Coil 11",
"Coil 12"};
29static const char*
const trailNames[] = {
"Trail 1",
"Trail 2",
"Trail 3",
"Trail 4",
"Trail 5",
"Trail 6",
"Trail 7",
"Trail 8",
30 "Trail 9",
"Trail 10",
"Trail 11",
"Trail 12"};
32static const char*
const trailShortNames[] = {
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"rA",
"rB",
"rD" };
47static const char*
const sparkShortNames[] = { PROTOCOL_COIL_SHORT_PREFIX
"1", PROTOCOL_COIL_SHORT_PREFIX
"2",
"c3",
"c4",
"c5",
"c6",
"c7",
"c8",
48 "c9",
"cA",
"cB",
"cD"};
50static const char*
const injectorNames[] = {
"Injector 1",
"Injector 2",
"Injector 3",
"Injector 4",
"Injector 5",
"Injector 6",
51 "Injector 7",
"Injector 8",
"Injector 9",
"Injector 10",
"Injector 11",
"Injector 12"};
53static const char*
const injectorShortNames[] = { PROTOCOL_INJ_SHORT_PREFIX
"1", PROTOCOL_INJ_SHORT_PREFIX
"2",
"i3",
"i4",
"i5",
"i6",
"i7",
"i8",
54 "i9",
"iA",
"iB",
"iC"};
56static const char*
const injectorStage2Names[] = {
"Injector Second Stage 1",
"Injector Second Stage 2",
"Injector Second Stage 3",
"Injector Second Stage 4",
"Injector Second Stage 5",
"Injector Second Stage 6",
57 "Injector Second Stage 7",
"Injector Second Stage 8",
"Injector Second Stage 9",
"Injector Second Stage 10",
"Injector Second Stage 11",
"Injector Second Stage 12"};
59static const char*
const injectorStage2ShortNames[] = { PROTOCOL_INJ_STAGE2_SHORT_PREFIX
"1", PROTOCOL_INJ_STAGE2_SHORT_PREFIX
"2",
"j3",
"j4",
"j5",
"j6",
"j7",
"j8",
60 "j9",
"jA",
"jB",
"jC"};
77 , registrationName(p_registrationName)
78 , m_pinOffset(static_cast<uint16_t>(pinOffset))
80 , m_pinModeOffset(static_cast<uint16_t>(pinModeOffset))
88 , registrationName(p_registrationName)
89 , m_pinOffset(static_cast<uint16_t>(pinOffset))
101 bool pinChanged = curPin != newPin;
109 return pinChanged || curMode != newMode;
122 newMode = OM_DEFAULT;
136#define CONFIG_OFFSET(x) (offsetof(engine_configuration_s, x))
139#define CONFIG_PIN_OFFSETS(x) CONFIG_OFFSET(x##Pin), CONFIG_OFFSET(x##PinMode)
143#define CONFIG_OFFSET2(x, y) (offsetof(engine_configuration_s, x) + offsetof(decltype(engine_configuration_s::x), y))
144#define CONFIG_PIN_OFFSETS2(x, y) CONFIG_OFFSET2(x, y##Pin), CONFIG_OFFSET2(x, y##PinMode)
148 mainRelay(
"Main Relay", CONFIG_PIN_OFFSETS(mainRelay)),
149 hpfpValve(
"HPFP Valve", CONFIG_PIN_OFFSETS(hpfpValve)),
150 starterControl(
"Starter Relay", CONFIG_PIN_OFFSETS(starterControl)),
152 fanRelay(
"Fan Relay", CONFIG_PIN_OFFSETS(fan)),
153 fanRelay2(
"Fan Relay 2", CONFIG_PIN_OFFSETS(fan2)),
154 acRelay(
"A/C Relay", CONFIG_PIN_OFFSETS(acRelay)),
155 fuelPumpRelay(
"Fuel pump Relay", CONFIG_PIN_OFFSETS(fuelPump)),
156 nitrousRelay(
"Nitrous Relay", CONFIG_PIN_OFFSETS(nitrousRelay)),
158 harleyAcr(
"Harley ACR", CONFIG_OFFSET(acrPin)),
159 harleyAcr2(
"Harley ACR 2", CONFIG_OFFSET(acrPin2)),
161 boostPin(
"Boost", CONFIG_PIN_OFFSETS(boostControl)),
162 idleSolenoidPin(
"Idle Valve", CONFIG_OFFSET2(idle, solenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
163 secondIdleSolenoidPin(
"Idle Valve#2", CONFIG_OFFSET(secondSolenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
165 checkEnginePin(
"checkEnginePin", CONFIG_PIN_OFFSETS(malfunctionIndicator)),
166 tachOut(
"tachOut", CONFIG_PIN_OFFSETS(tachOutput)),
167 triggerDecoderErrorPin(
"led: trigger debug", CONFIG_PIN_OFFSETS(triggerError)),
168 speedoOut(
"speedoOut", CONFIG_OFFSET(speedometerOutputPin))
175 static_assert(efi::size(
sparkNames) >= MAX_CYLINDER_COUNT,
"Too many ignition pins");
176 static_assert(efi::size(
trailNames) >= MAX_CYLINDER_COUNT,
"Too many ignition pins");
177 static_assert(efi::size(
injectorNames) >= MAX_CYLINDER_COUNT,
"Too many injection pins");
178 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
195 static_assert(efi::size(
auxValveShortNames) >= AUX_DIGITAL_VALVE_COUNT,
"Too many aux valve pins");
196 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT;i++) {
205#define unregisterOutputIfPinChanged(output, pin) { \
206 if (isConfigurationChanged(pin)) { \
211#define unregisterOutputIfPinOrModeChanged(output, pin, mode) { \
212 if (isPinOrModeChanged(pin, mode)) { \
219 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
225 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
238#if EFI_ELECTRONIC_THROTTLE_BODY
243 unregisterOutputIfPinChanged(
sdCsPin, sdCardCsPin);
247 while (
pin !=
nullptr) {
255 while (
pin !=
nullptr) {
256 efiPrintf(
"%s %d",
pin->getRegistrationName(),
pin->currentLogicValue);
262#if EFI_ENGINE_CONTROL
272 while (
pin !=
nullptr) {
279 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
287 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
288 unregisterOutputIfPinOrModeChanged(
enginePins.
coils[i], ignitionPins[i], ignitionPinMode);
294 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
295 unregisterOutputIfPinOrModeChanged(
enginePins.
injectors[i], injectionPins[i], injectionPinMode);
302 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
305 if (isConfigurationChanged(auxValves[i])) {
313 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
316 if (isConfigurationChanged(auxValves[i])) {
328 if (isPinOrModeChanged(trailingCoilPins[i], ignitionPinMode)) {
333 if (isPinOrModeChanged(ignitionPins[i], ignitionPinMode)) {
345 if (isPinOrModeChanged(injectionPins[i], injectionPinMode)) {
351 if (isPinOrModeChanged(injectionPinsStage2[i], injectionPinMode)) {
396 criticalError(
"Unexpected bench pin %d", index);
431 efiPrintf(
"pin %s goes high",
name);
434#if EFI_DEFAILED_LOGGING
441#if EFI_ENGINE_SNIFFER
453 efiPrintf(
"pin %s goes low",
name);
460#if EFI_ENGINE_SNIFFER
469 efiPrintf(
"turning off %s",
name);
546#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
547#if (BOARD_EXT_GPIOCHIPS > 0)
580 setValue(
nullptr, logicValue, isForce);
620 efiPrintf(
"pin goes %d", logicValue);
634 int electricalValue = getElectricalValue(logicValue,
mode);
637 #if (BOARD_EXT_GPIOCHIPS > 0)
660 this->
mode = outputMode;
666#if BOARD_EXT_GPIOCHIPS > 0
683#if EFI_SHAFT_POSITION_INPUT
694 initPin(p_msg, p_brainPin, OM_DEFAULT);
707 chibios_rt::CriticalSectionLocker csl;
709 if (!forceInitWithFatalError && hasFirmwareError()) {
722 if (outputMode > OM_OPENDRAIN_INVERTED) {
731#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
732 iomode_t l_mode = (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) ?
733 PAL_MODE_OUTPUT_PUSHPULL : PAL_MODE_OUTPUT_OPENDRAIN;
735 #if (BOARD_EXT_GPIOCHIPS > 0)
744 criticalError(
"OutputPin::initPin got invalid port for pin idx %d",
static_cast<int>(p_brainPin));
748 #if (BOARD_EXT_GPIOCHIPS > 0)
763#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
767 if (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) {
768#ifndef DISABLE_PIN_STATE_VALIDATION
772 const int logicalValue =
773 (outputMode == OM_INVERTED)
779 criticalError(
"HARDWARE VALIDATION FAILED %s: unexpected startup pin state %s actual value=%d logical value=%d mode=%s", msg,
hwPortname(
brainPin), actualValue, logicalValue,
getPin_output_mode_e(outputMode));
790 chibios_rt::CriticalSectionLocker csl;
797#if (BOARD_EXT_GPIOCHIPS > 0)
803#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
841 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
849#if EFI_PROD_CODE && HW_HELLEN
static SimplePwm alternatorControl("alt")
const char * getPin_output_mode_e(pin_output_mode_e value)
const OutputPin * getOutputOnTheBenchTest()
Utility methods related to bench testing.
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
TunerStudioOutputChannels outputChannels
RegisteredOutputPin harleyAcr2
RegisteredNamedOutputPin harleyAcr
OutputPin accelerometerCs
InjectorOutputPin injectorsStage2[MAX_CYLINDER_COUNT]
RegisteredOutputPin mainRelay
NamedOutputPin auxValve[AUX_DIGITAL_VALVE_COUNT]
RegisteredOutputPin fanRelay
IgnitionOutputPin trailingCoils[MAX_CYLINDER_COUNT]
RegisteredOutputPin starterControl
OutputPin debugTriggerSync
void startInjectionPins()
InjectorOutputPin injectors[MAX_CYLINDER_COUNT]
RegisteredOutputPin fuelPumpRelay
RegisteredOutputPin acRelay
OutputPin * getOutputPinForBenchMode(bench_mode_e idx)
IgnitionOutputPin coils[MAX_CYLINDER_COUNT]
RegisteredOutputPin checkEnginePin
RegisteredOutputPin idleSolenoidPin
RegisteredNamedOutputPin hpfpValve
int8_t overlappingCounter
const char * getName() const
void setName(const char *)
const char * getShortName() const
Single output pin reference and state.
brain_pin_diag_e getDiag() const
uint32_t durationsInStateMs[2]
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
bool getLogicValue() const
void setOnchipValue(int electricalValue)
bool getAndSet(int logicValue)
void setValue(const char *msg, int logicValue, bool isForce=false)
bool isInitialized() const
void setDefaultPinState(pin_output_mode_e mode)
RegisteredNamedOutputPin(const char *name, size_t pinOffset, size_t pinModeOffset)
const char *const registrationName
RegisteredOutputPin(const char *registrationName, size_t pinOffset, size_t pinModeOffset)
const uint16_t m_pinModeOffset
bool isPinConfigurationChanged()
const uint16_t m_pinOffset
void addConsoleAction(const char *token, Void callback)
Register console action without parameters.
int gpiochips_writePad(brain_pin_e pin, int value)
Set value to gpio of gpiochip.
brain_pin_diag_e gpiochips_getDiag(brain_pin_e pin)
Get diagnostic for given gpio.
ioportmask_t criticalErrorLedPin
static const char *const auxValveShortNames[]
static const char *const trailNames[]
static const char *const injectorNames[]
static RegisteredOutputPin * registeredOutputHead
ioportid_t criticalErrorLedPort
static const char *const sparkShortNames[]
uint8_t criticalErrorLedState
static const char *const injectorStage2Names[]
static const char *const sparkNames[]
static const char *const injectorShortNames[]
static const char *const injectorStage2ShortNames[]
static void initErrorLed(Gpio led)
void initMiscOutputPins()
static const char *const trailShortNames[]
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
static Engine *const engine
engine_configuration_s & activeConfiguration
static constexpr engine_configuration_s * engineConfiguration
void addEngineSnifferOutputPinEvent(NamedOutputPin *pin, FrontDirection frontDirection)
rusEfi console wave sniffer
@ BENCH_AC_COMPRESSOR_RELAY
@ BENCH_CHECK_ENGINE_LIGHT
@ BENCH_STARTER_ENABLE_RELAY
bool warning(ObdCode code, const char *fmt,...)
void firmwareError(ObdCode code, const char *fmt,...)
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
GPIO_TypeDef * ioportid_t
Port Identifier.
uint32_t iomode_t
Digital I/O modes.
void hellenDisableEnSilently()
void efiSetPadUnused(brain_pin_e brainPin)
void setMockState(brain_pin_e pin, bool state)
UNUSED(samplingTimeSeconds)
@ CUSTOM_INVALID_MODE_SETTING
@ CUSTOM_OBD_PIN_CONFLICT
const char * hwPortname(brain_pin_e brainPin)
bool brain_pin_is_onchip(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
starterRelayDisable("starterRelayDisable", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 401, 1.0, -10000.0, 10000.0, "")
output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT]
Gpio auxValves[AUX_DIGITAL_VALVE_COUNT]
output_pin_e injectionPins[MAX_CYLINDER_COUNT]
pin_output_mode_e ignitionPinMode
output_pin_e injectionPinsStage2[MAX_CYLINDER_COUNT]
pin_output_mode_e injectionPinMode
output_pin_e ignitionPins[MAX_CYLINDER_COUNT]
OutputPin * getVvtOutputPin(int index)