drivers: sensor: meas: ms5837 supporting 02 and 30 variants via dt
This patch adds support via dt compatible property.
Signed-off-by: Ivan Wagner <ivan.wagner@tecinvent.ch>
(cherry picked from commit b5adb4457ca8eea826fcec8edf2d0d06ebf79efe)
diff --git a/drivers/sensor/meas/ms5837/Kconfig b/drivers/sensor/meas/ms5837/Kconfig
index d758d59..96443c8 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 <jan.van_winkel@dxplore.eu>
+# Copyright (c) 2025 Ivan Wagner <ivan.wagner@tecinvent.ch>
# 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 d07d230..4f92ff7 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 <jan.van_winkel@dxplore.eu>
+ * Copyright (c) 2025 Ivan Wagner <ivan.wagner@tecinvent.ch>
*
* SPDX-License-Identifier: Apache-2.0
*/
-#define DT_DRV_COMPAT meas_ms5837
-
#include <zephyr/init.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/byteorder.h>
@@ -45,6 +44,8 @@
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 @@
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 @@
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 @@
return err;
}
- data->comp_func(dev, adc_temperature, adc_pressure);
+ cfg->comp_func(dev, adc_temperature, adc_pressure);
return 0;
}
@@ -348,34 +357,25 @@
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); \
+#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);
-DT_INST_FOREACH_STATUS_OKAY(MS5837_DEFINE)
+#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 e4f8fc6..5917e70 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 @@
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 0000000..61ac0b1
--- /dev/null
+++ b/dts/bindings/sensor/meas,ms5837-02ba.yaml
@@ -0,0 +1,8 @@
+# Copyright (c) 2025, Ivan Wagner <ivan.wagner@tecinvent.ch>
+# 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 0000000..329537b
--- /dev/null
+++ b/dts/bindings/sensor/meas,ms5837-30ba.yaml
@@ -0,0 +1,8 @@
+# Copyright (c) 2025, Ivan Wagner <ivan.wagner@tecinvent.ch>
+# 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 7d5472c..0000000
--- a/dts/bindings/sensor/meas,ms5837.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Jan Van Winkel <jan.van_winkel@dxplore.eu>
-# 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 7b5e801..39dcb32 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 = <I2C_BITRATE_STANDARD>;
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 dda3eeb..da527ae 100644
--- a/tests/drivers/build_all/sensor/i2c.dtsi
+++ b/tests/drivers/build_all/sensor/i2c.dtsi
@@ -175,9 +175,10 @@
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 @@
compatible = "sensirion,sht21";
reg = <0x90>;
};
+
+test_i2c_ms5837_30ba: ms5837@ae {
+ compatible = "meas,ms5837-30ba";
+ reg = <0xae>;
+ status = "okay";
+};