rusefi/firmware/config/boards/m74_9/board_configuration.cpp

189 lines
5.0 KiB
C++

#include "pch.h"
#include "defaults.h"
#include "smart_gpio.h"
#include "drivers/gpio/l9779.h"
// PB14 is error LED, configured in board.mk
Gpio getCommsLedPin() {
// this board has LEDs
return Gpio::Unassigned;
}
Gpio getWarningLedPin() {
// this board has LEDs
return Gpio::Unassigned;
}
Gpio getRunningLedPin() {
// this board has LEDs
return Gpio::Unassigned;
}
static void setInjectorPins() {
engineConfiguration->injectionPins[0] = Gpio::L9779_OUT_1;
engineConfiguration->injectionPins[1] = Gpio::L9779_OUT_2;
engineConfiguration->injectionPins[2] = Gpio::L9779_OUT_3;
engineConfiguration->injectionPins[3] = Gpio::L9779_OUT_4;
engineConfiguration->injectionPinMode = OM_DEFAULT;
}
static void setIgnitionPins() {
engineConfiguration->ignitionPins[0] = Gpio::L9779_IGN_1;
engineConfiguration->ignitionPins[1] = Gpio::L9779_IGN_2;
/* Two following has no IGBT populated, wasted spark is used */
engineConfiguration->ignitionPins[2] = Gpio::L9779_IGN_3;
engineConfiguration->ignitionPins[3] = Gpio::L9779_IGN_4;
engineConfiguration->ignitionPinMode = OM_DEFAULT;
}
static void setupEtb() {
// TLE9201 driver
// This chip has three control pins:
// DIR - sets direction of the motor
// PWM - pwm control (enable high, coast low)
// DIS - disables motor (enable low)
// PWM pin
engineConfiguration->etbIo[0].controlPin = Gpio::B14;
// DIR pin
engineConfiguration->etbIo[0].directionPin1 = Gpio::B15;
// // Disable pin todo clarify if we have it?
// engineConfiguration->etbIo[0].disablePin = Gpio::C8;
// we only have pwm/dir, no dira/dirb
engineConfiguration->etb_use_two_wires = false;
}
/**
* @brief Board-specific configuration defaults.
*/
void setBoardDefaultConfiguration() {
setInjectorPins();
setIgnitionPins();
engineConfiguration->cylindersCount = 4;
engineConfiguration->firingOrder = FO_1_3_4_2;
engineConfiguration->ignitionMode = IM_WASTED_SPARK;
engineConfiguration->crankingInjectionMode = IM_SIMULTANEOUS;
engineConfiguration->injectionMode = IM_SEQUENTIAL;
/* SPI1 is used for communication with L9779 */
engineConfiguration->is_enabled_spi_1 = true;
engineConfiguration->spi1mosiPin = Gpio::E15;
engineConfiguration->spi1misoPin = Gpio::E14;
engineConfiguration->spi1sckPin = Gpio::E13;
engineConfiguration->triggerInputPins[0] = Gpio::F8;
engineConfiguration->camInputs[0] = Gpio::B9;
// todo engineConfiguration->clt.adcChannel = EFI_ADC_; // ADC3 PF5
// todo engineConfiguration->iat.adcChannel = EFI_ADC_; // ADC3 PF6
// todo engineConfiguration->map.sensor.hwChannel = EFI_ADC_;
// ?k high side/?k low side = ? ratio divider todo is the value below right?
engineConfiguration->analogInputDividerCoefficient = 2.0f;
// todo engineConfiguration->vbattDividerCoeff = (33 + 6.8) / 6.8; // 5.835
// engineConfiguration->vbattAdcChannel = EFI_ADC_;
engineConfiguration->adcVcc = 3.3f;
setTPS1Inputs(EFI_ADC_12, EFI_ADC_13);
setPPSInputs(EFI_ADC_10, EFI_ADC_11);
}
void setBoardConfigOverrides() {
//CAN 1 bus overwrites
engineConfiguration->canRxPin = Gpio::G0;
engineConfiguration->canTxPin = Gpio::G1;
setupEtb();
}
static struct l9779_config l9779_cfg = {
.spi_bus = &SPID1,
.spi_config = {
.circular = false,
.end_cb = NULL,
.ssport = GPIOE,
.sspad = 12,
.cr1 =
SPI_CR1_16BIT_MODE |
SPI_CR1_SSM |
SPI_CR1_SSI |
SPI_CR1_LSBFIRST | //LSB first
((3 << SPI_CR1_BR_Pos) & SPI_CR1_BR) | // div = 16
SPI_CR1_MSTR |
SPI_CR1_CPHA |
0,
.cr2 = SPI_CR2_16BIT_MODE
},
.direct_gpio = {
/* ignition pre-drivers */
[0] = {.port = GPIOF, .pad = 12},
[1] = {.port = GPIOF, .pad = 13},
[2] = {.port = GPIOF, .pad = 14},
[3] = {.port = GPIOF, .pad = 15},
/* IN1 .. IN7 */
[4] = {.port = GPIOE, .pad = 8},
[5] = {.port = GPIOE, .pad = 9},
[6] = {.port = GPIOE, .pad = 10},
[7] = {.port = GPIOE, .pad = 11},
[8] = {.port = GPIOG, .pad = 5},
[9] = {.port = GPIOG, .pad = 6},
[10] = {.port = GPIOG, .pad = 7},
},
/* PWM signal */
.pwm_gpio = {.port = NULL, .pad = 0}
};
static void board_init_ext_gpios()
{
int ret;
ret = l9779_add(Gpio::L9779_IGN_1, 0, &l9779_cfg);
if (ret < 0) {
/* error */
}
}
/**
* @brief Board-specific initialization code.
* @todo Add your board-specific code, if any.
*/
void boardInit(void)
{
board_init_ext_gpios();
}
static Gpio OUTPUTS[] = {
Gpio::L9779_OUT_4, // Injector 1
Gpio::L9779_OUT_3, // Injector 2
// Gpio::L9779_OUT_2, // Injector 3
// Gpio::L9779_OUT_1, // Injector 4
// Gpio::L9779_OUT_6, // Oxygen sensor 1 heater
// Gpio::L9779_OUT_5, // EVAP solenoid control
// Gpio::L9779_OUT_7, // Oxygen sensor 2 heater
// Gpio::L9779_IGN_1, // Coil 1 (< +2.5v) / Coils 1,4
// Gpio::L9779_IGN_3, // Coil 3 (< +2.5v) / Coils 2,4
// Gpio::L9779_OUT_17, // Air compressor control
// Gpio::L9779_OUT_14, // Secondary starter relay
// Gpio::L9779_OUT_15, // FAN 1 relay
// Gpio::L9779_OUT_16, // FAN 2 relay
// Gpio::L9779_OUT_13, // Fuel pump relay
};
int getBoardMetaOutputsCount() {
return efi::size(OUTPUTS);
}
int getBoardMetaDcOutputsCount() {
return 1;
}