From d3187262099afa537fd28cde94ca1a6d0370eb63 Mon Sep 17 00:00:00 2001 From: Michal Piekos Date: Thu, 26 Dec 2024 14:38:48 +0100 Subject: [PATCH] drivers: sensor: vl53l0x: Add private channels Added private channels for metadata associated with distance measurement according to datasheet and API manual. Signed-off-by: Michal Piekos --- drivers/sensor/st/vl53l0x/vl53l0x.c | 24 +++++++++++++ include/zephyr/drivers/sensor/vl53l0x.h | 47 +++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 include/zephyr/drivers/sensor/vl53l0x.h diff --git a/drivers/sensor/st/vl53l0x/vl53l0x.c b/drivers/sensor/st/vl53l0x/vl53l0x.c index 569288f0851..b43046250cd 100644 --- a/drivers/sensor/st/vl53l0x/vl53l0x.c +++ b/drivers/sensor/st/vl53l0x/vl53l0x.c @@ -20,12 +20,16 @@ #include #include #include +#include #include "vl53l0x_api.h" #include "vl53l0x_platform.h" LOG_MODULE_REGISTER(VL53L0X, CONFIG_SENSOR_LOG_LEVEL); +#define VL53L0X_FIXPOINT1616_SCALE_FACTOR (65536) +#define VL53L0X_SENSOR_CHANNEL_VAL2_FACTOR (1000000) + /* All the values used in this driver are coming from ST datasheet and examples. * It can be found here: * https://www.st.com/en/embedded-software/stsw-img005.html @@ -288,6 +292,26 @@ static int vl53l0x_channel_get(const struct device *dev, } else if (chan == SENSOR_CHAN_DISTANCE) { val->val1 = drv_data->RangingMeasurementData.RangeMilliMeter / 1000; val->val2 = (drv_data->RangingMeasurementData.RangeMilliMeter % 1000) * 1000; + } else if ((enum sensor_channel_vl53l0x)chan == + SENSOR_CHAN_VL53L0X_EFFECTIVE_SPAD_RTN_COUNT) { + val->val1 = drv_data->RangingMeasurementData.EffectiveSpadRtnCount / 256; + val->val2 = 0; + } else if ((enum sensor_channel_vl53l0x)chan == SENSOR_CHAN_VL53L0X_AMBIENT_RATE_RTN_CPS) { + val->val1 = (drv_data->RangingMeasurementData.AmbientRateRtnMegaCps >> 16) + + (((drv_data->RangingMeasurementData.AmbientRateRtnMegaCps & 0xFFFF) * + VL53L0X_SENSOR_CHANNEL_VAL2_FACTOR) / VL53L0X_FIXPOINT1616_SCALE_FACTOR); + val->val2 = 0; + } else if ((enum sensor_channel_vl53l0x)chan == SENSOR_CHAN_VL53L0X_SIGNAL_RATE_RTN_CPS) { + val->val1 = (drv_data->RangingMeasurementData.SignalRateRtnMegaCps >> 16) + + (((drv_data->RangingMeasurementData.SignalRateRtnMegaCps & 0xFFFF) * + VL53L0X_SENSOR_CHANNEL_VAL2_FACTOR) / VL53L0X_FIXPOINT1616_SCALE_FACTOR); + val->val2 = 0; + } else if ((enum sensor_channel_vl53l0x)chan == SENSOR_CHAN_VL53L0X_RANGE_DMAX) { + val->val1 = drv_data->RangingMeasurementData.RangeDMaxMilliMeter / 1000; + val->val2 = (drv_data->RangingMeasurementData.RangeDMaxMilliMeter % 1000) * 1000; + } else if ((enum sensor_channel_vl53l0x)chan == SENSOR_CHAN_VL53L0X_RANGE_STATUS) { + val->val1 = drv_data->RangingMeasurementData.RangeStatus; + val->val2 = 0; } else { return -ENOTSUP; } diff --git a/include/zephyr/drivers/sensor/vl53l0x.h b/include/zephyr/drivers/sensor/vl53l0x.h new file mode 100644 index 00000000000..98613f16f31 --- /dev/null +++ b/include/zephyr/drivers/sensor/vl53l0x.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024 Michal Piekos + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Custom channels and values for VL53L0X ToF Sensor + * + * These channels provide additional sensor data not covered by the standard + * Zephyr sensor channels. Application must include vl53l0x.h file to gain + * access to these channels. + * + * Example usage: + * @code{c} + * #include + * + * if (sensor_channel_get(dev, SENSOR_CHAN_VL53L0X_RANGE_STATUS, &value)) { + * printk("Status: %d\n", value.val1); + * } + * @endcode + */ + +#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_VL53L0X_H_ +#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_VL53L0X_H_ + +#include + +/* VL53L0x specific channels */ +enum sensor_channel_vl53l0x { + SENSOR_CHAN_VL53L0X_RANGE_DMAX = SENSOR_CHAN_PRIV_START, + SENSOR_CHAN_VL53L0X_SIGNAL_RATE_RTN_CPS, + SENSOR_CHAN_VL53L0X_AMBIENT_RATE_RTN_CPS, + SENSOR_CHAN_VL53L0X_EFFECTIVE_SPAD_RTN_COUNT, + SENSOR_CHAN_VL53L0X_RANGE_STATUS, +}; + +/* VL53L0x meas status values */ +#define VL53L0X_RANGE_STATUS_RANGE_VALID (0) +#define VL53L0X_RANGE_STATUS_SIGMA_FAIL (1) +#define VL53L0X_RANGE_STATUS_SIGNAL_FAIL (2) +#define VL53L0X_RANGE_STATUS_MIN_RANGE_FAIL (3) +#define VL53L0X_RANGE_STATUS_PHASE_FAIL (4) +#define VL53L0X_RANGE_STATUS_HARDWARE_FAIL (5) +#define VL53L0X_RANGE_STATUS_NO_UPDATE (255) + +#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_VL53L0X_H_ */