rusefi/firmware/hw_layer/hardware.cpp

720 lines
17 KiB
C++
Raw Permalink Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file hardware.cpp
* @brief Hardware package entry point
*
* @date May 27, 2013
2020-01-07 21:02:40 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*/
#include "pch.h"
2019-01-03 21:16:08 -08:00
2022-09-07 12:56:45 -07:00
#include "trigger_input.h"
2015-07-10 06:01:56 -07:00
#include "can_hw.h"
#include "hardware.h"
#include "rtc_helper.h"
#include "bench_test.h"
2018-10-16 18:27:05 -07:00
#include "yaw_rate_sensor.h"
2019-01-03 21:16:08 -08:00
#include "pin_repository.h"
#include "logic_analyzer.h"
2019-04-13 07:58:52 -07:00
#include "smart_gpio.h"
2017-08-28 17:42:27 -07:00
#include "accelerometer.h"
2019-01-03 21:16:08 -08:00
#include "eficonsole.h"
#include "console_io.h"
#include "sensor_chart.h"
#include "serial_hw.h"
#include "idle_thread.h"
#include "odometer.h"
#include "kline.h"
2023-10-09 07:51:21 -07:00
#include "dac.h"
2015-07-10 06:01:56 -07:00
2021-07-14 19:37:05 -07:00
#if EFI_PROD_CODE
2019-01-03 21:16:08 -08:00
#include "mpu_util.h"
2021-07-14 19:37:05 -07:00
#endif /* EFI_PROD_CODE */
#include "mmc_card.h"
2017-05-12 18:19:14 -07:00
2015-07-10 06:01:56 -07:00
#include "AdcConfiguration.h"
#include "idle_hardware.h"
2015-07-10 06:01:56 -07:00
#include "mcp3208.h"
#include "hip9011.h"
2015-07-10 06:01:56 -07:00
#include "histogram.h"
#include "gps_uart.h"
#include "sent.h"
2019-01-04 20:47:39 -08:00
#include "cdm_ion_sense.h"
2015-07-10 06:01:56 -07:00
#include "trigger_central.h"
#include "svnversion.h"
#include "vvt.h"
#include "trigger_emulator_algo.h"
#include "boost_control.h"
#include "software_knock.h"
#include "trigger_scope.h"
#include "init.h"
#if EFI_MC33816
#include "mc33816.h"
#endif /* EFI_MC33816 */
#if EFI_WS2812
#include "WS2812.h"
#endif /* EFI_WS2812 */
2015-07-10 06:01:56 -07:00
2020-02-26 14:30:02 -08:00
#if EFI_MAP_AVERAGING
2015-07-10 06:01:56 -07:00
#include "map_averaging.h"
2020-02-26 14:30:02 -08:00
#endif
2015-07-10 06:01:56 -07:00
#if (EFI_STORAGE_INT_FLASH == TRUE) || (EFI_STORAGE_MFS == TRUE)
2015-07-10 06:01:56 -07:00
#include "flash_main.h"
2020-02-26 14:30:02 -08:00
#endif
2015-07-10 06:01:56 -07:00
#if HAL_USE_PAL && EFI_PROD_CODE
#include "digital_input_exti.h"
#endif // HAL_USE_PAL
#if EFI_CAN_SUPPORT
#include "can_vss.h"
#endif
2021-02-05 21:37:12 -08:00
#if HAL_USE_SPI
/* zero index is SPI_NONE */
extern bool isSpiInitialized[SPI_TOTAL_COUNT + 1];
2016-05-03 20:01:36 -07:00
/* these are common adapters for engineConfiguration access, move to some common file? */
brain_pin_e getMisoPin(spi_device_e device) {
switch(device) {
case SPI_DEVICE_1:
return engineConfiguration->spi1misoPin;
case SPI_DEVICE_2:
return engineConfiguration->spi2misoPin;
case SPI_DEVICE_3:
return engineConfiguration->spi3misoPin;
case SPI_DEVICE_4:
return engineConfiguration->spi4misoPin;
case SPI_DEVICE_5:
return engineConfiguration->spi5misoPin;
case SPI_DEVICE_6:
return engineConfiguration->spi6misoPin;
default:
break;
}
return Gpio::Unassigned;
}
brain_pin_e getMosiPin(spi_device_e device) {
switch(device) {
case SPI_DEVICE_1:
return engineConfiguration->spi1mosiPin;
case SPI_DEVICE_2:
return engineConfiguration->spi2mosiPin;
case SPI_DEVICE_3:
return engineConfiguration->spi3mosiPin;
case SPI_DEVICE_4:
return engineConfiguration->spi4mosiPin;
case SPI_DEVICE_5:
return engineConfiguration->spi5mosiPin;
case SPI_DEVICE_6:
return engineConfiguration->spi6mosiPin;
default:
break;
}
return Gpio::Unassigned;
}
brain_pin_e getSckPin(spi_device_e device) {
switch(device) {
case SPI_DEVICE_1:
return engineConfiguration->spi1sckPin;
case SPI_DEVICE_2:
return engineConfiguration->spi2sckPin;
case SPI_DEVICE_3:
return engineConfiguration->spi3sckPin;
case SPI_DEVICE_4:
return engineConfiguration->spi4sckPin;
case SPI_DEVICE_5:
return engineConfiguration->spi5sckPin;
case SPI_DEVICE_6:
return engineConfiguration->spi6sckPin;
default:
break;
}
return Gpio::Unassigned;
}
/**
* @return NULL if SPI device not specified
*/
SPIDriver * getSpiDevice(spi_device_e spiDevice) {
if (spiDevice == SPI_NONE) {
return NULL;
}
#if STM32_SPI_USE_SPI1
if (spiDevice == SPI_DEVICE_1) {
return &SPID1;
}
#endif
#if STM32_SPI_USE_SPI2
if (spiDevice == SPI_DEVICE_2) {
return &SPID2;
}
#endif
#if STM32_SPI_USE_SPI3
if (spiDevice == SPI_DEVICE_3) {
return &SPID3;
}
#endif
#if STM32_SPI_USE_SPI4
if (spiDevice == SPI_DEVICE_4) {
return &SPID4;
}
#endif
#if STM32_SPI_USE_SPI5
if (spiDevice == SPI_DEVICE_5) {
return &SPID5;
}
#endif
#if STM32_SPI_USE_SPI6
if (spiDevice == SPI_DEVICE_6) {
return &SPID6;
}
#endif
firmwareError(ObdCode::CUSTOM_ERR_UNEXPECTED_SPI, "Unexpected SPI device: %d", spiDevice);
return NULL;
}
2015-07-10 06:01:56 -07:00
/**
* Only one consumer can use SPI bus at a given time
*/
void lockSpi(spi_device_e device) {
2023-06-24 23:08:53 -07:00
efiAssertVoid(ObdCode::CUSTOM_STACK_SPI, hasLotsOfRemainingStack(), "lockSpi");
2020-10-25 14:26:46 -07:00
spiAcquireBus(getSpiDevice(device));
2015-07-10 06:01:56 -07:00
}
2020-08-02 14:58:57 -07:00
void unlockSpi(spi_device_e device) {
2020-10-25 14:26:46 -07:00
spiReleaseBus(getSpiDevice(device));
2015-07-10 06:01:56 -07:00
}
static void initSpiModules() {
if (engineConfiguration->is_enabled_spi_1) {
2017-05-09 15:55:38 -07:00
turnOnSpi(SPI_DEVICE_1);
}
if (engineConfiguration->is_enabled_spi_2) {
2015-07-10 06:01:56 -07:00
turnOnSpi(SPI_DEVICE_2);
}
if (engineConfiguration->is_enabled_spi_3) {
2015-07-10 06:01:56 -07:00
turnOnSpi(SPI_DEVICE_3);
}
if (engineConfiguration->is_enabled_spi_4) {
turnOnSpi(SPI_DEVICE_4);
}
2024-02-26 10:17:07 -08:00
if (engineConfiguration->is_enabled_spi_5) {
turnOnSpi(SPI_DEVICE_5);
}
if (engineConfiguration->is_enabled_spi_6) {
turnOnSpi(SPI_DEVICE_6);
}
2015-07-10 06:01:56 -07:00
}
void stopSpi(spi_device_e device) {
if (!isSpiInitialized[device]) {
return; // not turned on
2015-07-10 06:01:56 -07:00
}
isSpiInitialized[device] = false;
efiSetPadUnused(getSckPin(device));
efiSetPadUnused(getMisoPin(device));
efiSetPadUnused(getMosiPin(device));
}
static void stopSpiModules() {
if (isConfigurationChanged(is_enabled_spi_1)) {
stopSpi(SPI_DEVICE_1);
2015-07-10 06:01:56 -07:00
}
if (isConfigurationChanged(is_enabled_spi_2)) {
stopSpi(SPI_DEVICE_2);
2015-07-10 06:01:56 -07:00
}
if (isConfigurationChanged(is_enabled_spi_3)) {
stopSpi(SPI_DEVICE_3);
2015-07-10 06:01:56 -07:00
}
if (isConfigurationChanged(is_enabled_spi_4)) {
stopSpi(SPI_DEVICE_4);
}
if (isConfigurationChanged(is_enabled_spi_5)) {
stopSpi(SPI_DEVICE_5);
2024-02-26 10:32:47 -08:00
}
if (isConfigurationChanged(is_enabled_spi_6)) {
stopSpi(SPI_DEVICE_6);
2024-02-26 10:32:47 -08:00
}
2015-07-10 06:01:56 -07:00
}
void printSpiConfig(const char *msg, spi_device_e device) {
efiPrintf("%s %s mosi=%s", msg, getSpi_device_e(device), hwPortname(getMosiPin(device)));
efiPrintf("%s %s miso=%s", msg, getSpi_device_e(device), hwPortname(getMisoPin(device)));
efiPrintf("%s %s sck=%s", msg, getSpi_device_e(device), hwPortname(getSckPin(device)));
}
2023-05-31 20:06:39 -07:00
#endif // HAL_USE_SPI
2015-07-10 06:01:56 -07:00
#if HAL_USE_ADC
2015-07-10 06:01:56 -07:00
static FastAdcToken fastMapSampleIndex;
static FastAdcToken hipSampleIndex;
#if HAL_TRIGGER_USE_ADC
static FastAdcToken triggerSampleIndex;
2023-05-31 20:06:39 -07:00
#endif // HAL_TRIGGER_USE_ADC
2015-07-10 06:01:56 -07:00
2019-01-31 08:57:15 -08:00
extern AdcDevice fastAdc;
#ifdef FAST_ADC_SKIP
// No reason to enable if N = 1
static_assert(FAST_ADC_SKIP > 1);
static size_t fastAdcSkipCount = 0;
#endif // FAST_ADC_SKIP
2020-09-12 00:59:53 -07:00
/**
* This method is not in the adc* lower-level file because it is more business logic then hardware.
*/
void onFastAdcComplete(adcsample_t*) {
ScopePerf perf(PE::AdcCallbackFast);
2020-09-12 00:59:53 -07:00
#if HAL_TRIGGER_USE_ADC
// we need to call this ASAP, because trigger processing is time-critical
triggerAdcCallback(getFastAdc(triggerSampleIndex));
2020-09-12 00:59:53 -07:00
#endif /* HAL_TRIGGER_USE_ADC */
#ifdef FAST_ADC_SKIP
// If we run the fast ADC _very_ fast for triggerAdcCallback's benefit, we may want to
// skip most of the samples for the rest of the callback.
if (fastAdcSkipCount++ == FAST_ADC_SKIP) {
fastAdcSkipCount = 0;
} else {
return;
}
#endif
2019-10-11 17:43:21 -07:00
2015-07-10 06:01:56 -07:00
/**
* this callback is executed 10 000 times a second, it needs to be as fast as possible
*/
2023-06-24 23:08:53 -07:00
efiAssertVoid(ObdCode::CUSTOM_STACK_ADC, hasLotsOfRemainingStack(), "lowstck#9b");
2015-07-10 06:01:56 -07:00
2020-02-26 14:30:02 -08:00
#if EFI_SENSOR_CHART && EFI_SHAFT_POSITION_INPUT
2022-09-15 18:45:48 -07:00
if (getEngineState()->sensorChartMode == SC_AUX_FAST1) {
float voltage = getAdcValue("fAux1", engineConfiguration->auxFastSensor1_adcChannel);
scAddData(engine->triggerCentral.getCurrentEnginePhase(getTimeNowNt()).value_or(0), voltage);
}
2019-12-04 04:33:56 -08:00
#endif /* EFI_SENSOR_CHART */
2015-07-10 06:01:56 -07:00
#if EFI_MAP_AVERAGING
mapAveragingAdcCallback(adcToVoltsDivided(getFastAdc(fastMapSampleIndex), engineConfiguration->map.sensor.hwChannel));
2015-07-10 06:01:56 -07:00
#endif /* EFI_MAP_AVERAGING */
2019-04-12 17:52:51 -07:00
#if EFI_HIP_9011
if (engineConfiguration->isHip9011Enabled) {
hipAdcCallback(adcToVoltsDivided(getFastAdc(hipSampleIndex), engineConfiguration->hipOutputChannel));
}
2019-12-04 04:33:56 -08:00
#endif /* EFI_HIP_9011 */
2015-07-10 06:01:56 -07:00
}
2019-01-31 08:57:15 -08:00
#endif /* HAL_USE_ADC */
2015-07-10 06:01:56 -07:00
static void calcFastAdcIndexes() {
#if HAL_USE_ADC
fastMapSampleIndex = enableFastAdcChannel("Fast MAP", engineConfiguration->map.sensor.hwChannel);
hipSampleIndex = enableFastAdcChannel("HIP9011", engineConfiguration->hipOutputChannel);
2020-09-12 00:59:53 -07:00
#if HAL_TRIGGER_USE_ADC
triggerSampleIndex = enableFastAdcChannel("Trigger ADC", getAdcChannelForTrigger());
2020-09-12 00:59:53 -07:00
#endif /* HAL_TRIGGER_USE_ADC */
2019-01-31 08:57:15 -08:00
#endif/* HAL_USE_ADC */
2015-07-10 06:01:56 -07:00
}
static void adcConfigListener() {
2017-06-04 12:57:57 -07:00
// todo: something is not right here - looks like should be a callback for each configuration change?
2015-07-10 06:01:56 -07:00
calcFastAdcIndexes();
}
/**
* this method is NOT currently invoked on ECU start
2023-04-22 08:28:50 -07:00
* todo: reduce code duplication by moving more logic into startHardware method
*/
void applyNewHardwareSettings() {
/**
* All 'stop' methods need to go before we begin starting pins.
*
* We take settings from 'activeConfiguration' not 'engineConfiguration' while stopping hardware.
* Some hardware is restart unconditionally on change of parameters while for some systems we make extra effort and restart only
* relevant settings were changes.
*
*/
ButtonDebounce::stopConfigurationList();
#if EFI_PROD_CODE
stopSensors();
#endif // EFI_PROD_CODE
#if EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT
stopTriggerInputPins();
2015-07-10 06:01:56 -07:00
#endif /* EFI_SHAFT_POSITION_INPUT */
#if EFI_SENT_SUPPORT
stopSent();
#endif // EFI_SENT_SUPPORT
2019-10-18 16:45:32 -07:00
2019-04-12 17:52:51 -07:00
#if EFI_CAN_SUPPORT
2016-12-19 17:01:37 -08:00
stopCanPins();
#endif /* EFI_CAN_SUPPORT */
stopKLine();
#if EFI_AUX_SERIAL
stopAuxSerialPins();
#endif /* EFI_AUX_SERIAL */
#if EFI_HIP_9011
stopHip9001_pins();
#endif /* EFI_HIP_9011 */
stopHardware();
2015-07-10 06:01:56 -07:00
#if HAL_USE_SPI
stopSpiModules();
#endif /* HAL_USE_SPI */
2024-02-26 10:17:07 -08:00
2020-03-23 07:32:41 -07:00
if (isPinOrModeChanged(clutchUpPin, clutchUpPinMode)) {
2023-12-10 08:38:29 -08:00
// bug? duplication with stopSwitchPins?
efiSetPadUnused(activeConfiguration.clutchUpPin);
2020-03-23 07:32:41 -07:00
}
2022-04-16 14:04:35 -07:00
#if EFI_SHAFT_POSITION_INPUT
stopTriggerDebugPins();
2022-04-16 14:04:35 -07:00
#endif // EFI_SHAFT_POSITION_INPUT
2017-06-04 13:35:13 -07:00
enginePins.unregisterPins();
2016-09-13 21:03:14 -07:00
#if EFI_PROD_CODE
reconfigureSensors();
#endif /* EFI_PROD_CODE */
ButtonDebounce::startConfigurationList();
/*******************************************
* Start everything back with new settings *
******************************************/
startHardware();
#if EFI_PROD_CODE && (BOARD_EXT_GPIOCHIPS > 0)
/* TODO: properly restart gpio chips...
* This is only workaround for "CS pin lost" bug
* see: https://github.com/rusefi/rusefi/issues/2107
* We should provide better way to gracefully stop all
* gpio chips: set outputs to safe state, release all
* on-chip resources (gpios, SPIs, etc) and then restart
* with updated settings.
* Following code just re-inits CS pins for all external
* gpio chips, but does not update CS pin definition in
* gpio chips private data/settings. So changing CS pin
* on-fly does not work */
startSmartCsPins();
#endif /* (BOARD_EXT_GPIOCHIPS > 0) */
#if EFI_AUX_SERIAL
startAuxSerialPins();
#endif /* EFI_AUX_SERIAL */
startKLine();
#if EFI_HIP_9011
startHip9001_pins();
#endif /* EFI_HIP_9011 */
#if EFI_PROD_CODE && EFI_IDLE_CONTROL
if (isIdleHardwareRestartNeeded()) {
initIdleHardware();
}
2019-10-18 16:45:32 -07:00
#endif
#if EFI_BOOST_CONTROL
startBoostPin();
#endif
#if EFI_EMULATE_POSITION_SENSORS
startTriggerEmulatorPins();
#endif /* EFI_EMULATE_POSITION_SENSORS */
#if EFI_LOGIC_ANALYZER
startLogicAnalyzerPins();
#endif /* EFI_LOGIC_ANALYZER */
#if EFI_VVT_PID
2021-02-17 05:53:39 -08:00
startVvtControlPins();
#endif /* EFI_VVT_PID */
2016-12-19 17:01:37 -08:00
#if EFI_SENT_SUPPORT
startSent();
#endif
adcConfigListener();
2015-07-10 06:01:56 -07:00
}
2024-03-15 08:19:42 -07:00
#if EFI_PROD_CODE && EFI_BOR_LEVEL
2017-02-14 18:01:56 -08:00
void setBor(int borValue) {
efiPrintf("setting BOR to %d", borValue);
2017-02-14 18:01:56 -08:00
BOR_Set((BOR_Level_t)borValue);
}
2023-05-24 08:07:31 -07:00
#endif /* EFI_BOR_LEVEL */
2017-02-14 18:01:56 -08:00
// This function initializes hardware that can do so before configuration is loaded
void initHardwareNoConfig() {
2023-06-24 23:08:53 -07:00
efiAssertVoid(ObdCode::CUSTOM_IH_STACK, hasLotsOfRemainingStack(), "init h");
2015-07-10 06:01:56 -07:00
efiPrintf("initHardware()");
#if EFI_PROD_CODE
initPinRepository();
#endif
2015-07-10 06:01:56 -07:00
#if EFI_HISTOGRAMS
/**
* histograms is a data structure for CPU monitor, it does not depend on configuration
*/
initHistogramsModule();
#endif /* EFI_HISTOGRAMS */
#if EFI_GPIO_HARDWARE
2015-07-10 06:01:56 -07:00
/**
* We need the LED_ERROR pin even before we read configuration
*/
initPrimaryPins();
#endif // EFI_GPIO_HARDWARE
2015-07-10 06:01:56 -07:00
2023-05-23 21:44:58 -07:00
#if EFI_PROD_CODE && EFI_SIGNAL_EXECUTOR_ONE_TIMER
// it's important to initialize this pretty early in the game before any scheduling usages
initSingleTimerExecutorHardware();
2023-05-23 21:44:58 -07:00
#endif // EFI_PROD_CODE && EFI_SIGNAL_EXECUTOR_ONE_TIMER
#if EFI_PROD_CODE && EFI_RTC
initRtc();
2023-05-23 21:44:58 -07:00
#endif // EFI_PROD_CODE && EFI_RTC
2015-07-10 06:01:56 -07:00
#if (EFI_STORAGE_INT_FLASH == TRUE) || (EFI_STORAGE_MFS == TRUE)
initFlash();
#endif
#if EFI_FILE_LOGGING
initEarlyMmcCard();
#endif // EFI_FILE_LOGGING
#if HAL_USE_PAL && EFI_PROD_CODE
// this should be initialized before detectBoardType()
efiExtiInit();
#endif // HAL_USE_PAL
}
void stopHardware() {
2023-12-10 08:38:29 -08:00
stopSwitchPins();
#if EFI_PROD_CODE && (BOARD_EXT_GPIOCHIPS > 0)
stopSmartCsPins();
#endif /* (BOARD_EXT_GPIOCHIPS > 0) */
#if EFI_LOGIC_ANALYZER
stopLogicAnalyzerPins();
#endif /* EFI_LOGIC_ANALYZER */
#if EFI_EMULATE_POSITION_SENSORS
stopTriggerEmulatorPins();
#endif /* EFI_EMULATE_POSITION_SENSORS */
#if EFI_VVT_PID
stopVvtControlPins();
#endif /* EFI_VVT_PID */
}
/**
* This method is invoked both on ECU start and configuration change
2023-04-19 13:51:16 -07:00
* At the moment we have too many system which handle ECU start and configuration change separately
* TODO: move move hardware code here
*/
void startHardware() {
initStartStopButton();
#if EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT
startTriggerInputPins();
#endif /* EFI_SHAFT_POSITION_INPUT */
2023-04-19 13:51:16 -07:00
#if EFI_ENGINE_CONTROL
enginePins.startPins();
#endif /* EFI_ENGINE_CONTROL */
2022-04-16 14:04:35 -07:00
#if EFI_SHAFT_POSITION_INPUT
validateTriggerInputs();
startTriggerDebugPins();
2022-04-16 14:04:35 -07:00
#endif // EFI_SHAFT_POSITION_INPUT
2023-12-10 08:38:29 -08:00
startSwitchPins();
#if EFI_CAN_SUPPORT
startCanPins();
#endif /* EFI_CAN_SUPPORT */
}
2022-01-09 22:47:06 -08:00
// Weak link a stub so that every board doesn't have to implement this function
__attribute__((weak)) void boardInitHardware() { }
2024-02-24 15:28:20 -08:00
__attribute__((weak)) void boardInitHardwareExtra() { }
2022-01-09 22:47:06 -08:00
2022-01-14 19:45:49 -08:00
__attribute__((weak)) void setPinConfigurationOverrides() { }
2022-02-06 16:48:20 -08:00
#if HAL_USE_I2C
const I2CConfig i2cfg = {
OPMODE_I2C,
400000,
FAST_DUTY_CYCLE_2,
};
2022-02-06 16:48:20 -08:00
#endif
void initHardware() {
2015-07-10 06:01:56 -07:00
if (hasFirmwareError()) {
return;
}
2024-03-15 08:19:42 -07:00
#if EFI_PROD_CODE && STM32_I2C_USE_I2C3
if (engineConfiguration->useEeprom) {
i2cStart(&EE_U2CD, &i2cfg);
}
2022-02-06 18:26:22 -08:00
#endif // STM32_I2C_USE_I2C3
boardInitHardware();
2024-02-24 15:28:20 -08:00
boardInitHardwareExtra();
2019-04-12 17:52:51 -07:00
#if HAL_USE_ADC
initAdcInputs();
2020-09-12 00:59:53 -07:00
// wait for first set of ADC values so that we do not produce invalid sensor data
waitForSlowAdc(1);
#endif /* HAL_USE_ADC */
2015-07-10 06:01:56 -07:00
#if EFI_SOFTWARE_KNOCK
initSoftwareKnock();
#endif /* EFI_SOFTWARE_KNOCK */
#ifdef TRIGGER_SCOPE
initTriggerScope();
#endif // TRIGGER_SCOPE
2019-04-13 09:02:34 -07:00
#if HAL_USE_SPI
initSpiModules();
2019-06-05 18:39:12 -07:00
#endif /* HAL_USE_SPI */
2020-02-26 14:30:02 -08:00
#if (EFI_PROD_CODE && BOARD_EXT_GPIOCHIPS > 0) || EFI_SIMULATOR
2019-04-13 09:02:34 -07:00
// initSmartGpio depends on 'initSpiModules'
initSmartGpio();
2020-02-26 14:30:02 -08:00
#endif
2019-04-13 09:02:34 -07:00
// output pins potentially depend on 'initSmartGpio'
2023-11-24 11:37:01 -08:00
initMiscOutputPins();
#if EFI_MC33816
initMc33816();
#endif /* EFI_MC33816 */
#if EFI_CAN_SUPPORT
#if EFI_SIMULATOR
// Set CAN device name
CAND1.deviceName = "can0";
#endif
2015-07-10 06:01:56 -07:00
initCan();
#endif /* EFI_CAN_SUPPORT */
2022-10-21 18:16:37 -07:00
#if EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT
onEcuStartTriggerImplementation();
2022-10-21 18:16:37 -07:00
#endif /* EFI_SHAFT_POSITION_INPUT */
onEcuStartDoSomethingTriggerInputPins();
2015-07-10 06:01:56 -07:00
2019-04-12 17:52:51 -07:00
#if EFI_HIP_9011
initHip9011();
2015-07-10 06:01:56 -07:00
#endif /* EFI_HIP_9011 */
#if EFI_WS2812
initWS2812();
#endif /* EFI_LED_WS2812 */
2023-12-13 08:08:28 -08:00
#if EFI_ONBOARD_MEMS
initAccelerometer();
#endif
2018-10-16 18:27:05 -07:00
2019-04-12 17:52:51 -07:00
#if EFI_BOSCH_YAW
2018-10-16 18:27:05 -07:00
initBoschYawRateSensor();
#endif /* EFI_BOSCH_YAW */
2019-04-12 17:52:51 -07:00
#if EFI_UART_GPS
2015-07-10 06:01:56 -07:00
initGps();
#endif
#if EFI_AUX_SERIAL
initAuxSerial();
#endif /* EFI_AUX_SERIAL */
2017-05-12 18:19:14 -07:00
#if EFI_CAN_SUPPORT
initCanVssSupport();
#endif // EFI_CAN_SUPPORT
2019-01-04 20:47:39 -08:00
#if EFI_CDM_INTEGRATION
cdmIonInit();
#endif // EFI_CDM_INTEGRATION
2019-01-04 20:47:39 -08:00
#if EFI_SENT_SUPPORT
initSent();
#endif
initKLine();
2023-10-09 07:51:21 -07:00
#if EFI_DAC
initDac();
#endif
2015-07-10 06:01:56 -07:00
calcFastAdcIndexes();
startHardware();
efiPrintf("initHardware() OK!");
2015-07-10 06:01:56 -07:00
}
2019-04-12 17:52:51 -07:00
#if HAL_USE_SPI
2019-03-25 19:41:31 -07:00
// this is F4 implementation but we will keep it here for now for simplicity
int getSpiPrescaler(spi_speed_e speed, spi_device_e device) {
switch (speed) {
case _5MHz:
return device == SPI_DEVICE_1 ? SPI_BaudRatePrescaler_16 : SPI_BaudRatePrescaler_8;
case _2_5MHz:
return device == SPI_DEVICE_1 ? SPI_BaudRatePrescaler_32 : SPI_BaudRatePrescaler_16;
case _1_25MHz:
return device == SPI_DEVICE_1 ? SPI_BaudRatePrescaler_64 : SPI_BaudRatePrescaler_32;
2019-03-25 19:41:31 -07:00
case _150KHz:
// SPI1 does not support 150KHz, it would be 300KHz for SPI1
return SPI_BaudRatePrescaler_256;
default:
// unexpected
return 0;
}
}
#endif /* HAL_USE_SPI */
2023-12-12 14:02:56 -08:00
void checkLastResetCause() {
2023-12-12 14:09:02 -08:00
#if EFI_PROD_CODE
2023-12-12 14:02:56 -08:00
Reset_Cause_t cause = getMCUResetCause();
const char *causeStr = getMCUResetCause(cause);
efiPrintf("Last Reset Cause: %s", causeStr);
// if reset by watchdog, signal a fatal error
if (cause == Reset_Cause_IWatchdog || cause == Reset_Cause_WWatchdog) {
firmwareError(ObdCode::OBD_PCM_Processor_Fault, "Watchdog Reset");
}
2023-12-12 14:09:02 -08:00
#endif // EFI_PROD_CODE
2023-12-12 14:02:56 -08:00
}