drivers: sensor: wsen_hids_2525020210002: add sensor driver

Add wsen_hids_2525020210002 driver with
the corrected name and compatibility with
the hal update as well as added new features.

Signed-off-by: Wajdi ELMuhtadi <wajdi.elmuhtadi@we-online.com>
This commit is contained in:
Wajdi ELMuhtadi 2023-09-04 09:09:53 +02:00 committed by Alberto Escolar
parent 5936125f0e
commit fb45c6d93a
10 changed files with 413 additions and 0 deletions

View File

@ -287,6 +287,11 @@ Drivers and Sensors
:dtcompatible:`jedec,jc-42.4-temp` compatible string instead to the ``microchip,mcp9808``
string.
* WE
* Added Würth Elektronik HIDS-2525020210002
:dtcompatible:`we,wsen-hids-2525020210002` humidity sensor driver.
* Serial
* LiteX: Renamed the ``compatible`` from ``litex,uart0`` to :dtcompatible:`litex,uart`.

View File

@ -1,5 +1,7 @@
# Copyright (c) 2024 Analog Devices, Inc.
# Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
# SPDX-License-Identifier: Apache-2.0
# zephyr-keep-sorted-start
add_subdirectory_ifdef(CONFIG_WSEN_HIDS_2525020210002 wsen_hids_2525020210002)
# zephyr-keep-sorted-stop

View File

@ -1,5 +1,7 @@
# Copyright (c) 2024 Analog Devices, Inc.
# Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
# SPDX-License-Identifier: Apache-2.0
# zephyr-keep-sorted-start
source "drivers/sensor/wsen/wsen_hids_2525020210002/Kconfig"
# zephyr-keep-sorted-stop

View File

@ -0,0 +1,6 @@
# Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
# SPDX-License-Identifier: Apache-2.0
zephyr_library()
zephyr_library_sources(wsen_hids_2525020210002.c)

View File

@ -0,0 +1,11 @@
# Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
# SPDX-License-Identifier: Apache-2.0
config WSEN_HIDS_2525020210002
bool "WSEN-HIDS-2525020210002 humidity sensor"
default y
depends on DT_HAS_WE_WSEN_HIDS_2525020210002_ENABLED
select I2C
select HAS_WESENSORS
help
Enable driver for the WSEN-HIDS-2525020210002 I2C-based humidity sensor.

View File

