diff --git a/firmware/controllers/alternatorController.cpp b/firmware/controllers/alternatorController.cpp index 5c4fdbafd2..9854fa5c28 100644 --- a/firmware/controllers/alternatorController.cpp +++ b/firmware/controllers/alternatorController.cpp @@ -26,9 +26,9 @@ EXTERN_ENGINE static Logging *logger; extern pin_output_mode_e DEFAULT_OUTPUT; +extern engine_pins_s enginePins; static SimplePwm alternatorControl; -static OutputPin alternatorPin; static pid_s *altPidS = &persistentState.persistentConfiguration.engineConfiguration.alternatorControl; static Pid altPid(altPidS, 1, 90); @@ -71,7 +71,7 @@ static msg_t AltCtrlThread(int param) { if (boardConfiguration->onOffAlternatorLogic) { float h = 0.1; bool newState = (vBatt < targetVoltage - h) || (currentPlainOnOffState && vBatt < targetVoltage); - alternatorPin.setValue(newState); + enginePins.alternatorPin.setValue(newState); currentPlainOnOffState = newState; if (engineConfiguration->debugMode == ALTERNATOR) { tsOutputChannels.debugIntField1 = newState; @@ -151,12 +151,12 @@ void initAlternatorCtrl(Logging *sharedLogger) { return; if (boardConfiguration->onOffAlternatorLogic) { - outputPinRegisterExt2("on/off alternator", &alternatorPin, boardConfiguration->alternatorControlPin, + outputPinRegisterExt2("on/off alternator", &enginePins.alternatorPin, boardConfiguration->alternatorControlPin, &DEFAULT_OUTPUT); } else { startSimplePwmExt(&alternatorControl, "Alternator control", boardConfiguration->alternatorControlPin, - &alternatorPin, + &enginePins.alternatorPin, engineConfiguration->alternatorPwmFrequency, 0.1, applyAlternatorPinState); } chThdCreateStatic(alternatorControlThreadStack, sizeof(alternatorControlThreadStack), LOWPRIO, diff --git a/firmware/controllers/idle_thread.cpp b/firmware/controllers/idle_thread.cpp index cb90711e0c..0acdb5d52b 100644 --- a/firmware/controllers/idle_thread.cpp +++ b/firmware/controllers/idle_thread.cpp @@ -40,11 +40,11 @@ static THD_WORKING_AREA(ivThreadStack, UTILITY_THREAD_STACK_SIZE); static Logging *logger; extern TunerStudioOutputChannels tsOutputChannels; +extern engine_pins_s enginePins; EXTERN_ENGINE ; // todo: extract interface for idle valve hardware, with solenoid and stepper implementations? -static OutputPin idleSolenoidPin; static SimplePwm idleSolenoid; static StepperMotor iacMotor; @@ -290,7 +290,7 @@ static void initIdleHardware() { /** * Start PWM for idleValvePin */ - startSimplePwmExt(&idleSolenoid, "Idle Valve", boardConfiguration->idle.solenoidPin, &idleSolenoidPin, + startSimplePwmExt(&idleSolenoid, "Idle Valve", boardConfiguration->idle.solenoidPin, &enginePins.idleSolenoidPin, boardConfiguration->idle.solenoidFrequency, boardConfiguration->manIdlePosition / 100, applyIdleSolenoidPinState); } diff --git a/firmware/controllers/injector_central.cpp b/firmware/controllers/injector_central.cpp index 406ec05951..6e19fd31df 100644 --- a/firmware/controllers/injector_central.cpp +++ b/firmware/controllers/injector_central.cpp @@ -222,7 +222,7 @@ static msg_t benchThread(int param) { extern engine_configuration_s activeConfiguration; -static void unregister(brain_pin_e currentPin, OutputPin *output) { +void unregister(brain_pin_e currentPin, OutputPin *output) { if (currentPin == GPIO_UNASSIGNED) return; scheduleMsg(logger, "unregistering %s", hwPortname(currentPin)); @@ -232,7 +232,7 @@ static void unregister(brain_pin_e currentPin, OutputPin *output) { void stopIgnitionPins(void) { for (int i = 0; i < IGNITION_PIN_COUNT; i++) { - NamedOutputPin *output = &enginePins.injectors[i]; + NamedOutputPin *output = &enginePins.coils[i]; brain_pin_e currentPin = activeConfiguration.bc.ignitionPins[i]; if (engineConfiguration->bc.ignitionPins[i] != currentPin) { unregister(currentPin, output); diff --git a/firmware/controllers/injector_central.h b/firmware/controllers/injector_central.h index b81a0ecf40..b3549b883d 100644 --- a/firmware/controllers/injector_central.h +++ b/firmware/controllers/injector_central.h @@ -24,6 +24,7 @@ void assertCylinderId(int cylinderId, const char *msg); void stopInjectionPins(void); void startInjectionPins(void); +void unregister(brain_pin_e currentPin, OutputPin *output); void stopIgnitionPins(void); void startIgnitionPins(void); diff --git a/firmware/controllers/system/efiGpio.h b/firmware/controllers/system/efiGpio.h index 1ad52daf87..ab95526edf 100644 --- a/firmware/controllers/system/efiGpio.h +++ b/firmware/controllers/system/efiGpio.h @@ -65,6 +65,9 @@ public: OutputPin o2heater; // OutputPin alternatorField; OutputPin errorLedPin; + OutputPin idleSolenoidPin; + OutputPin alternatorPin; + InjectorOutputPin injectors[INJECTION_PIN_COUNT]; NamedOutputPin coils[IGNITION_PIN_COUNT]; diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index ddc06b0bdf..b6b9c99606 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -51,6 +51,8 @@ EXTERN_ENGINE ; extern bool hasFirmwareErrorFlag; +extern engine_configuration_s activeConfiguration; +extern engine_pins_s enginePins; static Mutex spiMtx; @@ -201,13 +203,79 @@ void turnOnHardware(Logging *sharedLogger) { #endif /* EFI_SHAFT_POSITION_INPUT */ } +static void unregisterPin(brain_pin_e currentPin, brain_pin_e prevPin) { + if (currentPin != prevPin) { + unmarkPin(prevPin); + } +} + +void stopSpi(spi_device_e device) { + if (!isSpiInitialized[device]) + return; // not turned on + isSpiInitialized[device] = false; + unmarkPin(getSckPin(device)); + unmarkPin(getMisoPin(device)); + unmarkPin(getMosiPin(device)); +} + void applyNewHardwareSettings(void) { #if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) applyNewTriggerInputPins(); #endif /* EFI_SHAFT_POSITION_INPUT */ - stopInjectionPins(); + + // all 'stop' methods need to go before we begin starting pins + + stopInjectionPins(); stopIgnitionPins(); + if (engineConfiguration->bc.is_enabled_spi_2 != activeConfiguration.bc.is_enabled_spi_2) + stopSpi(SPI_DEVICE_2); + + if (engineConfiguration->bc.is_enabled_spi_2 != activeConfiguration.bc.is_enabled_spi_2) + stopSpi(SPI_DEVICE_3); + + + { + brain_pin_e currentPin = activeConfiguration.bc.fuelPumpPin; + if (engineConfiguration->bc.fuelPumpPin != currentPin) { + unregister(currentPin, &enginePins.fuelPumpRelay); + } + } + unregisterPin(engineConfiguration->bc.HD44780_rs, activeConfiguration.bc.HD44780_rs); + unregisterPin(engineConfiguration->bc.HD44780_e, activeConfiguration.bc.HD44780_e); + unregisterPin(engineConfiguration->bc.HD44780_db4, activeConfiguration.bc.HD44780_db4); + unregisterPin(engineConfiguration->bc.HD44780_db5, activeConfiguration.bc.HD44780_db5); + unregisterPin(engineConfiguration->bc.HD44780_db6, activeConfiguration.bc.HD44780_db6); + unregisterPin(engineConfiguration->bc.HD44780_db7, activeConfiguration.bc.HD44780_db7); + + unregisterPin(engineConfiguration->bc.clutchUpPin, activeConfiguration.bc.clutchUpPin); + + + { + brain_pin_e currentPin = activeConfiguration.bc.fanPin; + if (engineConfiguration->bc.fanPin != currentPin) { + unregister(currentPin, &enginePins.fanRelay); + } + } + { + brain_pin_e currentPin = activeConfiguration.bc.idle.solenoidPin; + if (engineConfiguration->bc.idle.solenoidPin != currentPin) { + unregister(currentPin, &enginePins.idleSolenoidPin); + } + } + { + brain_pin_e currentPin = activeConfiguration.bc.alternatorControlPin; + if (engineConfiguration->bc.alternatorControlPin != currentPin) { + unregister(currentPin, &enginePins.alternatorPin); + } + } + { + brain_pin_e currentPin = activeConfiguration.bc.mainRelayPin; + if (engineConfiguration->bc.mainRelayPin != currentPin) { + unregister(currentPin, &enginePins.mainRelay); + } + } + startInjectionPins(); startIgnitionPins(); } diff --git a/firmware/hw_layer/pin_repository.cpp b/firmware/hw_layer/pin_repository.cpp index 34a4287a90..eb28f2122a 100644 --- a/firmware/hw_layer/pin_repository.cpp +++ b/firmware/hw_layer/pin_repository.cpp @@ -61,6 +61,7 @@ const char *portname(ioportid_t GPIOx) { } static int getPortIndex(ioportid_t port) { + efiAssert(port != NULL, "null port", -1); if (port == GPIOA) return 0; if (port == GPIOB) @@ -79,7 +80,7 @@ static int getPortIndex(ioportid_t port) { if (port == GPIOH) return 6; #endif /* defined(STM32F4XX) */ - firmwareError("portindex"); + firmwareError("unknown port"); return -1; } diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index cff342d312..52160d79c7 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -284,7 +284,7 @@ void firmwareError(const char *errorMsg, ...) { } } -static char UNUSED_RAM_SIZE[1400]; +static char UNUSED_RAM_SIZE[1300]; static char UNUSED_CCM_SIZE[8500] CCM_OPTIONAL;