Commit 8bb572c4 authored by Ivan Wagner's avatar Ivan Wagner Committed by Anas Nashif
Browse files

drivers: sensor: meas: ms5837 supporting 02 and 30 variants via dt

Fixes #87870

This patch adds support via dt compatible property.

Signed-off-by: default avatarIvan Wagner <ivan.wagner@tecinvent.ch>
parent 6eda124b
Loading
Loading
Loading
Loading
+2 −1
Changes for drivers/sensor/meas/ms5837/Kconfig: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
# 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.
+28 −28
Changes for drivers/sensor/meas/ms5837/ms5837.c: 28 added lines, 28 removed lines.
Original line number Diff line number Diff line
/* 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,
	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;					\
#define MS5837_DEFINE(inst, type)                                                                  \
	static struct ms5837_data ms5837_##type##_data_##inst;                                     \
                                                                                                   \
	static const struct ms5837_config ms5837_config_##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_data_##inst, &ms5837_config_##inst, POST_KERNEL,	\
			      CONFIG_SENSOR_INIT_PRIORITY, &ms5837_api_funcs);		\
	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)

DT_INST_FOREACH_STATUS_OKAY(MS5837_DEFINE)
#undef DT_DRV_COMPAT
#define DT_DRV_COMPAT meas_ms5837_30ba
DT_INST_FOREACH_STATUS_OKAY_VARGS(MS5837_DEFINE, 30)
+1 −7
Changes for drivers/sensor/meas/ms5837/ms5837.h: 1 added line, 7 removed lines.
Original line number Diff line number Diff line
@@ -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__ */
+3 −3
Changes for dts/bindings/sensor/meas,ms5837-02ba.yaml: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
# 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

description: TE Connectivity MS5837 digital pressure sensor
description: TE Connectivity MS5837-02BA digital pressure sensor

compatible: "meas,ms5837"
compatible: "meas,ms5837-02ba"

include: [sensor-device.yaml, i2c-device.yaml]
+8 −0
Changes for dts/bindings/sensor/meas,ms5837-30ba.yaml: 8 added lines, 0 removed lines.
Original line number Diff line number Diff line
# 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]
Loading