diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 70aa9d278c..c2cebd6d63 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -525,6 +525,15 @@ bool validateConfigOnStartUpOrBurn() { criticalError("Invalid cylinder count: %d", engineConfiguration->cylindersCount); return false; } +#if EFI_PROD_CODE && (BOARD_MC33810_COUNT > 0) + int maxDwell = getMc33810maxDwellTimer(engineConfiguration->mc33810maxDwellTimer); + for (size_t i = 0;isparkDwellValues);i++) { + float element = config->sparkDwellValues[i]; + if (element > maxDwell) { + criticalError("Dwell %f while 33810 limit %d", element, maxDwell); + } + } +#endif // EFI_PROD_CODE && (BOARD_MC33810_COUNT > 0) if (engineConfiguration->adcVcc > 5.0f || engineConfiguration->adcVcc < 1.0f) { criticalError("Invalid adcVcc: %f", engineConfiguration->adcVcc); return false; diff --git a/firmware/hw_layer/drivers/gpio/mc33810.cpp b/firmware/hw_layer/drivers/gpio/mc33810.cpp index cc8c6ba383..bcf6e38736 100644 --- a/firmware/hw_layer/drivers/gpio/mc33810.cpp +++ b/firmware/hw_layer/drivers/gpio/mc33810.cpp @@ -845,6 +845,25 @@ void mc33810_req_init() { } } +int getMc33810maxDwellTimer(mc33810maxDwellTimer_e value) { +switch(value) { +case DWELL_16MS: + return 16; +case DWELL_2MS: + return 2; +case DWELL_32MS: + return 32; +case DWELL_4MS: + return 4; +case DWELL_64MS: + return 64; +case DWELL_8MS: + return 8; + } + return 0; +} + + #else /* BOARD_MC33810_COUNT > 0 */ int mc33810_add(brain_pin_e base, unsigned int index, const mc33810_config *cfg) diff --git a/firmware/hw_layer/drivers/gpio/mc33810.h b/firmware/hw_layer/drivers/gpio/mc33810.h index 56df0f0081..59a48308aa 100644 --- a/firmware/hw_layer/drivers/gpio/mc33810.h +++ b/firmware/hw_layer/drivers/gpio/mc33810.h @@ -52,3 +52,4 @@ int mc33810_add(brain_pin_e base, unsigned int index, const mc33810_config *cfg) /* debug */ void mc33810_req_init(); +int getMc33810maxDwellTimer(mc33810maxDwellTimer_e value);