this is not great :(

#639
#971
This commit is contained in:
rusefi 2019-11-11 22:19:35 -05:00
parent b9f0f2c592
commit 15a571fb3e
9 changed files with 137 additions and 136 deletions

View File

@ -937,7 +937,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
tsOutputChannels->debugIntField1 = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_FALLING); tsOutputChannels->debugIntField1 = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_FALLING);
tsOutputChannels->debugIntField2 = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_FALLING); tsOutputChannels->debugIntField2 = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_FALLING);
tsOutputChannels->debugIntField3 = engine->triggerCentral.getHwEventCounter((int)SHAFT_3RD_FALLING); tsOutputChannels->debugIntField3 = engine->triggerCentral.getHwEventCounter((int)SHAFT_3RD_FALLING);
#if EFI_PROD_CODE #if EFI_PROD_CODE && HAL_USE_ICU == TRUE
tsOutputChannels->debugIntField4 = engine->triggerCentral.vvtEventRiseCounter; tsOutputChannels->debugIntField4 = engine->triggerCentral.vvtEventRiseCounter;
tsOutputChannels->debugIntField5 = engine->triggerCentral.vvtEventFallCounter; tsOutputChannels->debugIntField5 = engine->triggerCentral.vvtEventFallCounter;
tsOutputChannels->debugFloatField5 = icuWidthCallbackCounter + icuWidthPeriodCounter; tsOutputChannels->debugFloatField5 = icuWidthCallbackCounter + icuWidthPeriodCounter;

View File

@ -62,6 +62,11 @@ public:
*/ */
int globalSparkIdCounter = 0; int globalSparkIdCounter = 0;
// this is useful at least for real hardware integration testing - maybe a proper solution would be to simply
// GND input pins instead of leaving them floating
bool hwTriggerInputEnabled = true;
#if !EFI_PROD_CODE #if !EFI_PROD_CODE
float mockMapValue = 0; float mockMapValue = 0;
// for historical reasons we have options to mock TPS on different layers :( // for historical reasons we have options to mock TPS on different layers :(

View File

