diff --git a/drivers/sensor/wsen/CMakeLists.txt b/drivers/sensor/wsen/CMakeLists.txt index 856e5ff496479..2d44fb3e4eeb3 100644 --- a/drivers/sensor/wsen/CMakeLists.txt +++ b/drivers/sensor/wsen/CMakeLists.txt @@ -7,6 +7,7 @@ add_subdirectory_ifdef(CONFIG_WSEN_HIDS_2525020210002 wsen_hids_2525020210002) add_subdirectory_ifdef(CONFIG_WSEN_ISDS_2536030320001 wsen_isds_2536030320001) add_subdirectory_ifdef(CONFIG_WSEN_ITDS_2533020201601 wsen_itds_2533020201601) add_subdirectory_ifdef(CONFIG_WSEN_PADS_2511020213301 wsen_pads_2511020213301) +add_subdirectory_ifdef(CONFIG_WSEN_PDMS_25131308XXX05 wsen_pdms_25131308XXX05) add_subdirectory_ifdef(CONFIG_WSEN_PDUS_25131308XXXXX wsen_pdus_25131308XXXXX) add_subdirectory_ifdef(CONFIG_WSEN_TIDS_2521020222501 wsen_tids_2521020222501) # zephyr-keep-sorted-stop diff --git a/drivers/sensor/wsen/Kconfig b/drivers/sensor/wsen/Kconfig index 5b01259aa7443..e59faf68fb355 100644 --- a/drivers/sensor/wsen/Kconfig +++ b/drivers/sensor/wsen/Kconfig @@ -7,6 +7,7 @@ source "drivers/sensor/wsen/wsen_hids_2525020210002/Kconfig" source "drivers/sensor/wsen/wsen_isds_2536030320001/Kconfig" source "drivers/sensor/wsen/wsen_itds_2533020201601/Kconfig" source "drivers/sensor/wsen/wsen_pads_2511020213301/Kconfig" +source "drivers/sensor/wsen/wsen_pdms_25131308XXX05/Kconfig" source "drivers/sensor/wsen/wsen_pdus_25131308XXXXX/Kconfig" source "drivers/sensor/wsen/wsen_tids_2521020222501/Kconfig" # zephyr-keep-sorted-stop diff --git a/drivers/sensor/wsen/wsen_hids_2525020210002/wsen_hids_2525020210002.h b/drivers/sensor/wsen/wsen_hids_2525020210002/wsen_hids_2525020210002.h index 64fba2d4d2a4b..c61bf20bb8fed 100644 --- a/drivers/sensor/wsen/wsen_hids_2525020210002/wsen_hids_2525020210002.h +++ b/drivers/sensor/wsen/wsen_hids_2525020210002/wsen_hids_2525020210002.h @@ -10,9 +10,9 @@ #include #include -#include +#include -#include "WSEN_HIDS_2525020210002_hal.h" +#include #include #include diff --git a/drivers/sensor/wsen/wsen_isds_2536030320001/wsen_isds_2536030320001.h b/drivers/sensor/wsen/wsen_isds_2536030320001/wsen_isds_2536030320001.h index baf3fd131f28f..34bbebbe583ae 100644 --- a/drivers/sensor/wsen/wsen_isds_2536030320001/wsen_isds_2536030320001.h +++ b/drivers/sensor/wsen/wsen_isds_2536030320001/wsen_isds_2536030320001.h @@ -10,9 +10,9 @@ #include #include -#include +#include -#include "WSEN_ISDS_2536030320001_hal.h" +#include #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #include diff --git a/drivers/sensor/wsen/wsen_itds_2533020201601/CMakeLists.txt b/drivers/sensor/wsen/wsen_itds_2533020201601/CMakeLists.txt index 0a8ccb7dd2dbb..62728551dc029 100644 --- a/drivers/sensor/wsen/wsen_itds_2533020201601/CMakeLists.txt +++ b/drivers/sensor/wsen/wsen_itds_2533020201601/CMakeLists.txt @@ -5,3 +5,5 @@ zephyr_library() zephyr_library_sources(wsen_itds_2533020201601.c) zephyr_library_sources_ifdef(CONFIG_WSEN_ITDS_2533020201601_TRIGGER wsen_itds_2533020201601_trigger.c) + +zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) diff --git a/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.c b/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.c index 6de01077acd40..af7da6e0cf7c6 100644 --- a/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.c +++ b/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.c @@ -12,6 +12,7 @@ #include #include +#include #include "wsen_itds_2533020201601.h" LOG_MODULE_REGISTER(WSEN_ITDS_2533020201601, CONFIG_SENSOR_LOG_LEVEL); @@ -40,7 +41,11 @@ static const int itds_2533020201601_full_scale_list[] = { 16, }; -#define MAX_POLL_STEP_COUNT 10 +/* Map of dts binding power mode to enum power mode*/ +static const ITDS_powerMode_t power_mode_map[] = { + [0] = ITDS_lowPower, + [1] = ITDS_normalMode, +}; /* convert raw temperature to celsius */ static inline int16_t itds_2533020201601_raw_temp_to_celsius(int16_t raw_temp) @@ -67,6 +72,8 @@ static int itds_2533020201601_sample_fetch(const struct device *dev, enum sensor return -ENOTSUP; } + uint32_t step_sleep_duration = 0; + if (cfg->op_mode == ITDS_singleConversion) { if (ITDS_startSingleDataConversion(&data->sensor_interface, ITDS_enable) != WE_SUCCESS) { @@ -75,6 +82,12 @@ static int itds_2533020201601_sample_fetch(const struct device *dev, enum sensor } k_sleep(K_MSEC(5)); + } else { + if (!wsen_sensor_step_sleep_duration_milli_from_odr_hz( + &itds_2533020201601_odr_list[data->sensor_odr], &step_sleep_duration)) { + LOG_ERR("Accelerometer is disabled."); + return -ENOTSUP; + } } ITDS_state_t acceleration_data_ready, temp_data_ready; @@ -83,10 +96,6 @@ static int itds_2533020201601_sample_fetch(const struct device *dev, enum sensor bool data_ready = false; int step_count = 0; - uint32_t step_sleep_duration = - ((uint32_t)1000000000 / - (uint32_t)sensor_value_to_milli(&itds_2533020201601_odr_list[data->sensor_odr]) / - MAX_POLL_STEP_COUNT); while (1) { @@ -594,68 +603,80 @@ int itds_2533020201601_init(const struct device *dev) return 0; } +/* clang-format off */ + #ifdef CONFIG_WSEN_ITDS_2533020201601_TRIGGER -#define ITDS_2533020201601_CFG_EVENTS_IRQ(inst) \ - .events_interrupt_gpio = GPIO_DT_SPEC_INST_GET(inst, events_interrupt_gpios), -#define ITDS_2533020201601_CFG_DRDY_IRQ(inst) \ - .drdy_interrupt_gpio = GPIO_DT_SPEC_INST_GET(inst, drdy_interrupt_gpios), +#define ITDS_2533020201601_CFG_EVENTS_IRQ(inst) \ + .events_interrupt_gpio = \ + GPIO_DT_SPEC_INST_GET(inst, events_interrupt_gpios), + +#define ITDS_2533020201601_CFG_DRDY_IRQ(inst) \ + .drdy_interrupt_gpio = \ + GPIO_DT_SPEC_INST_GET(inst, drdy_interrupt_gpios), #else #define ITDS_2533020201601_CFG_EVENTS_IRQ(inst) #define ITDS_2533020201601_CFG_DRDY_IRQ(inst) #endif /* CONFIG_WSEN_ITDS_2533020201601_TRIGGER */ #ifdef CONFIG_WSEN_ITDS_2533020201601_TAP -#define ITDS_2533020201601_CONFIG_TAP(inst) \ - .tap_mode = DT_INST_PROP(inst, tap_mode), \ - .tap_threshold = DT_INST_PROP(inst, tap_threshold), \ - .tap_shock = DT_INST_PROP(inst, tap_shock), \ - .tap_latency = DT_INST_PROP(inst, tap_latency), \ +#define ITDS_2533020201601_CONFIG_TAP(inst) \ + .tap_mode = DT_INST_PROP(inst, tap_mode), \ + .tap_threshold = DT_INST_PROP(inst, tap_threshold), \ + .tap_shock = DT_INST_PROP(inst, tap_shock), \ + .tap_latency = DT_INST_PROP(inst, tap_latency), \ .tap_quiet = DT_INST_PROP(inst, tap_quiet), #else #define ITDS_2533020201601_CONFIG_TAP(inst) #endif /* CONFIG_WSEN_ITDS_2533020201601_TAP */ #ifdef CONFIG_WSEN_ITDS_2533020201601_FREEFALL -#define ITDS_2533020201601_CONFIG_FREEFALL(inst) \ - .freefall_duration = DT_INST_PROP(inst, freefall_duration), \ - .freefall_threshold = \ +#define ITDS_2533020201601_CONFIG_FREEFALL(inst) \ + .freefall_duration = DT_INST_PROP(inst, freefall_duration), \ + .freefall_threshold = \ (ITDS_FreeFallThreshold_t)DT_INST_ENUM_IDX(inst, freefall_threshold), #else #define ITDS_2533020201601_CONFIG_FREEFALL(inst) #endif /* CONFIG_WSEN_ITDS_2533020201601_FREEFALL */ #ifdef CONFIG_WSEN_ITDS_2533020201601_DELTA -#define ITDS_2533020201601_CONFIG_DELTA(inst) \ - .delta_threshold = DT_INST_PROP(inst, delta_threshold), \ - .delta_duration = DT_INST_PROP(inst, delta_duration), \ - .delta_offsets = DT_INST_PROP(inst, delta_offsets), \ +#define ITDS_2533020201601_CONFIG_DELTA(inst) \ + .delta_threshold = DT_INST_PROP(inst, delta_threshold), \ + .delta_duration = DT_INST_PROP(inst, delta_duration), \ + .delta_offsets = DT_INST_PROP(inst, delta_offsets), \ .delta_offset_weight = DT_INST_PROP(inst, delta_offset_weight), #else #define ITDS_2533020201601_CONFIG_DELTA(inst) #endif /* CONFIG_WSEN_ITDS_2533020201601_DELTA */ -#define ITDS_2533020201601_CONFIG_LN(inst) \ - .low_noise = COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, low_noise), \ - ((ITDS_state_t)ITDS_enable), ((ITDS_state_t)ITDS_disable)), - -#define ITDS_2533020201601_CONFIG_COMMON(inst) \ - .odr = (ITDS_outputDataRate_t)(DT_INST_ENUM_IDX(inst, odr) + 1), \ - .op_mode = (ITDS_operatingMode_t)DT_INST_ENUM_IDX(inst, op_mode), \ - .power_mode = (ITDS_powerMode_t)DT_INST_ENUM_IDX(inst, power_mode), \ - .range = DT_INST_PROP(inst, range), \ - ITDS_2533020201601_CONFIG_LN(inst) \ - ITDS_2533020201601_CONFIG_TAP(inst) \ - ITDS_2533020201601_CONFIG_FREEFALL(inst) \ - ITDS_2533020201601_CONFIG_DELTA(inst) \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, events_interrupt_gpios), \ - (ITDS_2533020201601_CFG_EVENTS_IRQ(inst)), ()) \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, drdy_interrupt_gpios), \ - (ITDS_2533020201601_CFG_DRDY_IRQ(inst)), ()) -/* - * Instantiation macros used when device is on SPI bus. - */ - -#define ITDS_2533020201601_SPI_OPERATION \ +#define ITDS_2533020201601_CONFIG_LN(inst) \ + .low_noise = COND_CODE_1( \ + DT_INST_NODE_HAS_PROP(inst, low_noise), \ + ((ITDS_state_t)ITDS_enable), \ + ((ITDS_state_t)ITDS_disable) \ + ), + +#define ITDS_2533020201601_CONFIG_COMMON(inst) \ + .odr = (ITDS_outputDataRate_t)(DT_INST_ENUM_IDX(inst, odr) + 1), \ + .op_mode = (ITDS_operatingMode_t)DT_INST_ENUM_IDX(inst, op_mode), \ + .power_mode = power_mode_map[DT_INST_ENUM_IDX(inst, power_mode)], \ + .range = DT_INST_PROP(inst, range), \ + ITDS_2533020201601_CONFIG_LN(inst) \ + ITDS_2533020201601_CONFIG_TAP(inst) \ + ITDS_2533020201601_CONFIG_FREEFALL(inst) \ + ITDS_2533020201601_CONFIG_DELTA(inst) \ + COND_CODE_1( \ + DT_INST_NODE_HAS_PROP(inst, events_interrupt_gpios), \ + (ITDS_2533020201601_CFG_EVENTS_IRQ(inst)), \ + () \ + ) \ + COND_CODE_1( \ + DT_INST_NODE_HAS_PROP(inst, drdy_interrupt_gpios), \ + (ITDS_2533020201601_CFG_DRDY_IRQ(inst)), \ + () \ + ) + +/* SPI configuration */ +#define ITDS_2533020201601_SPI_OPERATION \ (SPI_WORD_SET(8) | SPI_OP_MODE_MASTER | SPI_MODE_CPOL | SPI_MODE_CPHA) #define ITDS_2533020201601_CONFIG_SPI(inst) \ @@ -665,38 +686,55 @@ int itds_2533020201601_init(const struct device *dev) }, \ ITDS_2533020201601_CONFIG_COMMON(inst)} -/* - * Instantiation macros used when device is on I2C bus. - */ - -#define ITDS_2533020201601_CONFIG_I2C(inst) \ - {.bus_cfg = \ - { \ - .i2c = I2C_DT_SPEC_INST_GET(inst), \ - }, \ - ITDS_2533020201601_CONFIG_COMMON(inst)} - -#define ITDS_2533020201601_CONFIG_WE_INTERFACE(inst) \ - {COND_CODE_1(DT_INST_ON_BUS(inst, i2c), \ - (.sensor_interface = {.interfaceType = WE_i2c}), \ - ()) COND_CODE_1(DT_INST_ON_BUS(inst, spi), \ - (.sensor_interface = {.interfaceType = WE_spi}), \ - ()) } - -/* - * Main instantiation macro. Use of COND_CODE_1() selects the right - * bus-specific macro at preprocessor time. - */ -#define ITDS_2533020201601_DEFINE(inst) \ - static struct itds_2533020201601_data itds_2533020201601_data_##inst = \ - ITDS_2533020201601_CONFIG_WE_INTERFACE(inst); \ - static const struct itds_2533020201601_config itds_2533020201601_config_##inst = \ - COND_CODE_1(DT_INST_ON_BUS(inst, i2c), (ITDS_2533020201601_CONFIG_I2C(inst)), ()) \ - COND_CODE_1(DT_INST_ON_BUS(inst, spi), \ - (ITDS_2533020201601_CONFIG_SPI(inst)), ()); \ - SENSOR_DEVICE_DT_INST_DEFINE(inst, itds_2533020201601_init, NULL, \ - &itds_2533020201601_data_##inst, \ - &itds_2533020201601_config_##inst, POST_KERNEL, \ - CONFIG_SENSOR_INIT_PRIORITY, &itds_2533020201601_driver_api); +/* I2C configuration */ +#define ITDS_2533020201601_CONFIG_I2C(inst) \ + { \ + .bus_cfg = { \ + .i2c = I2C_DT_SPEC_INST_GET(inst), \ + }, \ + ITDS_2533020201601_CONFIG_COMMON(inst) \ + } + +#define ITDS_2533020201601_CONFIG_WE_INTERFACE(inst) \ + { \ + COND_CODE_1( \ + DT_INST_ON_BUS(inst, i2c), \ + (.sensor_interface = {.interfaceType = WE_i2c}), \ + () \ + ) \ + COND_CODE_1( \ + DT_INST_ON_BUS(inst, spi), \ + (.sensor_interface = {.interfaceType = WE_spi}), \ + () \ + ) \ + } + +/* Main instantiation macro */ +#define ITDS_2533020201601_DEFINE(inst) \ + static struct itds_2533020201601_data itds_2533020201601_data_##inst = \ + ITDS_2533020201601_CONFIG_WE_INTERFACE(inst); \ + static const struct itds_2533020201601_config itds_2533020201601_config_##inst = \ + COND_CODE_1( \ + DT_INST_ON_BUS(inst, i2c), \ + (ITDS_2533020201601_CONFIG_I2C(inst)), \ + () \ + ) \ + COND_CODE_1( \ + DT_INST_ON_BUS(inst, spi), \ + (ITDS_2533020201601_CONFIG_SPI(inst)), \ + () \ + ); \ + SENSOR_DEVICE_DT_INST_DEFINE( \ + inst, \ + itds_2533020201601_init, \ + NULL, \ + &itds_2533020201601_data_##inst, \ + &itds_2533020201601_config_##inst, \ + POST_KERNEL, \ + CONFIG_SENSOR_INIT_PRIORITY, \ + &itds_2533020201601_driver_api \ + ); DT_INST_FOREACH_STATUS_OKAY(ITDS_2533020201601_DEFINE) + +/* clang-format on */ diff --git a/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.h b/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.h index 793bb392ee3df..6b87e815c4e41 100644 --- a/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.h +++ b/drivers/sensor/wsen/wsen_itds_2533020201601/wsen_itds_2533020201601.h @@ -10,9 +10,9 @@ #include #include -#include +#include -#include "WSEN_ITDS_2533020201601_hal.h" +#include #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #include diff --git a/drivers/sensor/wsen/wsen_pads_2511020213301/wsen_pads_2511020213301.h b/drivers/sensor/wsen/wsen_pads_2511020213301/wsen_pads_2511020213301.h index 8fb335e6e68a5..e4c8b98a4e86b 100644 --- a/drivers/sensor/wsen/wsen_pads_2511020213301/wsen_pads_2511020213301.h +++ b/drivers/sensor/wsen/wsen_pads_2511020213301/wsen_pads_2511020213301.h @@ -10,9 +10,9 @@ #include #include -#include +#include -#include "WSEN_PADS_2511020213301_hal.h" +#include #include #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) diff --git a/drivers/sensor/wsen/wsen_pdms_25131308XXX05/CMakeLists.txt b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/CMakeLists.txt new file mode 100644 index 0000000000000..339c4b8c1dd60 --- /dev/null +++ b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() + +zephyr_library_sources(wsen_pdms_25131308XXX05.c) diff --git a/drivers/sensor/wsen/wsen_pdms_25131308XXX05/Kconfig b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/Kconfig new file mode 100644 index 0000000000000..b0b959fca530e --- /dev/null +++ b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/Kconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG +# SPDX-License-Identifier: Apache-2.0 + +config WSEN_PDMS_25131308XXX05 + bool "WSEN-PDMS-25131308XXX05 differential pressure sensor" + default y + depends on DT_HAS_WE_WSEN_PDMS_25131308XXX05_ENABLED + select I2C if $(dt_compat_on_bus,$(DT_COMPAT_WE_WSEN_PDMS_25131308XXX05),i2c) + select SPI if $(dt_compat_on_bus,$(DT_COMPAT_WE_WSEN_PDMS_25131308XXX05),spi) + select HAS_WESENSORS + help + Enable driver for the WSEN-PDMS-25131308XXX05 I2C/SPI-based differential pressure sensor. diff --git a/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.c b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.c new file mode 100644 index 0000000000000..79e8c7af4c2a6 --- /dev/null +++ b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.c @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define DT_DRV_COMPAT we_wsen_pdms_25131308xxx05 + +#include +#include +#include + +#include + +#include "wsen_pdms_25131308XXX05.h" + +LOG_MODULE_REGISTER(WSEN_PDMS_25131308XXX05, CONFIG_SENSOR_LOG_LEVEL); + +static int pdms_25131308XXX05_sample_fetch(const struct device *dev, enum sensor_channel chan) +{ + switch (chan) { + case SENSOR_CHAN_ALL: + case SENSOR_CHAN_AMBIENT_TEMP: + case SENSOR_CHAN_PRESS: { + break; + } + default: + LOG_ERR("Invalid channel."); + return -ENOTSUP; + } + + const struct pdms_25131308XXX05_config *const config = dev->config; + struct pdms_25131308XXX05_data *data = dev->data; + + uint16_t status; + + switch (data->sensor_interface.interfaceType) { +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) + case WE_i2c: { + if (config->crc) { + if (PDMS_I2C_GetRawPressureAndTemperature_WithCRC( + &data->sensor_interface, &data->pressure_data, + &data->temperature_data, &status) != WE_SUCCESS) { + LOG_ERR("Failed to retrieve data from the sensor."); + return -EIO; + } + } else { + if (PDMS_I2C_GetRawPressureAndTemperature( + &data->sensor_interface, &data->pressure_data, + &data->temperature_data, &status) != WE_SUCCESS) { + LOG_ERR("Failed to retrieve data from the sensor."); + return -EIO; + } + } + break; + } +#endif +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) + case WE_spi: { + if (config->crc) { + if (PDMS_SPI_getRawPressureAndTemperature_WithCRC( + &data->sensor_interface, &data->pressure_data, + &data->temperature_data, &status) != WE_SUCCESS) { + LOG_ERR("Failed to retrieve data from the sensor."); + return -EIO; + } + } else { + if (PDMS_SPI_GetRawPressureAndTemperature( + &data->sensor_interface, &data->pressure_data, + &data->temperature_data, &status) != WE_SUCCESS) { + LOG_ERR("Failed to retrieve data from the sensor."); + return -EIO; + } + } + break; + } +#endif + default: + return -EIO; + } + + return 0; +} + +static int pdms_25131308XXX05_channel_get(const struct device *dev, enum sensor_channel chan, + struct sensor_value *val) +{ + const struct pdms_25131308XXX05_config *const config = dev->config; + struct pdms_25131308XXX05_data *data = dev->data; + + int status = 0; + + switch (chan) { + case SENSOR_CHAN_AMBIENT_TEMP: { + int64_t temp = ((int64_t)(data->temperature_data - T_MIN_TYP_VAL_PDMS)) * 4272; + + status = sensor_value_from_micro(val, temp); + break; + } + case SENSOR_CHAN_PRESS: { + int64_t pascal = (int64_t)(data->pressure_data - P_MIN_TYP_VAL_PDMS); + + /* + * these values are conversion factors based on the sensor type defined in the user + * manual of the respective sensor + */ + switch (config->sensor_type) { + case PDMS_pdms0: + pascal = ((pascal * 763) / 10000) - 1000; + break; + case PDMS_pdms1: + pascal = ((pascal * 763) / 1000) - 10000; + break; + case PDMS_pdms2: + pascal = (((pascal * 2670) / 1000) - 35000); + break; + case PDMS_pdms3: + pascal = ((pascal * 381) / 100); + break; + case PDMS_pdms4: + pascal = ((pascal * 4190) / 100) - 100000; + break; + default: + LOG_ERR("Sensor type doesn't exist"); + return -ENOTSUP; + } + + status = sensor_value_from_milli(val, pascal); + break; + } + default: + LOG_ERR("Invalid channel."); + return -ENOTSUP; + } + + return status; +} + +static int pdms_25131308XXX05_init(const struct device *dev) +{ + const struct pdms_25131308XXX05_config *const config = dev->config; + struct pdms_25131308XXX05_data *data = dev->data; + + /* Initialize WE sensor interface */ + WE_sensorInterfaceType_t interface_type = data->sensor_interface.interfaceType; + + if (PDMS_getDefaultInterface(&data->sensor_interface) != WE_SUCCESS) { + return -EIO; + } + + data->sensor_interface.interfaceType = interface_type; + + switch (data->sensor_interface.interfaceType) { +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) + case WE_i2c: { + if (!i2c_is_ready_dt(&config->bus_cfg.i2c)) { + LOG_ERR("I2C bus device not ready"); + return -ENODEV; + } + + switch (config->bus_cfg.i2c.addr) { + case PDMS_I2C_ADDRESS_CRC: { + if (!config->crc) { + LOG_ERR("I2C with CRC disabled but the wrong I2C address is " + "chosen."); + return -ENODEV; + } + break; + } + case PDMS_I2C_ADDRESS: { + if (config->crc) { + LOG_ERR("I2C with CRC enabled but the wrong I2C address is " + "chosen."); + return -ENODEV; + } + break; + } + default: + LOG_ERR("Invalid I2C address."); + return -ENODEV; + } + + data->sensor_interface.options.i2c.address = config->bus_cfg.i2c.addr; + data->sensor_interface.handle = (void *)&config->bus_cfg.i2c; + break; + } +#endif +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) + case WE_spi: { + if (!spi_is_ready_dt(&config->bus_cfg.spi)) { + LOG_ERR("SPI bus device not ready"); + return -ENODEV; + } + + data->spi_crc = (config->crc ? PDMS_SPI_withCRC : PDMS_SPI_withoutCRC); + data->sensor_interface.options.spi.sensorSpecificSettings = (void *)&data->spi_crc; + data->sensor_interface.options.spi.duplexMode = 1; + data->sensor_interface.options.spi.burstMode = 1; + data->sensor_interface.handle = (void *)&config->bus_cfg.spi; + break; + } +#endif + default: + LOG_ERR("Invalid interface type"); + return -EINVAL; + } + + return 0; +} + +static DEVICE_API(sensor, pdms_25131308XXX05_driver_api) = { + .sample_fetch = pdms_25131308XXX05_sample_fetch, + .channel_get = pdms_25131308XXX05_channel_get, +}; + +/* clang-format off */ + +#define PDMS_25131308XXX05_CONFIG_WE_INTERFACE(inst) \ + COND_CODE_1(DT_INST_ON_BUS(inst, i2c), \ + (.sensor_interface = { \ + .interfaceType = WE_i2c \ + }), \ + ()) \ + COND_CODE_1(DT_INST_ON_BUS(inst, spi), \ + (.sensor_interface = { \ + .interfaceType = WE_spi \ + }), \ + ()) + +#define PDMS_25131308XXX05_SPI_OPERATION \ + (SPI_WORD_SET(8) | SPI_OP_MODE_MASTER) + +#define PDMS_25131308XXX05_CONFIG_BUS(inst) \ + COND_CODE_1(DT_INST_ON_BUS(inst, i2c), \ + (.bus_cfg = { \ + .i2c = I2C_DT_SPEC_INST_GET(inst) \ + },), \ + ()) \ + COND_CODE_1(DT_INST_ON_BUS(inst, spi), \ + (.bus_cfg = { \ + .spi = SPI_DT_SPEC_INST_GET( \ + inst, \ + PDMS_25131308XXX05_SPI_OPERATION, \ + 0 \ + ) \ + },), \ + ()) + +#define PDMS_25131308XXX05_CONFIG_SENSOR_TYPE(inst) \ + .sensor_type = (PDMS_SensorType_t)DT_INST_ENUM_IDX(inst, sensor_type), + +#define PDMS_25131308XXX05_CONFIG_CRC(inst) \ + .crc = DT_INST_PROP(inst, crc), + +#define PDMS_25131308XXX05_CONFIG(inst) \ + PDMS_25131308XXX05_CONFIG_BUS(inst) \ + PDMS_25131308XXX05_CONFIG_SENSOR_TYPE(inst) \ + PDMS_25131308XXX05_CONFIG_CRC(inst) + +/* + * Main instantiation macro. + */ +#define PDMS_25131308XXX05_DEFINE(inst) \ + static struct pdms_25131308XXX05_data pdms_25131308XXX05_data_##inst = { \ + PDMS_25131308XXX05_CONFIG_WE_INTERFACE(inst) \ + }; \ + static const struct pdms_25131308XXX05_config pdms_25131308XXX05_config_##inst = { \ + PDMS_25131308XXX05_CONFIG(inst) \ + }; \ + SENSOR_DEVICE_DT_INST_DEFINE( \ + inst, \ + pdms_25131308XXX05_init, \ + NULL, \ + &pdms_25131308XXX05_data_##inst, \ + &pdms_25131308XXX05_config_##inst, \ + POST_KERNEL, \ + CONFIG_SENSOR_INIT_PRIORITY, \ + &pdms_25131308XXX05_driver_api \ + ) + +DT_INST_FOREACH_STATUS_OKAY(PDMS_25131308XXX05_DEFINE) + +/* clang-format on */ diff --git a/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.h b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.h new file mode 100644 index 0000000000000..e91419f0fde8d --- /dev/null +++ b/drivers/sensor/wsen/wsen_pdms_25131308XXX05/wsen_pdms_25131308XXX05.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_DRIVERS_SENSOR_WSEN_PDMS_25131308XXX05_H_ +#define ZEPHYR_DRIVERS_SENSOR_WSEN_PDMS_25131308XXX05_H_ + +#include + +#include + +#include + +#include + +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) +#include +#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */ + +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) +#include +#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) */ + +struct pdms_25131308XXX05_data { + /* WE sensor interface configuration */ + WE_sensorInterface_t sensor_interface; + +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) + PDMS_Spi_CrcSelect_t spi_crc; +#endif + + uint16_t pressure_data; + uint16_t temperature_data; +}; + +struct pdms_25131308XXX05_config { + union { +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) + const struct i2c_dt_spec i2c; +#endif +#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) + const struct spi_dt_spec spi; +#endif + } bus_cfg; + + const PDMS_SensorType_t sensor_type; + const bool crc; +}; + +/* GCDS Sensor API functions*/ +static int pdms_25131308XXX05_sample_fetch(const struct device *dev, enum sensor_channel chan); +static int pdms_25131308XXX05_channel_get(const struct device *dev, enum sensor_channel chan, + struct sensor_value *val); + +static int pdms_25131308XXX05_init(const struct device *dev); + +#endif /* ZEPHYR_DRIVERS_SENSOR_WSEN_PDMS_25131308XXX05_H_ */ diff --git a/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.c b/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.c index 9b85f401902e8..d659263fdcd42 100644 --- a/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.c +++ b/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.c @@ -61,14 +61,15 @@ static int pdus_25131308XXXXX_channel_get(const struct device *dev, enum sensor_ switch (chan) { case SENSOR_CHAN_AMBIENT_TEMP: { - int32_t temperature_mega = ((int32_t)(data->temperature - T_MIN_VAL_PDUS)) * 4272; + int32_t temperature_mega = + ((int32_t)(data->temperature - T_MIN_TYP_VAL_PDUS)) * 4272; value->val1 = temperature_mega / 1000000; value->val2 = temperature_mega % 1000000; break; } case SENSOR_CHAN_PRESS: { - int32_t pressure_temp = ((int32_t)(data->pressure - P_MIN_VAL_PDUS)); + int32_t pressure_temp = ((int32_t)(data->pressure - P_MIN_TYP_VAL_PDUS)); /* * these values are conversion factors based on the sensor type defined in the user @@ -114,10 +115,9 @@ static int pdus_25131308XXXXX_channel_get(const struct device *dev, enum sensor_ return 0; } -static DEVICE_API(sensor, pdus_25131308XXXXX_driver_api) = { - .sample_fetch = pdus_25131308XXXXX_sample_fetch, - .channel_get = pdus_25131308XXXXX_channel_get -}; +static DEVICE_API(sensor, + pdus_25131308XXXXX_driver_api) = {.sample_fetch = pdus_25131308XXXXX_sample_fetch, + .channel_get = pdus_25131308XXXXX_channel_get}; static int pdus_25131308XXXXX_init(const struct device *dev) { diff --git a/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.h b/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.h index ee065f0b16dee..c7a5314abd940 100644 --- a/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.h +++ b/drivers/sensor/wsen/wsen_pdus_25131308XXXXX/wsen_pdus_25131308XXXXX.h @@ -10,9 +10,9 @@ #include #include -#include +#include -#include "WSEN_PDUS_25131308XXX01_hal.h" +#include #include struct pdus_25131308XXXXX_data { diff --git a/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501.h b/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501.h index 46051ac5fc13f..cec657165c251 100644 --- a/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501.h +++ b/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501.h @@ -10,10 +10,9 @@ #include #include -#include +#include -#include "WSEN_TIDS_2521020222501_hal.h" -#include +#include #include diff --git a/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501_trigger.c b/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501_trigger.c index 62fd442829dfe..a14f6110ac204 100644 --- a/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501_trigger.c +++ b/drivers/sensor/wsen/wsen_tids_2521020222501/wsen_tids_2521020222501_trigger.c @@ -11,6 +11,7 @@ #include #include "wsen_tids_2521020222501.h" +#include LOG_MODULE_DECLARE(WSEN_TIDS_2521020222501, CONFIG_SENSOR_LOG_LEVEL); diff --git a/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-common.yaml b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-common.yaml new file mode 100644 index 0000000000000..88d3c0a4230b7 --- /dev/null +++ b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-common.yaml @@ -0,0 +1,29 @@ +# Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG +# SPDX-License-Identifier: Apache-2.0 + +include: sensor-device.yaml + +properties: + sensor-type: + type: int + required: true + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + description: | + PDMS sensor product variant (pressure measurement range). + 0 - order code 2513130810105, range = -1 to + 1 kPa + 1 - order code 2513130810205, range = -10 to + 10 kPa + 2 - order code 2513130835205, range = -35 to + 35 kPa + 3 - order code 2513130810305, range = 0 to 100 kPa + 4 - order code 2513130810405, range = -100 to 1000 kPa + + crc: + type: boolean + description: | + Enable CRC over the chosen interface. + When using I2C the correct address with CRC must + be chosen as well. diff --git a/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-i2c.yaml b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-i2c.yaml new file mode 100644 index 0000000000000..996f781d7ae2b --- /dev/null +++ b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-i2c.yaml @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG +# SPDX-License-Identifier: Apache-2.0 + +description: | + Würth Elektronik WSEN-PDMS-25131308XXX05 differential pressure sensor (I2C bus) + Note: On some MCUs a speed of more than 100 kHz cannot be used. + +compatible: "we,wsen-pdms-25131308XXX05" + +include: ["i2c-device.yaml", "we,wsen-pdms-25131308XXX05-common.yaml"] diff --git a/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-spi.yaml b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-spi.yaml new file mode 100644 index 0000000000000..15ecdcb0a08c3 --- /dev/null +++ b/dts/bindings/sensor/we,wsen-pdms-25131308XXX05-spi.yaml @@ -0,0 +1,9 @@ +# Copyright (c) 2025 Würth Elektronik eiSos GmbH & Co. KG +# SPDX-License-Identifier: Apache-2.0 + +description: | + Würth Elektronik WSEN-PDMS-25131308XXX05 differential pressure sensor (SPI bus) + +compatible: "we,wsen-pdms-25131308XXX05" + +include: ["spi-device.yaml", "we,wsen-pdms-25131308XXX05-common.yaml"] diff --git a/tests/drivers/build_all/sensor/i2c.dtsi b/tests/drivers/build_all/sensor/i2c.dtsi index 35849732143d6..b7bf34f0764af 100644 --- a/tests/drivers/build_all/sensor/i2c.dtsi +++ b/tests/drivers/build_all/sensor/i2c.dtsi @@ -1438,3 +1438,9 @@ test_i2c_veml6046: veml6046@bf { compatible = "vishay,veml6046"; reg = <0xbf>; }; + +test_i2c_wsen_pdms_25131308XXX05: wsen_pdms_25131308XXX05@c0 { + compatible = "we,wsen-pdms-25131308XXX05"; + reg = <0xc0>; + sensor-type = <4>; +}; diff --git a/west.yml b/west.yml index e29994ac314e8..9be67b9079cc2 100644 --- a/west.yml +++ b/west.yml @@ -275,7 +275,7 @@ manifest: groups: - hal - name: hal_wurthelektronik - revision: e3e2797b224fc48fdef1bc3e5a12a7c73108bba2 + revision: 7c1297ea071d03289112eb24e789c89c7095c0a2 path: modules/hal/wurthelektronik groups: - hal