diff --git a/drivers/sensor/meas/ms5837/Kconfig b/drivers/sensor/meas/ms5837/Kconfig index d758d5970a0..96443c8ff12 100644 --- a/drivers/sensor/meas/ms5837/Kconfig +++ b/drivers/sensor/meas/ms5837/Kconfig @@ -1,12 +1,13 @@ # MS5837 pressure sensor configuration options # Copyright (c) 2018 Jan Van Winkel +# Copyright (c) 2025 Ivan Wagner # SPDX-License-Identifier: Apache-2.0 config MS5837 bool "MS5837 pressure and temperature sensor" default y - depends on DT_HAS_MEAS_MS5837_ENABLED + depends on DT_HAS_MEAS_MS5837_02BA_ENABLED || DT_HAS_MEAS_MS5837_30BA_ENABLED select I2C help Enable driver for MS5837 pressure and temperature sensor. diff --git a/drivers/sensor/meas/ms5837/ms5837.c b/drivers/sensor/meas/ms5837/ms5837.c index d07d23071aa..4f92ff774b6 100644 --- a/drivers/sensor/meas/ms5837/ms5837.c +++ b/drivers/sensor/meas/ms5837/ms5837.c @@ -1,12 +1,11 @@ /* Driver for MS5837 pressure sensor * * Copyright (c) 2018 Jan Van Winkel + * Copyright (c) 2025 Ivan Wagner * * SPDX-License-Identifier: Apache-2.0 */ -#define DT_DRV_COMPAT meas_ms5837 - #include #include #include @@ -45,6 +44,8 @@ static int ms5837_get_measurement(const struct device *dev, uint32_t *val, return 0; } +#if DT_HAS_COMPAT_STATUS_OKAY(meas_ms5837_30ba) + static void ms5837_compensate_30(const struct device *dev, const int32_t adc_temperature, const int32_t adc_pressure) @@ -94,10 +95,14 @@ static void ms5837_compensate_30(const struct device *dev, SENS -= SENSi; data->temperature -= Ti; - data->pressure = - (((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 13); + /* Result is in mbar * 10 but store result as mbar * 100 same as 02 sensor variant */ + data->pressure = ((((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 13)) * 10; } +#endif + +#if DT_HAS_COMPAT_STATUS_OKAY(meas_ms5837_02ba) + /* * First and second order pressure and temperature calculations, as per the flowchart in the * MS5837-02B datasheet. (see "Pressure and Temperature Calculation", pages 6 and 7, REV a8 12/2019) @@ -135,12 +140,16 @@ static void ms5837_compensate_02(const struct device *dev, SENS -= SENSi; data->temperature -= Ti; + /* Result is in mbar * 100 */ data->pressure = (((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 15); } +#endif + static int ms5837_sample_fetch(const struct device *dev, enum sensor_channel channel) { + const struct ms5837_config *cfg = dev->config; struct ms5837_data *data = dev->data; int err; uint32_t adc_pressure; @@ -161,7 +170,7 @@ static int ms5837_sample_fetch(const struct device *dev, return err; } - data->comp_func(dev, adc_temperature, adc_pressure); + cfg->comp_func(dev, adc_temperature, adc_pressure); return 0; } @@ -348,34 +357,25 @@ static int ms5837_init(const struct device *dev) return err; } - const int type_id = (data->factory >> 5) & 0x7f; - - switch (type_id) { - case MS5837_02BA01: - case MS5837_02BA21: - data->comp_func = ms5837_compensate_02; - break; - case MS5837_30BA26: - data->comp_func = ms5837_compensate_30; - break; - default: - LOG_WRN(" unrecognized type: '%2x', defaulting to MS5837-30", type_id); - data->comp_func = ms5837_compensate_30; - break; - } - return 0; } -#define MS5837_DEFINE(inst) \ - static struct ms5837_data ms5837_data_##inst; \ - \ - static const struct ms5837_config ms5837_config_##inst = { \ - .i2c = I2C_DT_SPEC_INST_GET(inst), \ - }; \ - \ - SENSOR_DEVICE_DT_INST_DEFINE(inst, ms5837_init, NULL, \ - &ms5837_data_##inst, &ms5837_config_##inst, POST_KERNEL, \ - CONFIG_SENSOR_INIT_PRIORITY, &ms5837_api_funcs); \ - -DT_INST_FOREACH_STATUS_OKAY(MS5837_DEFINE) +#define MS5837_DEFINE(inst, type) \ + static struct ms5837_data ms5837_##type##_data_##inst; \ + \ + static const struct ms5837_config ms5837_##type##_config_##inst = { \ + .i2c = I2C_DT_SPEC_INST_GET(inst), \ + .comp_func = ms5837_compensate_##type \ + }; \ + \ + SENSOR_DEVICE_DT_INST_DEFINE(inst, ms5837_init, NULL, &ms5837_##type##_data_##inst, \ + &ms5837_##type##_config_##inst, POST_KERNEL, \ + CONFIG_SENSOR_INIT_PRIORITY, &ms5837_api_funcs); + +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT meas_ms5837_02ba +DT_INST_FOREACH_STATUS_OKAY_VARGS(MS5837_DEFINE, 02) + +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT meas_ms5837_30ba +DT_INST_FOREACH_STATUS_OKAY_VARGS(MS5837_DEFINE, 30) diff --git a/drivers/sensor/meas/ms5837/ms5837.h b/drivers/sensor/meas/ms5837/ms5837.h index e4f8fc650bb..5917e709022 100644 --- a/drivers/sensor/meas/ms5837/ms5837.h +++ b/drivers/sensor/meas/ms5837/ms5837.h @@ -44,12 +44,6 @@ #define MS5837_ADC_READ_DELAY_4086 10 #define MS5837_ADC_READ_DELAY_8129 20 -enum ms5837_type { - MS5837_02BA01 = 0x00, - MS5837_02BA21 = 0x15, - MS5837_30BA26 = 0x1A -}; - typedef void (*ms5837_compensate_func)(const struct device *dev, const int32_t adc_temperature, const int32_t adc_pressure); @@ -76,11 +70,11 @@ struct ms5837_data { uint8_t presure_conv_delay; uint8_t temperature_conv_delay; - ms5837_compensate_func comp_func; }; struct ms5837_config { struct i2c_dt_spec i2c; + ms5837_compensate_func comp_func; }; #endif /* __SENSOR_MS5837_H__ */ diff --git a/dts/bindings/sensor/meas,ms5837-02ba.yaml b/dts/bindings/sensor/meas,ms5837-02ba.yaml new file mode 100644 index 00000000000..61ac0b1760a --- /dev/null +++ b/dts/bindings/sensor/meas,ms5837-02ba.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2025, Ivan Wagner +# SPDX-License-Identifier: Apache-2.0 + +description: TE Connectivity MS5837-02BA digital pressure sensor + +compatible: "meas,ms5837-02ba" + +include: [sensor-device.yaml, i2c-device.yaml] diff --git a/dts/bindings/sensor/meas,ms5837-30ba.yaml b/dts/bindings/sensor/meas,ms5837-30ba.yaml new file mode 100644 index 00000000000..329537b3313 --- /dev/null +++ b/dts/bindings/sensor/meas,ms5837-30ba.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2025, Ivan Wagner +# SPDX-License-Identifier: Apache-2.0 + +description: TE Connectivity MS5837-30BA digital pressure sensor + +compatible: "meas,ms5837-30ba" + +include: [sensor-device.yaml, i2c-device.yaml] diff --git a/dts/bindings/sensor/meas,ms5837.yaml b/dts/bindings/sensor/meas,ms5837.yaml deleted file mode 100644 index 7d5472c3613..00000000000 --- a/dts/bindings/sensor/meas,ms5837.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2018, Jan Van Winkel -# SPDX-License-Identifier: Apache-2.0 - -description: TE Connectivity MS5837 digital pressure sensor - -compatible: "meas,ms5837" - -include: [sensor-device.yaml, i2c-device.yaml] diff --git a/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay b/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay index 7b5e801a828..39dcb323ccd 100644 --- a/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay +++ b/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay @@ -8,7 +8,8 @@ status = "okay"; clock-frequency = ; ms5837@76 { - compatible = "meas,ms5837"; + compatible = "meas,ms5837-30ba"; reg = <0x76>; + status = "okay"; }; }; diff --git a/tests/drivers/build_all/sensor/i2c.dtsi b/tests/drivers/build_all/sensor/i2c.dtsi index dda3eeb008d..da527aeb5a1 100644 --- a/tests/drivers/build_all/sensor/i2c.dtsi +++ b/tests/drivers/build_all/sensor/i2c.dtsi @@ -175,9 +175,10 @@ test_i2c_ms5607: ms5607@17 { reg = <0x17>; }; -test_i2c_ms5837: ms5837@18 { - compatible = "meas,ms5837"; +test_i2c_ms5837_02ba: ms5837@18 { + compatible = "meas,ms5837-02ba"; reg = <0x18>; + status = "okay"; }; test_i2c_mcp9808: mcp9808@19 { @@ -1067,3 +1068,9 @@ test_i2c_sht21@90 { compatible = "sensirion,sht21"; reg = <0x90>; }; + +test_i2c_ms5837_30ba: ms5837@ae { + compatible = "meas,ms5837-30ba"; + reg = <0xae>; + status = "okay"; +};