19 #if EFI_ELECTRONIC_THROTTLE_BODY
26 static const char*
const sparkNames[] = {
"Coil 1",
"Coil 2",
"Coil 3",
"Coil 4",
"Coil 5",
"Coil 6",
"Coil 7",
"Coil 8",
27 "Coil 9",
"Coil 10",
"Coil 11",
"Coil 12"};
29 static const char*
const trailNames[] = {
"Trail 1",
"Trail 2",
"Trail 3",
"Trail 4",
"Trail 5",
"Trail 6",
"Trail 7",
"Trail 8",
30 "Trail 9",
"Trail 10",
"Trail 11",
"Trail 12"};
32 static const char*
const trailShortNames[] = {
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"rA",
"rB",
"rD" };
41 PROTOCOL_WA_CHANNEL_1,
42 PROTOCOL_WA_CHANNEL_2,
43 PROTOCOL_WA_CHANNEL_3,
44 PROTOCOL_WA_CHANNEL_4};
47 static const char*
const sparkShortNames[] = { PROTOCOL_COIL1_SHORT_NAME,
"c2",
"c3",
"c4",
"c5",
"c6",
"c7",
"c8",
48 "c9",
"cA",
"cB",
"cD"};
50 static const char*
const injectorNames[] = {
"Injector 1",
"Injector 2",
"Injector 3",
"Injector 4",
"Injector 5",
"Injector 6",
51 "Injector 7",
"Injector 8",
"Injector 9",
"Injector 10",
"Injector 11",
"Injector 12"};
53 static const char*
const injectorShortNames[] = { PROTOCOL_INJ1_SHORT_NAME,
"i2",
"i3",
"i4",
"i5",
"i6",
"i7",
"i8",
54 "i9",
"iA",
"iB",
"iC"};
56 static const char*
const injectorStage2Names[] = {
"Injector Second Stage 1",
"Injector Second Stage 2",
"Injector Second Stage 3",
"Injector Second Stage 4",
"Injector Second Stage 5",
"Injector Second Stage 6",
57 "Injector Second Stage 7",
"Injector Second Stage 8",
"Injector Second Stage 9",
"Injector Second Stage 10",
"Injector Second Stage 11",
"Injector Second Stage 12"};
59 static const char*
const injectorStage2ShortNames[] = { PROTOCOL_INJ1_STAGE2_SHORT_NAME,
"j2",
"j3",
"j4",
"j5",
"j6",
"j7",
"j8",
60 "j9",
"jA",
"jB",
"jC"};
77 , registrationName(p_registrationName)
78 , m_pinOffset(static_cast<uint16_t>(pinOffset))
80 , m_pinModeOffset(static_cast<uint16_t>(pinModeOffset))
88 , registrationName(p_registrationName)
89 , m_pinOffset(static_cast<uint16_t>(pinOffset))
101 bool pinChanged = curPin != newPin;
109 return pinChanged || curMode != newMode;
122 newMode = OM_DEFAULT;
136 #define CONFIG_OFFSET(x) (offsetof(engine_configuration_s, x))
139 #define CONFIG_PIN_OFFSETS(x) CONFIG_OFFSET(x##Pin), CONFIG_OFFSET(x##PinMode)
143 #define CONFIG_OFFSET2(x, y) (offsetof(engine_configuration_s, x) + offsetof(decltype(engine_configuration_s::x), y))
144 #define CONFIG_PIN_OFFSETS2(x, y) CONFIG_OFFSET2(x, y##Pin), CONFIG_OFFSET2(x, y##PinMode)
147 mainRelay(
"Main Relay", CONFIG_PIN_OFFSETS(mainRelay)),
148 hpfpValve(
"HPFP Valve", CONFIG_PIN_OFFSETS(hpfpValve)),
149 starterControl(
"Starter Relay", CONFIG_PIN_OFFSETS(starterControl)),
151 fanRelay(
"Fan Relay", CONFIG_PIN_OFFSETS(fan)),
152 fanRelay2(
"Fan Relay 2", CONFIG_PIN_OFFSETS(fan2)),
153 acRelay(
"A/C Relay", CONFIG_PIN_OFFSETS(acRelay)),
154 fuelPumpRelay(
"Fuel pump Relay", CONFIG_PIN_OFFSETS(fuelPump)),
156 harleyAcr(
"Harley ACR", CONFIG_OFFSET(acrPin)),
157 harleyAcr2(
"Harley ACR 2", CONFIG_OFFSET(acrPin2)),
159 boostPin(
"Boost", CONFIG_PIN_OFFSETS(boostControl)),
160 idleSolenoidPin(
"Idle Valve", CONFIG_OFFSET2(idle, solenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
161 secondIdleSolenoidPin(
"Idle Valve#2", CONFIG_OFFSET(secondSolenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
163 checkEnginePin(
"checkEnginePin", CONFIG_PIN_OFFSETS(malfunctionIndicator)),
164 tachOut(
"tachOut", CONFIG_PIN_OFFSETS(tachOutput)),
165 triggerDecoderErrorPin(
"led: trigger debug", CONFIG_PIN_OFFSETS(triggerError)),
166 speedoOut(
"speedoOut", CONFIG_OFFSET(speedometerOutputPin))
176 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
194 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT;i++) {
203 #define unregisterOutputIfPinChanged(output, pin) { \
204 if (isConfigurationChanged(pin)) { \
209 #define unregisterOutputIfPinOrModeChanged(output, pin, mode) { \
210 if (isPinOrModeChanged(pin, mode)) { \
217 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
223 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
234 #if EFI_ELECTRONIC_THROTTLE_BODY
239 unregisterOutputIfPinChanged(
sdCsPin, sdCardCsPin);
243 while (pin !=
nullptr) {
251 while (pin !=
nullptr) {
258 #if EFI_ENGINE_CONTROL
265 while (pin !=
nullptr) {
272 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
280 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
281 unregisterOutputIfPinOrModeChanged(
enginePins.
coils[i], ignitionPins[i], ignitionPinMode);
287 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
288 unregisterOutputIfPinOrModeChanged(
enginePins.
injectors[i], injectionPins[i], injectionPinMode);
294 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
297 if (isConfigurationChanged(auxValves[i])) {
305 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
308 if (isConfigurationChanged(auxValves[i])) {
319 if (isPinOrModeChanged(trailingCoilPins[i], ignitionPinMode)) {
324 if (isPinOrModeChanged(ignitionPins[i], ignitionPinMode)) {
336 if (isPinOrModeChanged(injectionPins[i], injectionPinMode)) {
342 if (isPinOrModeChanged(injectionPinsStage2[i], injectionPinMode)) {
387 criticalError(
"Unexpected bench pin %d", index);
422 efiPrintf(
"pin %s goes high",
name);
425 #if EFI_DEFAILED_LOGGING
432 #if EFI_ENGINE_SNIFFER
444 efiPrintf(
"pin %s goes low",
name);
451 #if EFI_ENGINE_SNIFFER
457 #if EFI_GPIO_HARDWARE
460 efiPrintf(
"turning off %s",
name);
538 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
539 #if (BOARD_EXT_GPIOCHIPS > 0)
572 setValue(
nullptr, logicValue, isForce);
590 #if ENABLE_PERF_TRACE
614 efiPrintf(
"pin goes %d", logicValue);
628 int electricalValue = getElectricalValue(logicValue,
mode);
631 #if (BOARD_EXT_GPIOCHIPS > 0)
654 this->
mode = outputMode;
660 #if BOARD_EXT_GPIOCHIPS > 0
671 #if EFI_GPIO_HARDWARE
677 #if EFI_SHAFT_POSITION_INPUT
688 initPin(p_msg, p_brainPin, OM_DEFAULT);
701 chibios_rt::CriticalSectionLocker csl;
703 if (!forceInitWithFatalError && hasFirmwareError()) {
716 if (outputMode > OM_OPENDRAIN_INVERTED) {
725 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
726 iomode_t l_mode = (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) ?
727 PAL_MODE_OUTPUT_PUSHPULL : PAL_MODE_OUTPUT_OPENDRAIN;
729 #if (BOARD_EXT_GPIOCHIPS > 0)
737 if (
m_port == GPIO_NULL) {
738 criticalError(
"OutputPin::initPin got invalid port for pin idx %d",
static_cast<int>(p_brainPin));
742 #if (BOARD_EXT_GPIOCHIPS > 0)
757 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
761 if (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) {
762 #ifndef DISABLE_PIN_STATE_VALIDATION
766 const int logicalValue =
767 (outputMode == OM_INVERTED)
773 criticalError(
"HARDWARE VALIDATION FAILED %s: unexpected startup pin state %s actual value=%d logical value=%d mode=%s",
msg,
hwPortname(
brainPin), actualValue, logicalValue,
getPin_output_mode_e(outputMode));
784 chibios_rt::CriticalSectionLocker csl;
791 #if (BOARD_EXT_GPIOCHIPS > 0)
797 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
805 #if EFI_GPIO_HARDWARE
835 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
static SimplePwm alternatorControl("alt")
const char * getPin_output_mode_e(pin_output_mode_e value)
const OutputPin * getOutputOnTheBenchTest()
Utility methods related to bench testing.
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
TunerStudioOutputChannels outputChannels
RegisteredOutputPin harleyAcr2
RegisteredNamedOutputPin harleyAcr
OutputPin accelerometerCs
InjectorOutputPin injectorsStage2[MAX_CYLINDER_COUNT]
RegisteredOutputPin mainRelay
NamedOutputPin auxValve[AUX_DIGITAL_VALVE_COUNT]
RegisteredOutputPin fanRelay
IgnitionOutputPin trailingCoils[MAX_CYLINDER_COUNT]
RegisteredOutputPin starterControl
OutputPin debugTriggerSync
void startInjectionPins()
InjectorOutputPin injectors[MAX_CYLINDER_COUNT]
RegisteredOutputPin fuelPumpRelay
RegisteredOutputPin acRelay
OutputPin * getOutputPinForBenchMode(bench_mode_e idx)
IgnitionOutputPin coils[MAX_CYLINDER_COUNT]
RegisteredOutputPin checkEnginePin
RegisteredOutputPin idleSolenoidPin
RegisteredNamedOutputPin hpfpValve
int8_t overlappingCounter
const char * getName() const
void setName(const char *)
const char * getShortName() const
Single output pin reference and state.
brain_pin_diag_e getDiag() const
uint32_t durationsInStateMs[2]
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
bool getLogicValue() const
void setOnchipValue(int electricalValue)
bool getAndSet(int logicValue)
void setValue(const char *msg, int logicValue, bool isForce=false)
bool isInitialized() const
void setDefaultPinState(pin_output_mode_e mode)
RegisteredNamedOutputPin(const char *name, size_t pinOffset, size_t pinModeOffset)
const char *const registrationName
RegisteredOutputPin(const char *registrationName, size_t pinOffset, size_t pinModeOffset)
const uint16_t m_pinModeOffset
RegisteredOutputPin *const next
bool isPinConfigurationChanged()
const char * getRegistrationName() const
const uint16_t m_pinOffset
void addConsoleAction(const char *token, Void callback)
Register console action without parameters.
int gpiochips_writePad(brain_pin_e pin, int value)
Set value to gpio of gpiochip.
brain_pin_diag_e gpiochips_getDiag(brain_pin_e pin)
Get diagnostic for given gpio.
ioportmask_t criticalErrorLedPin
static const char *const auxValveShortNames[]
static const char *const trailNames[]
static const char *const injectorNames[]
static RegisteredOutputPin * registeredOutputHead
ioportid_t criticalErrorLedPort
bool qcDirectPinControlMode
static const char *const sparkShortNames[]
uint8_t criticalErrorLedState
static const char *const injectorStage2Names[]
static const char *const sparkNames[]
static const char *const injectorShortNames[]
static const char *const injectorStage2ShortNames[]
void turnAllPinsOff(void)
static void initErrorLed(Gpio led)
void initMiscOutputPins()
static const char *const trailShortNames[]
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
engine_configuration_s & activeConfiguration
void addEngineSnifferOutputPinEvent(NamedOutputPin *pin, FrontDirection frontDirection)
rusEfi console wave sniffer
@ BENCH_AC_COMPRESSOR_RELAY
@ BENCH_CHECK_ENGINE_LIGHT
@ BENCH_STARTER_ENABLE_RELAY
bool warning(ObdCode code, const char *fmt,...)
void firmwareError(ObdCode code, const char *fmt,...)
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
GPIO_TypeDef * ioportid_t
Port Identifier.
uint32_t iomode_t
Digital I/O modes.
void efiSetPadUnused(brain_pin_e brainPin)
void setMockState(brain_pin_e pin, bool state)
UNUSED(samplingTimeSeconds)
@ CUSTOM_INVALID_MODE_SETTING
@ CUSTOM_OBD_PIN_CONFLICT
engine_configuration_s * engineConfiguration
const char * hwPortname(brain_pin_e brainPin)
bool brain_pin_is_onchip(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
starterRelayDisable("starterRelayDisable", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 373, 1.0, -10000.0, 10000.0, "")
output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT]
Gpio auxValves[AUX_DIGITAL_VALVE_COUNT]
output_pin_e injectionPins[MAX_CYLINDER_COUNT]
pin_output_mode_e ignitionPinMode
output_pin_e injectionPinsStage2[MAX_CYLINDER_COUNT]
pin_output_mode_e injectionPinMode
output_pin_e ignitionPins[MAX_CYLINDER_COUNT]
OutputPin * getVvtOutputPin(int index)