Browse Source

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 b5adb4457c)
backport-87871-to-v3.7-branch
Ivan Wagner 3 months ago committed by github-actions[bot]
parent
commit
e05d96fc63
  1. 3
      drivers/sensor/meas/ms5837/Kconfig
  2. 66
      drivers/sensor/meas/ms5837/ms5837.c
  3. 8
      drivers/sensor/meas/ms5837/ms5837.h
  4. 8
      dts/bindings/sensor/meas,ms5837-02ba.yaml
  5. 8
      dts/bindings/sensor/meas,ms5837-30ba.yaml
  6. 8
      dts/bindings/sensor/meas,ms5837.yaml
  7. 3
      samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay
  8. 11
      tests/drivers/build_all/sensor/i2c.dtsi

3
drivers/sensor/meas/ms5837/Kconfig

@ -1,12 +1,13 @@ @@ -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.

66
drivers/sensor/meas/ms5837/ms5837.c

@ -1,12 +1,11 @@ @@ -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 @@ static int ms5837_get_measurement(const struct device *dev, uint32_t *val, @@ -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, @@ -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, @@ -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, @@ -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) @@ -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)

8
drivers/sensor/meas/ms5837/ms5837.h

@ -44,12 +44,6 @@ @@ -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 { @@ -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__ */

8
dts/bindings/sensor/meas,ms5837-02ba.yaml

@ -0,0 +1,8 @@ @@ -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]

8
dts/bindings/sensor/meas,ms5837-30ba.yaml

@ -0,0 +1,8 @@ @@ -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]

8
dts/bindings/sensor/meas,ms5837.yaml

@ -1,8 +0,0 @@ @@ -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]

3
samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay

@ -8,7 +8,8 @@ @@ -8,7 +8,8 @@
status = "okay";
clock-frequency = <I2C_BITRATE_STANDARD>;
ms5837@76 {
compatible = "meas,ms5837";
compatible = "meas,ms5837-30ba";
reg = <0x76>;
status = "okay";
};
};

11
tests/drivers/build_all/sensor/i2c.dtsi

@ -175,9 +175,10 @@ test_i2c_ms5607: ms5607@17 { @@ -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 { @@ -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";
};

Loading…
Cancel
Save