From ee5ee1942c28dbb51031a68320176caec1fce37a Mon Sep 17 00:00:00 2001 From: andreika-git Date: Thu, 31 Oct 2019 22:06:34 +0200 Subject: [PATCH] Kinetis & TLE8888 compatibility & fixes... (#991) * TLE8888: More compatibility & postTunerStudioState * activeConfiguration & EFI_ACTIVE_CONFIGURATION_IN_FLASH fix * Kinetis: jump_to_bootloader() impl. * Kinetis: UART baudrate safety check * Kinetis: OMG!.. --- .../ARMCMx/compilers/GCC/ld/MKE1xF512.ld | 9 ----- .../ports/KINETIS/LLD/UARTv2/hal_uart_lld.c | 9 ++++- firmware/config/boards/kinetis/efifeatures.h | 4 +- firmware/config/engines/custom_engine.cpp | 2 + firmware/config/engines/mazda_miata_1_6.cpp | 3 +- firmware/config/engines/mazda_miata_vvt.cpp | 3 +- firmware/console/status_loop.cpp | 9 +++++ .../controllers/algo/engine_configuration.cpp | 5 ++- firmware/controllers/global_shared.h | 2 +- firmware/hw_layer/drivers/gpio/tle8888.c | 37 +++++++++---------- firmware/hw_layer/drivers/gpio/tle8888.h | 5 +++ .../hw_layer/ports/kinetis/kinetis_common.cpp | 13 +++++++ firmware/hw_layer/ports/kinetis/mpu_util.h | 1 + unit_tests/engine_test_helper.cpp | 2 +- unit_tests/global.h | 2 +- 15 files changed, 67 insertions(+), 39 deletions(-) diff --git a/firmware/config/boards/kinetis/OS/os/common/startup/ARMCMx/compilers/GCC/ld/MKE1xF512.ld b/firmware/config/boards/kinetis/OS/os/common/startup/ARMCMx/compilers/GCC/ld/MKE1xF512.ld index c4633a5631..ad54edaa2a 100644 --- a/firmware/config/boards/kinetis/OS/os/common/startup/ARMCMx/compilers/GCC/ld/MKE1xF512.ld +++ b/firmware/config/boards/kinetis/OS/os/common/startup/ARMCMx/compilers/GCC/ld/MKE1xF512.ld @@ -44,7 +44,6 @@ MEMORY ram5 : org = 0x00000000, len = 0 ram6 : org = 0x00000000, len = 0 ram7 : org = 0x00000000, len = 0 - config : org = 0x00075000, len = 0xB000 } /* Flash region for the configuration bytes.*/ @@ -58,14 +57,6 @@ SECTIONS { KEEP(*(.cfmconfig)) } > flash1b - - .config : ALIGN(4) - { - . = ALIGN(4); - *(.config) - *(.config.*) - . = ALIGN(4); - } > config AT > config } /* For each data/text section two region are defined, a virtual region diff --git a/firmware/config/boards/kinetis/OS/os/hal/ports/KINETIS/LLD/UARTv2/hal_uart_lld.c b/firmware/config/boards/kinetis/OS/os/hal/ports/KINETIS/LLD/UARTv2/hal_uart_lld.c index f5095251e1..7492720ab1 100644 --- a/firmware/config/boards/kinetis/OS/os/hal/ports/KINETIS/LLD/UARTv2/hal_uart_lld.c +++ b/firmware/config/boards/kinetis/OS/os/hal/ports/KINETIS/LLD/UARTv2/hal_uart_lld.c @@ -203,7 +203,14 @@ void uart_lld_start(UARTDriver *uartp) { } #endif // Enable UART - LPUART_Init(uartp->lpuart, &lpuartConfig, KINETIS_UART_FREQUENCY); + status_t status = LPUART_Init(uartp->lpuart, &lpuartConfig, KINETIS_UART_FREQUENCY); + if (status == kStatus_LPUART_BaudrateNotSupport) { + // the only reason we could fail is wrong 'baudRate_Bps'. So let's give it a second chance... + static const int defaultBaudRate = 115200; + lpuartConfig.baudRate_Bps = defaultBaudRate; + status = LPUART_Init(uartp->lpuart, &lpuartConfig, KINETIS_UART_FREQUENCY); + assert (status == kStatus_Success); + } //LPUART_EnableInterrupts(uartp->lpuart, kLPUART_IdleLineInterruptEnable); diff --git a/firmware/config/boards/kinetis/efifeatures.h b/firmware/config/boards/kinetis/efifeatures.h index 96a7fec6e4..891dbe1d96 100644 --- a/firmware/config/boards/kinetis/efifeatures.h +++ b/firmware/config/boards/kinetis/efifeatures.h @@ -111,7 +111,7 @@ * It also has smaller pages so it takes less time to erase * * There is no remote access to FlexNVM meaning that we cannot erase settings externally - * / + */ #define FLASH_ADDR 0x10000000 // FlexNVM #define FLASH_ADDR_SECOND_COPY 0x10008000 @@ -407,7 +407,7 @@ #define EFI_PRINT_ERRORS_AS_WARNINGS TRUE #define EFI_PRINT_MESSAGES_TO_TERMINAL TRUE -#define EFI_ACTIVE_CONFIGURATION_IN_FLASH __attribute__((section (".config"))) +#define EFI_ACTIVE_CONFIGURATION_IN_FLASH FLASH_ADDR //#define PWM_PHASE_MAX_COUNT 122 diff --git a/firmware/config/engines/custom_engine.cpp b/firmware/config/engines/custom_engine.cpp index 6f8bc84af1..68a6444d29 100644 --- a/firmware/config/engines/custom_engine.cpp +++ b/firmware/config/engines/custom_engine.cpp @@ -389,6 +389,7 @@ void setTle8888TestConfiguration(DECLARE_CONFIG_PARAMETER_SIGNATURE) { * set engine_type 30 */ void mreBoardTest(DECLARE_CONFIG_PARAMETER_SIGNATURE) { +#if (BOARD_TLE8888_COUNT > 0) engineConfiguration->directSelfStimulation = true; // this engine type is used for board validation boardConfiguration->triggerSimulatorFrequency = 60; @@ -496,6 +497,7 @@ void mreBoardTest(DECLARE_CONFIG_PARAMETER_SIGNATURE) { // TLE8888 high current low side: VVT2 IN9 / OUT5 // GPIOE_10: "3 - Lowside 2" boardConfiguration->injectionPins[2 - 1] = GPIOE_10; +#endif /* BOARD_TLE8888_COUNT */ } #endif /* CONFIG_ENGINES_CUSTOM_ENGINE_CPP_ */ diff --git a/firmware/config/engines/mazda_miata_1_6.cpp b/firmware/config/engines/mazda_miata_1_6.cpp index 270c0639c4..47b56a231b 100644 --- a/firmware/config/engines/mazda_miata_1_6.cpp +++ b/firmware/config/engines/mazda_miata_1_6.cpp @@ -301,6 +301,7 @@ void setMiataNA6_VAF_Frankenso(DECLARE_CONFIG_PARAMETER_SIGNATURE) { * set engine_type 12 */ void setMiataNA6_VAF_MRE(DECLARE_CONFIG_PARAMETER_SIGNATURE) { +#if (BOARD_TLE8888_COUNT > 0) // idle.solenoidPin output is inherited from boards/microrusefi/board_configuration.cpp // CLT: "18 - AN temp 1" // IAT: "23 - AN temp 2" @@ -345,5 +346,5 @@ void setMiataNA6_VAF_MRE(DECLARE_CONFIG_PARAMETER_SIGNATURE) { setMiataNA6_settings(PASS_CONFIG_PARAMETER_SIGNATURE); miataNAcommonEngineSettings(PASS_CONFIG_PARAMETER_SIGNATURE); engineConfiguration->fuelAlgorithm = LM_PLAIN_MAF; - +#endif /* BOARD_TLE8888_COUNT */ } diff --git a/firmware/config/engines/mazda_miata_vvt.cpp b/firmware/config/engines/mazda_miata_vvt.cpp index 6565b60b7b..a0145039e7 100644 --- a/firmware/config/engines/mazda_miata_vvt.cpp +++ b/firmware/config/engines/mazda_miata_vvt.cpp @@ -486,6 +486,7 @@ void setMazdaMiata2003EngineConfigurationBoardTest(DECLARE_CONFIG_PARAMETER_SIGN * set engine_type 13 */ void setMiataNB2_MRE(DECLARE_CONFIG_PARAMETER_SIGNATURE) { +#if (BOARD_TLE8888_COUNT > 0) setMazdaMiataEngineNB2Defaults(PASS_CONFIG_PARAMETER_SIGNATURE); // MRE has a special main relay control low side pin - rusEfi firmware is totally not involved with main relay control @@ -564,5 +565,5 @@ void setMiataNB2_MRE(DECLARE_CONFIG_PARAMETER_SIGNATURE) { // 0.3#4 has wrong R139 as well? // 56k high side/10k low side multiplied by above analogInputDividerCoefficient = 11 engineConfiguration->vbattDividerCoeff = (66.0f / 10.0f) * engineConfiguration->analogInputDividerCoefficient; - +#endif /* BOARD_TLE8888_COUNT */ } diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index ffc901db0b..bb4891fdda 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -91,6 +91,10 @@ extern int icuWidthPeriodCounter; #include "fsio_impl.h" #endif /* EFI_FSIO */ +#if (BOARD_TLE8888_COUNT > 0) +#include "tle8888.h" +#endif /* BOARD_TLE8888_COUNT */ + #if EFI_ENGINE_SNIFFER #include "engine_sniffer.h" extern WaveChart waveChart; @@ -999,6 +1003,11 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ ionPostState(tsOutputChannels); #endif /* EFI_CDM_INTEGRATION */ break; + case DBG_TLE8888: +#if (BOARD_TLE8888_COUNT > 0) + tle8888PostState(tsOutputChannels); +#endif /* BOARD_TLE8888_COUNT */ + break; default: ; } diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index f1e4c7571c..8128999997 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -141,9 +141,10 @@ static fuel_table_t alphaNfuel = { * todo: place this field next to 'engineConfiguration'? */ #ifdef EFI_ACTIVE_CONFIGURATION_IN_FLASH -engine_configuration_s EFI_ACTIVE_CONFIGURATION_IN_FLASH activeConfiguration; +engine_configuration_s & activeConfiguration = *(engine_configuration_s *)EFI_ACTIVE_CONFIGURATION_IN_FLASH; #else -engine_configuration_s activeConfiguration; +static engine_configuration_s activeConfigurationLocalStorage; +engine_configuration_s & activeConfiguration = activeConfigurationLocalStorage; #endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */ extern engine_configuration_s *engineConfiguration; diff --git a/firmware/controllers/global_shared.h b/firmware/controllers/global_shared.h index 3d2dc9f3c3..14ab8d2ecf 100644 --- a/firmware/controllers/global_shared.h +++ b/firmware/controllers/global_shared.h @@ -28,7 +28,7 @@ #define EXTERN_CONFIG \ extern engine_configuration_s *engineConfiguration; \ extern board_configuration_s *boardConfiguration; \ - extern engine_configuration_s activeConfiguration; \ + extern engine_configuration_s & activeConfiguration; \ extern persistent_config_container_s persistentState; \ extern persistent_config_s *config; \ diff --git a/firmware/hw_layer/drivers/gpio/tle8888.c b/firmware/hw_layer/drivers/gpio/tle8888.c index 0a7ba6f6c2..5178d53ee7 100644 --- a/firmware/hw_layer/drivers/gpio/tle8888.c +++ b/firmware/hw_layer/drivers/gpio/tle8888.c @@ -40,13 +40,6 @@ #include "pin_repository.h" #include "os_util.h" -/* to be removed */ -#if EFI_TUNER_STUDIO -#include "engine_configuration.h" -EXTERN_CONFIG; -#include "tunerstudio.h" -#endif /* EFI_TUNER_STUDIO */ - /* * TODO list: */ @@ -118,6 +111,7 @@ static int reinitializationCounter = 0; static int initResponsesAccumulator = 0; static int initResponse0 = 0; static int initResponse1 = 0; +static uint16_t spiRxb = 0, spiTxb = 0; /* Driver private data */ @@ -150,6 +144,18 @@ static const char* tle8888_pin_names[TLE8888_OUTPUTS] = { "TLE8888.IGN1", "TLE8888.IGN2", "TLE8888.IGN3", "TLE8888.IGN4" }; +#if EFI_TUNER_STUDIO +void tle8888PostState(TunerStudioOutputChannels *tsOutputChannels) { + tsOutputChannels->debugIntField1 = tle8888SpiCounter; + tsOutputChannels->debugIntField2 = spiTxb; + tsOutputChannels->debugIntField3 = spiRxb; + tsOutputChannels->debugIntField4 = initResponsesAccumulator; + tsOutputChannels->debugIntField5 = reinitializationCounter; + tsOutputChannels->debugFloatField1 = initResponse0; + tsOutputChannels->debugFloatField2 = initResponse1; +} +#endif /* EFI_TUNER_STUDIO */ + /*==========================================================================*/ /* Driver local functions. */ /*==========================================================================*/ @@ -179,27 +185,18 @@ static int tle8888_spi_rw(struct tle8888_priv *chip, uint16_t tx, uint16_t *rx) /* Slave Select assertion. */ spiSelect(spi); /* Atomic transfer operations. */ - uint16_t rxb = spiPolledExchange(spi, tx); + spiRxb = spiPolledExchange(spi, tx); //spiExchange(spi, 2, &tx, &rxb); 8 bit version just in case? /* Slave Select de-assertion. */ spiUnselect(spi); /* Ownership release. */ spiReleaseBus(spi); -#if EFI_TUNER_STUDIO - if (engineConfiguration->debugMode == DBG_TLE8888) { - tsOutputChannels.debugIntField1 = tle8888SpiCounter++; - tsOutputChannels.debugIntField2 = tx; - tsOutputChannels.debugIntField3 = rxb; - tsOutputChannels.debugIntField4 = initResponsesAccumulator; - tsOutputChannels.debugIntField5 = reinitializationCounter; - tsOutputChannels.debugFloatField1 = initResponse0; - tsOutputChannels.debugFloatField2 = initResponse1; - } -#endif /* EFI_TUNER_STUDIO */ + spiTxb = tx; + tle8888SpiCounter++; if (rx) - *rx = rxb; + *rx = spiRxb; /* no errors for now */ return 0; diff --git a/firmware/hw_layer/drivers/gpio/tle8888.h b/firmware/hw_layer/drivers/gpio/tle8888.h index 53c106507b..a35312571e 100644 --- a/firmware/hw_layer/drivers/gpio/tle8888.h +++ b/firmware/hw_layer/drivers/gpio/tle8888.h @@ -53,6 +53,11 @@ extern "C" int tle8888_add(unsigned int index, const struct tle8888_config *cfg); void requestTLE8888initialization(void); +#if EFI_TUNER_STUDIO +#include "tunerstudio_configuration.h" +void tle8888PostState(TunerStudioOutputChannels *tsOutputChannels); +#endif /* EFI_TUNER_STUDIO */ + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/firmware/hw_layer/ports/kinetis/kinetis_common.cpp b/firmware/hw_layer/ports/kinetis/kinetis_common.cpp index aad392ff2d..54c3ac0df9 100644 --- a/firmware/hw_layer/ports/kinetis/kinetis_common.cpp +++ b/firmware/hw_layer/ports/kinetis/kinetis_common.cpp @@ -124,3 +124,16 @@ int getAdcChannelPin(adc_channel_e hwChannel) { } #endif /* HAL_USE_ADC */ + +#if EFI_PROD_CODE +#define BOOTLOADER_LOCATION 0x1C00001CUL +void jump_to_bootloader() { + typedef void (*bootloader_start_t)(void * arg); + // Read the function address from the ROM API tree and turn it into a function pointer + bootloader_start_t bootloaderStart = (bootloader_start_t)(**(uint32_t **)BOOTLOADER_LOCATION); + // Call the function! + bootloaderStart(NULL); + // Will not return from here + NVIC_SystemReset(); +} +#endif /* EFI_PROD_CODE */ diff --git a/firmware/hw_layer/ports/kinetis/mpu_util.h b/firmware/hw_layer/ports/kinetis/mpu_util.h index 7a5746a9f9..b45699877c 100644 --- a/firmware/hw_layer/ports/kinetis/mpu_util.h +++ b/firmware/hw_layer/ports/kinetis/mpu_util.h @@ -50,6 +50,7 @@ BOR_Result_t BOR_Set(BOR_Level_t BORValue); void baseMCUInit(void); void turnOnSpi(spi_device_e device); +void jump_to_bootloader(); #ifdef __cplusplus extern "C" diff --git a/unit_tests/engine_test_helper.cpp b/unit_tests/engine_test_helper.cpp index ab4021ec18..609655eaf7 100644 --- a/unit_tests/engine_test_helper.cpp +++ b/unit_tests/engine_test_helper.cpp @@ -22,7 +22,7 @@ extern WarningCodeState unitTestWarningCodeState; extern float testMafValue; extern float testCltValue; extern float testIatValue; -extern engine_configuration_s activeConfiguration; +extern engine_configuration_s & activeConfiguration; EngineTestHelperBase::EngineTestHelperBase() { // todo: make this not a global variable, we need currentTimeProvider interface on engine diff --git a/unit_tests/global.h b/unit_tests/global.h index d26a4fae74..82a16765d0 100644 --- a/unit_tests/global.h +++ b/unit_tests/global.h @@ -73,7 +73,7 @@ void print(const char *fmt, ...); #define CCM_OPTIONAL #define EXTERN_ENGINE extern EnginePins enginePins; \ - extern engine_configuration_s activeConfiguration + extern engine_configuration_s & activeConfiguration #define EXTERN_CONFIG