From 742ea83bfa19600aa832dd5ee8125ac469d66f32 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 27 Apr 2021 12:29:22 -0700 Subject: [PATCH] Baro config (#2591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * adjust API to allow i2c init to fail * init * proteus config * 🎠🎠🎠 * buh Co-authored-by: Matthew Kennedy --- .../config/boards/proteus/board_configuration.cpp | 3 +++ firmware/hw_layer/adc/ads1015.cpp | 4 +++- firmware/hw_layer/i2c_bb.cpp | 11 +++++++++-- firmware/hw_layer/i2c_bb.h | 2 +- firmware/hw_layer/sensors/lps25.cpp | 4 +++- firmware/init/init.h | 2 +- firmware/init/sensor/init_baro.cpp | 8 ++++---- firmware/init/sensor/init_sensors.cpp | 2 +- 8 files changed, 25 insertions(+), 11 deletions(-) diff --git a/firmware/config/boards/proteus/board_configuration.cpp b/firmware/config/boards/proteus/board_configuration.cpp index 9fff99c28a..b26501ba02 100644 --- a/firmware/config/boards/proteus/board_configuration.cpp +++ b/firmware/config/boards/proteus/board_configuration.cpp @@ -162,6 +162,9 @@ void setBoardConfigOverrides(void) { engineConfiguration->canTxPin = GPIOD_1; engineConfiguration->canRxPin = GPIOD_0; + + engineConfiguration->lps25BaroSensorScl = GPIOB_10; + engineConfiguration->lps25BaroSensorSda = GPIOB_11; } void setPinConfigurationOverrides(void) { diff --git a/firmware/hw_layer/adc/ads1015.cpp b/firmware/hw_layer/adc/ads1015.cpp index e861a0b6d4..bab207a149 100644 --- a/firmware/hw_layer/adc/ads1015.cpp +++ b/firmware/hw_layer/adc/ads1015.cpp @@ -9,7 +9,9 @@ constexpr uint8_t addr = 0x48; #define ADS1015_HI_THRESH (3) bool Ads1015::init(brain_pin_e scl, brain_pin_e sda) { - m_i2c.init(scl, sda); + if (!m_i2c.init(scl, sda)) { + return false; + } // ADS1015 has no ID register - so we read the Lo_thresh instead uint16_t loThresh = readReg(ADS1015_LO_THRESH); diff --git a/firmware/hw_layer/i2c_bb.cpp b/firmware/hw_layer/i2c_bb.cpp index b75fce2baa..25512831a9 100644 --- a/firmware/hw_layer/i2c_bb.cpp +++ b/firmware/hw_layer/i2c_bb.cpp @@ -10,6 +10,7 @@ #include "io_pins.h" #include "efi_gpio.h" +#include "pin_repository.h" void BitbangI2c::sda_high() { #if EFI_PROD_CODE @@ -35,9 +36,13 @@ void BitbangI2c::scl_low() { #endif } -void BitbangI2c::init(brain_pin_e scl, brain_pin_e sda) { +bool BitbangI2c::init(brain_pin_e scl, brain_pin_e sda) { #if EFI_PROD_CODE - if (m_sdaPort) return; + if (m_sdaPort) return false; + + if (!isBrainPinValid(scl) || !isBrainPinValid(sda)) { + return false; + } efiSetPadMode("i2c", scl, PAL_MODE_OUTPUT_OPENDRAIN); //PAL_STM32_OTYPE_OPENDRAIN efiSetPadMode("i2c", sda, PAL_MODE_OUTPUT_OPENDRAIN); @@ -52,6 +57,8 @@ void BitbangI2c::init(brain_pin_e scl, brain_pin_e sda) { // Both lines idle high scl_high(); sda_high(); + + return true; } void BitbangI2c::start() { diff --git a/firmware/hw_layer/i2c_bb.h b/firmware/hw_layer/i2c_bb.h index 51a1ce093a..f59730db7b 100644 --- a/firmware/hw_layer/i2c_bb.h +++ b/firmware/hw_layer/i2c_bb.h @@ -19,7 +19,7 @@ class BitbangI2c { public: // Initialize the I2C driver - void init(brain_pin_e scl, brain_pin_e sda); + bool init(brain_pin_e scl, brain_pin_e sda); // Write a sequence of bytes to the specified device void write(uint8_t addr, const uint8_t* data, size_t size); diff --git a/firmware/hw_layer/sensors/lps25.cpp b/firmware/hw_layer/sensors/lps25.cpp index a65d4b5e57..f15f56731c 100644 --- a/firmware/hw_layer/sensors/lps25.cpp +++ b/firmware/hw_layer/sensors/lps25.cpp @@ -27,7 +27,9 @@ static constexpr uint8_t expectedWhoAmI = 0xBD; #define REG_PressureOutH 0x2A bool Lps25::init(brain_pin_e scl, brain_pin_e sda) { - m_i2c.init(scl, sda); + if (!m_i2c.init(scl, sda)) { + return false; + } // Read ident register auto whoAmI = m_i2c.readRegister(addr, REG_WhoAmI); diff --git a/firmware/init/init.h b/firmware/init/init.h index fd431bacf1..07b358df4e 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -26,7 +26,7 @@ void initCanSensors(); void initLambda(DECLARE_ENGINE_PARAMETER_SIGNATURE); void initFlexSensor(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initFuelLevel(DECLARE_CONFIG_PARAMETER_SIGNATURE); -void initBaro(); +void initBaro(DECLARE_CONFIG_PARAMETER_SIGNATURE); // Sensor reconfiguration void reconfigureVbatt(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/init/sensor/init_baro.cpp b/firmware/init/sensor/init_baro.cpp index 7af9a40501..9d50f5b9a3 100644 --- a/firmware/init/sensor/init_baro.cpp +++ b/firmware/init/sensor/init_baro.cpp @@ -3,21 +3,21 @@ #include "rusefi_hw_enums.h" +EXTERN_ENGINE; + static Lps25 device; static Lps25Sensor sensor(device); -void initBaro() { +void initBaro(DECLARE_CONFIG_PARAMETER_SIGNATURE) { // If there's already an external (analog) baro sensor configured, // don't configure the internal one. if (Sensor::hasSensor(SensorType::BarometricPressure)) { return; } -#if HW_PROTEUS - if (device.init(GPIOB_10, GPIOB_11)) { + if (device.init(CONFIG(lps25BaroSensorScl), CONFIG(lps25BaroSensorScl))) { sensor.Register(); } -#endif } void baroUpdate() { diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index 911fe0b572..92d3d2e639 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -20,7 +20,7 @@ void initNewSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { initThermistors(PASS_CONFIG_PARAMETER_SIGNATURE); initLambda(PASS_ENGINE_PARAMETER_SIGNATURE); initFlexSensor(PASS_CONFIG_PARAMETER_SIGNATURE); - initBaro(); + initBaro(PASS_CONFIG_PARAMETER_SIGNATURE); #if !EFI_UNIT_TEST initFuelLevel(PASS_CONFIG_PARAMETER_SIGNATURE);