@ -887,13 +887,11 @@ static void setSpiMode(int index, bool mode) {
printSpiState(&logger, boardConfiguration); printSpiState(&logger, boardConfiguration);
} }
extern bool hwTriggerInputEnabled;
static void enableOrDisable(const char *param, bool isEnabled) { static void enableOrDisable(const char *param, bool isEnabled) {
if (strEqualCaseInsensitive(param, "fastadc")) { if (strEqualCaseInsensitive(param, "fastadc")) {
boardConfiguration->isFastAdcEnabled = isEnabled; boardConfiguration->isFastAdcEnabled = isEnabled;
} else if (strEqualCaseInsensitive(param, CMD_TRIGGER_HW_INPUT)) { } else if (strEqualCaseInsensitive(param, CMD_TRIGGER_HW_INPUT)) {
hwTriggerInputEnabled = isEnabled; engine->hwTriggerInputEnabled = isEnabled;
} else if (strEqualCaseInsensitive(param, "etb_auto")) { } else if (strEqualCaseInsensitive(param, "etb_auto")) {
engine->etbAutoTune = isEnabled; engine->etbAutoTune = isEnabled;
} else if (strEqualCaseInsensitive(param, "cranking_constant_dwell")) { } else if (strEqualCaseInsensitive(param, "cranking_constant_dwell")) {

View File

@ -511,7 +511,6 @@ extern int perSecondIrqCounter;
#if EFI_PROD_CODE #if EFI_PROD_CODE
extern uint32_t maxPrecisionCallbackDuration; extern uint32_t maxPrecisionCallbackDuration;
extern bool hwTriggerInputEnabled;
#endif /* EFI_PROD_CODE */ #endif /* EFI_PROD_CODE */
extern uint32_t maxSchedulingPrecisionLoss; extern uint32_t maxSchedulingPrecisionLoss;
@ -545,11 +544,11 @@ void triggerInfo(void) {
#if (HAL_TRIGGER_USE_PAL == TRUE) && (PAL_USE_CALLBACKS == TRUE) #if (HAL_TRIGGER_USE_PAL == TRUE) && (PAL_USE_CALLBACKS == TRUE)
scheduleMsg(logger, "trigger PAL mode %d", hwTriggerInputEnabled); scheduleMsg(logger, "trigger PAL mode %d", engine->hwTriggerInputEnabled);
#else #else
#if HAL_USE_ICU == TRUE #if HAL_USE_ICU == TRUE
scheduleMsg(logger, "trigger ICU hw: %d %d %d", icuWidthCallbackCounter, icuWidthPeriodCounter, hwTriggerInputEnabled); scheduleMsg(logger, "trigger ICU hw: %d %d %d", icuWidthCallbackCounter, icuWidthPeriodCounter, engine->hwTriggerInputEnabled);
#endif /* HAL_USE_ICU */ #endif /* HAL_USE_ICU */
#endif /* HAL_TRIGGER_USE_PAL */ #endif /* HAL_TRIGGER_USE_PAL */

View File

@ -10,6 +10,41 @@
#if (EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT) || defined(__DOXYGEN__) #if (EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT) || defined(__DOXYGEN__)
EXTERN_ENGINE;
#if (HAL_USE_ICU == TRUE) || (HAL_TRIGGER_USE_PAL == TRUE)
void stopTriggerInputPins(void) {
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(bc.triggerInputPins[i])) {
turnOffTriggerInputPin(activeConfiguration.bc.triggerInputPins[i]);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOffTriggerInputPin(activeConfiguration.camInputs[i]);
}
}
}
void startTriggerInputPins(void) {
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(bc.triggerInputPins[i])) {
const char * msg = (i == 0 ? "trigger#1" : (i == 1 ? "trigger#2" : "trigger#3"));
turnOnTriggerInputPin(msg, CONFIGB(triggerInputPins)[i], true);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOnTriggerInputPin("cam", engineConfiguration->camInputs[i], false);
}
}
setPrimaryChannel(CONFIGB(triggerInputPins)[0]);
}
#endif
void applyNewTriggerInputPins(void) { void applyNewTriggerInputPins(void) {
// first we will turn off all the changed pins // first we will turn off all the changed pins
stopTriggerInputPins(); stopTriggerInputPins();

View File

@ -3,13 +3,16 @@
* @brief Position sensor hardware layer * @brief Position sensor hardware layer
* *
* @date Dec 30, 2012 * @date Dec 30, 2012
* @author Andrey Belomutskiy, (c) 2012-2017 * @author Andrey Belomutskiy, (c) 2012-2019
*/ */
#ifndef CRANK_INPUT_H_ #ifndef CRANK_INPUT_H_
#define CRANK_INPUT_H_ #define CRANK_INPUT_H_
#include "engine.h" #include "engine.h"
#include "pin_repository.h"
#include "trigger_structure.h"
#include "trigger_central.h"
#define TRIGGER_SUPPORTED_CHANNELS 2 #define TRIGGER_SUPPORTED_CHANNELS 2
@ -17,5 +20,8 @@ void turnOnTriggerInputPins(Logging *sharedLogger);
void applyNewTriggerInputPins(void); void applyNewTriggerInputPins(void);
void startTriggerInputPins(void); void startTriggerInputPins(void);
void stopTriggerInputPins(void); void stopTriggerInputPins(void);
void setPrimaryChannel(brain_pin_e brainPin);
void turnOffTriggerInputPin(brain_pin_e brainPin);
int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool isVvtShaft);
#endif /* CRANK_INPUT_H_ */ #endif /* CRANK_INPUT_H_ */

View File

@ -15,10 +15,7 @@
#include "trigger_input.h" #include "trigger_input.h"
#include "digital_input_hw.h" #include "digital_input_hw.h"
#include "pin_repository.h"
#include "trigger_structure.h"
#include "trigger_central.h"
#include "engine_configuration.h"
extern bool hasFirmwareErrorFlag; extern bool hasFirmwareErrorFlag;

View File

@ -14,4 +14,78 @@
#if EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE) && (HAL_USE_COMP == FALSE) #if EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE) && (HAL_USE_COMP == FALSE)
#include "trigger_input.h"
#include "digital_input_exti.h"
extern bool hasFirmwareErrorFlag;
static Logging *logger;
EXTERN_ENGINE;
static ioline_t primary_line;
static void shaft_callback(void *arg) {
ioline_t pal_line = (ioline_t)arg;
// todo: support for 3rd trigger input channel
// todo: start using real event time from HW event, not just software timer?
if (hasFirmwareErrorFlag)
return;
bool isPrimary = pal_line == primary_line;
if (!isPrimary && !TRIGGER_SHAPE(needSecondTriggerInput)) {
return;
}
bool rise = (palReadLine(pal_line) == PAL_HIGH);
trigger_event_e signal;
// todo: add support for 3rd channel
if (rise) {
signal = isPrimary ?
(engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_FALLING : SHAFT_PRIMARY_RISING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_FALLING : SHAFT_SECONDARY_RISING);
} else {
signal = isPrimary ?
(engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_RISING : SHAFT_SECONDARY_FALLING);
}
hwHandleShaftSignal(signal);
}
static void cam_callback(void *arg) {
ioline_t pal_line = (ioline_t)arg;
bool rise = (palReadLine(pal_line) == PAL_HIGH);
if (rise) {
hwHandleVvtCamSignal(TV_RISE);
} else {
hwHandleVvtCamSignal(TV_FALL);
}
}
int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool isVvtShaft) {
scheduleMsg(logger, "turnOnTriggerInputPin(PAL) %s %s", msg, hwPortname(brainPin));
/* TODO:
* * do not set to both edges if we need only one
* * simplify callback in case of one edge */
ioline_t pal_line = PAL_LINE(getHwPort("trg", brainPin), getHwPin("trg", brainPin));
return efiExtiEnablePin(msg, brainPin, PAL_EVENT_MODE_BOTH_EDGES, isVvtShaft ? shaft_callback : cam_callback, (void *)pal_line);
}
void turnOffTriggerInputPin(brain_pin_e brainPin) {
efiExtiDisablePin(brainPin);
}
void setPrimaryChannel(brain_pin_e brainPin) {
primary_line = PAL_LINE(getHwPort("trg", brainPin), getHwPin("trg", brainPin));
}
void turnOnTriggerInputPins(Logging *sharedLogger) {
logger = sharedLogger;
applyNewTriggerInputPins();
}
#endif /* (EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE) && (HAL_USE_COMP == FALSE)) */ #endif /* (EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE) && (HAL_USE_COMP == FALSE)) */

View File

@ -1,6 +1,6 @@
/** /**
* @file trigger_input_icu.cpp * @file trigger_input_icu.cpp
* @brief Position sensor hardware layer (ICU and PAL drivers) * @brief Position sensor hardware layer - ICU version
* *
* todo: code reuse with digital_input_hw.cpp was never finished * todo: code reuse with digital_input_hw.cpp was never finished
* todo: at the moment due to half-done code reuse we already depend on EFI_ICU_INPUTS but still have custom code * todo: at the moment due to half-done code reuse we already depend on EFI_ICU_INPUTS but still have custom code
@ -16,93 +16,18 @@
volatile int icuWidthCallbackCounter = 0; volatile int icuWidthCallbackCounter = 0;
volatile int icuWidthPeriodCounter = 0; volatile int icuWidthPeriodCounter = 0;
bool hwTriggerInputEnabled = true; // this is useful at least for real hardware integration testing
#if EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE || HAL_USE_ICU == TRUE) && (HAL_USE_COMP == FALSE) #if EFI_SHAFT_POSITION_INPUT && (HAL_USE_ICU == TRUE) && (HAL_USE_COMP == FALSE)
#include "trigger_input.h" #include "trigger_input.h"
#include "digital_input_hw.h" #include "digital_input_hw.h"
#include "digital_input_exti.h"
#include "pin_repository.h" EXTERN_ENGINE;
#include "trigger_structure.h"
#include "trigger_central.h"
#include "engine_configuration.h"
extern bool hasFirmwareErrorFlag; extern bool hasFirmwareErrorFlag;
EXTERN_ENGINE
;
static Logging *logger; static Logging *logger;
#if EFI_PROD_CODE
/* PAL based implementation */
#if (HAL_TRIGGER_USE_PAL == TRUE) && (PAL_USE_CALLBACKS == TRUE)
/* static variables for PAL implementation */
static ioline_t primary_line;
static void shaft_callback(void *arg) {
ioline_t pal_line = (ioline_t)arg;
// todo: support for 3rd trigger input channel
// todo: start using real event time from HW event, not just software timer?
if (hasFirmwareErrorFlag)
return;
bool isPrimary = pal_line == primary_line;
if (!isPrimary && !TRIGGER_SHAPE(needSecondTriggerInput)) {
return;
}
bool rise = (palReadLine(pal_line) == PAL_HIGH);
trigger_event_e signal;
// todo: add support for 3rd channel
if (rise) {
signal = isPrimary ?
(engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_FALLING : SHAFT_PRIMARY_RISING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_FALLING : SHAFT_SECONDARY_RISING);
} else {
signal = isPrimary ?
(engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_RISING : SHAFT_SECONDARY_FALLING);
}
hwHandleShaftSignal(signal);
}
static void cam_callback(void *arg) {
ioline_t pal_line = (ioline_t)arg;
bool rise = (palReadLine(pal_line) == PAL_HIGH);
if (rise) {
hwHandleVvtCamSignal(TV_RISE);
} else {
hwHandleVvtCamSignal(TV_FALL);
}
}
static int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool is_shaft) {
scheduleMsg(logger, "turnOnTriggerInputPin(PAL) %s %s", msg, hwPortname(brainPin));
/* TODO:
* * do not set to both edges if we need only one
* * simplify callback in case of one edge */
ioline_t pal_line = PAL_LINE(getHwPort("trg", brainPin), getHwPin("trg", brainPin));
return efiExtiEnablePin(msg, brainPin, PAL_EVENT_MODE_BOTH_EDGES, is_shaft ? shaft_callback : cam_callback, (void *)pal_line);
}
static void turnOffTriggerInputPin(brain_pin_e brainPin) {
efiExtiDisablePin(brainPin);
}
static void setPrimaryChannel(brain_pin_e brainPin) {
primary_line = PAL_LINE(getHwPort("trg", brainPin), getHwPin("trg", brainPin));
}
/* ICU based implementation */
#elif (HAL_USE_ICU)
/* static vars for ICU implementation */
static ICUDriver *primaryCrankDriver; static ICUDriver *primaryCrankDriver;
static void cam_icu_width_callback(ICUDriver *icup) { static void cam_icu_width_callback(ICUDriver *icup) {
@ -120,7 +45,7 @@ static void cam_icu_period_callback(ICUDriver *icup) {
* 'width' events happens before the 'period' event * 'width' events happens before the 'period' event
*/ */
static void shaft_icu_width_callback(ICUDriver *icup) { static void shaft_icu_width_callback(ICUDriver *icup) {
if (!hwTriggerInputEnabled) { if (!engine->hwTriggerInputEnabled) {
return; return;
} }
icuWidthCallbackCounter++; icuWidthCallbackCounter++;
@ -140,7 +65,7 @@ static void shaft_icu_width_callback(ICUDriver *icup) {
} }
static void shaft_icu_period_callback(ICUDriver *icup) { static void shaft_icu_period_callback(ICUDriver *icup) {
if (!hwTriggerInputEnabled) { if (!engine->hwTriggerInputEnabled) {
return; return;
} }
icuWidthPeriodCounter++; icuWidthPeriodCounter++;
@ -180,14 +105,14 @@ static ICUConfig cam_icucfg = { ICU_INPUT_ACTIVE_LOW,
ICU_CHANNEL_1, ICU_CHANNEL_1,
0}; 0};
static int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool is_shaft) { int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool isVvtShaft) {
ICUConfig *icucfg; ICUConfig *icucfg;
if (brainPin == GPIO_UNASSIGNED) { if (brainPin == GPIO_UNASSIGNED) {
return -1; return -1;
} }
if (is_shaft) { if (isVvtShaft) {
icucfg = &shaft_icucfg; icucfg = &shaft_icucfg;
} else { } else {
icucfg = &cam_icucfg; icucfg = &cam_icucfg;
@ -222,7 +147,7 @@ static int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool is_
return 0; return 0;
} }
static void turnOffTriggerInputPin(brain_pin_e brainPin) { void turnOffTriggerInputPin(brain_pin_e brainPin) {
ICUDriver *driver = getInputCaptureDriver("trigger_off", brainPin); ICUDriver *driver = getInputCaptureDriver("trigger_off", brainPin);
if (driver != NULL) { if (driver != NULL) {
icuDisableNotifications(driver); icuDisableNotifications(driver);
@ -233,13 +158,10 @@ static void turnOffTriggerInputPin(brain_pin_e brainPin) {
} }
} }
static void setPrimaryChannel(brain_pin_e brainPin) { void setPrimaryChannel(brain_pin_e brainPin) {
primaryCrankDriver = getInputCaptureDriver("primary", brainPin); primaryCrankDriver = getInputCaptureDriver("primary", brainPin);
} }
#endif /* HAL_USE_ICU */
#endif /* EFI_PROD_CODE */
/*==========================================================================*/ /*==========================================================================*/
/* Exported functions. */ /* Exported functions. */
/*==========================================================================*/ /*==========================================================================*/
@ -249,39 +171,4 @@ void turnOnTriggerInputPins(Logging *sharedLogger) {
applyNewTriggerInputPins(); applyNewTriggerInputPins();
} }
#endif /* (EFI_SHAFT_POSITION_INPUT && (HAL_USE_ICU == TRUE) && (HAL_USE_COMP == FALSE)) */
void stopTriggerInputPins(void) {
#if EFI_PROD_CODE
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(bc.triggerInputPins[i])) {
turnOffTriggerInputPin(activeConfiguration.bc.triggerInputPins[i]);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOffTriggerInputPin(activeConfiguration.camInputs[i]);
}
}
#endif /* EFI_PROD_CODE */
}
void startTriggerInputPins(void) {
#if EFI_PROD_CODE
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(bc.triggerInputPins[i])) {
const char * msg = (i == 0 ? "trigger#1" : (i == 1 ? "trigger#2" : "trigger#3"));
turnOnTriggerInputPin(msg, CONFIGB(triggerInputPins)[i], true);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOnTriggerInputPin("cam", engineConfiguration->camInputs[i], false);
}
}
setPrimaryChannel(CONFIGB(triggerInputPins)[0]);
#endif /* EFI_PROD_CODE */
}
#endif /* (EFI_SHAFT_POSITION_INPUT && (HAL_TRIGGER_USE_PAL == TRUE || HAL_USE_ICU == TRUE) && (HAL_USE_COMP == FALSE)) */