From 9c2a6420b4b9a3237d5f6ffbfc33a348510fcb4f Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Mon, 26 Feb 2024 11:30:08 -0800 Subject: [PATCH] support spi4/5/6 --- firmware/config/stm32f4ems/efifeatures.h | 9 +-- firmware/controllers/algo/rusefi_enums.h | 2 + firmware/hw_layer/hardware.cpp | 19 +++++- firmware/hw_layer/ports/cypress/mpu_util.cpp | 2 +- firmware/hw_layer/ports/kinetis/mpu_util.cpp | 2 +- .../hw_layer/ports/stm32/stm32_common.cpp | 68 ++++++++++++++++--- firmware/integration/rusefi_config.txt | 16 ++++- 7 files changed, 99 insertions(+), 19 deletions(-) diff --git a/firmware/config/stm32f4ems/efifeatures.h b/firmware/config/stm32f4ems/efifeatures.h index 69dd0482ec..c6aaa40803 100644 --- a/firmware/config/stm32f4ems/efifeatures.h +++ b/firmware/config/stm32f4ems/efifeatures.h @@ -320,14 +320,11 @@ #define EFI_INTERNAL_FAST_ADC_GPT &GPTD6 #define EFI_SPI1_AF 5 - #define EFI_SPI2_AF 5 - -/** - * This section is for right-side center SPI - */ - #define EFI_SPI3_AF 6 +#define EFI_SPI4_AF 5 +#define EFI_SPI5_AF 5 +#define EFI_SPI6_AF 6 /** * Patched version of ChibiOS/RT support extra details in the system error messages diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h index 8dfd75b619..edda4ba69c 100644 --- a/firmware/controllers/algo/rusefi_enums.h +++ b/firmware/controllers/algo/rusefi_enums.h @@ -291,6 +291,8 @@ typedef enum __attribute__ ((__packed__)) { SPI_DEVICE_2 = 2, SPI_DEVICE_3 = 3, SPI_DEVICE_4 = 4, + SPI_DEVICE_5 = 5, + SPI_DEVICE_6 = 6, } spi_device_e; typedef enum __attribute__ ((__packed__)) { diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index 41fdf588f0..4112771265 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -64,7 +64,7 @@ #endif #if HAL_USE_SPI -extern bool isSpiInitialized[5]; +extern bool isSpiInitialized[6]; /** * Only one consumer can use SPI bus at a given time @@ -79,7 +79,6 @@ void unlockSpi(spi_device_e device) { } static void initSpiModules() { - UNUSED(engineConfiguration); if (engineConfiguration->is_enabled_spi_1) { turnOnSpi(SPI_DEVICE_1); } @@ -92,6 +91,12 @@ static void initSpiModules() { if (engineConfiguration->is_enabled_spi_4) { turnOnSpi(SPI_DEVICE_4); } + if (engineConfiguration->is_enabled_spi_5) { + turnOnSpi(SPI_DEVICE_5); + } + if (engineConfiguration->is_enabled_spi_6) { + turnOnSpi(SPI_DEVICE_6); + } } /** @@ -120,6 +125,16 @@ SPIDriver * getSpiDevice(spi_device_e spiDevice) { if (spiDevice == SPI_DEVICE_4) { return &SPID4; } +#endif +#if STM32_SPI_USE_SPI5 + if (spiDevice == SPI_DEVICE_5) { + return &SPID5; + } +#endif +#if STM32_SPI_USE_SPI6 + if (spiDevice == SPI_DEVICE_6) { + return &SPID6; + } #endif firmwareError(ObdCode::CUSTOM_ERR_UNEXPECTED_SPI, "Unexpected SPI device: %d", spiDevice); return NULL; diff --git a/firmware/hw_layer/ports/cypress/mpu_util.cpp b/firmware/hw_layer/ports/cypress/mpu_util.cpp index deabdc280a..abce014abe 100644 --- a/firmware/hw_layer/ports/cypress/mpu_util.cpp +++ b/firmware/hw_layer/ports/cypress/mpu_util.cpp @@ -56,7 +56,7 @@ void HardFaultVector(void) { } #if HAL_USE_SPI || defined(__DOXYGEN__) -bool isSpiInitialized[5] = { false, false, false, false, false }; +bool isSpiInitialized[6] = { false, false, false, false, false, false }; static int getSpiAf(SPIDriver *driver) { #if STM32_SPI_USE_SPI1 diff --git a/firmware/hw_layer/ports/kinetis/mpu_util.cpp b/firmware/hw_layer/ports/kinetis/mpu_util.cpp index 939f843654..c19e09e91e 100644 --- a/firmware/hw_layer/ports/kinetis/mpu_util.cpp +++ b/firmware/hw_layer/ports/kinetis/mpu_util.cpp @@ -48,7 +48,7 @@ void HardFaultVector(void) { } #if HAL_USE_SPI || defined(__DOXYGEN__) -bool isSpiInitialized[5] = { false, false, false, false, false }; +bool isSpiInitialized[6] = { false, false, false, false, false, false }; static int getSpiAf(SPIDriver *driver) { #if STM32_SPI_USE_SPI1 diff --git a/firmware/hw_layer/ports/stm32/stm32_common.cpp b/firmware/hw_layer/ports/stm32/stm32_common.cpp index 9eefce2634..2a2367656c 100644 --- a/firmware/hw_layer/ports/stm32/stm32_common.cpp +++ b/firmware/hw_layer/ports/stm32/stm32_common.cpp @@ -463,7 +463,7 @@ EXTERNC int getRemainingStack(thread_t *otp) { } #if HAL_USE_SPI -bool isSpiInitialized[5] = { false, false, false, false, false }; +bool isSpiInitialized[6] = { false, false, false, false, false, false}; static int getSpiAf(SPIDriver *driver) { #if STM32_SPI_USE_SPI1 @@ -480,6 +480,21 @@ static int getSpiAf(SPIDriver *driver) { if (driver == &SPID3) { return EFI_SPI3_AF; } +#endif +#if STM32_SPI_USE_SPI4 + if (driver == &SPID4) { + return EFI_SPI4_AF; + } +#endif +#if STM32_SPI_USE_SPI5 + if (driver == &SPID5) { + return EFI_SPI5_AF; + } +#endif +#if STM32_SPI_USE_SPI6 + if (driver == &SPID6) { + return EFI_SPI6_AF; + } #endif return -1; } @@ -492,6 +507,12 @@ brain_pin_e getMisoPin(spi_device_e device) { return engineConfiguration->spi2misoPin; case SPI_DEVICE_3: return engineConfiguration->spi3misoPin; + case SPI_DEVICE_4: + return engineConfiguration->spi4misoPin; + case SPI_DEVICE_5: + return engineConfiguration->spi5misoPin; + case SPI_DEVICE_6: + return engineConfiguration->spi6misoPin; default: break; } @@ -506,6 +527,12 @@ brain_pin_e getMosiPin(spi_device_e device) { return engineConfiguration->spi2mosiPin; case SPI_DEVICE_3: return engineConfiguration->spi3mosiPin; + case SPI_DEVICE_4: + return engineConfiguration->spi4mosiPin; + case SPI_DEVICE_5: + return engineConfiguration->spi5mosiPin; + case SPI_DEVICE_6: + return engineConfiguration->spi6mosiPin; default: break; } @@ -520,6 +547,12 @@ brain_pin_e getSckPin(spi_device_e device) { return engineConfiguration->spi2sckPin; case SPI_DEVICE_3: return engineConfiguration->spi3sckPin; + case SPI_DEVICE_4: + return engineConfiguration->spi4sckPin; + case SPI_DEVICE_5: + return engineConfiguration->spi5sckPin; + case SPI_DEVICE_6: + return engineConfiguration->spi6sckPin; default: break; } @@ -531,9 +564,7 @@ void turnOnSpi(spi_device_e device) { return; // already initialized isSpiInitialized[device] = true; if (device == SPI_DEVICE_1) { -// todo: introduce a nice structure with all fields for same SPI #if STM32_SPI_USE_SPI1 -// scheduleMsg(&logging, "Turning on SPI1 pins"); initSpiModule(&SPID1, getSckPin(device), getMisoPin(device), getMosiPin(device), @@ -544,7 +575,6 @@ void turnOnSpi(spi_device_e device) { } if (device == SPI_DEVICE_2) { #if STM32_SPI_USE_SPI2 -// scheduleMsg(&logging, "Turning on SPI2 pins"); initSpiModule(&SPID2, getSckPin(device), getMisoPin(device), getMosiPin(device), @@ -555,7 +585,6 @@ void turnOnSpi(spi_device_e device) { } if (device == SPI_DEVICE_3) { #if STM32_SPI_USE_SPI3 -// scheduleMsg(&logging, "Turning on SPI3 pins"); initSpiModule(&SPID3, getSckPin(device), getMisoPin(device), getMosiPin(device), @@ -566,11 +595,34 @@ void turnOnSpi(spi_device_e device) { } if (device == SPI_DEVICE_4) { #if STM32_SPI_USE_SPI4 -// scheduleMsg(&logging, "Turning on SPI4 pins"); - /* there are no configuration fields for SPI4 in engineConfiguration, rely on board init code - * it should set proper functions for SPI4 pins */ + initSpiModule(&SPID4, getSckPin(device), + getMisoPin(device), + getMosiPin(device), + engineConfiguration->spi4SckMode, + engineConfiguration->spi4MosiMode, + engineConfiguration->spi4MisoMode); #endif /* STM32_SPI_USE_SPI4 */ } + if (device == SPI_DEVICE_5) { +#if STM32_SPI_USE_SPI5 + initSpiModule(&SPID5, getSckPin(device), + getMisoPin(device), + getMosiPin(device), + engineConfiguration->spi5SckMode, + engineConfiguration->spi5MosiMode, + engineConfiguration->spi5MisoMode); +#endif /* STM32_SPI_USE_SPI5 */ + } + if (device == SPI_DEVICE_6) { +#if STM32_SPI_USE_SPI6 + initSpiModule(&SPID6, getSckPin(device), + getMisoPin(device), + getMosiPin(device), + engineConfiguration->spi6SckMode, + engineConfiguration->spi6MosiMode, + engineConfiguration->spi6MisoMode); +#endif /* STM32_SPI_USE_SPI6 */ + } } void initSpiModule(SPIDriver *driver, brain_pin_e sck, brain_pin_e miso, diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 93a3d55425..f5d9270089 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -432,6 +432,8 @@ bit useFordRedundantPps;On some Ford and Toyota vehicles one of the pedal sensor bit cltSensorPulldown bit iatSensorPulldown bit allowIdenticalPps +bit is_enabled_spi_5 +bit is_enabled_spi_6 int16_t tpsMin;Closed throttle, 1 volt = 200 units;"ADC", 1, 0, 0, 1023, 0 int16_t tpsMax;Full throttle, 1 volt = 200 units;"ADC", 1, 0, 0, 1023, 0 @@ -1489,7 +1491,19 @@ pin_input_mode_e[LUA_DIGITAL_INPUT_COUNT iterate] luaDigitalInputPinModes; output_pin_e speedometerOutputPin uint16_t speedometerPulsePerKm;Number of speedometer pulses per kilometer travelled.;"", 1, 0, 0, 65000, 0 -uint8_t[246] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 + Gpio spi4mosiPin; + Gpio spi4misoPin; + Gpio spi4sckPin; + + Gpio spi5mosiPin; + Gpio spi5misoPin; + Gpio spi5sckPin; + + Gpio spi6mosiPin; + Gpio spi6misoPin; + Gpio spi6sckPin; + +uint8_t[237] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 ! end of engine_configuration_s end_struct