From 82b28bc72f5a036a83ea2895eed2eca24862b2fb Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Tue, 2 Aug 2022 18:59:08 -0600 Subject: [PATCH] Add BMP390 to BMP388 driver --- src/drivers/barometer/bmp388/bmp388.cpp | 13 +++++++++-- src/drivers/barometer/bmp388/bmp388.h | 9 +++++++- src/drivers/barometer/bmp388/bmp388_i2c.cpp | 6 +++++ src/drivers/barometer/bmp388/bmp388_spi.cpp | 7 ++++++ src/drivers/drv_sensor.h | 25 +++++++++++---------- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/drivers/barometer/bmp388/bmp388.cpp b/src/drivers/barometer/bmp388/bmp388.cpp index ebfa5f9b52..8178bc5785 100644 --- a/src/drivers/barometer/bmp388/bmp388.cpp +++ b/src/drivers/barometer/bmp388/bmp388.cpp @@ -68,11 +68,19 @@ BMP388::init() return -EIO; } - if (_interface->get_reg(BMP3_CHIP_ID_ADDR) != BMP3_CHIP_ID) { - PX4_WARN("id of your baro is not: 0x%02x", BMP3_CHIP_ID); + _chip_id = _interface->get_reg(BMP3_CHIP_ID_ADDR); + + if (_chip_id != BMP388_CHIP_ID && _chip_id != BMP390_CHIP_ID) { + PX4_WARN("id of your baro is not: 0x%02x or 0x%02x", BMP388_CHIP_ID, BMP390_CHIP_ID); return -EIO; } + if (_chip_id == BMP390_CHIP_ID) { + _interface->set_device_type(DRV_BARO_DEVTYPE_BMP390); + } + + _chip_rev_id = _interface->get_reg(BMP3_REV_ID_ADDR); + _cal = _interface->get_calibration(BMP3_CALIB_DATA_ADDR); if (!_cal) { @@ -99,6 +107,7 @@ void BMP388::print_status() { I2CSPIDriverBase::print_status(); + printf("chip id: 0x%02x rev id: 0x%02x\n", _chip_id, _chip_rev_id); perf_print_counter(_sample_perf); perf_print_counter(_measure_perf); perf_print_counter(_comms_errors); diff --git a/src/drivers/barometer/bmp388/bmp388.h b/src/drivers/barometer/bmp388/bmp388.h index 1fd5f4a418..2db3e22382 100644 --- a/src/drivers/barometer/bmp388/bmp388.h +++ b/src/drivers/barometer/bmp388/bmp388.h @@ -51,7 +51,8 @@ // From https://github.com/BoschSensortec/BMP3-Sensor-API/blob/master/bmp3_defs.h -#define BMP3_CHIP_ID (0x50) +#define BMP388_CHIP_ID (0x50) +#define BMP390_CHIP_ID (0x60) /* Over sampling macros */ #define BMP3_NO_OVERSAMPLING (0x00) @@ -79,6 +80,7 @@ /* Register Address */ #define BMP3_CHIP_ID_ADDR (0x00) +#define BMP3_REV_ID_ADDR (0x01) #define BMP3_ERR_REG_ADDR (0x02) #define BMP3_SENS_STATUS_REG_ADDR (0x03) #define BMP3_DATA_ADDR (0x04) @@ -304,6 +306,8 @@ public: virtual uint32_t get_device_id() const = 0; virtual uint8_t get_device_address() const = 0; + + virtual void set_device_type(uint8_t devtype) = 0; }; class BMP388 : public I2CSPIDriver @@ -339,6 +343,9 @@ private: bool _collect_phase{false}; + uint8_t _chip_id{0}; + uint8_t _chip_rev_id{0}; + void start(); int measure(); int collect(); //get results and publish diff --git a/src/drivers/barometer/bmp388/bmp388_i2c.cpp b/src/drivers/barometer/bmp388/bmp388_i2c.cpp index 5a3ea5e5be..0b735d35df 100644 --- a/src/drivers/barometer/bmp388/bmp388_i2c.cpp +++ b/src/drivers/barometer/bmp388/bmp388_i2c.cpp @@ -58,6 +58,7 @@ public: uint8_t get_device_address() const override { return device::I2C::get_device_address(); } + void set_device_type(uint8_t devtype); private: struct calibration_s _cal; }; @@ -108,3 +109,8 @@ calibration_s *BMP388_I2C::get_calibration(uint8_t addr) return nullptr; } } + +void BMP388_I2C::set_device_type(uint8_t devtype) +{ + device::Device::set_device_type(devtype); +} diff --git a/src/drivers/barometer/bmp388/bmp388_spi.cpp b/src/drivers/barometer/bmp388/bmp388_spi.cpp index 2943c03692..18479a4aaf 100644 --- a/src/drivers/barometer/bmp388/bmp388_spi.cpp +++ b/src/drivers/barometer/bmp388/bmp388_spi.cpp @@ -74,6 +74,8 @@ public: uint32_t get_device_id() const override { return device::SPI::get_device_id(); } uint8_t get_device_address() const override { return device::SPI::get_device_address(); } + + void set_device_type(uint8_t devtype); private: spi_calibration_s _cal; }; @@ -124,3 +126,8 @@ calibration_s *BMP388_SPI::get_calibration(uint8_t addr) return nullptr; } } + +void BMP388_SPI::set_device_type(uint8_t devtype) +{ + device::Device::set_device_type(devtype); +} diff --git a/src/drivers/drv_sensor.h b/src/drivers/drv_sensor.h index fbe8419f38..b0e45b7655 100644 --- a/src/drivers/drv_sensor.h +++ b/src/drivers/drv_sensor.h @@ -128,18 +128,19 @@ #define DRV_BARO_DEVTYPE_MPC2520 0x5F #define DRV_BARO_DEVTYPE_LPS22HB 0x60 -#define DRV_ACC_DEVTYPE_LSM303AGR 0x61 -#define DRV_MAG_DEVTYPE_LSM303AGR 0x62 -#define DRV_IMU_DEVTYPE_ADIS16497 0x63 -#define DRV_BARO_DEVTYPE_BAROSIM 0x65 -#define DRV_GYR_DEVTYPE_BMI088 0x66 -#define DRV_BARO_DEVTYPE_BMP388 0x67 -#define DRV_BARO_DEVTYPE_DPS310 0x68 -#define DRV_PWM_DEVTYPE_PCA9685 0x69 -#define DRV_ACC_DEVTYPE_BMI088 0x6a -#define DRV_OSD_DEVTYPE_ATXXXX 0x6b -#define DRV_ACC_DEVTYPE_BMI085 0x6C -#define DRV_GYR_DEVTYPE_BMI085 0x6D +#define DRV_ACC_DEVTYPE_LSM303AGR 0x61 +#define DRV_MAG_DEVTYPE_LSM303AGR 0x62 +#define DRV_IMU_DEVTYPE_ADIS16497 0x63 +#define DRV_BARO_DEVTYPE_BAROSIM 0x65 +#define DRV_GYR_DEVTYPE_BMI088 0x66 +#define DRV_BARO_DEVTYPE_BMP388 0x67 +#define DRV_BARO_DEVTYPE_DPS310 0x68 +#define DRV_PWM_DEVTYPE_PCA9685 0x69 +#define DRV_ACC_DEVTYPE_BMI088 0x6a +#define DRV_OSD_DEVTYPE_ATXXXX 0x6b +#define DRV_ACC_DEVTYPE_BMI085 0x6C +#define DRV_GYR_DEVTYPE_BMI085 0x6D +#define DRV_BARO_DEVTYPE_BMP390 0x6E #define DRV_DIST_DEVTYPE_LL40LS 0x70 #define DRV_DIST_DEVTYPE_MAPPYDOT 0x71