@ -0,0 +1,248 @@
/*
* Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
*
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT we_wsen_hids_2525020210002
#include <stdlib.h>
#include <zephyr/sys/__assert.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/logging/log.h>
#include "wsen_hids_2525020210002.h"
LOG_MODULE_REGISTER(WSEN_HIDS_2525020210002, CONFIG_SENSOR_LOG_LEVEL);
static const hids_measureCmd_t precision_cmds[] = {HIDS_MEASURE_LPM, HIDS_MEASURE_MPM,
HIDS_MEASURE_HPM};
static const hids_measureCmd_t heater_cmds[] = {HIDS_HEATER_200_MW_01_S, HIDS_HEATER_200_MW_100_MS,
HIDS_HEATER_110_MW_01_S, HIDS_HEATER_110_MW_100_MS,
HIDS_HEATER_20_MW_01_S, HIDS_HEATER_20_MW_100_MS};
static int hids_2525020210002_sample_fetch(const struct device *dev, enum sensor_channel chan)
{
struct hids_2525020210002_data *data = dev->data;
hids_measureCmd_t cmd;
int32_t raw_temperature;
int32_t raw_humidity;
switch (chan) {
case SENSOR_CHAN_ALL:
case SENSOR_CHAN_AMBIENT_TEMP:
case SENSOR_CHAN_HUMIDITY:
break;
default:
LOG_ERR("Fetching is not supported on channel %d.", chan);
return -ENOTSUP;
}
if (data->sensor_precision == hids_2525020210002_precision_High &&
data->sensor_heater != hids_2525020210002_heater_Off) {
cmd = heater_cmds[data->sensor_heater - 1];
} else {
cmd = precision_cmds[data->sensor_precision];
}
if (HIDS_Sensor_Measure_Raw(&data->sensor_interface, cmd, &raw_temperature,
&raw_humidity) != WE_SUCCESS) {
LOG_ERR("Failed to fetch data sample");
return -EIO;
}
switch (chan) {
case SENSOR_CHAN_ALL:
data->temperature = raw_temperature;
data->humidity = raw_humidity;
break;
case SENSOR_CHAN_AMBIENT_TEMP:
data->temperature = raw_temperature;
break;
case SENSOR_CHAN_HUMIDITY:
data->humidity = raw_humidity;
break;
default:
return -ENOTSUP;
}
return 0;
}
static int hids_2525020210002_channel_get(const struct device *dev, enum sensor_channel chan,
struct sensor_value *val)
{
struct hids_2525020210002_data *data = dev->data;
switch (chan) {
case SENSOR_CHAN_AMBIENT_TEMP:
val->val1 = data->temperature / 1000;
val->val2 = ((int32_t)data->temperature % 1000) * (1000000 / 1000);
break;
case SENSOR_CHAN_HUMIDITY:
val->val1 = data->humidity / 1000;
val->val2 = ((int32_t)data->humidity % 1000) * (1000000 / 1000);
break;
default:
LOG_ERR("Channel not supported %d", chan);
return -ENOTSUP;
}
return 0;
}
/* Set precision configuration. */
static int hids_2525020210002_precision_set(const struct device *dev,
const struct sensor_value *precision)
{
struct hids_2525020210002_data *data = dev->data;
if (precision->val1 < hids_2525020210002_precision_Low ||
precision->val1 > hids_2525020210002_precision_High || precision->val2 != 0) {
LOG_ERR("Bad precision configuration %d", precision->val1);
return -EINVAL;
}
data->sensor_precision = (hids_2525020210002_precision_t)precision->val1;
return 0;
}
/* Set heater option. */
static int hids_2525020210002_heater_set(const struct device *dev,
const struct sensor_value *heater)
{
struct hids_2525020210002_data *data = dev->data;
if (heater->val1 < hids_2525020210002_heater_Off ||
heater->val1 > hids_2525020210002_heater_On_20mW_100ms || heater->val2 != 0) {
LOG_ERR("Bad heater option %d", heater->val1);
return -EINVAL;
}
data->sensor_heater = (hids_2525020210002_heater_t)heater->val1;
return 0;
}
static int hids_2525020210002_attr_set(const struct device *dev, enum sensor_channel chan,
enum sensor_attribute attr, const struct sensor_value *val)
{
if (chan != SENSOR_CHAN_ALL) {
LOG_WRN("attr_set() is not supported on channel %d.", chan);
return -ENOTSUP;
}
switch ((int)attr) {
case SENSOR_ATTR_WSEN_HIDS_2525020210002_PRECISION:
return hids_2525020210002_precision_set(dev, val);
case SENSOR_ATTR_WSEN_HIDS_2525020210002_HEATER:
return hids_2525020210002_heater_set(dev, val);
default:
LOG_ERR("Operation not supported.");
return -ENOTSUP;
}
return 0;
}
static int hids_2525020210002_attr_get(const struct device *dev, enum sensor_channel chan,
enum sensor_attribute attr, struct sensor_value *val)
{
struct hids_2525020210002_data *data = dev->data;
if (chan != SENSOR_CHAN_ALL) {
LOG_WRN("attr_get() is not supported on channel %d.", chan);
return -ENOTSUP;
}
if (val == NULL) {
LOG_WRN("address of passed value is NULL.");
return -EFAULT;
}
switch ((int)attr) {
case SENSOR_ATTR_WSEN_HIDS_2525020210002_PRECISION:
val->val1 = data->sensor_precision;
val->val2 = 0;
break;
case SENSOR_ATTR_WSEN_HIDS_2525020210002_HEATER:
val->val1 = data->sensor_heater;
val->val2 = 0;
break;
default:
LOG_ERR("Operation not supported.");
return -ENOTSUP;
}
return 0;
}
static const struct sensor_driver_api hids_2525020210002_driver_api = {
.attr_set = hids_2525020210002_attr_set,
.attr_get = hids_2525020210002_attr_get,
.sample_fetch = hids_2525020210002_sample_fetch,
.channel_get = hids_2525020210002_channel_get,
};
static int hids_2525020210002_init(const struct device *dev)
{
const struct hids_2525020210002_config *const config = dev->config;
struct hids_2525020210002_data *data = dev->data;
struct sensor_value precision, heater;
/* Initialize WE sensor interface */
HIDS_Get_Default_Interface(&data->sensor_interface);
data->sensor_interface.interfaceType = WE_i2c;
if (!i2c_is_ready_dt(&config->bus_cfg.i2c)) {
LOG_ERR("I2C bus device not ready");
return -ENODEV;
}
data->sensor_interface.handle = (void *)&config->bus_cfg.i2c;
/* First communication test - check device ID */
if (HIDS_Sensor_Init(&data->sensor_interface) != WE_SUCCESS) {
LOG_ERR("Failed to read device ID.");
return -EIO;
}
precision.val1 = config->precision;
precision.val2 = 0;
if (hids_2525020210002_precision_set(dev, &precision) < 0) {
LOG_ERR("Failed to set precision configuration.");
return -EIO;
}
heater.val1 = config->heater;
heater.val2 = 0;
if (hids_2525020210002_heater_set(dev, &heater) < 0) {
LOG_ERR("Failed to set heater option.");
return -EIO;
}
return 0;
}
/*
* Main instantiation macro.
*/
#define HIDS_2525020210002_DEFINE(inst) \
static struct hids_2525020210002_data hids_2525020210002_data_##inst; \
static const struct hids_2525020210002_config hids_2525020210002_config_##inst = { \
.bus_cfg = {.i2c = I2C_DT_SPEC_INST_GET(inst)}, \
.precision = (hids_2525020210002_precision_t)(DT_INST_ENUM_IDX(inst, precision)), \
.heater = (hids_2525020210002_heater_t)(DT_INST_ENUM_IDX(inst, heater)), \
}; \
SENSOR_DEVICE_DT_INST_DEFINE(inst, hids_2525020210002_init, NULL, \
&hids_2525020210002_data_##inst, \
&hids_2525020210002_config_##inst, POST_KERNEL, \
CONFIG_SENSOR_INIT_PRIORITY, &hids_2525020210002_driver_api);
DT_INST_FOREACH_STATUS_OKAY(HIDS_2525020210002_DEFINE)

