305 lines
8.4 KiB
C++
305 lines
8.4 KiB
C++
#include "pch.h"
|
|
#include "hellen_meta.h"
|
|
#include "defaults.h"
|
|
#include "smart_gpio.h"
|
|
#include "drivers/gpio/tle9104.h"
|
|
|
|
static OutputPin alphaTempPullUp;
|
|
|
|
static void setInjectorPins() {
|
|
engineConfiguration->injectionPins[0] = Gpio::TLE9104_0_OUT_0;
|
|
engineConfiguration->injectionPins[1] = Gpio::TLE9104_0_OUT_1;
|
|
engineConfiguration->injectionPins[2] = Gpio::TLE9104_0_OUT_2;
|
|
engineConfiguration->injectionPins[3] = Gpio::TLE9104_0_OUT_3;
|
|
engineConfiguration->injectionPins[4] = Gpio::TLE9104_1_OUT_3;
|
|
engineConfiguration->injectionPins[5] = Gpio::TLE9104_1_OUT_2;
|
|
engineConfiguration->injectionPins[6] = Gpio::TLE9104_1_OUT_1;
|
|
engineConfiguration->injectionPins[7] = Gpio::TLE9104_1_OUT_0;
|
|
}
|
|
|
|
static void setIgnitionPins() {
|
|
engineConfiguration->ignitionPins[0] = Gpio::H144_IGN_1;
|
|
engineConfiguration->ignitionPins[1] = Gpio::H144_IGN_2;
|
|
engineConfiguration->ignitionPins[2] = Gpio::H144_IGN_3;
|
|
engineConfiguration->ignitionPins[3] = Gpio::H144_IGN_4;
|
|
engineConfiguration->ignitionPins[4] = Gpio::H144_IGN_5;
|
|
engineConfiguration->ignitionPins[5] = Gpio::H144_IGN_6;
|
|
engineConfiguration->ignitionPins[6] = Gpio::H144_IGN_7;
|
|
engineConfiguration->ignitionPins[7] = Gpio::H144_IGN_8;
|
|
}
|
|
|
|
static void setDefaultSensorInputs() {
|
|
setTPS1Inputs(H144_IN_TPS, H144_IN_TPS2);
|
|
setPPSInputs(H144_IN_PPS, H144_IN_PPS2);
|
|
|
|
engineConfiguration->boardUseTempPullUp = true;
|
|
|
|
|
|
engineConfiguration->map.sensor.hwChannel = H144_IN_O2S2; // external MAP
|
|
// engineConfiguration->map.sensor.hwChannel = H144_IN_MAP2; // On-board MAP
|
|
engineConfiguration->map.sensor.type = MT_MPXH6400;
|
|
|
|
engineConfiguration->clt.adcChannel = H144_IN_CLT;
|
|
engineConfiguration->iat.adcChannel = H144_IN_IAT;
|
|
}
|
|
|
|
void setBoardConfigOverrides() {
|
|
setHellenMegaEnPin();
|
|
|
|
setHellenVbatt();
|
|
setHellenCan();
|
|
hellenMegaSdWithAccelerometer();
|
|
setDefaultHellenAtPullUps();
|
|
|
|
/* Four TLE9104 */
|
|
enableHellenSpi2();
|
|
}
|
|
|
|
static void setDefaultETBPins() {
|
|
// users would want to override those if using H-bridges for stepper idle control
|
|
setupTLE9201IncludingStepper(/*PWM controlPin*/Gpio::H144_OUT_PWM1, Gpio::H144_OUT_PWM6, Gpio::H144_OUT_PWM5, 0);
|
|
setupTLE9201IncludingStepper(/*PWM controlPin*/Gpio::H144_OUT_PWM2, Gpio::H144_OUT_PWM4, Gpio::H144_OUT_PWM3, 1);
|
|
}
|
|
|
|
/**
|
|
* @brief Board-specific configuration defaults.
|
|
*
|
|
* See also setDefaultEngineConfiguration
|
|
*
|
|
*/
|
|
void setBoardDefaultConfiguration() {
|
|
setInjectorPins();
|
|
setIgnitionPins();
|
|
setHellenMMbaro();
|
|
setDefaultSensorInputs();
|
|
setDefaultETBPins();
|
|
|
|
engineConfiguration->cylindersCount = 8;
|
|
engineConfiguration->firingOrder = FO_1_8_7_2_6_5_4_3;
|
|
|
|
engineConfiguration->displayLogicLevelsInEngineSniffer = true;
|
|
engineConfiguration->isSdCardEnabled = true;
|
|
|
|
engineConfiguration->globalTriggerAngleOffset = 0;
|
|
|
|
engineConfiguration->enableSoftwareKnock = true;
|
|
|
|
// Done in setBoardConfigOverrides() -> setHellenCan() ?
|
|
engineConfiguration->canTxPin = H144_CAN_TX;
|
|
engineConfiguration->canRxPin = H144_CAN_RX;
|
|
|
|
engineConfiguration->mainRelayPin = Gpio::TLE9104_3_OUT_3;
|
|
|
|
// Done in setBoardConfigOverrides() -> enableHellenSpi2() ?
|
|
// SPI2 for TLE9104 diagnostics
|
|
engineConfiguration->is_enabled_spi_2 = true;
|
|
engineConfiguration->spi2mosiPin = H_SPI2_MOSI;
|
|
engineConfiguration->spi2misoPin = H_SPI2_MISO;
|
|
engineConfiguration->spi2sckPin = H_SPI2_SCK;
|
|
}
|
|
|
|
/*
|
|
* RESET and EN signals of both TLE9104 are driven by same gpios,
|
|
* Do not allow TLE driver to drive this pins as it will reset
|
|
* first chip while initing second.
|
|
* Set pins to proper state only once.
|
|
* TODO: improve?
|
|
*/
|
|
static const tle9104_config tle9104_cfg[BOARD_TLE9104_COUNT] = {
|
|
// INJ_LO
|
|
{
|
|
.spi_bus = &SPID2,
|
|
.spi_config = {
|
|
.circular = false,
|
|
.end_cb = NULL,
|
|
.ssport = GPIOC,
|
|
.sspad = 10, // 9104_CSN_INJ_LO <- SPI3_SCK
|
|
.cr1 =
|
|
SPI_CR1_16BIT_MODE |
|
|
SPI_CR1_SSM |
|
|
SPI_CR1_SSI |
|
|
((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16
|
|
SPI_CR1_MSTR |
|
|
SPI_CR1_CPHA |
|
|
0,
|
|
.cr2 = SPI_CR2_16BIT_MODE
|
|
},
|
|
.direct_io = {
|
|
{ .port = GPIOG, .pad = 7 }, // OUT_INJ1
|
|
{ .port = GPIOG, .pad = 8 }, // OUT_INJ2
|
|
{ .port = GPIOD, .pad = 11 }, // OUT_INJ3
|
|
{ .port = GPIOD, .pad = 10 } // OUT_INJ4
|
|
},
|
|
.resn = Gpio::Unassigned, // Gpio::B12, // 9104_EN <- SPI2_CS/CAN2_RX
|
|
.en = Gpio::Unassigned // Gpio::A10 // 9104_RESN <- USBID
|
|
},
|
|
// INJ_HI
|
|
{
|
|
.spi_bus = &SPID2,
|
|
.spi_config = {
|
|
.circular = false,
|
|
.end_cb = NULL,
|
|
.ssport = GPIOC,
|
|
.sspad = 11, // 9104_CSN_INJ_HI <- SPI3_MISO
|
|
.cr1 =
|
|
SPI_CR1_16BIT_MODE |
|
|
SPI_CR1_SSM |
|
|
SPI_CR1_SSI |
|
|
((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16
|
|
SPI_CR1_MSTR |
|
|
SPI_CR1_CPHA |
|
|
0,
|
|
.cr2 = SPI_CR2_16BIT_MODE
|
|
},
|
|
.direct_io = {
|
|
{ .port = GPIOD, .pad = 9 }, // OUT_INJ5
|
|
{ .port = GPIOF, .pad = 12 }, // OUT_INJ6
|
|
{ .port = GPIOF, .pad = 13 }, // OUT_INJ7
|
|
{ .port = GPIOF, .pad = 14 } // OUT_INJ8
|
|
},
|
|
.resn = Gpio::Unassigned, // Gpio::B12, // 9104_EN <- SPI2_CS/CAN2_RX
|
|
.en = Gpio::Unassigned // Gpio::A10 // 9104_RESN <- USBID
|
|
},
|
|
// AUX1-4
|
|
{
|
|
.spi_bus = &SPID2,
|
|
.spi_config = {
|
|
.circular = false,
|
|
.end_cb = NULL,
|
|
.ssport = GPIOC,
|
|
.sspad = 12, // 9104_CSN_AUX1 <- SPI3_MOSI
|
|
.cr1 =
|
|
SPI_CR1_16BIT_MODE |
|
|
SPI_CR1_SSM |
|
|
SPI_CR1_SSI |
|
|
((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16
|
|
SPI_CR1_MSTR |
|
|
SPI_CR1_CPHA |
|
|
0,
|
|
.cr2 = SPI_CR2_16BIT_MODE
|
|
},
|
|
.direct_io = {
|
|
{ .port = GPIOD, .pad = 3 }, // AUX_LS2 <- OUT_IO1
|
|
{ .port = GPIOA, .pad = 9 }, // AUX_LS1 <- OUT_IO2
|
|
{ .port = GPIOG, .pad = 14 }, // IO3 <- OUT_IO3
|
|
{ .port = GPIOG, .pad = 5 } // TACH <- OUT_IO4
|
|
},
|
|
.resn = Gpio::Unassigned, // Gpio::B12, // 9104_EN <- SPI2_CS/CAN2_RX
|
|
.en = Gpio::Unassigned // Gpio::A10 // 9104_RESN <- USBID
|
|
},
|
|
// MISC
|
|
{
|
|
.spi_bus = &SPID2,
|
|
.spi_config = {
|
|
.circular = false,
|
|
.end_cb = NULL,
|
|
.ssport = GPIOA,
|
|
.sspad = 15, // 9104_CSN_AUX2 <- SPI3_CS
|
|
.cr1 =
|
|
SPI_CR1_16BIT_MODE |
|
|
SPI_CR1_SSM |
|
|
SPI_CR1_SSI |
|
|
((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16
|
|
SPI_CR1_MSTR |
|
|
SPI_CR1_CPHA |
|
|
0,
|
|
.cr2 = SPI_CR2_16BIT_MODE
|
|
},
|
|
.direct_io = {
|
|
{ .port = GPIOD, .pad = 2 }, // AUX_LS5 <- OUT_IO5
|
|
{ .port = GPIOG, .pad = 11 }, // AUX_LS3 <- OUT_IO6
|
|
{ .port = GPIOG, .pad = 3 }, // AUX_LS4 <- OUT_IO7
|
|
{ .port = GPIOG, .pad = 4 } // MAIN_RELAY <- OUT_IO8
|
|
},
|
|
.resn = Gpio::Unassigned, // Gpio::B12, // 9104_EN <- SPI2_CS/CAN2_RX
|
|
.en = Gpio::Unassigned // Gpio::A10 // 9104_RESN <- USBID
|
|
}
|
|
};
|
|
|
|
static void board_init_ext_gpios() {
|
|
/* Waste of RAM, switch to palSetPadMode() and palSetPort() */
|
|
{
|
|
static OutputPin TleCs0;
|
|
TleCs0.initPin("TLE9104 CS0", Gpio::C10);
|
|
TleCs0.setValue(1);
|
|
}
|
|
{
|
|
static OutputPin TleCs1;
|
|
TleCs1.initPin("TLE9104 CS1", Gpio::C11);
|
|
TleCs1.setValue(1);
|
|
}
|
|
{
|
|
static OutputPin TleCs2;
|
|
TleCs2.initPin("TLE9104 CS2", Gpio::C12);
|
|
TleCs2.setValue(1);
|
|
}
|
|
{
|
|
static OutputPin TleCs3;
|
|
TleCs3.initPin("TLE9104 CS3", Gpio::A15);
|
|
TleCs3.setValue(1);
|
|
}
|
|
|
|
{
|
|
static OutputPin TleReset;
|
|
TleReset.initPin("TLE9104 Reset", Gpio::B12);
|
|
TleReset.setValue(1);
|
|
|
|
static OutputPin TleEn;
|
|
TleEn.initPin("TLE9104 En", Gpio::A10);
|
|
TleEn.setValue(1);
|
|
}
|
|
|
|
initAll9104(tle9104_cfg);
|
|
}
|
|
|
|
/**
|
|
* @brief Board-specific initialization code.
|
|
*/
|
|
void boardInitHardware() {
|
|
alphaTempPullUp.initPin("a-temp", Gpio::H144_GP_IO3); // TEMP_PULLUP <- IO3
|
|
board_init_ext_gpios();
|
|
}
|
|
|
|
void boardOnConfigurationChange(engine_configuration_s * /*previousConfiguration*/) {
|
|
alphaTempPullUp.setValue(engineConfiguration->boardUseTempPullUp);
|
|
}
|
|
|
|
static Gpio OUTPUTS[] = {
|
|
Gpio::TLE9104_0_OUT_3, // 1A - Injector 4
|
|
Gpio::TLE9104_0_OUT_2, // 2A - Injector 3
|
|
Gpio::TLE9104_0_OUT_1, // 3A - Injector 2
|
|
Gpio::TLE9104_0_OUT_0, // 4A - Injector 1
|
|
Gpio::TLE9104_2_OUT_3, // 14A - OUT_TACH
|
|
Gpio::TLE9104_2_OUT_1, // 5A - OUT_AUX_LS1
|
|
Gpio::TLE9104_2_OUT_0, // 6A - OUT_AUX_LS2
|
|
Gpio::TLE9104_1_OUT_3, // 1B - Injector 8
|
|
Gpio::TLE9104_1_OUT_2, // 2B - Injector 7
|
|
Gpio::TLE9104_1_OUT_1, // 3B - Injector 6
|
|
Gpio::TLE9104_1_OUT_0, // 4B - Injector 5
|
|
Gpio::TLE9104_3_OUT_3, // 5B - OUT_MAIN_RELAY
|
|
Gpio::TLE9104_3_OUT_2, // 6B - OUT_AUX_LS3
|
|
Gpio::TLE9104_3_OUT_1, // 7B - OUT_AUX_LS4
|
|
Gpio::TLE9104_3_OUT_0, // 8B - OUT_AUX_LS5
|
|
Gpio::TLE9104_2_OUT_2, // P1
|
|
Gpio::H144_IGN_1,
|
|
Gpio::H144_IGN_2,
|
|
Gpio::H144_IGN_3,
|
|
Gpio::H144_IGN_4,
|
|
Gpio::H144_IGN_5,
|
|
Gpio::H144_IGN_6,
|
|
Gpio::H144_IGN_7,
|
|
Gpio::H144_IGN_8,
|
|
};
|
|
|
|
int getBoardMetaOutputsCount() {
|
|
return efi::size(OUTPUTS);
|
|
}
|
|
|
|
int getBoardMetaLowSideOutputsCount() {
|
|
return getBoardMetaOutputsCount() - 8;
|
|
}
|
|
|
|
Gpio* getBoardMetaOutputs() {
|
|
return OUTPUTS;
|
|
}
|