From 1a8b8f42207a40f8bfb0507e8fe96d8d8a9a02ec Mon Sep 17 00:00:00 2001 From: Thomas Lang Date: Wed, 23 Apr 2025 16:44:08 -0500 Subject: [PATCH] drivers: sensor: Added timeout for apds9960 sampling Timeout occurs if status register does not register an interrupt Signed-off-by: Thomas Lang --- drivers/sensor/apds9960/apds9960.c | 10 ++++++++++ drivers/sensor/apds9960/apds9960.h | 1 + 2 files changed, 11 insertions(+) diff --git a/drivers/sensor/apds9960/apds9960.c b/drivers/sensor/apds9960/apds9960.c index 433c793b68b..32bb14caa22 100644 --- a/drivers/sensor/apds9960/apds9960.c +++ b/drivers/sensor/apds9960/apds9960.c @@ -54,6 +54,9 @@ static int apds9960_sample_fetch(const struct device *dev, const struct apds9960_config *config = dev->config; struct apds9960_data *data = dev->data; uint8_t tmp; +#ifdef CONFIG_APDS9960_FETCH_MODE_POLL + int64_t start_time; +#endif if (chan != SENSOR_CHAN_ALL) { LOG_ERR("Unsupported sensor channel"); @@ -84,12 +87,16 @@ static int apds9960_sample_fetch(const struct device *dev, } #ifdef CONFIG_APDS9960_FETCH_MODE_POLL + start_time = k_uptime_get(); #ifdef CONFIG_APDS9960_ENABLE_ALS while (!(tmp & APDS9960_STATUS_AINT)) { k_sleep(K_MSEC(APDS9960_DEFAULT_WAIT_TIME)); if (i2c_reg_read_byte_dt(&config->i2c, APDS9960_STATUS_REG, &tmp)) { return -EIO; } + if ((k_uptime_get() - start_time) > APDS9960_MAX_WAIT_TIME) { + return -ETIMEDOUT; + } } #else while (!(tmp & APDS9960_STATUS_PINT)) { @@ -97,6 +104,9 @@ static int apds9960_sample_fetch(const struct device *dev, if (i2c_reg_read_byte_dt(&config->i2c, APDS9960_STATUS_REG, &tmp)) { return -EIO; } + if ((k_uptime_get() - start_time) > APDS9960_MAX_WAIT_TIME) { + return -ETIMEDOUT; + } } #endif #endif diff --git a/drivers/sensor/apds9960/apds9960.h b/drivers/sensor/apds9960/apds9960.h index c36a2c2a9d3..d40d12ac3fd 100644 --- a/drivers/sensor/apds9960/apds9960.h +++ b/drivers/sensor/apds9960/apds9960.h @@ -214,6 +214,7 @@ /* Polling Wait Times (ms) */ #define APDS9960_DEFAULT_WAIT_TIME 2.78 +#define APDS9960_MAX_WAIT_TIME 10000 struct apds9960_config { struct i2c_dt_spec i2c;