View File

@ -0,0 +1,45 @@
/*
* Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_WSEN_HIDS_2525020210002_H_
#define ZEPHYR_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_WSEN_HIDS_2525020210002_H_
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/sensor.h>
#include <weplatform.h>
#include "WSEN_HIDS_2525020210002_hal.h"
#include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/sensor/wsen_hids_2525020210002.h>
struct hids_2525020210002_data {
/* WE sensor interface configuration */
WE_sensorInterface_t sensor_interface;
/* Last humidity sample */
int32_t humidity;
/* Last temperature sample */
int32_t temperature;
hids_2525020210002_precision_t sensor_precision;
hids_2525020210002_heater_t sensor_heater;
};
struct hids_2525020210002_config {
union {
const struct i2c_dt_spec i2c;
} bus_cfg;
const hids_2525020210002_precision_t precision;
const hids_2525020210002_heater_t heater;
};
#endif /* ZEPHYR_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_WSEN_HIDS_2525020210002_H_ */

View File

@ -0,0 +1,41 @@
# Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
# SPDX-License-Identifier: Apache-2.0
description: |
Würth Elektronik WSEN-HIDS-2525020210002 humidity sensor
compatible: "we,wsen-hids-2525020210002"
include: [sensor-device.yaml, i2c-device.yaml]
properties:
precision:
type: string
default: "mid"
enum:
- "low"
- "mid"
- "high"
description: |
Sensor measurement precision for temperature and humidity.
Supported precision options are low, mid or high.
Defaults to mid, which is a good compromise between
current usage and precision.
heater:
type: string
default: "OFF"
enum:
- "OFF"
- "ON_200MW_1S"
- "ON_200MW_100MS"
- "ON_110MW_1S"
- "ON_110MW_100MS"
- "ON_20MW_1S"
- "ON_20MW_100MS"
description: |
Activate the heater when fetching a sample for the specified amount of time.
This is only possible when the precison is set to high.
Defaults to OFF, since this option is valid for high precision
and the default precision is mid.

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 2024 Würth Elektronik eiSos GmbH & Co. KG
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Extended public API for WSEN-HIDS-2525020210002 Sensor
*
*/
#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_H_
#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <zephyr/drivers/sensor.h>
enum sensor_attribute_wsen_hids_2525020210002 {
SENSOR_ATTR_WSEN_HIDS_2525020210002_PRECISION = SENSOR_ATTR_PRIV_START,
SENSOR_ATTR_WSEN_HIDS_2525020210002_HEATER
};
typedef enum {
hids_2525020210002_precision_Low = 0x0,
hids_2525020210002_precision_Medium = 0x1,
hids_2525020210002_precision_High = 0x2
} hids_2525020210002_precision_t;
typedef enum {
hids_2525020210002_heater_Off = 0x0,
hids_2525020210002_heater_On_200mW_1s = 0x1,
hids_2525020210002_heater_On_200mW_100ms = 0x2,
hids_2525020210002_heater_On_110mW_1s = 0x3,
hids_2525020210002_heater_On_110mW_100ms = 0x4,
hids_2525020210002_heater_On_20mW_1s = 0x5,
hids_2525020210002_heater_On_20mW_100ms = 0x6,
} hids_2525020210002_heater_t;
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_WSEN_HIDS_2525020210002_H_ */

View File

@ -1109,3 +1109,9 @@ apds_9306: apds9306@92 {
resolution = <13>;
frequency = <2000>;
};
test_i2c_wsen_hids_2525020210002: wsen_hids_2525020210002@99 {
compatible = "we,wsen-hids-2525020210002";
reg = <0x99>;
precision = "high";
};