rusefi/firmware/hw_layer/hardware.cpp

627 lines
14 KiB
C++
Raw 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
*/
2018-09-16 19:25:17 -07:00
#include "global.h"
2019-01-03 21:16:08 -08:00
#if EFI_PROD_CODE
#include "os_access.h"
#include "trigger_input.h"
#include "servo.h"
2015-07-10 06:01:56 -07:00
#include "adc_inputs.h"
#include "can_hw.h"
#include "hardware.h"
#include "rtc_helper.h"
2019-07-06 17:15:49 -07:00
#include "os_util.h"
#include "bench_test.h"
2015-07-10 06:01:56 -07:00
#include "vehicle_speed.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"
2015-07-10 06:01:56 -07:00
#include "max31855.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"
2015-07-10 06:01:56 -07:00
2019-01-03 21:16:08 -08:00
#include "mpu_util.h"
2017-05-12 18:19:14 -07:00
//#include "usb_msd.h"
2015-07-10 06:01:56 -07:00
#include "AdcConfiguration.h"
2019-10-18 16:45:32 -07:00
#include "idle_thread.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 "mmc_card.h"
#include "neo6m.h"
#include "lcd_HD44780.h"
#include "settings.h"
#include "joystick.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 "engine_configuration.h"
2017-05-02 15:40:33 -07:00
#include "aux_pid.h"
2019-10-11 17:43:21 -07:00
#include "perf_trace.h"
#include "boost_control.h"
#if EFI_MC33816
#include "mc33816.h"
#endif /* EFI_MC33816 */
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_INTERNAL_FLASH
#include "flash_main.h"
2020-02-26 14:30:02 -08:00
#endif
2015-07-10 06:01:56 -07:00
#if EFI_CAN_SUPPORT
#include "can_vss.h"
#endif
EXTERN_ENGINE;
2015-07-10 06:01:56 -07:00
2017-03-21 11:58:14 -07:00
static mutex_t spiMtx;
2015-07-10 06:01:56 -07:00
2019-04-12 17:52:51 -07:00
#if HAL_USE_SPI
2016-09-14 16:03:00 -07:00
extern bool isSpiInitialized[5];
2015-07-10 06:01:56 -07:00
2016-09-15 19:02:00 -07:00
/**
* #311 we want to test RTC before engine start so that we do not test it while engine is running
*/
bool rtcWorks = true;
2016-05-03 20:01:36 -07:00
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) {
UNUSED(device);
efiAssertVoid(CUSTOM_STACK_SPI, getCurrentRemainingStack() > 128, "lockSpi");
2015-07-10 06:01:56 -07:00
// todo: different locks for different SPI devices!
chMtxLock(&spiMtx);
}
2020-08-02 14:58:57 -07:00
void unlockSpi(spi_device_e device) {
2017-03-21 11:58:14 -07:00
chMtxUnlock(&spiMtx);
2015-07-10 06:01:56 -07:00
}
static void initSpiModules(engine_configuration_s *engineConfiguration) {
UNUSED(engineConfiguration);
if (CONFIG(is_enabled_spi_1)) {
2017-05-09 15:55:38 -07:00
turnOnSpi(SPI_DEVICE_1);
}
if (CONFIG(is_enabled_spi_2)) {
2015-07-10 06:01:56 -07:00
turnOnSpi(SPI_DEVICE_2);
}
if (CONFIG(is_enabled_spi_3)) {
2015-07-10 06:01:56 -07:00
turnOnSpi(SPI_DEVICE_3);
}
if (CONFIG(is_enabled_spi_4)) {
turnOnSpi(SPI_DEVICE_4);
}
2015-07-10 06:01:56 -07:00
}
/**
* @return NULL if SPI device not specified
*/
2015-07-10 06:01:56 -07:00
SPIDriver * getSpiDevice(spi_device_e spiDevice) {
if (spiDevice == SPI_NONE) {
return NULL;
}
2019-04-12 17:52:51 -07:00
#if STM32_SPI_USE_SPI1
2015-07-10 06:01:56 -07:00
if (spiDevice == SPI_DEVICE_1) {
return &SPID1;
}
#endif
2019-04-12 17:52:51 -07:00
#if STM32_SPI_USE_SPI2
2015-07-10 06:01:56 -07:00
if (spiDevice == SPI_DEVICE_2) {
return &SPID2;
}
#endif
2019-04-12 17:52:51 -07:00
#if STM32_SPI_USE_SPI3
2015-07-10 06:01:56 -07:00
if (spiDevice == SPI_DEVICE_3) {
return &SPID3;
}
#endif
#if STM32_SPI_USE_SPI4
if (spiDevice == SPI_DEVICE_4) {
return &SPID4;
}
2015-07-10 06:01:56 -07:00
#endif
2017-03-08 22:10:33 -08:00
firmwareError(CUSTOM_ERR_UNEXPECTED_SPI, "Unexpected SPI device: %d", spiDevice);
2015-07-10 06:01:56 -07:00
return NULL;
}
#endif
2019-04-12 17:52:51 -07:00
#if HAL_USE_I2C
#if defined(STM32F7XX)
// values calculated with STM32CubeMX tool, 100kHz I2C clock for Nucleo-767 @168 MHz, PCK1=42MHz
#define HAL_I2C_F7_100_TIMINGR 0x00A0A3F7
static I2CConfig i2cfg = { HAL_I2C_F7_100_TIMINGR, 0, 0 }; // todo: does it work?
#else /* defined(STM32F4XX) */
2015-07-10 06:01:56 -07:00
static I2CConfig i2cfg = { OPMODE_I2C, 100000, STD_DUTY_CYCLE, };
#endif /* defined(STM32F4XX) */
2015-07-10 06:01:56 -07:00
//static char txbuf[1];
static void sendI2Cbyte(int addr, int data) {
2019-04-04 16:56:03 -07:00
(void)addr;
(void)data;
2015-07-10 06:01:56 -07:00
// i2cAcquireBus(&I2CD1);
// txbuf[0] = data;
// i2cMasterTransmit(&I2CD1, addr, txbuf, 1, NULL, 0);
// i2cReleaseBus(&I2CD1);
}
#endif
static Logging *sharedLogger;
#if EFI_PROD_CODE
#define TPS_IS_SLOW -1
static int fastMapSampleIndex;
static int hipSampleIndex;
static int tpsSampleIndex;
2019-01-31 08:57:15 -08:00
#if HAL_USE_ADC
extern AdcDevice fastAdc;
2015-07-10 06:01:56 -07:00
/**
* This method is not in the adc* lower-level file because it is more business logic then hardware.
*/
void adc_callback_fast(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
(void) buffer;
(void) n;
2019-10-11 17:43:21 -07:00
ScopePerf perf(PE::AdcCallbackFast);
2015-07-10 06:01:56 -07:00
/**
* Note, only in the ADC_COMPLETE state because the ADC driver fires an
* intermediate callback when the buffer is half full.
* */
if (adcp->state == ADC_COMPLETE) {
2019-10-14 23:34:12 -07:00
ScopePerf perf(PE::AdcCallbackFastComplete);
2019-10-11 17:43:21 -07:00
2019-10-08 17:44:59 -07:00
fastAdc.invalidateSamplesCache();
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
*/
2019-02-23 09:33:49 -08:00
efiAssertVoid(CUSTOM_ERR_6676, getCurrentRemainingStack() > 128, "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
if (ENGINE(sensorChartMode) == SC_AUX_FAST1) {
float voltage = getAdcValue("fAux1", engineConfiguration->auxFastSensor1_adcChannel);
scAddData(getCrankshaftAngleNt(getTimeNowNt() PASS_ENGINE_PARAMETER_SUFFIX), 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
2018-02-06 13:13:09 -08:00
mapAveragingAdcCallback(fastAdc.samples[fastMapSampleIndex]);
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 (CONFIG(isHip9011Enabled)) {
2015-07-10 06:01:56 -07:00
hipAdcCallback(fastAdc.samples[hipSampleIndex]);
}
2019-12-04 04:33:56 -08:00
#endif /* EFI_HIP_9011 */
2018-12-26 17:27:24 -08:00
// if (tpsSampleIndex != TPS_IS_SLOW) {
2016-01-31 18:02:03 -08:00
// tpsFastAdc = fastAdc.samples[tpsSampleIndex];
2018-12-26 17:27:24 -08:00
// }
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(void) {
2019-01-31 08:57:15 -08:00
#if HAL_USE_ADC
2015-07-10 06:01:56 -07:00
fastMapSampleIndex = fastAdc.internalAdcIndexByHardwareIndex[engineConfiguration->map.sensor.hwChannel];
hipSampleIndex =
engineConfiguration->hipOutputChannel == EFI_ADC_NONE ?
-1 : fastAdc.internalAdcIndexByHardwareIndex[engineConfiguration->hipOutputChannel];
if (engineConfiguration->tps1_1AdcChannel != EFI_ADC_NONE) {
tpsSampleIndex = fastAdc.internalAdcIndexByHardwareIndex[engineConfiguration->tps1_1AdcChannel];
2015-07-10 06:01:56 -07:00
} else {
tpsSampleIndex = TPS_IS_SLOW;
}
2019-01-31 08:57:15 -08:00
#endif/* HAL_USE_ADC */
2015-07-10 06:01:56 -07:00
}
static void adcConfigListener(Engine *engine) {
UNUSED(engine);
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();
}
void turnOnHardware(Logging *sharedLogger) {
2019-04-12 17:52:51 -07:00
#if EFI_SHAFT_POSITION_INPUT
2015-07-10 06:01:56 -07:00
turnOnTriggerInputPins(sharedLogger);
#endif /* EFI_SHAFT_POSITION_INPUT */
}
2016-09-13 21:03:14 -07:00
void stopSpi(spi_device_e device) {
2019-04-12 17:52:51 -07:00
#if HAL_USE_SPI
2020-03-23 07:32:41 -07:00
if (!isSpiInitialized[device]) {
2016-09-13 21:03:14 -07:00
return; // not turned on
2020-03-23 07:32:41 -07:00
}
2016-09-13 21:03:14 -07:00
isSpiInitialized[device] = false;
brain_pin_markUnused(getSckPin(device));
brain_pin_markUnused(getMisoPin(device));
brain_pin_markUnused(getMosiPin(device));
#endif /* HAL_USE_SPI */
2016-09-13 21:03:14 -07:00
}
/**
* this method is NOT currently invoked on ECU start
* todo: maybe start invoking this method on ECU start so that peripheral start-up initialization and restart are unified?
*/
2015-07-10 06:01:56 -07:00
void applyNewHardwareSettings(void) {
// all 'stop' methods need to go before we begin starting pins
2019-04-12 17:52:51 -07:00
#if EFI_SHAFT_POSITION_INPUT
stopTriggerInputPins();
2015-07-10 06:01:56 -07:00
#endif /* EFI_SHAFT_POSITION_INPUT */
2019-10-18 16:45:32 -07:00
#if (HAL_USE_PAL && EFI_JOYSTICK)
stopJoystickPins();
#endif /* HAL_USE_PAL && EFI_JOYSTICK */
2016-09-13 21:03:14 -07:00
2017-06-04 15:43:08 -07:00
enginePins.stopInjectionPins();
enginePins.stopIgnitionPins();
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 */
#if EFI_AUX_SERIAL
stopAuxSerialPins();
#endif /* EFI_AUX_SERIAL */
#if EFI_HIP_9011
stopHip9001_pins();
#endif /* EFI_HIP_9011 */
2019-10-18 16:45:32 -07:00
#if EFI_IDLE_CONTROL
bool isIdleRestartNeeded = isIdleHardwareRestartNeeded();
if (isIdleRestartNeeded) {
stopIdleHardware();
2019-10-18 16:45:32 -07:00
}
#endif
#if (BOARD_TLE6240_COUNT > 0)
stopSmartCsPins();
#endif /* (BOARD_MC33972_COUNT > 0) */
2019-04-12 17:52:51 -07:00
#if EFI_VEHICLE_SPEED
2017-04-05 15:08:36 -07:00
stopVSSPins();
#endif /* EFI_VEHICLE_SPEED */
2019-04-12 17:52:51 -07:00
#if EFI_AUX_PID
2017-05-02 15:40:33 -07:00
stopAuxPins();
#endif /* EFI_AUX_PID */
2015-07-10 06:01:56 -07:00
2020-03-23 07:32:41 -07:00
if (isConfigurationChanged(is_enabled_spi_1)) {
2016-09-14 07:02:54 -07:00
stopSpi(SPI_DEVICE_1);
2020-03-23 07:32:41 -07:00
}
2016-09-14 07:02:54 -07:00
2020-03-23 07:32:41 -07:00
if (isConfigurationChanged(is_enabled_spi_2)) {
2016-09-13 21:03:14 -07:00
stopSpi(SPI_DEVICE_2);
2020-03-23 07:32:41 -07:00
}
2016-09-13 21:03:14 -07:00
2020-03-23 07:32:41 -07:00
if (isConfigurationChanged(is_enabled_spi_3)) {
2016-09-13 21:03:14 -07:00
stopSpi(SPI_DEVICE_3);
2020-03-23 07:32:41 -07:00
}
2016-09-13 21:03:14 -07:00
2020-03-23 07:32:41 -07:00
if (isConfigurationChanged(is_enabled_spi_4)) {
stopSpi(SPI_DEVICE_4);
2020-03-23 07:32:41 -07:00
}
#if EFI_HD44780_LCD
stopHD44780_pins();
#endif /* #if EFI_HD44780_LCD */
2016-09-13 21:03:14 -07:00
#if EFI_BOOST_CONTROL
stopBoostPin();
#endif
2020-03-23 07:32:41 -07:00
if (isPinOrModeChanged(clutchUpPin, clutchUpPinMode)) {
brain_pin_markUnused(activeConfiguration.clutchUpPin);
2020-03-23 07:32:41 -07:00
}
if (isPinOrModeChanged(startStopButtonPin, startStopButtonMode)) {
brain_pin_markUnused(activeConfiguration.startStopButtonPin);
}
2016-09-13 21:03:14 -07:00
2017-06-04 13:35:13 -07:00
enginePins.unregisterPins();
2016-09-13 21:03:14 -07:00
2019-04-12 17:52:51 -07:00
#if EFI_SHAFT_POSITION_INPUT
startTriggerInputPins();
#endif /* EFI_SHAFT_POSITION_INPUT */
2016-09-13 21:03:14 -07:00
#if (HAL_USE_PAL && EFI_JOYSTICK)
startJoystickPins();
#endif /* HAL_USE_PAL && EFI_JOYSTICK */
#if EFI_HD44780_LCD
startHD44780_pins();
#endif /* #if EFI_HD44780_LCD */
2017-06-04 15:43:08 -07:00
enginePins.startInjectionPins();
enginePins.startIgnitionPins();
2019-04-12 17:52:51 -07:00
#if EFI_CAN_SUPPORT
2016-12-19 17:01:37 -08:00
startCanPins();
#endif /* EFI_CAN_SUPPORT */
#if EFI_AUX_SERIAL
startAuxSerialPins();
#endif /* EFI_AUX_SERIAL */
#if EFI_HIP_9011
startHip9001_pins();
#endif /* EFI_HIP_9011 */
2019-10-18 16:45:32 -07:00
#if EFI_IDLE_CONTROL
if (isIdleRestartNeeded) {
2019-10-18 16:45:32 -07:00
initIdleHardware();
}
2019-10-18 16:45:32 -07:00
#endif
2019-04-12 17:52:51 -07:00
#if EFI_VEHICLE_SPEED
2017-04-05 15:08:36 -07:00
startVSSPins();
#endif /* EFI_VEHICLE_SPEED */
#if EFI_BOOST_CONTROL
startBoostPin();
#endif
2019-04-12 17:52:51 -07:00
#if EFI_AUX_PID
2017-05-02 15:40:33 -07:00
startAuxPins();
#endif /* EFI_AUX_PID */
2016-12-19 17:01:37 -08:00
2016-09-14 21:01:50 -07:00
adcConfigListener(engine);
2015-07-10 06:01:56 -07:00
}
2017-02-14 18:01:56 -08:00
void setBor(int borValue) {
scheduleMsg(sharedLogger, "setting BOR to %d", borValue);
BOR_Set((BOR_Level_t)borValue);
showBor();
}
void showBor(void) {
scheduleMsg(sharedLogger, "BOR=%d", (int)BOR_Get());
}
2015-07-10 06:01:56 -07:00
void initHardware(Logging *l) {
efiAssertVoid(CUSTOM_IH_STACK, getCurrentRemainingStack() > EXPECTED_REMAINING_STACK, "init h");
2015-07-10 06:01:56 -07:00
sharedLogger = l;
engine_configuration_s *engineConfiguration = engine->engineConfigurationPtr;
2018-09-10 19:00:13 -07:00
efiAssertVoid(CUSTOM_EC_NULL, engineConfiguration!=NULL, "engineConfiguration");
2015-07-10 06:01:56 -07:00
printMsg(sharedLogger, "initHardware()");
// todo: enable protection. it's disabled because it takes
// 10 extra seconds to re-flash the chip
//flashProtect();
2017-03-21 11:58:14 -07:00
chMtxObjectInit(&spiMtx);
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 */
/**
* We need the LED_ERROR pin even before we read configuration
*/
initPrimaryPins(sharedLogger);
2015-07-10 06:01:56 -07:00
if (hasFirmwareError()) {
return;
}
#if EFI_INTERNAL_FLASH
2020-06-21 12:40:59 -07:00
#ifdef CONFIG_RESET_SWITCH_PORT
// this pin is not configurable at runtime so that we have a reliable way to reset configuration
#define SHOULD_INGORE_FLASH() (palReadPad(CONFIG_RESET_SWITCH_PORT, CONFIG_RESET_SWITCH_PIN) == 0)
#else
#define SHOULD_INGORE_FLASH() (false)
#endif // CONFIG_RESET_SWITCH_PORT
#ifdef CONFIG_RESET_SWITCH_PORT
2015-07-10 06:01:56 -07:00
palSetPadMode(CONFIG_RESET_SWITCH_PORT, CONFIG_RESET_SWITCH_PIN, PAL_MODE_INPUT_PULLUP);
#endif /* CONFIG_RESET_SWITCH_PORT */
2015-07-10 06:01:56 -07:00
initFlash(sharedLogger);
/**
* this call reads configuration from flash memory or sets default configuration
* if flash state does not look right.
2019-04-06 05:41:37 -07:00
*
* interesting fact that we have another read from flash before we get here
2015-07-10 06:01:56 -07:00
*/
if (SHOULD_INGORE_FLASH()) {
engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
2017-05-15 20:28:49 -07:00
resetConfigurationExt(sharedLogger, engineConfiguration->engineType PASS_ENGINE_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
writeToFlashNow();
} else {
readFromFlash();
}
#else
engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
2017-05-15 20:28:49 -07:00
resetConfigurationExt(sharedLogger, engineConfiguration->engineType PASS_ENGINE_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
#endif /* EFI_INTERNAL_FLASH */
2019-02-27 14:12:52 -08:00
// it's important to initialize this pretty early in the game before any scheduling usages
initSingleTimerExecutorHardware();
#if EFI_HD44780_LCD
lcd_HD44780_init(sharedLogger);
if (hasFirmwareError())
return;
lcd_HD44780_print_string(VCS_VERSION);
#endif /* EFI_HD44780_LCD */
2015-07-10 06:01:56 -07:00
if (hasFirmwareError()) {
return;
}
2019-04-12 17:52:51 -07:00
#if HAL_USE_ADC
initAdcInputs();
// 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
initRtc();
2019-04-13 09:02:34 -07:00
#if HAL_USE_SPI
initSpiModules(engineConfiguration);
2019-06-05 18:39:12 -07:00
#endif /* HAL_USE_SPI */
2020-02-26 14:30:02 -08:00
#if BOARD_EXT_GPIOCHIPS > 0
2019-04-13 09:02:34 -07:00
// initSmartGpio depends on 'initSpiModules'
initSmartGpio(PASS_ENGINE_PARAMETER_SIGNATURE);
2020-02-26 14:30:02 -08:00
#endif
2019-04-13 09:02:34 -07:00
2020-03-20 17:45:35 -07:00
if (CONFIG(startStopButtonPin) != GPIO_UNASSIGNED) {
efiSetPadMode("start/stop", CONFIG(startStopButtonPin),
getInputMode(CONFIG(startStopButtonMode)));
}
2019-04-13 09:02:34 -07:00
// output pins potentially depend on 'initSmartGpio'
2019-09-19 18:41:52 -07:00
initOutputPins(PASS_ENGINE_PARAMETER_SIGNATURE);
2015-07-10 06:01:56 -07:00
#if EFI_MC33816
2020-02-25 18:35:21 -08:00
initMc33816(sharedLogger);
#endif /* EFI_MC33816 */
2015-07-10 06:01:56 -07:00
#if EFI_MAX_31855
initMax31855(sharedLogger, CONFIG(max31855spiDevice), CONFIG(max31855_cs));
2015-07-10 06:01:56 -07:00
#endif /* EFI_MAX_31855 */
#if EFI_CAN_SUPPORT
initCan();
#endif /* EFI_CAN_SUPPORT */
// init_adc_mcp3208(&adcState, &SPID2);
// requestAdcValue(&adcState, 0);
2019-04-12 17:52:51 -07:00
#if EFI_SHAFT_POSITION_INPUT
2015-07-10 06:01:56 -07:00
// todo: figure out better startup logic
2017-05-15 17:31:16 -07:00
initTriggerCentral(sharedLogger);
2015-07-10 06:01:56 -07:00
#endif /* EFI_SHAFT_POSITION_INPUT */
turnOnHardware(sharedLogger);
2019-04-12 17:52:51 -07:00
#if EFI_HIP_9011
2015-07-10 06:01:56 -07:00
initHip9011(sharedLogger);
#endif /* EFI_HIP_9011 */
2019-04-12 17:52:51 -07:00
#if EFI_FILE_LOGGING
2015-07-10 06:01:56 -07:00
initMmcCard();
#endif /* EFI_FILE_LOGGING */
2019-04-12 17:52:51 -07:00
#if EFI_MEMS
2017-08-28 17:42:27 -07:00
initAccelerometer(PASS_ENGINE_PARAMETER_SIGNATURE);
#endif
2015-07-10 06:01:56 -07:00
// initFixedLeds();
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 */
2015-07-10 06:01:56 -07:00
// initBooleanInputs();
2019-04-12 17:52:51 -07:00
#if EFI_UART_GPS
2015-07-10 06:01:56 -07:00
initGps();
#endif
2018-03-17 18:24:04 -07:00
#if EFI_SERVO
initServo();
#endif
2019-04-12 17:52:51 -07:00
#if ADC_SNIFFER
2015-07-10 06:01:56 -07:00
initAdcDriver();
#endif
2019-04-12 17:52:51 -07:00
#if HAL_USE_I2C
2015-07-10 06:01:56 -07:00
addConsoleActionII("i2c", sendI2Cbyte);
#endif
#if EFI_AUX_SERIAL
initAuxSerial();
#endif /* EFI_AUX_SERIAL */
2017-05-12 18:19:14 -07:00
// USBMassStorageDriver UMSD1;
2015-07-10 06:01:56 -07:00
// while (true) {
// for (int addr = 0x20; addr < 0x28; addr++) {
// sendI2Cbyte(addr, 0);
// int err = i2cGetErrors(&I2CD1);
// print("I2C: err=%x from %d\r\n", err, addr);
// chThdSleepMilliseconds(5);
// sendI2Cbyte(addr, 255);
// chThdSleepMilliseconds(5);
// }
// }
2019-04-12 17:52:51 -07:00
#if EFI_VEHICLE_SPEED
2015-07-10 06:01:56 -07:00
initVehicleSpeed(sharedLogger);
#endif
#if EFI_CAN_SUPPORT
initCanVssSupport(sharedLogger);
#endif
2019-01-04 20:47:39 -08:00
#if EFI_CDM_INTEGRATION
cdmIonInit();
#endif
2019-04-12 17:52:51 -07:00
#if (HAL_USE_PAL && EFI_JOYSTICK)
2015-07-10 06:01:56 -07:00
initJoystick(sharedLogger);
#endif /* HAL_USE_PAL && EFI_JOYSTICK */
2015-07-10 06:01:56 -07:00
calcFastAdcIndexes();
printMsg(sharedLogger, "initHardware() OK!");
}
#endif /* EFI_PROD_CODE */
2019-01-03 21:16:08 -08:00
#endif /* EFI_PROD_CODE || EFI_SIMULATOR */
2019-03-25 19:41:31 -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 */