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>
This commit is contained in:
parent
8db85916f2
commit
b5adb4457c
@ -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.
|
||||
|
||||
@ -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,
|
||||
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); \
|
||||
#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)
|
||||
|
||||
@ -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__ */
|
||||
|
||||
8
dts/bindings/sensor/meas,ms5837-02ba.yaml
Normal file
8
dts/bindings/sensor/meas,ms5837-02ba.yaml
Normal file
@ -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
Normal file
8
dts/bindings/sensor/meas,ms5837-30ba.yaml
Normal file
@ -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]
|
||||
@ -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]
|
||||
@ -8,7 +8,8 @@
|
||||
status = "okay";
|
||||
clock-frequency = <I2C_BITRATE_STANDARD>;
|
||||
ms5837@76 {
|
||||
compatible = "meas,ms5837";
|
||||
compatible = "meas,ms5837-30ba";
|
||||
reg = <0x76>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
@ -178,9 +178,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_jc42: jc42@19 {
|
||||
@ -1269,3 +1270,9 @@ test_i2c_ltr329: ltr329@aa {
|
||||
compatible = "liteon,ltr329";
|
||||
reg = <0xad>;
|
||||
};
|
||||
|
||||
test_i2c_ms5837_30ba: ms5837@ae {
|
||||
compatible = "meas,ms5837-30ba";
|
||||
reg = <0xae>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user